한이음 공모전에서 진행하는 trading app을 개발하기 전에 자동화를 구축하려고 한다.
Github Access Token은 Packages의 권한을 가진다.
Github Container Registry로 docker image를 배포하고 EC2(runner) 실행 할 때 docker login에 사용된다.
Github 계정의 Settings -> Developer settings -> Personal access tokens에서 새로운 token을 만들어준다.
위 사진처럼 4개의 scopes를 선택해주고 생성한 뒤에 생성된 토큰을 복사해 Repository의 secret에 등록해서 사용한다.(실제 계정 토큰이므로 노출되어서는 안됨)
Repository의 Settings -> Actions에서 New repository secret을 눌러 만들어준다.
요기서 Feature preview를 눌러서 Enable을 눌러줘야 build and push가 가능하다고 한다.
Repository의 Actions 탭에서 set up a workflow yourself 버튼을 눌러 yml 파일을 작성한다.
name: CI/CD Docker
on:
push:
branches: [ master ]
env:
DOCKER_IMAGE: ghcr.io/${{ github.actor }}/trading
VERSION: ${{ github.sha }}
NAME: go_cicd
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Check out source code
uses: actions/checkout@v2
- name: Set up docker buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Cache docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ env.VERSION }} # runner 설정에서 읽어들일거에요.
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to ghcr
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
builder: ${{ steps.buildx.outputs.name }}
push: true
tags: ${{ env.DOCKER_IMAGE }}:latest
deploy:
needs: build
name: Deploy
runs-on: [ self-hosted, label-go ]
steps:
- name: Login to ghcr
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Docker run
run: |
docker stop ${{ env.NAME }} && docker rm ${{ env.NAME }} && docker rmi ${{ env.DOCKER_IMAGE }}:latest
docker run -d -p 8080:5000 --name go_cicd --restart always ${{ env.DOCKER_IMAGE }}:latest
on:
push:
branches: [ master ]
env:
DOCKER_IMAGE: ghcr.io/${{ github.actor }}/trading
VERSION: ${{ github.sha }}
NAME: go_cicd
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Check out source code
uses: actions/checkout@v2
- name: Set up docker buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Login to ghcr
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
builder: ${{ steps.buildx.outputs.name }}
push: true
tags: ${{ env.DOCKER_IMAGE }}:latest
deploy:
needs: build
name: Deploy
runs-on: [ self-hosted, label-go ]
steps:
- name: Login to ghcr
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Docker run
run: |
docker stop ${{ env.NAME }} && docker rm ${{ env.NAME }} && docker rmi ${{ env.DOCKER_IMAGE }}:latest
docker run -d -p 8080:5000 --name go_cicd --restart always ${{ env.DOCKER_IMAGE }}:latest
Repository의 Settings -> Actions -> Runners로 가서 Add Runner를 누르고
자신의 서버에 맞은 OS와 아키텍처를 선택하고 사진과 같이 configure까지 코드를 EC2 서버에 접속해 입력하여 runner를 달아줘야 한다.
Configure의 첫 번째 코드까지를 입력하게 되면
이 두 개를 입력해야하는 상황이 발생하는데
첫 번째에 대한 답은 복수개의 runner를 등록할 때 github 상에서 구분할 수 있는 runner의 이름을 지정하면 되고(나는 trading으로 지었다.)
두 번째에 대한 답은 실행되는 runner를 구분하기 위한 것이므로 yml 파일의 Deploy에서 runs-on에 설정해주었던 label-go를 입력하면 된다.
-> 둘 다 임의로 변경 가능
이렇게 설정한 이름은 Repository의 Settings -> Actions에서 확인할 수 있다.
마지막으로 ./run.sh
를 실행하면
다음과 같은 결과를 볼 수 있다.
./run.sh
은 다른 작업을 하지 못하므로 nohup ./run.sh &
를 이용해 백그라운드로 runner를 실행시킨다.
이제 서버에서는 Job을 Listening하고 지정한 branch에 push가 되면 자동으로 EC2에 이미지가 실행되고 자동으로 배포된다.
나는 Repository가 Organization에 있어서 buildx call failed
라는 오류를 만났는데 문서를 참고하여 오류를 해결했다.
Organization의 Settings에서 Packages의 Enable improved container support를 체크해주면 된다.