[Web] NCP + Github Actions 배포 자동화

박성우·2023년 9월 26일
0

Web

목록 보기
3/3

Naver Cloud Platform과 Github Actions를 이용해서 배포 자동화를 하는 데 있어서 처음에 고려한 몇 가지 선택지가 있었는데,

  • SSH와 스크립트를 이용한 배포
  • Docker를 통한 배포
  • Docker와 NCP Registry를 통한 배포

스크립트를 이용한 배포는 사실상 수동 배포를 위한 커맨드를 그대로 자동화하는 것과 다름이 없어서 Docker를 사용하기로 결정했고 나머지 두 개의 차이점은 Docker 허브에 이미지를 푸쉬하고 풀 받을 지, NCP Registry에 이미지를 푸쉬하고 풀 받을 지의 차이였다.

NCP Registry를 이용할 경우 이미지 파일을 저장하기위해 Object Storage 또한 사용해야 하기 때문에, 비용적으로나 효율적으로도 Docker 허브를 사용하는 것이 더 좋을 것이라고 판단했다.

AWS를 통해서도 배포 자동화를 해본 적이 있는데, AWS의 S3가 NCP의 Object Storage와 유사하고, AWS Code Deploy가 CD라는 측면에서 NCP Registry가 유사한 방식 같았다.

AWS Code Deploy의 경우에는 Docker를 이용할 필요없이 S3와 Code Deploy만으로도 배포가 가능하고 NCP Registry는 Docker를 사용해야한다는 점에서 Code Deploy가 더 간편한 서비스이지 않나 싶다.

결국 Docker 허브에 이미지를 푸쉬하고 이미지를 컨테이너로 배포하는 방식을 택했고, 이를 위해 Github Actions의 workflows에 작성한 코드는 다음과 같다.

name: Auto deploy to NCP
run-name: Running
on:
  push:
    branches:
      - develop

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # 체크아웃 및 JDK 세팅
    - name : Checkout
      uses: actions/checkout@v3
      with:
        ref: develop
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'zulu'
    # Secret YML 파일 생성
    - name: Setting secret
      run: |
        mkdir -p src/main/resources
        echo "${{ secrets.SECRET_YML }}" | base64 --decode > src/main/resources/application-secret.yml
        find src
      shell: bash
    # Gradle 권한 부여
    - name: Grant permission for gradlew
      run: chmod +x ./gradlew
    # Test 없이 빌드
    - name: Build with Gradle
      run: ./gradlew clean build -x test
    #빌드한 jar 파일을 도커 이미지로 빌드하고 도커 허브에 푸시
    - name: web docker build and push
      run: |
        docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
        docker build -t ${{ secrets.DOCKER_REPO }}/my-project .
        docker push ${{ secrets.DOCKER_REPO }}/my-project

  deploy:
    # needs를 통해 build job이 수행 성공시에 작업되도록 설정
    needs: build
    runs-on: ubuntu-latest

    steps:
    # NCP 로그인 / docker image pull & run
    - name: NCP login and docker image pull and run
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.NCP_HOST }}
        username: ${{ secrets.NCP_USERNAME }}
        password: ${{ secrets.NCP_PASSWORD }}
        port: ${{ secrets.NCP_PORT }}
        script: |
          sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          sudo docker stop $(sudo docker ps -a -q)
          sudo docker rm -f $(sudo docker ps -a -q)
          sudo docker pull ${{ secrets.DOCKER_REPO }}/my-project
          sudo docker run -d -p 8080:8080 ${{ secrets.DOCKER_REPO }}/my-project
          sudo docker image prune -f
          ps -ef | grep 

이 과정을 진행하면서 주의할 점은 프로젝트에 추가될 application-secret.yml 파일을 포함한 시크릿 정보들을 아래와 같은 부분에 생성해주어야 한다.

SECRET.YML의 경우 Base64로 인코딩해서 기입하고, application-secret.yml 파일이 생성될 때는 디코딩해서 생성되도록 하였다.

또한, Docker 이미지를 빌드하는데 Dockerfile이 필요한데, 프로젝트의 Dockerfile 명명과 함께 최상위 폴더에 생성해주면 된다.

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]\
EXPOSE 8080

다음과 같이 Git Actions를 통한 배포 자동화가 성공한 것을 볼 수 있다.


Reference

https://sungbin.dev/post/NCP%20Container%20Registry%EB%A5%BC%20%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC%20CI%C2%B7CD%20%ED%99%98%EA%B2%BD%20%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0
https://devjong12.tistory.com/50

profile
Backend Developer

0개의 댓글