배움 기록/Programming

[Github actions] CI 구축하기 (feat. workflow yaml파일)

Spezi 2024. 3. 1. 19:03
반응형

이미지 출처 https://blog.openreplay.com/what-is-a-ci-cd-pipeline/

 

CI/CD pipeline 이란?

CI/CD 파이프라인은 소프트웨어 개발 프로세스의 일환으로, Continuous Integration (CI, 지속적 통합) 및 Continuous Deployment/Delivery (CD, 지속적 배포/배달)의 약자다. 이는 소프트웨어를 개발하고 배포하는 과정을 자동화하고 지속적으로 진행함으로써 소프트웨어의 품질을 향상시키고 개발 및 배포 과정을 더욱 효율적으로 만드는 방법이다.
 

  • Continuous Integration (CI, 지속적 통합):
    • CI는 개발자들이 코드를 공유 레포지토리에 푸시할 때마다 자동으로 소프트웨어를 빌드하고 테스트하는 과정을 말함
    • 즉, new code가 기존에 존재하는 codebase에서 works 하는지 아닌지 알고자함
    • 테스트가 fail 하면 개발자들이 fix 해서 main branch로 merge 전에 수정할 수 있음
  • Continuous Deployment/Delivery (CD, 지속적 배포/배달):
    • CD는 CI를 통과한 코드 변경 사항이 자동으로 프로덕션 환경으로 배포되는 과정을 말함
    • Continuous Delivery에서는 코드 변경 사항을 프로덕션 환경으로 자동으로 배포하지만, 배포를 트리거하기 위해 수동으로 승인하는 단계가 포함될 수 있음
    • Continuous Deployment에서는 코드 변경 사항이 자동으로 프로덕션 환경으로 배포됨.

오늘은, Github actions를 이용해서 CI를 구축하는 방법에 대해 알아보고자 한다.
 

Github actions 이란?

GitHub Actions은 GitHub에서 제공하는 자동화 및 워크플로우 도구로, 레포지토리에서 발생하는 이벤트(pushes, pull requests, issue creation, etc)에 대한 응답으로 다양한 작업을 실행할 수 있음   CI/CD 작업을 자동화할 수 있다.
 

Workflow 파일 만들기

workflow는 Github actions을 구성하는 구성요소 중 하나인데, `.github/workflows` 디렉터리에 YAML 파일로 저장된다.
이제 이 YAML 파일에 어떤 내용을 써야 하는지 하나씩 보도록 해보자.
참고로 이 workflow파일은 나의 요구의 맞게 만들어진 것이지 이렇게 써야만 하는 것은 당연히 아니다.
 
자세한 설명은 각 코멘트에 달아놓았다.

# 작업의 이름을 정의함
name: CI

# 워크플로우가 실행되는 조건을 정의함. 여기서는 push 이벤트가 트리거로 설정되어있음
on:
  push:

# 수행할 작업을 정의함
jobs:
  build:
    name: Build & Test
    # 작업이 실행될 환경을 정의함
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10"]
    # 환경변수를 설정함
    env:
      PYTHONPATH: /my/path/to/project:/my/second/path
      MODULE_ROOTS: "src tests 등등"
    steps:
      # 액션이 실행되면 현재 저장소의 코드를 클론하고 작업 디렉토리로 가져온다.
      - name: Checkout code
        uses: actions/checkout@v3
        
      # 특정 Python 버전을 설치
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v3
        with:
          python-version: ${{ matrix.python-version }}
          
      # pip 업그레이드 및 requirements 설치
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install -r requirements.txt
          
      # autopep8 을 사용하여 코드 스타일 검사
      # 나는 configure/.pep8rc 에 configure를 따로 함. 예를들어 max_line_length 를 100으로 설정함
      # 위에서 지정한 $MODULE_ROOTS 에 대해 코드 스타일을 검사하게 됨
      - name: Check code style with autopep8
        run: |
          python -m pycodestyle --config=configure/.pep8rc $MODULE_ROOTS
      
      # pylint로 코드 분석. 가독성, 잠재적인 버그 등을 검사하여 개선할점을 제안해줌
      # 위와 비슷하게, --rcfile=configure/.pylintrc를 통해서 pylint의 옵션을 따로 설정함.
      # 그럴 필요가 없으면 이부분은 지우고 $(git ls-files '*.py')만 쓰면됨
      - name: Analysing the code with pylint
        run: |
          pylint --rcfile=configure/.pylintrc $(git ls-files '*.py')
	
      # 'test_'로 시작하는 파일들에 대해 unittest를 실행함
      - name: Run Unittests
        run: |
          python -m unittest discover -s tests -p 'test_*.py'

 
 

 


배움을 기록하기 위한 공간입니다. 
수정이 필요한 내용이나 공유하고 싶은 것이 있다면 언제든 댓글로 남겨주시면 환영입니다 :D

반응형