hotamul의 개발 이야기

[Flask] Github Action CI (Flask & Docker) 본문

Dev./Flask

[Flask] Github Action CI (Flask & Docker)

hotamul 2022. 8. 12. 00:43

지난 포스트 [Flask] Flask & docker-compose wait for db에서 docker-compose를 이용할 때 Flask app이 db보다 먼저 실행되는 문제를 해결했었다.

이번 포스트에는 Github Action을 이용해 CI 구축을 해보고자 한다.

docker hub token setting

[Flask] Flask & Docker (Dockerfile 작성 방법), [Flask] Flask & docker-compose wait for db을 보면 python:3.8-alpine3.13, postgres:13-alpine 이미지를 사용하고 있다. 따라서 Github Action에서 해당 이미지를 가져올 수 있도록 Docker hub user, Docker hub token을 설정해줘야 한다.

docker hub에 로그인 한 뒤 Account Settings에 들어간다.

그리고 Security - New Access Token에 들어간다.

원하는 이름으로 Description을 작성하고 Generate 버튼을 클릭한다.

docker login -u 유저이름 에서 유저이름을 복사하고 Github repository로 이동한다. (위에 생성된 token은 창을 닫으면 다시 볼 수 없으니 주의하자. 사실 다시 만들면 되긴 한다.)

Github repository - Settings - Secrets - Actions 메뉴에 들어간 뒤 New repository secret을 클릭한다.

그리고 Name은 DOCKERHUB_USER Value는 복사했던 유저이름을 붙여넣은 다음 저장한다.

Token 도 똑같이 해서 아래와 같이 생성하면 Docker Hub에 로그인 할 준비는 끝났다.

.github/workflows/checks.yml

이제 yml 파일을 작성해 보자.

해당 프로젝트 root 위치(Dockerfile, docker-compose.yml이 있는 위치)에 .github/workflows/checks.yml 파일을 생성한다.

---
name: Checks

on: [push]

jobs:
  test-lint:
    name: Test and Lint
    runs-on: ubuntu-20.04
    steps:
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Checkout
        uses: actions/checkout@v2
      - name: Test
        run: docker-compose run --rm app sh -c "sh ./scripts/wait-for-postgres.sh -- pytest"
      - name: Lint
        run: docker-compose run --rm app sh -c "flake8"

나는 모든 branch에 해당 action이 실행되게 하기 위해서 따로 branch를 설정하지는 않았다.

간단하게 설명하면 action job의 이름은 Test and Lint이고 ubuntu-20.04 버전을 사용한다.

steps 부분을 보면 총 4단계로 구성되어 있다.

  1. Docker Hub에 로그인
    Github Settings - Secrets 에 생성했던 DOCKERHUB_USER, DOCKERHUB_TOKEN을 사용하여 docker hub에 로그인한다.
  2. Git Checkout
    GitHub의 코드 저장소에 올려둔 코드를 Github Action이 실행되는 서버로 내려받은 후에 특정 브랜치로 전환하는 단계이다.
  3. Test
    해당 서버에서는 docker-compose build 작업이 없었기 때문에 docker-compose build작업이 선행된다. (이때 docker hub에서 이미지를 가져오게 된다.)
    pytest 앞에 sh ./scripts/wait-for-postgres.sh가 있는 이유는 이전 포스트([Flask] Flask & docker-compose wait for db)에서 해결했던 service 실행 순서 문제 때문에 Test에서 psycopg2.OperationError가 발생할 수 있기 때문에 꼭 작성해줘야 한다.
  4. Lint
    flake8을 이용해서 code style 검사까지 진행한다.

yml 파일까지 작성하면 끝이다.

 

이제 git add, commit, push하고 Github Repository Actions 메뉴를 들어가면 작성했던 Job이 실행되는 것을 확인 할 수 있다.

Comments