Github Action을 이용하여 파이썬 코드를 확인하고, 자동적으로 Docker Image로 빌드해주는 CI를 구현해보는 실습을 진행하였다.
이를 기억하기 위해 관련 이론과 실습 내용을 문서로 정리해본다.
🌟새롭게 알게 된 점
Git Action에서 여러 Template을 지원해준다는 것을 알게됨
Github Actions란?
- CI/CD를 위한 Github서비스
- Workflow라고 불림
1) Workflow
- Workflow는 트리거 이벤트가 발생하면 시작되는 일련의 동작들을 의미함
- 트리거 이벤트 example : 코드 커밋, PR, 다른 Workflow의 성공적인 실행 등
- Workflow의 명령어들은 YAML파일로 저장됨
- Workflow는 Job들로 나눠지며 각 Job은 일련의 스텝을 수행
- 스텝은 1개 이상의 명령어 실행
- 스텝은 윈도우나 리눅스 서버 위에서 runner에 의해 실행.
Docker Image에서 수행하는 것이 서비스 배포 관점에서 더 일반적임
2) CI Template
workflow는 레파지토리의 Actions 메뉴에서 생성 가능하다.
Github에서는 CI Template을 제공하여, 파이썬 코드 스타일 체크나, 도커 이미지 빌드등이 가능하다.
그 중 Python application과 Docker Image 템플릿을 이용하여 실습을 진행해본다.
생성한 워크플로우는 .github/worflows에 yaml파일로 저장된다.
3) Python application
테스트 코드를 돌리거나 파이썬 코드 스타일을 검증해주는 CI Template이다.
기본 configure 파일 (python-app.yml)
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python application
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pytest
- step 아래에 name과 run으로 실행할 작업들을 써넣는다.
- 기본으로 pytest를 테스트 프레임워크로 제공하는데 이를 unittest로도 작성 가능함
- - name: Test with unittest
run: |
python -m unittest discover -p 'test*.py'
- - name: Test with unittest
- flake8는 파이썬 코드 스타일을 체크해주는 툴이다.
4) Docker Image
Docker Image 또한 CI Template으로 제공한다.
name: Docker Image CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: docker login
env:
DOCKER_USER: ${{secrets.DOCKER_USER}}
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
run:
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
- name : Build the Docker image
run : docker build --tag ${{secrets.DOCKER_USER}}/hangman:latest .
- name: docker push
run: docker push ${{secrets.DOCKER_USER}}/hangman:latest
- 위 코드는 docker login -> docker build -> docker push 과정을 통해,
만든 docker image를 로그인한 docker hub 계정의 repository로 업로드 하는 코드이다. - Docker hub의 ID와 Password는 Settings의 Security> Secrets and variables에서 Actions에서 변수로 등록해주었다.
- 변수로 등록한 것은 yaml파일에서 ${{ }} 로 사용할 수 있다
5) 실습
Python application과 Docker Image의 CI Template으로 작성한 예시는 아래 레파지토리에서 확인할 수 있다.
https://github.com/HyeM207/hangman_web
또한, CI의 빌드가 잘 통과되었는지는 Commit 시 옆에 뜨는 체크표시를 통해 확인 가능하다.