인프라/Github Actions

SpringBoot, Docker Github Actions CI / CD

소프 2022. 10. 22.

스프링 부트, Gradle의 bootBuildImage를 사용해 간단하게 스프링부트 도커 이미지 생성 후 Github Actions을 연동하여 서버에 배포 

(필요시 Dockerfile을 커스텀하여 이미지 생성도 가능) 

Github Actions의 자세한 사용법은 맨 하단 출처의 블로그 참고

 

./github/workflows/**.yml

name: 'build-push-prod'

on:
  push:
    branches: [ "main" ]
#  pull_request:
#    types:
#      - closed
#    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    name: build
    steps:
      # 코드 저장소로 부터 CI 서버로 코드 pull
      - name: checkout
        uses: actions/checkout@v3

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

      # gradle 빌드 실행을 위한 권한을 부여
      - name: grant execute permission for gradlew
        run: chmod +x gradlew

      - name: gradle build
        run: ./gradlew clean build

      # private 저장소일경우 로그인 필요
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: build docker
        run: ./gradlew bootBuildImage --imageName=${{ secrets.DOCKER_REPO }}

      - name: Docker push
        run: |
          docker tag ${{secrets.DOCKER_REPO}}:latest ${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DOCKER_REPO}}:latest
          docker push ${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DOCKER_REPO}}
      - name: action-slack
        uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          author_name: build & docker push # default: 8398a7@action-slack
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
        if: always() # Pick up events even if the job fails or is canceled.

  deploy:
    needs: build
    name: deploy
    runs-on: [ self-hosted, api-server, prod ] # 인식하기 위한 label 설정
    steps:
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{secrets.DOCKERHUB_USERNAME}}
          password: ${{secrets.DOCKERHUB_TOKEN}}

      - name: docker-compose.yml run
        run: |
          cd /home/prod-server/api-server
          docker-compose down
          if [ -z $(docker images -qf reference='${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DOCKER_REPO}}') ]; then
            echo "not search docker images"
            exit 1
          else
            docker rmi -f ${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DOCKER_REPO}}
            echo "docker images remove success"
            docker-compose up --build -d
            echo "api-server docker-compose start success"
          fi
          
          cd /home/prod-server/api-server2
          docker-compose down
          if [ -z $(docker images -qf reference='${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DOCKER_REPO}}') ]; then
            echo "not search docker images"
            exit 1
          else
            docker rmi -f ${{secrets.DOCKERHUB_USERNAME}}/${{secrets.DOCKER_REPO}}
            echo "docker images remove success"
            docker-compose up --build -d
            echo "api-server2 docker-compose start success"
          fi
      - name: action-slack
        uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          author_name: docker pull & deploy # default: 8398a7@action-slack
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
        if: always() # Pick up events even if the job fails or is canceled.

위 스크립트의 단점

- 서버에서 Docker image가 존재하지 않을시 수동으로 한번 받아야 한다.

- 서버 증가시 초기에 docker-compose.yml를 세팅해줘야 한다.

 

'${{ }}' 로 정의한 변수는 깃허브의 레파지토리 설정에서 할 수 있다.

 

 

서버에 Github Actions 세팅 후 연동시 주의사항

github actions와 관련된 파일은 위와 같고, root 사용자로 명령어를 진행하다가 './config.sh' 사용시 'Must not run with sudo' 라는 문구가 포함된 에러를 만날 수 있다.

root 사용자로 그대로 진행시 아래 명령어를 사전에 입력해 준후 ./config.sh를 실행해준다.

export RUNNER_ALLOW_RUNASROOT="1"
sudo ./bin/installdependencies.sh

  

./run.sh를 실행한 뒤, 1분이 지나고 Runners의 상태가 Offline가 되는 경우

idle이 진행중인 상태인데 처음에 ./run.sh로 실행하면 idel상태가 됬다가 시간이 지나면 자동으로 Offline로 바뀌는 현상

daemon 형태(항시 가동)로 실행을 시켜야 되므로 아래 ./run.sh명령어가 아닌 아래 명령어를 실행시킨다.

./svc.sh install
./svc.sh start

출처

https://www.hahwul.com/2022/07/05/macos-github-action-runner/

 

 

출처

https://bcp0109.tistory.com/362?category=1073811

https://zzsza.github.io/development/2020/06/06/github-action/

 

 

github actions runner 등록

https://docs.github.com/en/actions/hosting-your-own-runners/adding-self-hosted-runners

 

댓글