DevOps/Docker

Docker & Github actions로 CI/CD 구축하기

코딩맛 2024. 4. 14. 19:35

도커와 Github Actions를 사용해 spring boot 샘플 프로젝트를 AWS EC2에 CI/CD하는 과정을 담은 글입니다.

(깃허브를 커밋하면 자동으로 EC2에 반영되도록 하는 CI/CD를 구축합니다.)

 

CI/CD 란 ?

지속적 통합(Continuous Integration)과 지속적 제공/배포(Continuous Delivery/Deployment)의 약자로, 소프트웨어 개발 프로세스를 자동화하여 더 빠르고 효율적으로 소프트웨어를 제공하는 방법론을 의미합니다.

목차
1. CI 과정 구축하기
    1. Github Actions 환경변수 설정
    2. Actions gradle.yml 생성
    3. gradle.yml 수정
    4. Docker 허브 확인 및 EC2 배포

2. CD 과정 구축하기(배포 자동화)
    1. Github Actions의 self-hosted 수신 준비
    2. gradle.yml 수정
    3. 실행 결과 확인

 

1. CI 구축하기

Spring boot 애플리케이션을 app.jar로 빌드하고 도커 이미지를 도커 허브에 푸시하는 과정까지 단계입니다.

 

1-1. Github Actions 환경변수 설정

위치 : github repository > settings > Secrets and vaiables > Actions

 

도커 허브의 username과 password를 등록합니다.

 

1-2. Actions gradle.yml 생성

위치 : github repository > Actions > New workflow > Java with Gradle를 선택합니다.


CI 과정(도커 이미지 빌드, 도커 허브에 푸쉬) 을 Github Actions가 하도록 gradle.yml을 작성합니다.

 

1-3. gradle.yml 수정

gradle.yml 파일 내용을 수정합니다.

name: Java CI with Gradle

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

permissions:
      contents: read

jobs:
  # Spring Boot 애플리케이션을 빌드하여 도커허브에 푸시하는 과정
  build-docker-image:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    
    # 1. Java 17 세팅
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    # 2. Spring Boot 애플리케이션 빌드
    - name: Build with Gradle
      run: ./gradlew build
      
    # 3. Docker 이미지 빌드
    - name: docker image build
      run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2 .

    # 4. DockerHub 로그인
    - name: docker login
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}

    # 5. Docker Hub 이미지 푸시
    - name: docker Hub push
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2

 

gradle.yml 파일을 수정한 뒤 Commit Changes를 누르고 Actions 탭에 들어가면 위 과정의 진행 상황을 볼 수 있습니다.

 

1-4. Docker 허브 확인 및 EC2 배포

 

Docker 허브에서 gradle.yml 파일에 명시된 sample:0.0.2 이미지가 푸쉬된 것을 확인 할 수 있습니다.

 

EC2에서 도커 이미지를 pull 받아와서 실행시켜보면 웹에서 접속이 원활하게 됩니다.

 

 

 

 

2. CD 과정 구축하기(배포 자동화)

도커 허브에 푸쉬된 이미지를 EC2에서 풀 받아와서 서버를 실행하는 부분을 자동화합니다.

self-hosted 방법을 사용하여 진행합니다.

 

2-1. Github Actions의 self-hosted 수신 준비

위치 : githun repository > Settings > Actions > Runners > New self-hosted runner로 이동합니다.

 

EC2 운영체제에 맞게 선택한 후 서버 터미널에 해당 명령어를 차례대로 입력합니다.

 

위와 같은 화면이 나옵니다. 따로 설정하지 않고 enter를 눌러 패스합니다.

 

$ sudo ./svc.sh install

$ sudo ./svc.sh start

명령어를 입력하여 Github Actions를 수신할 준비를 완료합니다.

 

2-2. gradle.yml 수정

도커 허브에 push된 이미지를 pull 받아와서 구동되고 있는 컨테이너를 중지하고 새롭게 컨테이너를 구동하는 내용입니다.

 run-docker-image-on-ec2:
    needs: build-docker-image
    runs-on: self-hosted
    
    steps:
    # 1. 최신 이미지를 풀받습니다
    - name: docker pull
      run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2
    # 2. 기존의 컨테이너를 중지시킵니다
    - name: docker stop container
      run: sudo docker stop $(sudo docker ps -q) 2>/dev/null || true

    # 3. 최신 이미지를 컨테이너화하여 실행시킵니다
    - name: docker run new container
      run: sudo docker run --name sample --rm -d -p 80:80 ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2

    # 4. 미사용 이미지를 정리합니다
    - name: delete old docker image
      run: sudo docker system prune -f

기존 gradle.yml 파일에 해당 내용 추가합니다.

 

2-3. 실행 결과 확인

intelliJ에서 Controller 내용을 변경하고 github에 commit&push 해줍니다.

 

Gitgub Actions에서 gradle.yml 파일 내용을 순차적으로 실행하는 과정 및 상태를 확인할 수 있습니다.

build-docker-image(CI), run-docker-image-on-ec2(CD)를 성공하였습니다.

 

 

[참고 블로그]

https://e-room.tistory.com/171

 

Docker + Github Actions로 SpringBoot CI/CD 구축하기

목표 : 깃허브 커밋을 하면 자동으로 EC2에 반영되도록 하는 CD/CD를 구축한다. 지난번에는 Docker를 이용하여 Spring boot 애플리케이션을 EC2에 배포를 했습니다. 이번에는 해당 과정을 로컬환경에서

e-room.tistory.com