Backend에서 PR이 머지되면, Github action을 통해 EC2에서 DockerFile을 통해 Docker Image를 생성하고, 이를 Docker Hub에 올리고, EC2에서 Docker를 Run 시켜 운영환경을 처리하려고 하였다. 하지만 문제 상황이 발생하였는데, Docker Run을 통해 Backend Server가 Container 환경이 운용되는 시점에, EC2에서 Docker Build가 일어나면 EC2 가상환경이 터져버렸다. 아래와 같이 CPU 사용률이 95%를 넘어가게 되면서 종료가 된 것으로 보인다.
이 문제를 해결하기 위해서는 Docker Build를 다른 위치에서 해야만 했다. Local에서 하는 방식을 생각해보았는데 (개인 컴퓨터), 이 방법은 결국에 Github의 소스코드가 곧바로 배포환경에 갱신되지 않음을 의미하므로 이 방법을 채택하지 않았다.
따라서 다른 가상환경에서 이를 처리해야하겠다고 생각하였고, AWS의 서비스를 찾다가, EC2 Image Builder를 찾게 되었다. 하지만 가장 걱정되는 부분은 비용 문제였다. 한 달에 10번 이상 Image를 만드는 과정이 필요할 것으로 보였는데, 아래에 추가 비용이라는 글자가 계속 걸려서 사용이 두려웠다. (아마 다른 대안이 없었다면 그럼에도 불구하고 사용했을 것 같다)
따라서 다른 방법을 찾아야했는데, 상상도 못했던 Github action에서 Docker Build를 제공해주었다. 사실 Github action이 VM이라는 것은 알고는 있었는데, DockerFile을 Build하려면 결국 Docker가 설치되어 있어야하기 때문에, 이를 제공해주지 않을 것이라고 생각했었다. 하지만, Github action에서는 정말 편리하게 Docker Build를 제공해주고 있었고, 이를 통하여 아래와 같이 CI/CD 파이프라인을 구축하였다. shell script 같은 경우는 docker 명령어를 담고 있는 명령어이다.
name: Backend-Deploy
on:
push:
branches:
- main
paths :
- "backend/**"
jobs:
build:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: make application-secret.yml
run: |
cd ./dockerfile/backend/
touch ./application-secret.yml
echo "${{ secrets.SECRET_YML }}" > ./application-secret.yml
shell: bash
-
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: baikjonghyun/tamago
tag-semver: |
{{version}}
{{major}}.{{minor}}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: ./dockerfile/backend/
file: ./dockerfile/backend/Dockerfile
platforms: linux/amd64
push: true
tags: baikjonghyun/tamago:lastest
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_IP }}
username: ${{ secrets.REMOTE_SSH_ID }}
key: ${{ secrets.REMOTE_SSH_KEY }}
port: ${{ secrets.REMOTE_SSH_PORT }}
script: |
echo -e "\
+------------------------------------+
| run |
+------------------------------------+"
cd /home/ubuntu/dockerfile/backend
chmod +x backend_install.sh || exit 1
chmod +x delete_not_use_image_file.sh || exit 1
sudo ./backend_install.sh || exit 1
sudo ./delete_not_use_image_file.sh || exit 1
이렇게 해서 성공적으로 강건한 배포 파이프라인을 만들었다.