Github Action은 event, job, step을 정의하기 위해 YAML 파일을 사용하니 ./github/workflows 폴더에 yml를 추가해준다.
github Actions에 들어가면 처음에 기본 형태를 가지고 올 수 있다.
또 필요한 값들은 Settings > Secrets 에 필요한 값들을 아래와 같이 셋팅해준다.
워크 플로우 이름 지정
name: CI/CD Docker
해당 이름으로 github에 워크플로우가 생성된다.
on:
push:
branches: [ main ]
push할 때 동작할 branch를 입력해준다.
main 브랜치에 push 되었을 때 이벤트를 통해 이 워크플로우가 실행된다.
들어가면 YAML 파일에 정의된 job이 성공했는지와 걸린시간이 나온다
그 안에 들어가면 로그를 볼 수 있다.
해당 job은 yml 파일에 정의해준다.
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Report Status
if: always()
uses: 8398a7/action-slack@v3
with:
status: custom
custom_payload: |
{
text: "${{ env.DOCKER_IMAGE }} ${{ env.ENV_NAME }} deploy *STARTED*"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- 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.ACCESS_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
builder: ${{ steps.buildx.outputs.name }}
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ env.DOCKER_IMAGE }}:${{ env.VERSION }}
- name: action-slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
notify_when: 'failure'
author_name: ${{ env.DOCKER_IMAGE }} ${{ env.ENV_NAME }} deploy ${{ job.status }} # default: 8398a7@action-slack
fields: commit,workflow
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
if: failure() # Pick up events even if the job fails or is canceled.
deploy:
needs: build
name: Deploy
runs-on: [ self-hosted, label-toy-api-prod ]
steps:
- name: Login to ghcr
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Docker run
run: |
docker ps -q --filter "name=${{ env.CONTANIER_NAME1 }}" | grep -q . && docker stop ${{ env.CONTANIER_NAME1 }} && docker rm -fv ${{ env.CONTANIER_NAME1 }}
docker run -d \
-e VIRTUAL_HOST=${{ env.DOMAIN_NAME }} \
-e DB_HOST=${{ secrets.DB_HOST }} \
-e DB_NAME=${{ secrets.DB_NAME }} \
-e DB_USER=${{ secrets.DB_USER }} \
-e DB_PASS=${{ secrets.DB_PASS }} \
-e DB_PORT=${{ secrets.DB_PORT }} \
-e NODE_ENV=production \
-e CONTANIER_NAME=${{ env.CONTANIER_NAME1 }} \
--name ${{ env.CONTANIER_NAME1 }} \
--restart always ${{ env.DOCKER_IMAGE }}:${{ env.VERSION }}
docker ps -q --filter "name=${{ env.CONTANIER_NAME2 }}" | grep -q . && docker stop ${{ env.CONTANIER_NAME2 }} && docker rm -fv ${{ env.CONTANIER_NAME2 }}
docker run -d \
-e VIRTUAL_HOST=${{ env.DOMAIN_NAME }} \
-e DB_HOST=${{ secrets.DB_HOST }} \
-e DB_NAME=${{ secrets.DB_NAME }} \
-e DB_USER=${{ secrets.DB_USER }} \
-e DB_PASS=${{ secrets.DB_PASS }} \
-e DB_PORT=${{ secrets.DB_PORT }} \
-e NODE_ENV=production \
-e CONTANIER_NAME=${{ env.CONTANIER_NAME2 }} \
--name ${{ env.CONTANIER_NAME2 }} \
--restart always ${{ env.DOCKER_IMAGE }}:${{ env.VERSION }}
docker image prune -af
- name: action-slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
author_name: ${{ env.DOCKER_IMAGE }} ${{ env.ENV_NAME }} deploy ${{ job.status }} # default: 8398a7@action-slack
fields: commit,workflow
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
if: always() # Pick up events even if the job fails or is canceled.
Action Runner가 Github Action을 실제로 돌리는 프로그램
AWS EC2 에 runner를 설치해주고 도커 설치합니다