취미가 좋다

[3-5] github action을 사용하여 CD 구축하기 본문

Sparta Coding Club/Docker

[3-5] github action을 사용하여 CD 구축하기

benlee73 2021. 8. 5. 17:45

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. 배포할 때, 기존 컨테이너가 내려가고, 새로운 컨테이너가 올라간다.

그 잠깐 사이에 응답을 하지 못할 수 있다. 이는 서버의 구조 자체를 바꿔야 하는 부분이다.

Comments