Github Action PR merge 전 테스트 하기

BSH·2023년 6월 1일
0

간단한 동아리 프로젝트를 하면서 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 파일들도 모두 변경해야할 것 같습니다.


참고

github-cation(Python + Pipenv + Postgres)

profile
컴공생

0개의 댓글