최근 듣고 있는 연사님의 강의를 통해 CI에 대해서 알아 볼 수 있는 시간을 가졌다.
신입 개발자에게 코딩,엔지니어링 요소도 물론 중요하지만, 해당 요소를 많이 기대하지는 않고 기본기를 많이 중요시 한다고 하시면서 CI의 중요성에 대해서 말씀해주시며 CI를 사용하는 습관을 가지면 좋겠다고 조언해주셨다.
CI란
Continuous Integration로 지속적인 통합으로 소스/버전에 대한 코드 변경사항을 주기적으로 commit & push하여 자동으로 테스트 과정을 거치고 동작이 이루어지는지 error사항은 없는지 확인 하는 것을 의미한다.
(현업에서는 시니어 개발자가 CI를 통해 error 사항이 발생했을 때 merge 되는 것을 방지하기 위해 사용한다.)
간단하게 빌드,테스트,배포의 자동화 과정이라고 할 수 있다.
Github Actions를 사용하여 repo에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행하며, CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완전히 사용자 정의된 워크플로에서 작업을 결합할 수 있다.
https://docs.github.com/en/actions
Lint: 코드의 문법 및 코드 스타일의 오류를 미리 점검하기 위해서 사용하는 툴
(ex. python: black,flake8... etc..)
name: Lint Code Base
on: push
jobs:
# Set the job key. The key is displayed as the job name
# when a job name is not provided
super-lint:
# Name the Job
name: Lint Code Base
# Set the type of machine to run on
runs-on: ubuntu-latest
env:
#OS: ${{ matrix.os }}
PYTHON: '3.7'
steps:
# Checks out a copy of your repository on the ubuntu-latest machine
- name: Checkout code
uses: actions/checkout@v2
# Runs the Super-Linter action
- name: Lint Code Base
uses: github/super-linter@v4
env:
DEFAULT_BRANCH: master
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VALIDATE_PYTHON_BLACK: true
VALIDATE_PYTHON_FLAKE8: true
경로: .github/workflows/lintcode.yml
위의 예시 코드는 yml형식으로 되어 있고 같은 폴더에 위치한 *.py file를 자동으로 확인해준다.
coverage: 작성한 코드가 테스트에 얼마만큼 충족되었는지 알려주는 툴
name: Coverage Report
# Run this workflow every time a new commit pushed to your repository
on: push
jobs:
coverage-report:
name: Coverage Report
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python 3.7
uses: actions/setup-python@v2
with:
# Semantic version range syntax or exact version of a Python version
python-version: '3.7'
# Optional - x64 or x86 architecture, defaults to x64
architecture: 'x64'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Run unit test
run: |
coverage run --source=./ -m unittest discover -p "*_test.py"
- name: Publish code coverage
uses: paambaati/codeclimate-action@v3.0.0
with:
coverageCommand: coverage xml
coverageLocations: ${{github.workspace}}/coverage.xml:coverage.py
env:
CC_TEST_REPORTER_ID: 24437f0fe93e1caa579319885785a0172b2343e17af1dfce3a8aaecc2606a51c
# codeclimate -> repo setting -testcoverage id
경로: .github/workflows/coverage.yml
+) requirements.txt
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Run unit test
run: |
coverage run --source=./ -m unittest discover -p "*_test.py"
env:
CC_TEST_REPORTER_ID: token_ID
black==19.10b0
coverage==4.3
codeclimate-test-reporter==0.2.3
해당 txt에는 lint,coverage,codeclimate등의 패키지 목록이 담겨있다.
coverage run --source=./ -m unittest discover -p "*_test.py"
-> terminal에 위의 명령어를 통해 실행 할 수 있다.
coverage xml
-> terminal에 위의 명령어를 통해 internet과 연결하는 xml file을 생성 할 수 있다.
env:
CC_TEST_REPORTER_ID: token_ID
token_ID 경로 : codeclimate -> repo setting -testcoverage ID copy
CC_TEST_REPORTER_ID의 경우, codeclimate에서 제공하는 id 값을 사용하여야 coverage의 진행률을 확인 할 수 있다.
https://docs.codeclimate.com/docs/configuring-test-coverage (참고 url)
앞선 내용에서 Git actions & lint,coverage code를 사용하여 CI를 자동화하는 과정을 살펴보았다.
앞선 과정에 대한 코드의 품질에 대한 평가 및 이를 한 눈에 보기 쉽게 시각화 해주는 사이트를 CodeClimate라고 할 수 있다.
또한, CodeClimate는 Git 계정과 연동이 가능하기 때문에 자신의 repo에 대한 품질 평가를 진행 할 수 있다.
codeclimate 사이트에서 py file별, 종합적으로 품질 평가 결과를 확인 할 수 있다.
Github repo에서도 markdown 설정을 통해 다음과 같이 확인 할 수 있다.