본문 바로가기
[스파르타코딩클럽]/Docker & CICD

Github Actions와 CI/CD

by 진진리 2024. 3. 18.
728x90

Github Actions

  • Github에 내장된 CI/CD 도구
  • github와 통합이 쉽고 CI/CD 서버가 내장되어 따로 구축할 필요가 없으며 일정 수준까지 가격이 무료
    • 무료 버전: 스토리지 500MB, 월 2000분
  • 동작 방법: .github/workflows 폴더 아래에 yaml 파일이 위치
    • 작성된 actions 파일들을 github에서 자동으로 실행
  • CI
    • test를 통과한 코드만 develop 브랜치와 main 브랜치에 merge되도록 하여 오류를 방지하고 안정적인 코드를 배포하며 버그를 빠르게 발견
    • 예시
# Actions 이름 github 페이지에서 볼 수 있다.
name: 'CI'

# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on: 
    push:
        # 배열로 여러 브랜치를 넣을 수 있다.
        branches: [ develop, feature/* ]
    # github pull request 생성시
    pull_request:
        branches: 
            - develop # -를 쓴 여러 줄로 여러 브랜치를 명시하는 것도 가능

    # 실제 어떤 작업을 실행할지에 대한 명시
jobs:
  ci:
  # 스크립트 실행 환경 (OS)
  # 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
    runs-on: [ ubuntu-latest ] 

    # 실제 실행 스크립트
    steps: 
      # uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
      - name: checkout
        uses: actions/checkout@v4

      # with은 plugin 파라미터 입니다. (java 11버전 셋업)
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      # run은 사용자 지정 스크립트 실행
      - name: run unittest
        run: |
          ./gradlew clean test

 

  • CD
    • 배포를 자동화하는 작업을 기술해서 빠르고 간편하게 배포
    • 샘플
name: 'CD'

on: 
    push:
        branches: [ main ]
jobs:
  cd:
    runs-on: [ ubuntu-latest ] 

    steps: 
      - name: checkout
        uses: actions/checkout@v4

      - name: java setup
        uses: actions/setup-java@v3
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      - name: run unittest
        run: |
          ./gradlew clean test
		  
      - name: deploy to heroku
	      uses: akhileshns/heroku-deploy@v3.12.12
		    with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "sampleapp-github-actions" #Must be unique in Heroku
          heroku_email: "nbcdocker@proton.me"

 

  • Workflow
    • 최상위 개념
    • 여러 Job으로 구성되고 event에 의해 트리거될 수 있는 자동화된 프로세스
  • event
    • Github Repository에서 발생하는 push, pull request open, issue open, cron 등의 특정한 규칙
    • workflow를 실행함
  • runner
    • Github Action Runner app이 설치된 VM
    • workflow가 실행될 instance로 각각의 Job들은 개별적인 runner에서 실행
  • job
    • 하나의 runner에서 실행될 여러 step의 모음
  • step
    • 실행 가능한 하나의 shell script 또는 action
  • Actions
    • workflow의 가장 작은 단위로 재사용이 가능
    • Job을 만들기 위해 step들을 연결
# Actions 이름 github 페이지에서 볼 수 있다.
name: Run Test

# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on: 
    push:
        # 배열로 여러 브랜치를 넣을 수 있다.
        branches: [ develop, feature/* ]
    # github pull request 생성시
    pull_request:
        branches: 
            - develop # -로 여러 브랜치를 명시하는 것도 가능

    # 실제 어떤 작업을 실행할지에 대한 명시
jobs:
  build:
  # 스크립트 실행 환경 (OS)
  # 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
    runs-on: [ ubuntu-latest ] 

    # 실제 실행 스크립트
    steps: 
      # uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
      - name: checkout
        uses: actions/checkout@v4

      # with은 plugin 파라미터 입니다. (java 17버전 셋업)
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      - name: make executable gradlew
        run: chmod +x ./gradlew

      # run은 사용자 지정 스크립트 실행
      - name: run unittest
        run: |
          ./gradlew clean test

 

 

Cloudtype을 사용하여 배포해보기

  • github 토큰 발급
  • cloudtype의 API Key 발급
  • 깃허브 Secrets에 GHP_TOKEN, CLOUD_TOKEN으로 저장

 

  • test-pr.yml
    • PR이 생성되면 PR의 테스트 코드가 모두 성공인지 확인
name: test every pr
on:
  workflow_dispatch:
  pull_request:
permissions:
  contents: read
  pull-requests: read
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: setup jdk
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: gradle
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
      - name: gradlew test
        run: ./gradlew test

 

  • deploy-main.yml
name: Deploy to cloudtype
on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Connect deploy key
        uses: cloudtype-github-actions/connect@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          ghtoken: ${{ secrets.GHP_TOKEN }}
      - name: Deploy
        uses: cloudtype-github-actions/deploy@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          project: # 워크스페이스 이름/프로젝트 이름 ex) nbc.docker/cicd
          stage: main
          yaml: |
            name: # 프로젝트 이름 ex) `cicd`
            app: java@17
            options:
              ports: 8080
            context:
              git:
                url: git@github.com:${{ github.repository }}.git
                ref: ${{ github.ref }}
              preset: java-springboot

'[스파르타코딩클럽] > Docker & CICD' 카테고리의 다른 글

Docker volume  (0) 2024.03.19
Docker 모니터링&로깅  (0) 2024.03.19
Docker Compose  (1) 2024.03.19
Dockerfile  (0) 2024.03.18
CI/CD와 Docker  (0) 2024.03.18