취미가 좋다
[3-5] github action을 사용하여 CD 구축하기 본문
Continuous Deployment 과정
1. 서버에 접속해서 docker-compose.yaml 파일 작성하기
2. docker compose up
github action으로 CD 파이프라인 생성
위의 과정을 github action으로 수행해야한다.
github secrets에 2개의 secret을 추가해야 한다.
1. PRIVATE_KEY : 서버 접속에 필요한 ssh key
2. HOST : 서버 private ip
파일을 수정한다.
Dockerfile
FROM python:3.8-slim AS builder
ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt
FROM python:3.8-slim-buster
COPY --from=builder /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/
ADD templates templates
ADD app.py .
ADD utils.py .
CMD ["python", "app.py"]
docker-compose.yaml
version: "3.9"
services:
flask:
image: wellshs/docker-memo:latest
ports:
- "80:5000"
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"
volumes:
mongo:
ci-cd-pipeline.yaml
name: ci-cd-pipeline
on:
push:
branches:
- main
jobs:
run-test-code:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: "3.8"
- run: pip install -r requirements.dev.txt
- run: pytest
build-image:
needs: run-test-code
runs-on: ubuntu-latest
steps:
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
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
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/docker-memo:latest
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
cd-pipeline:
needs: build-image
name: continuos deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: copy file via ssh password
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.PRIVATE_KEY }}
port: 22
source: "docker-compose.yaml"
target: "/home/ec2-user/"
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.PRIVATE_KEY }}
port: 22
script: "docker-compose pull && docker-compose up -d"
이전에 만들었던 ci를 위한 yaml 파일에, cd를 위한 job을 추가한다.
needs : 이미지를 docker file에 올린 후, 그 이미지를 배포하기 위해서, build-image job 이후에 실행되도록 한다.
uses : 3 단계를 거친다.
1. github의 main branch 에 checkout을 한다.
2. docker-compose.yaml 을 서버로 옮긴다.
3. docker-compose up 을 실행한다.
docker-compose pull이 필요한 이유는 새롭게 업데이트된 코드를 사용하기 위함이다.
이 파일을 github repostory에 올린다.
Repository > Actions 에 들어가면, 코드를 테스트하고, 이미지를 빌드해서 올리고, 서버에 배포하는 3가지 과정이 이루어진다.
웹페이지에 접속하여 CD가 잘 이루어졌는지 확인해 본다.
지금까지 CI/CD 를 수행하는 자동화 파이프라인을 구축한 결과, 아래의 과정이 자동을 실행된다.
코드를 수정하고, github repo에 올린다.
→ 코드가 잘 동작하는 지 test
→ 이미지를 빌드하고 도커 허브에 올린다.
→ 새로 올라간 도커 허브의 이미지를 AWS 서버에서 가져와서 띄운다.
→ 변경된 코드가 적용된 웹 페이지를 볼 수 있다.
따로 코드에 오류가 없는지 테스트할 필요가 없고, 도커허브에 새로운 이미지를 업데이트하거나, 서버에서 새로운 이미지를 가져와서 다시 컨테이터를 띄울 필요가 없어졌다.
현재 CD 파이프라인의 문제점
1. docker image의 tag를 항상 동일하게 latest를 사용
이미지간 차이점이 있을테니, 사람이 알아볼 수 있는 tag를 사용하는 것이 더 좋다.
2. 배포할 때, 기존 컨테이너가 내려가고, 새로운 컨테이너가 올라간다.
그 잠깐 사이에 응답을 하지 못할 수 있다. 이는 서버의 구조 자체를 바꿔야 하는 부분이다.
'Sparta Coding Club > Docker' 카테고리의 다른 글
[3-6] 사용한 리소스 정리하기 (0) | 2021.08.05 |
---|---|
[3-4] github action으로 CI 파이프라인 구축하기 (0) | 2021.08.05 |
[3-3] CI / CD 란? (0) | 2021.08.05 |
[3-2] 도커가 편한 이유 (0) | 2021.08.05 |
[3-1] AWS로 서비스 배포하기 (0) | 2021.08.04 |