참고자료

django 어플리 케이션을 Github Action 으로 배포를 자동화 해놓았었는데
name: Build And Deploy
on:
pull_request:
branches:
- main
types:
- closed
jobs:
deploy:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Docker login
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker Build and Push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:${{ github.event.pull_request.number }}, ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
cd ~/${{ secrets.REPOSITORY_NAME }}
sudo echo "${{ secrets.DOT_ENT }}" > .env
sudo docker rm -f ${{ secrets.REPOSITORY_NAME }} || true
sudo docker rmi -f ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest || true
sudo docker run -d --name ${{ secrets.REPOSITORY_NAME }} -p 8001:8000 --env-file .env ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest
모든 dockerfile이 build 될때마다 너무 많은 시간을 소비 했다
특히 requirments.txt 를 pip install 하는 부분은 항상 고민이었다.
그렇게 docker/build-push-action@v2 액션에 구현되어있는 cache 기능을 이용해 도커 이미지 캐쉬를 이용하였다.
name: Build And Deploy
on:
pull_request:
branches:
- main
types:
- closed
jobs:
deploy:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Docker login
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker Build and Push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:${{ github.event.pull_request.number }}, ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
cd ~/${{ secrets.REPOSITORY_NAME }}
sudo echo "${{ secrets.DOT_ENT }}" > .env
sudo docker rm -f ${{ secrets.REPOSITORY_NAME }} || true
sudo docker rmi -f ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest || true
sudo docker run -d --name ${{ secrets.REPOSITORY_NAME }} -p 8001:8000 --env-file .env ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest
docker/build-push-action@v2 액션에서 with 절에서 사용된
cache-from: type=gha
cache-to: type=gha,mode=max
가 보인다.
위 처럼 작성하게 되면 requirements.txt 가 변경되지 않았다면 캐싱되어있는 도커 이미지 레이러를 사용하게 되어 더욱 빠른 docker build 가 가능하다.
필자는 1분 10초정도 이득을 봤다…