본문 바로가기
Dev Tools/Docker

[Docker] GitHub Actions CI/CD - Docker Image 자동 빌드, push(CI) (1)

by lucas_owner 2023. 2. 18.

GitHub Actions 를 사용한 Docker Image 자동 빌드, push 

- Info 

Docker를 사용하여 EC2에 Spring Boot를 배포하는 방법들을 포스팅해왔다, 실제로 해봤다면 알겠지만 해당 작업은 상당히 복잡한 프로세스를 갖고있고, 자동화 또한 되어있지 않다. 중간에 실수가 있거나, 순서중 하나만 헷갈리더라도 굉장한 장애를 발생시킬 수 있다. 

 

이러한 배포 자동화를 CI/CD(Continuous Integration, Continuous Deployment) 라고 한다. 

  • CI (Continuous Integration)
    • 지속적 통합 : 여러 개발자들이 협업을 하고 있는 경우 발생하는 '불일치'를 최소화 해주는 개념.
    • 예를들어 master 브랜치에 PR 요청이 왔을때, 빌드, 테스트를 수행하여 코드 Qulity를 체크 할 수 있다. 
    • CI System 종류 : Jenkins, Travis CI, GitHub Actions 가 대표적으로 유명하다.
  • CD (Continuous Deployment)
    • 지속적 배포 : 프로젝트의 변경사항을 가상 환경(AWS, IDC)에 배포하는것이다.
    • 배포의 자동화가 이루어지는 환경으로, 수동으로 배포해야하는 번거로움을 줄일 수 있고, 더 나아가 무중단 배포 환경까지 구성할 수있다. 

- 해당 글에서는 CI 만을 다루며, Docker 이미지를 이용 할 것이다. 

- 또한 CI tool 로는 GitHub Actions를 사용할 것이다.

이전 글에서 작업 했던것중 Jar 빌드 -> Docker Image 생성 -> Docker Hub를 자동화 하는것이다.

https://lucas-owner.tistory.com/48

 

[Docker] Docker - Spring Boot로 EC2 배포하기

Docker - Spring Boot로 EC2 배포하기 ○ 목표 - Spring Boot (server) Docker Image로 Build - Docker Hub에 Docker Image 공유(push) - EC2 Docker Image pull 및 설치 -> 한마디로 Spring Boot를 Docker를 이용하여 EC2에 간편하게 배포

lucas-owner.tistory.com

 

* gradle 빌드 기준으로 진행된다.

 

1. GitHub Actions 

- GitHub Actions란? 

GitHub에서 제공하는 CI/CD tool 이다. 특정 branch에 이벤트(push, pull Request)가 발생 했을때, 미리 지정 해둔 work flow가 실행된다. 

 

-> Master 브랜치 push, PR 발생시 -> JAR빌드, Docker 이미지 빌드, Docker Hub push 까지 다룰 예정이다. 

해당 작업을 통해 Test를 수행하여 코드 품질또한 체크할 수 있다. 

 

1-1 GitHub Actions 설정 

 

- GitHub Repository -> Actions -> gradle 검색 -> Java With Gradle Configure 선택

 

1-2 gradle.yml 파일 수정 - 설정

- Configure를 클릭하면 위와 같은 화면이 나오게 된다. 

- 해당 화면은 어떤 이벤트가 발생 했을때, 어떤 작업을 수행할 것인지 명시하는 파일이다.

 

name: Java CI with Gradle

# master 브랜치에 push, PR 이벤트 발생시 동작.
on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  deploy: 
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3
    
    # Spring Boot 어플리케이션 Build (1)
    - name: Spring Boot Build
      run: ./gradlew clean build --exclude-task test
    
    # Docker 이미지 Build (2)
    - name: docker image build
      run: docker build -t lucaskang134/boot-prac-ci .
    
    # DockerHub Login (3)
    - name: docker login 
      uses: docker/login-action@v2
      with: 
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    # Docker Hub push (4)
    - name: docker Hub push
      run: docker push lucaskang134/boot-prac-ci

- 위의 코드가 우리가 사용할 수정 파일이다. 

- on 부분의 수정을 통해, 어떤 이벤트에 동작할것인지 명시 할 수 있고, 

- jobs 부분의 수정을 통해, 상세 설정을 할 수 있다. 

- Test 프로젝트 이기 때문에 jar 빌드시 test는 스킵한다! (1)번 항목

- flow 자체는 이전에 했던 내용과 완벽하게 동일하다. 

 

* 주의점

- (3)번 항목의 with 부분을 보면 docker hub의 username, password 가 존재하는데, 이는 GitHub Actions의 Secret Key를 설정해줘야 한다. 해당 항목이 존재하지 않는다면, Actions = Fail 상태가 될것이다. 

 

- Secret Key 생성해야 하는 이유는 공개된곳에 docker hub의 패스워드나, 토큰이 유출되면 안되기 때문이다.

 

 

1-3. GitHub Actions Secret Key 생성.

  1. repository 의 Settings - Security - Secrets and Variable - Actions 
  2. New repository secret 클릭 후 이름과 내용 작성 및 저장
  3. 저장이 되었다면 생성한 List가 생성되고, gradle.yml 에서 사용할 수 있게된다.

 

2. 이벤트 발생시켜서 Actions flow 실행. 

- 각자 Actions 파일을 정의했다면, 어떤 상황일 때 flow 를 동작시키는 설정을 했으니 실행 시켜보자.

 

- 필자의 경우: master 브랜치 push, PR 발생시 동작. 

 

2-1 실패시

 

- 해당 flow 상세페이지에 들어가서, 어떤부분에서 실패했는지 확인 할 수 있고, 해당 flow를 재시작 할 수도 있다.

2-2 성공시 

 

 

3. Docker Hub 확인

- 우리의 목표는 jar 빌드 및 해당 내용을 Docker Image 빌드 후 Docker Hub 까지 push 하는것이였으니 확인해보자. 

 

- 현재 GitHub Actions 상태가 성공이므로, 정상적으로 빌드가 되었다면 Docker Hub에 이미지가 등록이 되어있어야 한다. 

- gradle.yml 에 설정했던 이미지명으로 Image가 만들어져 푸시된것을 확인 할 수있다. 

 

3-1.  AWS EC2 에서 확인. 

 

- 도커 허브에 푸시가 되었다고 해서 정상적으로 동작하는지는 모르니, 해당 이미지를 EC2에서 컨테이너화 시켜보자. 

- docker 컨테이너 정상 동작 및 EC2 퍼블릭IP : 8080 접속 성공이다. 

 


CI는 구동 했지만 CD에 관한것은 구현하지 않아서, 여기까지는 EC2에 컨테이너화를 하는 작업까지 진행 했다. 

다음 글에서는 CD 까지 진행하여 자동 배포에 관한것을 다뤄보도록 하겠다. 

반응형

댓글