카테고리 없음

Docker를 통한 CI/CD (2) - Github Action 이해

DuL2 2024. 1. 31. 19:50

이 글에서는 Github Action에 대해서 이해해보고 cloudtype 플랫폼을 사용해 cd까지 연결해보는 글입니다.

Github Actions

 

Github Actions는 깃허브에 내장된 CI/CD 도구라고 이해하면 됩니다. Jenkins, Travis CI 등의 도구가 비슷하다고 할 수 있을 것 같습니다.

 

깃허브 내장이다보니 깃허븐와의 통합이 쉽고, CI/CD 서버가 내장되어 CI/CD 서버를 따로 구축할 필요 없다는 점이 장점입니다. 또한, 일정 스펙까지는 무료이기 때문에 공부하기에도 좋습니다. 무료 버전은 스토리지 500MB, 월 2000분이 무료입니다.

 

Github Actions를 동작시키려면은 repository의 `.github/workflows` 디렉토리에 필요한 Actions 파일들을 yaml 형식으로 작성해놓습니다. 작성된 actions 파일들을 github에서 자동으로 실행하여 CI/CD가 구축됩니다.

 

Github actions에서 CI

Github actions에서는 feature/에서 dev으로 합쳐질 때 test를 통과한 코드만 merge되도록 하여 오류를 방지하고 안정적인 코드만 배포할 수 있도록 설정이 가능합니다.

 

다음은 예시 yml 파일입니다.

# 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

Github actions에서 CD

배포를 자동화하는 작업을 기술할 수 있으며 빠르고 간편하게 배포가 가능합니다. main 브랜치에 코드가 통합되었을 때 운영 환경에 빠르게 배포가 가능해집니다. 

 

main 브랜치는 감시당하며 merge되었을 경우 gradle test가 실행되고 main 브랜치 기준으로 jar 파일이 생성됩니다. 이 jar 파일을 운영 서버 aws, gcp 등에 배포를 해줄 수 있습니다.

 

다음은 예시 yml 파일입니다.

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"

 

Github actions의 진행 과정

 

맨 위 Repository는 우리의 프로젝트가 저장된 Repository를 의미한다. 다음 workflows는 위에서 우리가 알아본 workflows/ 디렉토리에 저장하는 yml파일들을 의미한다. 다음 jobs는 우리가 각 workflow에서 명시해둔 일들을 의미하는데 job들은 각각 가상화 머신에서 따로 병렬로 진행될 수 있으며 따로 설정을 해주면 순차적으로 실행되도록 만들 수도 있다. 마지막으로 각 job들은 각 머신에서 순서대로 step by step으로 진행된다.

 

 

우리가 정해놓은 event 가 발생하면(위 코드에서는 push 특정 branch) Runner(가상화 머신)에서 우리가 지정해놓은 job들을 순차적으로 진행한다. 위 그림에서 Runner1과 Runner2가 순차적인 것처럼 그려져있지만 둘다 각자 분리된 가상화머신이므로 동시에 실행될 수 있다.

 

Workflow 구조 이해하기

name: 'CD'                                     # github actions의 이름을 정하는 부분

on:                                            # 이 action이 언제 실행되는지에 대한 부분
    push:
        branches: [ main ]
jobs:                                          # 실제 실행할 내용에 대한 부분
  cd:
    runs-on: [ ubuntu-latest ]                 # 어떤 환경에서 실행하는지 기술

    steps:                                     # 실제 실행할 단계들을 기술
      - name: checkout                         # 실행에 표시될 이름
        uses: actions/checkout@v4              # 여러 가지 plugin 사용

      - name: java setup
        uses: actions/setup-java@v3
        with:                                  # plugin 에서 사용할 파라미터들
          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"
 

GitHub 호스팅 실행기 정보 - GitHub Docs

GitHub는 워크플로를 실행하는 호스팅 가상 머신을 제공합니다. 가상 머신에는 GitHub Actions에서 사용할 수 있는 도구, 패키지 및 설정 환경이 포함되어 있습니다.

docs.github.com

 

 

GitHub Marketplace: actions to improve your workflow

Find the actions that help your team build better, together.

github.com

 

Cloudtype으로 배포해보기

1. Cloudtype 가입하기

https://app.cloudtype.io/auth/signup 클릭 후, github 계정으로 가입하기 클릭

 

모두의 플랫폼팀, 클라우드타입

클라우드타입은 클라우드 기반 애플리케이션을 빠르게 개발하고 배포할 수 있는 클라우드 애플리케이션 플랫폼입니다.

cloudtype.io

2. 결제 카드 등록 후 무료 요금제 활성화

오른쪽위 프로필을 눌러서 구독 결제 탭으로 들어가 본인 카드 등록

 

성공시 구독내역에 프리티어라고 뜸.

3. github - cloudtype 을 연결하기 위한 설정 - GitHub Personal Token 발급하기

https://github.com/settings/tokens 로 이동해서 본인 토큰 만들기

 

티스토리가 저장이 안되서 다시 찍느라 본인은 이미 존재함.

 

repo, admin:public_key 체크하고 이름 짓기

 

토큰은 한번만 확인할 수 있으므로 메모장같은곳에 잘 보관.

3. github - cloudtype 을 연결하기 위한 설정 -  cloudtype 의 API Key 발급

환경설정 인증 탭가서 새로운 api 키 발급

 

 

 

 

보관해둘것 이것도 한번만 확인가능

 

4. Cloudtype 시작하기 

홈화면으로 가서 + 버튼 누르고 시작하고 내 깃허브 저장소로 배포하기 클릭

 

계속 이어 진행. 본인이 하고싶은 repository 클릭

 

유의해야 할점이 보통은 application.yml 이 github 레포에 없을 것이므로 application.yml을 배포시 주입해줄 단계가 필요함.(secretkey 등..)

 

5. github - cloudtype 을 연결하기 위한 설정 - 토큰 넣어주기

본인 저장소 세팅가서 지금만든 api 키와 github personal token 저장하기

 

 

 

6. Github Actions 설정하기

"프로젝트 레포지토리/.github/workflows/" 안에 다음 파일을 넣어 세팅. 프로젝트에 부족한 파일이 있다면 추가로 설정해줘야 함.

# test-pr.yml
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
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

 

설정해주면 간단한 프로젝트의 경우에는 배포가 자동으로 진행됨. 위에서 언급했던 aws secret key나 database url 값등을 넣어줄 방법을 본인이 찾아야함.

 

7. cloudtype 가서 확인하기

위 설정을 깃허브에 만들면 다음과 같이 배포가 진행됨

 

 

 

 

 

 

 

 

 

p.s. 기존에 작성하던게 다 날라가서 다시 작성하느라 부족한 부분이 많음. 티스토리... 이놈... 하..