간단한 동아리 프로젝트를 하면서 pull request merge받기 전 작동을 하는지 간단하게 테스트 하고 싶어서 만들어 봤습니다.
# 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: API Test
on:
pull_request:
branches: [ "dev" ]
jobs:
api_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10.9
uses: actions/setup-python@v4
with:
python-version: "3.10.9"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pipenv
- id: cache-pipenv
uses: actions/cache@v3
with:
path: ~/.local/share/virtualenvs
key: ${{ runner.os }}-pipenv-${{ hashFiles('**/Pipfile.lock') }}
- name: Make .ENV
env:
mongo_user: admin_user
mongo_password: password
mongo_host: localhost
mongo_port: 27017
run: |
mkdir env
echo "MONGO_INITDB_ROOT_USERNAME=$mongo_user" >> ./env/.db.env
echo "MONGO_INITDB_ROOT_PASSWORD=$mongo_password" >> ./env/.db.env
echo "mongo_user=$mongo_user" >> ./env/.server.env
echo "mongo_password=$mongo_password" >> ./env/.server.env
echo "mongo_host=$mongo_host" >> ./env/.server.env
echo "mongo_port=$mongo_port" >> ./env/.server.env
- name: Install dependencies
if: steps.cache-pipenv.outputs.cache-hit != 'true'
run: |
pipenv install --dev
- name: Run Docker Compose
run: docker compose up -d
- name: Run Test
run: |
pipenv run pytest
간단하게 하나씩 보겠습니다.
dev branch에서 작업을 진행했기 때문에 dev에 pull request 이벤트가 들어오면 실행되도록 했습니다.
on:
pull_request:
branches: [ "dev" ]
가상 머신은 우분투이고 먼저 해당 브랜치로 checkout합니다. 그리고 파이썬 환경을 만들어줍니다.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10.9
uses: actions/setup-python@v4
with:
python-version: "3.10.9"
프로젝트 환경은 pipenv에서 가상환경을 만들어 진행했기 때문에 pipenv를 설치해줍니다.
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pipenv
github action을 할 때마다 새로운 가상머신이 생성되기 때문에 시간을 덜 들이기 위해 캐싱이 필요합니다. pipenv는 아래처럼 캐싱할 수 있습니다. 그리고 cache-hit가 아닐때만 새로 가상환경을 설치해줍니다.
- id: cache-pipenv
uses: actions/cache@v3
with:
path: ~/.local/share/virtualenvs
key: ${{ runner.os }}-pipenv-${{ hashFiles('**/Pipfile.lock') }}
- name: Install dependencies
if: steps.cache-pipenv.outputs.cache-hit != 'true'
run: |
pipenv install --dev
그 다음에 서버와 DB를 위한 환경 변수를 설정해줍니다. db는 docker로 열어놨기 때문에 docker compose up -d를 통해 열어주고 pytest를 진행하도록 했습니다.
- name: Make .ENV
env:
mongo_user: admin_user
mongo_password: password
mongo_host: localhost
mongo_port: 27017
run: |
mkdir env
echo "MONGO_INITDB_ROOT_USERNAME=$mongo_user" >> ./env/.db.env
echo "MONGO_INITDB_ROOT_PASSWORD=$mongo_password" >> ./env/.db.env
echo "mongo_user=$mongo_user" >> ./env/.server.env
echo "mongo_password=$mongo_password" >> ./env/.server.env
echo "mongo_host=$mongo_host" >> ./env/.server.env
echo "mongo_port=$mongo_port" >> ./env/.server.env
- name: Run Docker Compose
run: docker compose up -d
- name: Run Test
run: |
pipenv run pytest
deploy까지 신경쓰면 test하는 방법도 바꿔야할 것 같은데 이부분은 조금 찾아보고 구조랑 github workflow 파일들도 모두 변경해야할 것 같습니다.