๐ก CI๋ ๋น๋/ํ ์คํธ ์๋ํ ๊ณผ์ ์ ๋งํ๋ฉฐ, ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ํ ํ๋ก์ธ์ค์ธ โ์ง์์ ์ธ ํตํฉโ์ ์๋ฏธํ๋ค.
CI๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์๋ก์ด ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ๊ธฐ์ ์ผ๋ก ๋น๋ ๋ฐ ํ ์คํธ ๋์ด ๊ณต์ ๋ ํฌ์งํ ๋ฆฌ์ ํตํฉ๋๋ค.
โ ๋ฐ๋ผ์, ์ด๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋ ์ฝ๋ ์์ ์ ํ ๊ฒฝ์ฐ ์๋ก ์ถฉ๋ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
CI๋ ์ปค๋ฐํ ๋๋ง๋ค ๋น๋์ ์ผ๋ จ์ ์๋ ํ ์คํธ๊ฐ ์ด๋ฃจ์ด์ ธ ๋์์ ํ์ธํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํ ์ค๋ฅ๊ฐ ์๊ธฐ๋ ๋ถ๋ถ์ด ์๋๋ก ๋ณด์ฅํ๋ค. ์ฆ, ํด๋์ค์ ๊ธฐ๋ฅ์์๋ถํฐ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ์๋ก ๋ค๋ฅธ ๋ชจ๋์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ๋ํ ํ ์คํธ๋ฅผ ์ํํ๋ฉฐ, ์๋ํ๋ ํ ์คํธ ๊ณผ์ ์์ ๊ธฐ์กด ์ฝ๋์ ์ ๊ท ์ฝ๋ ๊ฐ์ ์ถฉ๋์ด ๋ฐ๊ฒฌ๋๋ฉด CI๋ฅผ ํตํด ๋ฒ๊ทธ๊ฐ ๋ ๋น ๋ฅด๊ฒ ์์ ๋ ์ ์๋ค.
๋ฐ๋ผ์, CI๋ฅผ ์ด์ฉํ๋ฉด ๋น๋ ์๋ํ, ํ ์คํธ ์๋ํ๋ฅผ ํตํด ๋ฒ๊ทธ๋ ์ฝ๋ ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ ๋์ฑ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
๐ก CD๋ Continuous Delivery์ ์ฝ์๋ก, โ์ง์์ ์ ๊ณตโ์ ์๋ฏธํ๋๋ฐ, Continuous Deployment์ธ โ์ง์์ ๋ฐฐํฌโ๊น์ง CI โ Continuous Delivery โ Continous Deployment ์ด 3๋จ๊ณ ๊ตฌ์ถ ์ฌ๋ก๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๊ฒฝ์ฐ์ผ ์๋ ์๋ค.
์ง์์ ์ ๊ณต
โ์ง์์ ์ ๊ณตโ์ CI์ ๋น๋, ์๋ํ, ์ ๋ ๋ฐ ํตํฉ ํ ์คํธ ์ํ ์ดํ์ ์ด์ด์ง๋ ํ๋ก์ธ์ค๋ก, CD์์๋ ์ ํจํ ์ฝ๋๋ฅผ ๋ ํฌ์งํ ๋ฆฌ์ ์๋์ผ๋ก ๋ฐฐํฌํ๊ฒ ๋๋ค. ์ง์์ ์ ๊ณต์ ํ๋ก๋์ ํ๊ฒฝ์ผ๋ก ๋ฐฐํฌํ ์ค๋น๊ฐ ๋ ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ํ๋ณดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
์ง์์ ๋ฐฐํฌ
โ์ง์์ ๋ฐฐํฌโ๋ ํ๋ก๋์ ์ค๋น๊ฐ ์๋ฃ๋ ๋น๋๋ฅผ ์ฝ๋ ๋ ํฌ์งํ ๋ฆฌ์ ์๋์ผ๋ก ๋ฐฐํฌํ๋ โ์ง์์ ์ ๊ณตโ์ ํ์ฅ๋ ํํ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ก๋์ ์ผ๋ก ๋ฐฐํฌํ๋ ์์ ์ ์๋ํ ํ๋ค.
์ค์ ์ฌ๋ก์์๋ ์ง์์ ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฑํ ํ ๋ช ๋ถ ์ด๋ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ์คํํ ์ ์์ด์ผ ํ๋ค. ๊ทธ๋ด๋ ค๋ฉด ์ด์ ์ ๋น์ฐํ CI ๋จ๊ณ๋ ํต๊ณผํ ๊ฒ์ด๋ผ ๋ด์ผ ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, CI/CD๋ฅผ ์ด์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ์ํ์ฑ์ ์ค์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ํ ๋ฒ์ ๋ชจ๋ ๋ฆด๋ฆฌ์ค ํ์ง ์๊ณ ์์ ์กฐ๊ฐ์ผ๋ก ์ธ๋ถํ ํ์ฌ ๋์ฑ ํจ์จ์ ์ผ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋ค.
CircleCI
CircleCI๋ CI/CD๋ฅผ ์ํ ํด์ด๋ค.
์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ circleci.com์ ํ๋ก์ ํธ์ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ํ๋ก์ ํธ์ vcs ๋ ํฌ์งํ ๋ฆฌ๊ฐ ์ธ์ฆ๋์ด ์์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด code ๋ณํ๊ฐ ์์ ๋ circleCI๊ฐ ๋์ปค ์ปจํ ์ด๋ ํน์ VM๋ด์์ ์๋ํ๋ ํ ์คํธ๋ฅผ ์งํํ๊ฒ ๋๋ค.
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ โ.circleci/config.ymlโ ํ์ผ์ ์์ฑํด์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
# Python CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-python/ for more details
#
version: 2
jobs:
build:
docker:
# specify the version you desire here
# use `-browsers` prefix for selenium tests, e.g. `3.6.1-browsers`
- image: circleci/python:3.6.1
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
working_directory: ~/repo
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "requirements.txt" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run:
name: install dependencies
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
- save_cache:
paths:
- ./venv
key: v1-dependencies-{{ checksum "requirements.txt" }}
# run tests!
- run:
name: run tests
command: |
. venv/bin/activate
python manage.py test accounts lists
- store_artifacts:
path: test-reports
destination: test-reports
๋ณธ์ธ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐ๋ผ steps์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ด์ฉ๋ค์ ๋ณ๊ฒฝํ๋ค.
๋ง์ฝ postgres๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, docker image์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
- image: circleci/postgres:9.6-alpine
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: {your password}
POSTGRES_DB: {your db}
๊ทธ ๋ค์ CLI์ ์๋์ ๋ช ๋ น์ด๋ค์ ์์ฑํ๋ค.
git add .circleci
git commit -m "{message}"
git push
๊ทธ ๋ค์ CircleCI์์ โstart buildingโ ๋ฒํผ์ ํด๋ฆญํ๋ฉด circleCI์์ ์ฐ๋์ด ๋๋ค.
Codecov
Codecov๋ test coverage๋ฅผ ์ธก์ ํ๊ธฐ ์ํ ํด๋ก, ํ ์คํธ ์ฝ๋๊ฐ ํด๋น ์ ํ ์ฝ๋๋ฅผ ์ผ๋ง๋ ์ปค๋ฒํ๊ณ ์๋์ง ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ถ๋ถ์ด ์ทจ์ฝํ ์ง๋ฅผ ์๋ ค์ค๋ค. codecov๋ circleCi์ ์ฐ๋ํด์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ๋ก์ ํธ ๋น๋ ํ ํ ์คํธ ์คํ์ coverage๋ฅผ ์ธก์ ํ ์ ์๋ค.
codecov๋ฅผ ์ถ๊ฐํด ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ codecov์ ํ๋ก์ ํธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ฑ๋กํ ๋ค, ์๋์ ๋ด์ฉ์ config.yml์ ์ถ๊ฐํ๋ฉด ๋๋ค.
์ผ๋จ โcoverageโ โcodecovโ๋ฅผ pip๋ก ์ค์นํ๊ณ ์์์ run์ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ค ์ฆ,
# run tests!
- run:
name: run tests
command: |
. venv/bin/activate
python manage.py test accounts lists
์ด ๋ด์ฉ ์ค โpython manage.py ~โ ๋ถ๋ถ์ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
# run tests!
- run:
name: run tests
command: |
. venv/bin/activate
coverage run ./manage.py test accounts lists
codecov
โ ์ด๋ โcoverageโ ํ โcodecovโ ์ถ๊ฐ๋ฅผ ํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
์ด๋ ๊ฒ ๋ณ๊ฒฝํ ํ pushํ๋ฉด coverage ๋ถ์์ด ์ ์คํ๋๋ค.
์ฐธ๊ณ
1) CI/CD: https://www.redhat.com/ko/topics/devops/what-is-ci-cd
2) sentry: https://blog.sentry.io/2020/01/21/automating-sentry-releases-with-circleci
3) CircleCIhttps://showerbugs.github.io/2017-12-26/circleci-codecov-django-์ฐ๋ํ๊ธฐ