스프링 부트, 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://emgc.tistory.com/151
- bootBuildImage 사용
- https://steady-coding.tistory.com/471
- https://field-spectrum-573.notion.site/CI-CD-12366f57593d4a91a82f3ea43cb464d0
- https://emgc.tistory.com/151
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
댓글