Post

CI/CD Github Action

자동화된 프로세스를 통해 수동 작업을 줄이고 불필요한 시간을 줄이기 통해 CI/CD를 구축했다.

CI/CD를 구축하는 방법에는 여러 가지 종류가 있는데, 그 중 Github Action을 선택했다.


Github Action

Github에서 제공하는 CI/CD 작업을 자동화하고 관리하는 도구로 PR, 푸시 등 코드 변경이 일어났을 때, 빌드 및 테스트와 배포를 자동으로 수행하도록 해준다.

Github Action은 CI/CD 템플릿을 지원하기 때문에 쉽고 빠르게 CI/CD를 구축할 수 있어서 선택하게 되었다.


CI/CD

  • CI는 코드를 지속적을 통합하고 자동으로 테스트하는 프로세스로, 코드를 Push하거나 PR을 생성할 때마다, 자동으로 빌드와 테스트를 진행한다.
  • CD는 지속적으로 통합된 코드를 자동으로 운영 환경에 배포하는 프로세스이다.

    CI/CD 지속적 통합과 지속적 배포



CI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
name: CI

on:
  pull_request:
    branches: [ "develop" ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
      with:
        gradle-version: '7.6'

    - name: Build with Gradle Wrapper
      run: |
        ./gradlew build --version
      shell: bash

    - name: Run Tests
      run: |
        ./gradlew test
      shell: bash

flow

develop 브랜치에 대해 PR을 생성했을 때, develop 브랜치에 대한 자동 빌드와 테스트를 실행한다.


CD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
name: CD

on:
  push:
    branches: [ "develop" ]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
        with:
          gradle-version: '7.6'

      - name: Grant Execute Permission For Gradlew
        run: chmod +x gradlew

      - name: Clean & Build With Gradle
        run: ./gradlew clean build -x test

      - name: Check Docker Username
        run: echo $

      - name: Docker build & Push
        run: |
          docker login -u $ -p $
          docker build -f Dockerfile -t $/ticketing-repository .
          docker push $/ticketing-repository

      - name: Deploy Images with Docker compose
        uses: appleboy/ssh-action@master
        with:
          host: $
          username: $
          password: $
          script_stop: true
          script: |
            container_ids=$(sudo docker ps -q)
            if [ -n "$container_ids" ]; then
              sudo docker stop $container_ids
              sudo docker rm $container_ids
            fi
            sudo docker pull $/ticketing-repository
            sudo docker run -d -p 8080:8080 $/ticketing-repository
            sudo docker system prune

CD는 develop 브랜치에 푸시 이벤트가 발생할 때 실행된다.

flow

  1. 프로젝트를 빌드한 후 도커에 로그인 하기 위한 사용자의 이름을 확인한다.

  2. 그 후 Docker Hub에 로그인하고, Dockfile을 사용하여 Docker 이미지를 빌드하고, Docker Hub에 푸시한다.
  3. SSH를 사용하여 원격 서버에 접속하여 현재 실행 중인 Docker 컨테이너를 중지하고 제거한다.

  4. 마지막으로 최신 이미지를 pull하고 새로운 컨테이너를 실행한 후 불필요한 Docker 데이터를 정리한다.




Github Action을 사용한 CI/CD 과정 자동화

GitHub에서 코드가 푸시되거나 PR이 생성되면 Github Action이 자동으로 실행된다.
이 과정에서 설정된 CI/CD 파이프라인이 작동하여 빌드 및 테스트가 수행되며, 만약 테스트가 실패하는 경우 이메일로 알림을 받을 수 있다.

개발 서버와 운영 서버의 환경이 달라, 애플리케이션이 운영체제에 종속되지 않도록 Docker로 이미지를 빌드하여 동일한 환경에서 동작할 수 있도록 하였다. 빌드된 이미지를 Docker Hub에 업로드하고, 운영 서버의 Docker Hub에서 이미지를 다운로드하고 실행하여 CD 자동화 작업을 수행한다.

This post is licensed under CC BY 4.0 by the author.