초기 환경설정

✅ 개발 현황

  1. 완료상황
    • CI 환경설정(main, dev)
    • pre-commit-hooks 설정
    • black, isort 린트 검사 설정
    • pytest 테스트 설정
  2. 해야할 것들
    • feature 브랜치에서도 자동 포맷팅이 될 수 있게 설정
    • oauth 설정

✅ 새로 배운 내용

🔎 CI 플로우

🔎 지속적 통합(CI)을 하는 이유

  • 코드 품질 유지
  • 빌드 자동화
  • 테스트 실행
  • 코드 분석
  • 병합 승인

✅ 회고

✍️ CI 설정

이번 프로젝트에서 처음으로 CI 설정을 했다. CI는 개발 전반에 걸쳐서 진행이 되기 때문에 프로젝트의 환경설정과 밀접하게 연관되어 있었다. 특히 이번 프로젝트는 FastAPI와 poetry를 활용해서 개발을 하기 때문에 이를 고려해서 CI 설정을 해야했다.

✍️ 코드 설명

.github > workflows > ci.yml

name: CI for Ticha Backend

on:
  push:
    branches:
      - main
      - dev
  pull_request:
    branches:
      - main
      - dev

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    # 1. 코드 체크아웃
    - name: Checkout code
      uses: actions/checkout@v3

    # 2. Python 환경 설정
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: "3.11"

    # 3. Poetry 설치 및 경로 설정
    - name: Install Poetry
      run: |
        curl -sSL https://install.python-poetry.org | python3 -
        echo "POETRY_HOME=$HOME/.local" >> $GITHUB_ENV
        echo "$HOME/.local/bin" >> $GITHUB_PATH

    # 4. 의존성 설치
    - name: Install dependencies
      run: |
        poetry install --no-root

    # 5. 린트 검사
    - name: Run code formatter check (Black)
      run: |
        poetry run black --check .

    - name: Run import sorting check (isort)
      run: |
        poetry run isort --check .

    # 6. 테스트 실행
    - name: Run tests with Pytest
      run: |
        poetry run pytest

처음에는 이게 무슨 언어인가 싶었다. 우리의 친구 chatgpt의 도움을 받으면서 스크립트를 작성해봤다. 스크립트는 크게 name, on, jobs로 구분할 수 있다.

name
on
jobs

name은 제목이다. 끗.

on은 CI 설정이 어느 시점에 진행 될지를 결정한다. 브랜치에서 일어난 push, pull_request를 기준으로 설정할 수 있다.

on:
  push:
    branches:
      - main
      - dev
  pull_request:
    branches:
      - main
      - dev

우리 프로젝트의 경우에는 main, dev 에서 push와 pull_request가 있으면 CI가 되게끔 설정을 했다. 하지만 feature 개발을 할 때도 해당 설정을 하는게 좋을 것 같다. dev에 머지를 하기 전에 ci에서 거절 당하면 그때까지 한 모든 작업들을 일일이 수정한다는 것은 별로 하고 싶지 않기 때문이다.

job은 해당 스크립트의 작업 덩어리 단위이다. 지금은 test 하나만 정의해놨다. test는 job의 이름으로 다른 이름으로 바꿀 수 있다.

jobs:
  test:
    runs-on: ubuntu-latest

runs-on은 CI를 진행할 런타임 환경을 결정한다.

job은 여러개의 step으로 구성된다.

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    # 1. 코드 체크아웃
    - name: Checkout code
      uses: actions/checkout@v3

    # 2. Python 환경 설정
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: "3.11"

    # 3. Poetry 설치 및 경로 설정
    - name: Install Poetry
      run: |
        curl -sSL https://install.python-poetry.org | python3 -
        echo "POETRY_HOME=$HOME/.local" >> $GITHUB_ENV
        echo "$HOME/.local/bin" >> $GITHUB_PATH

    # 4. 의존성 설치
    - name: Install dependencies
      run: |
        poetry install --no-root

    # 5. 린트 검사
    - name: Run code formatter check (Black)
      run: |
        poetry run black --check .

    - name: Run import sorting check (isort)
      run: |
        poetry run isort --check .

    # 6. 테스트 실행
    - name: Run tests with Pytest
      run: |
        poetry run pytest

step은 위에서 아래로 순차적으로 실행된다. 각 단계는 이전 단계가 성공한 경우에만 실행이 된다. 즉, 한 단계가 실패하면 즉시 CI가 중단되고 실패라고 뜬다. 그러면 해당부분에서 문제가 생겼기 때문에 그 부분을 수정하고 다시 푸시하면 된다.

모든 단계를 통과하면 해당 작업(jobs)가 성공한 것으로 표시된다. 모든 작업들이 성공하면 워크플로우도 성공한 것으로 간주된다.

CI 워크플로우 성공 이후에는 CD 등의 후속 작업을 할 수 있도록 설정할 수 있다.

✍️ 후기

린트부터 테스트 코드까지 자동화할 수 있어서 정신적인 에너지를 아낄 수 있게 되었다. CI 워크 플로우 설정을 토해 코드에 대해 규칙을 강제할 수 있어서 코드 품질도 보장을 할 수 있게 되었다. 프로젝트 전반으로는 main과 dev에 CI 적용을 했지만 feature 브랜치에도 적용을 하면 개인이 개발을 하는데에도 편리할 것 같다.

경우에 따라서는 개발환경마다 workflow 설정도 다르게 할 수 있지 않을까?