Github Action + Docker로 CI/CD 파이프라인 구축하기

최미래·2024년 4월 25일
19
post-thumbnail

Github Action?

Github에 공식적으로 내장된 기능으로
빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼
[ public repository 면 제한 없이 사용 가능 ]

* CI/CD란?
지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)

수동배포만 해오던 나에게는 아주 기적같은 기능이다

구축 과정

1. 스펙

AWS EC2
GitHub Actions
Docker

2. 배포 전 설정사항

루트 밑에 Dockerfile 생성

FROM openjdk:{자신에게 맞는 JDK 버전}
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

3. 구축 코드

Actions를 누르고 Gradle 템플릿 선택 후 /.github/workflows/main.yml 추가

name: CI/CD using GitHub Actions & Docker

on:
  push:
    branches: [ "master" ]

jobs:
  CI-CD:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'temurin'
          
		## git ignore에 등록된 application.properties 파일 생성해주기
      - name: Create directory and file if not exist
        run: |
          mkdir -p ./src/main/resources
          echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties

		## 스프링 프로젝트 jar 파일 빌드
      - name: Set executable permission
        run: chmod +x ./gradlew

      - name: Build with Gradle
        run: ./gradlew bootJar

		## Docker Hub에 이미지 push 하기
      - name: Docker build & push to prod
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT .
          docker push ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT

		## Docker Hub에 Push한 이미지를 우분투 서버에 받아와서 run
      - name: Deploy to prod
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST_PROD }}
          username: ubuntu
          key: ${{ secrets.PRIVATE_KEY }}
          envs: GITHUB_SHA
          script: |
            docker stop keep
            docker rm keep
            docker rmi ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT
            docker pull ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT
            docker run -d -p 8080:8080 --name keep ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT

4. Action Secrets(환경 변수) 생성

Settings - Security - Actions 위치에서
DOCKER_USERNAME DOCKER_PASSWORD 에는 각각 docker username과 password,
HOST_PROD 에는 EC2 서버 퍼블릭 주소를 넣어주었다.
application.properties 또한 APPLICATION 을 만들어 환경변수로 사용할 것이다.

5. 도커 설치하기

본인 EC2에 접속한 후 아래 명령어 입력

sudo apt install docker.io

6. CI/CD

이제 masterpush 만 하면 Github Action이 자동으로 CI/CD를 진행 해준다!

profile
주니어 백엔드 엔지니어, 최미래입니다.

2개의 댓글

comment-user-thumbnail
2024년 5월 4일

EC2하나에 서버를 두면 고가용성이 좋지 못해서 EC2 2개의 서버를 alb로 묶어서 고가용성을 높여보시면 좋으실 것 같습니다 :)

1개의 답글

관련 채용 정보