IAS - Github Actions를 사용한 배포 자동화 구축

IKNOW·2024년 2월 26일
0

See space

목록 보기
6/9
post-thumbnail

나는 이전에 Jenkins와 Github Actions를 사용한 배포를 각각 진행해 본 경험이 있는데, 이번 프로젝트에서는 Github Actions를 사용하기로 결정했다. Jenkins의 장점인 모든 CICD과정을 한곳에서 한번에 볼수 있다는 장점이 크지만, 이번 프로젝트는 클라우드 환경이 아니고, github actions의 단점이라고 생각했던 '나온지 얼마 안되어서 너무 자주 바뀐다'는 문제도 점점 해소가 되어간다고 생각되어 Github Actions를 사용하기로 하였다.

우선 과정은
Build -> Test -> build Docker container로 나눌 수 있다.

  1. Build
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'corretto'

      - name: create properties for CI Test
        run: |
          cd src/main/resources
          echo "${{ secrets.OAUTH_PROPERTIES }}" > oauth.properties
          echo "${{ secrets.SECURITY_PROPERTIES }}" > security.properties
          echo "${{ secrets.APPLICATION_PROPERTIES }}" > application.properties

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        run: ./gradlew clean build -x test

checkout을 통해 소스코드를 받아오고 환경으로는 JDK21을 사용한다.
secrets에 선언된 *.properties파일들을 생성하고
gladlew에 실행 권한을 부여한다.
gradle을 사용하여 애플리케이션을 빌드한다.

  1. Test
      - name: Run Tests
        run: |
          ./gradlew --info test

      - name: Upload Artifact
        uses: actions/upload-artifact@v3
        with:
          name: springboot-jar
          path: build/libs/*.jar

테스트를 실행한다.
단 이 프로젝트에서는 Testcontainer가 적용되었기 때문에
외부 TEST DB 또는 Mocking 테스트가 아닌 docker container 기반의 DB가 생성되고 사용된다.

  1. 배포
    여기서 조금 해맨 부분이 존재하는데 Github Actions는 Job간 격리가 되어 있기 때문에 서로 다른 PC라고 생각하는 것이 좋다.
    병렬적으로 일을 진행할 수 있다면 더 빠르게 처리할 수 있다는 장점이 존재하지만, 전체적인 build -> deploy과정에서는 반드시 build가 선행되어야 하기 때문에 needs를 통해 build이후에 처리하도록 처리하였다.

또한 Job간 격리가 되어 있기 때문에 빌드된 애플리케이션을 바로 사용하는 것이 아니라. actions의 download-artifact를 사용해 빌드된 애플리케이션을 전송 받아야 한다.

다음으로는 SCP action을 사용해서 빌드된 이미지를 배포를 진행할 서버로 옮겨준다.
secret에 저장된 host, username, priv_key를 사용해 배포에 필요한 .jar, Dockerfile, docker-compose-spring.yml을 복사한다.

마지막으로 SSH를 사용해 서버에 접속하고 docker-compose를 사용해 Docker image를 빌드하고 실행한다.

  deploy:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - uses: actions/checkout@v3
      - name: Download Artifact
        uses: actions/download-artifact@v3
        with:
          name: springboot-jar
          path: build/libs

      - name: SCP Action
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.HOST_4800H }}
          username: ${{ secrets.USERNAME_4800H }}
          key: ${{ secrets.PRIVATE_KEY_4800H }}
          source: "build/libs/*.jar, Dockerfile, docker-compose-spring.yml"
          target: "~/prod/ias"

      - name: SSH Action
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST_4800H }}
          username: ${{ secrets.USERNAME_4800H }}
          key: ${{ secrets.PRIVATE_KEY_4800H }}
          script: |
            cd ~/prod/ias
            docker-compose -f docker-compose-spring.yml up -d --build 

이것으로 스프링 백엔드의 간단한 배포 자동화를 구현하였으며, 현재 배포에 걸리는 시간은 약 3분 정도이다.

지금 당장 생각나는 배포 시간을 줄이는 방법은 gradle캐시를 사용하여 빌드 타임을 줄이는 방법 정도가 생각나는데 다음에 적용하고 또한 포스팅 해야 겠다.

profile
조금씩,하지만,자주

0개의 댓글

관련 채용 정보