본문 바로가기
dev-ops

Github Action을 이용한 CI/CD

by 쭈꾸마뇽 2021. 9. 14.

그동안 CI/CD구현을 위해 젠킨스를 사용했었는데 이번 프로젝트에서 EC2를 프리티어로 사용해서 젠킨스를 돌릴수가 없어서 Github Action을 사용해 보았다.  사용방법은 젠킨스에 비하면 훨씬 간단했다.

GitHub Action 시작

먼저 Git 레포지토리의 Actions 탭에 들어가서 새로운 workflow를 만들어준다.

탭을 누르면 위와 같이 기본적으로 제공하는 여러 workflow가 있는데 나는 Java with Gradle을 선택하겠다.

Set up this workflow 버튼을 클릭하면 yml 파일을 작성할 수 있는 화면으로 이동한다.

이처럼 workflow별로 기본적인 세팅은 모두 제공한다.  여기서 몇가지를 수정하여 Docker로 배포할 수 있는 환경세팅을 해줘야 한다.

name: Java CI with Gradle

on:
  push:
    branches: [ main ]

jobs:
  CI:
    env:
      working-directory: ./BarkingCat
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        cache: gradle
    - name: Grant execute permission for gradlew
      run: chmod +x BarkingCat/gradlew
    - name: Build with Gradle
      run: |
        cd BarkingCat
        sudo ./gradlew build
    - name: Build Docker Image
      uses: mr-smithers-excellent/docker-build-push@v5
      with:
        image: rkdals213/barking-cat
        tags: latest
        registry: docker.io
        username: ${{ secrets.DOCKER_ID }}
        password: ${{ secrets.DOCKER_PW }}
        
  deploy:
    needs: CI
    name: Deploy
    runs-on: [ self-hosted ]
    steps:
      - name: Login to Docker
        uses: docker/login-action@v1
        with:
          registry: docker.io
          username: ${{ secrets.DOCKER_ID }}
          password: ${{ secrets.DOCKER_PW }}
      - name: Docker run
        run: |
          docker stop barking-cat && docker rm -fv barking-cat
          docker rmi -f rkdals213/barking-cat
          docker run -d -p 8080:8080 --name barking-cat --restart always rkdals213/barking-cat:latest

스크립트를 보면 CI와 deploy 두 부분으로 job을 나눠줬다.  이 Action은 main 브랜치에 push 될때만 실행 될 수 있도록 on: 옵션을 이용해서 설정해 주었다.

CI

CI 부분에서는 프로젝트를 빌드하고 Docker Hub에 업로드 하는 로직이 들어갔다.  Docker Hub에 업로드 하기 위해서 계정 정보가 필요한데, Github에 secrets를 설정해서 환경변수처럼 사용할 수 있다.  이 yml 파일 또한 Github에 올라가기 때문에 이러한 계정 정보들은 secrets로 따로 관리해줘야 한다.

Deploy

Deploy 부분에서는 Docker Hub에 올라간 이미지를 pull해서 EC2에서 돌려주는 로직이 들어간다.  이 또한 Docker Hub의 계정정보가 필요하다.  그리고 이미지를 계속 pull 하기 때문에 EC2에 옛날 버전의 이미지가 계쏙 쌓기 되어 이를 삭제해주는 로직도 들어간다.

 

yml 파일 작성을 끝내고 실제로 main 브랜치에 push하게 된다면 Actions 탭에서 다음과 같이 실행되는 모습을 볼 수 있다.

Secrets 등록

Settings 탭으로 들어와서 좌측 메뉴에 Secrets를 클릭하면 다음과 같은 화면이 뜬다.  

New repository secret을 클릭해서 yml 파일에 사용할 환경변수를 설정해 주면 된다.

Actions 등록

다음은 EC2에서 실행한 Actions Runner를 등록해야한다.  Settings탭에 Actions에 보면 Runner가 있다.

그리고 EC2에 들어가서 나와있는 스크립트들을 작성해준다.  그러면 아래와 같은 화면이 나오면서 설치가 된다.

그리고 중간중간 입력하는 창이 나오는데 처음 name 지정은 dev로 해줬고 나머지는 모두 기본값으로 설정해줬다.  그리고 ./run.sh로 runner을 실행시켜주는데 백그라운드에서 실행해줘야 하기 때문에 nohup을 붙여줬다.

nohup ./run.sh &

이렇게 되면 모든 설정은 끝이 났고 테스트를 해보자

테스트

먼저 TestController의 api response를 HELLO에서 HI로 바꾼후 새로운 브랜치를 만들어서 풀리퀘스트를 만들어보겠다.

그려면 새로운 pull request가 생성되었지만 Action은 동작하지 않는다.

그리고 이 pull request를 merge하게 되면 main 브랜치에 push가 일어나 Action이 동작하게 된다.

CI -> Deploy 순으로 진행되는 것을 확인할 수 있다.

모든 작업이 끝나게 되면 초록색 불이 켜지고 완료 표시가 뜬다.  

Postman으로 요청을 보내보면 HI가 정상적으로 뜨는것을 확인할 수 있다.

'dev-ops' 카테고리의 다른 글

Kafka 설치하기 (Mac)  (0) 2021.12.04
Docker를 이용한 Spring 프로젝트 배포  (0) 2021.09.13

댓글