์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Spark Partitioning
- Airflow
- Spark Caching
- AQE
- ๋น ๋ฐ์ดํฐ
- Docker
- Kubernetes
- CI/CD
- aws
- off heap memory
- SQL
- KDT_TIL
- Spark ์ค์ต
- k8s
- backfill
- Kafka
- Spark SQL
- Spark
- Dag
- spark executor memory
- DataFrame Hint
- topic
- Salting
- colab
- etl
- redshift
- Speculative Execution
- mysql
- disk spill
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
- Today
- Total
JUST DO IT!
Python unittest๋ฅผ Github Actions ๊ธฐ๋ฅ์ผ๋ก CI/CD ๊ตฌํํ๊ธฐ(with Docker) - TIL230613 ๋ณธ๋ฌธ
Python unittest๋ฅผ Github Actions ๊ธฐ๋ฅ์ผ๋ก CI/CD ๊ตฌํํ๊ธฐ(with Docker) - TIL230613
sunhokimDev 2023. 6. 14. 22:45๐ KDT WEEK 11 DAY 2 TIL
- CI/CD
- Git
- Github Actions
- Actions ๊ธฐ๋ฅ์ ์ฌ์ฉํ Python CI/CD ๊ตฌํ
๐ฅ CI/CD
์ํํธ์จ์ด ๋น๋ : ์ํํธ์จ์ด๋ฅผ ์ต์ข ์ ์ผ๋ก ์ถ์ํ๊ธฐ ์ํ ํํ๋ก ๋ง๋๋ ๊ฒ
Continuous Intergration(CI) : ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๊ณ ์น ๋๋ง๋ค ํ ์คํธ๋ฅผ ๋๋ ค๋ด์ผ๋ก์จ ์์ ์ฑ์ ์ฆ๋์ํด
Continuous Delivery(CD) : ์ฑ๊ณตํ ๋น๋์ ํ๋ก๋์ ๋ฆด๋ฆฌ์ค (์๋ํ)
์ฝ๋์ ๋ณ๊ฒฝ โก๏ธ Code Commit โก๏ธ CI(ํ ์คํธ ์ํ) โก๏ธ CD(์ํํธ์จ์ด ๋ฐฐํฌ)๊ฐ ๋ฐ๋ณต๋๋ ๊ตฌ์กฐ
๐ฆ Git
๋ถ์ฐํ๊ฒฝ์ ์ง์ํ๋ ์์ค ๋ฒ์ ์ปจํธ๋กค ์์คํ
SVN/CVS(๋ค๋ฅธ ์ํํธ์จ์ด ๋ฒ์ ๊ด๋ฆฌ ์์คํ )์ ๋นํด ํ์ ํ๊ฒ ๋น ๋ฅด์ง๋ง ์ฌ์ฉ๋ฒ์ ํจ์ฌ ๋ ๋ณต์กํ๋ค.
- ๋ค์์ ๊ฐ๋ฐ์์ ๊ณต๋ ๊ฐ๋ฐ
- ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ๋ฐฑ์ ๊ฐ๋ฅ
๐ Github
Git repo ํธ์คํ /ํด๋ผ์ฐ๋ ์๋น์ค
- Private repo ์์ ๋ฐ๋ผ ๊ฐ๊ฒฉ๋๊ฐ ๊ฒฐ์ ๋๋ฉฐ, public๋ง ์ฌ์ฉํ๋ค๋ฉด ๋ฌด๋ฃ์ด๋ค.
- Copilot(์ฝ๋ ๊ฐ๋ฐ ์์ฐ์ฑ ์ฆ๋), Workflows(CI/CD), Issues(๋ฌธ์ํ) ๋ฑ ๋ค์ํ ํด์ ์ ๊ณตํ๋ค.
๐ Git ๊ด๋ จ ์ฉ์ด
- Repo : Repository์ ์ค๋ง๋ก Git์ผ๋ก ๊ด๋ฆฌ๋๋ ์ํํธ์จ์ด ํ๋ก์ ํธ๋ฅผ ์ง์นญ
- Master/Main : ํ Repo์์ ๊ธฐ๋ณธ์ด ๋๋ ๋ฉ์ธ ์ฝ๋๋ฅผ ์ง์นญ, ์์ฆ์ ๊ฑฐ์ main์ผ๋ก ์ด๋ค.
- Branch : Repo์์ ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํด ๋ฉ์ธ ์ฝ๋๋ก๋ถํฐ ๋ง๋ ์๋ก์ด ์ฝ๋ ์์ ๋ณธ์ ์ง์นญํ๋ค.
- Clone : ๋ค๋ฅธ ๊ณ์ ์ repo๋ฅผ ์๋ก์ด local repository๋ก ๋ง๋๋ ๊ฒ
- Commit : ๋ด๊ฐ ๋ง๋ ์ฝ๋ ๋ณ๊ฒฝ์ Branch์ Local Repository์ ๋ฐ์ํ๋ ๊ฒ
- Pull : ์ฐ๊ฒฐ๋ Repo๋ก๋ถํฐ ๋ง์ง๋ง Pull ์ดํ ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ค์ ๊ฐ์ ธ์ค๋ ์์ , ์๋ฒ์ Repo์ ๋์ผํ๊ฒ ์ฝํฌํ๋ค.
- Push : ์์ ์ค์ธ ๋ก์ปฌ ๋ณต์ฌ๋ณธ์์ ์๋ฒ๋ก ๋ณ๊ฒฝ์ฌํญ๋ค์ ๋ด๋ณด๋ด๋ ๊ฒ
- Merge : Pull์ด๋ Pushํ์ ๊ฒฝ์ฐ ๋ Branch๊ฐ์ ์ถฉ๋(Conflict)์ ํด๊ฒฐํ๋ ๊ณผ์ , ๋ณํฉ๋๋ ๊ณผ์ .
Git์์๋ ๋ Branch๋ฅผ Mergeํ๋ ๊ณผ์ ์์ ์๋ก์ด ์ฝ๋๊ฐ ์ฝ์ ๋ ๊ฒ์ด๋ค.
์ด ์๋ก์ด ์ฝ๋๋ฅผ ๋ฃ๊ณ ๋์๋ ๋ณธ๋์ ๊ธฐ๋ฅ๊ณผ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ ์๋ํ๋ ์ง ํ ์คํธํด๋ณด๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ ๊ฒ์ด๊ณ ,
์ด๋ฌํ ๊ณผ์ (์ฝ๋๋ฅผ ํ ์คํธํ๊ณ , ๋ฐฐํฌํ๋ ๊ณผ์ )์ ์์์ ์ค๋ช ํ๋ CI/CD๋ผ๊ณ ํ๋ค.
๋ฐ๋ผ์ Github์์๋ ์ฝ๋๊ฐ ํน์ ๋ธ๋์น์ ์ถ๊ฐ๋๋ ์๊ฐ CI/CD๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋๋ก Actions๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค!
๐ฉ Github Actions
Github์์์ CI/CD๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์๋น์ค
Actions ๊ธฐ๋ฅ์ Repo๊ฐ Public์ด๋ฉด ๋ฌด๋ฃ์ง๋ง, Private์ ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ์ ๋ฃ๋ก ์ ๊ณต๋๊ณ ์๋ค.
๐ Workflow
ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์์๋๋ ์ผ๋ จ์ ๋์๋ค์ ์ง์นญ
ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๋ ์ฝ๋ ์ปค๋ฐ, Pull Request, ๋ค๋ฅธ Workflow์ ์คํ ๋ฑ์ผ๋ก ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์ ์๋ค.
Workfow๋ฅผ ์ํ ๋ช ๋ น์ด(ํ๊ฒฝ์ค์ ์ด๋ ์คํฌ๋ฆฝํธ ์คํ ๋ฑ)๋ค์ YAML ํ์ผ๋ก ์ ์ฅํ๋ค.
YAML์ JSON๊ณผ ํํ๊ฐ ๋น์ทํ ํ๊ฒฝ์ค์ ์ ๋ด์๋ format์ด๋ค.
Workflow๋ ํ๋์ repo์ ๋ํด ์ฌ๋ฌ ๊ฐ์ Workflow๋ก ์กด์ฌํ ์ ์๋ค.
๐จ Actions ๊ธฐ๋ฅ์ ์ฌ์ฉํ Python CI/CD ๊ตฌํ
Python์ unittest ๋ชจ๋์ ์ด์ฉํ test๋ฅผ Github Actions ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ CI/CD๋ฅผ ๊ตฌํํด๋ณด๋ ์ค์ต์ ์งํํ๋ค.
โจ๏ธ ๋ฉ์ธ ์ฝ๋ ์๊ฐ
๋จผ์ , CI/CD๊ฐ ์ ์ฉ๋ ๋ฉ์ธ ์ฝ๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ๋ค.
Python์ผ๋ก hangman ๊ฒ์์ ๊ตฌํํ๊ณ , flask๋ฅผ ์ด์ฉํด ๊ฐ๋จํ ์น UI๋ฅผ ์ ๊ณตํ๋ ์ฝ๋์ด๋ค.
- app.py : flask์ ๋ฉ์ธ ํจ์๊ฐ ์กด์ฌ, ์ปค๋งจ๋๋ผ์ธ์ผ๋ก ๋ฐ์ ํฌํธ์ ๋ฐ์ธ๋ํ๊ณ ์์ฒญ์ด ๋ค์ด์ค๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
- requirements.txt : flask ๋ชจ๋๋ค์ ์ค์นํ๋๋ฐ ํ์ฉ, flask์ ๊ด๋ จ๋ 4๊ฐ์ ๋ชจ๋๋ค ํฌํจ
- test.py : app.py์ ์๋ ์ฝ๋์ ์ ๋ ํ ์คํธ ๋ก์ง์ด ๋ค์ด๊ฐ์๋ค. CI/CD ๊ตฌ์ฑ์ ์คํ์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํ ์์
Python ํ ์คํธ ๋ชจ๋๋ก๋ pytest๊ฐ ์๋ unittest๋ฅผ ์ฌ์ฉํ์๋ค.
์ด ๋ถ๋ถ๋๋ฌธ์ ์๋์์ ์ค์ตํ๋ฉด์ ๋ณ๊ฒฝํด์ผํ ๋ถ๋ถ์ด ์กฐ๊ธ ์๋ค.
์ถ๊ฐ๋ก, Repo์๋ dockerization์ ์ํ Dockerfile๋ ํฌํจ๋์ด ์๋ค. ์ด๊ฒ๋ CI/CD์์ ์ถ๊ฐ๋ก ๊ตฌํํด๋ณผ ๊ฒ์ด๋ค.
1. Github Actions ๊ธฐ๋ฅ์ผ๋ก CI ๊ตฌํํ๊ธฐ
CI/CD๋ฅผ ๊ตฌํํ repo๋ก ๋ค์ด๊ฐ์, ์๋จ ํญ์ Actions(์๋ ์ด๋ฏธ์ง์ ๋นจ๊ฐ ๋ฐ์ค)๋ฅผ ํด๋ฆญํ๋ค.
๊ทธ๋ฆฌ๊ณ Python application์ Configure ๋ฒํผ์ ํด๋ฆญํ์.
๋ง์ฝ Python application์ด ๋ณด์ด์ง ์๋๋ค๋ฉด ๊ฒ์์ผ๋ก ์ฐพ์ผ๋ฉด ๋์จ๋ค.
๊ทธ๋ฌ๋ฉด, ์๋ ์ด๋ฏธ์ง์ฒ๋ผ python-app.yml ์ ์์ฑํ๋ ํ๋ฉด์ผ๋ก ๋์ด์ค๊ฒ ๋๋ค.
ํ๋ ๋ฐ์ค๋ฅผ ๋ณด๋ฉด, ์ด๋ค ํน์ ๋ธ๋ฐ์น์ push๋ pull_request (ํน์ ์ด๋ฒคํธ)์ ๋ฐ์ํ ๊ฒ์ธ์ง ์ ํ ์ ์๋ค.
on: ๋ฐ์ผ๋ก ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๋ฅผ ์ง์ ํ ์ ์๊ณ , push: , pull_request: ๋ ํน์ ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๋ง์ฝ ๋ชจ๋ ๋ธ๋์น์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด ["main", "dev"] ์ฒ๋ผ ์์ฑํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ผ๋ก jobs: ๋ ์ค์ CI ํ๋ก์ธ์ค๊ฐ ์คํ (name)๋ณ๋ก ๊ธฐ์ ๋๋ค.
์ด ๋ถ๋ถ์์ pytest๊ฐ ์๋ unittest ๋ชจ๋์ ์ฌ์ฉํ์ผ๋ฏ๋ก ์กฐ๊ธ์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค.
์ฐธ๊ณ ๋ก flake8์ ์ฝ๋ ์คํ์ผ๊ณผ ๋ฌธ๋ฒ์ ์ฒดํฌํ๋ ๋ชจ๋์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋นจ๊ฐ ๋ฐ์ค ๋ถ๋ถ์ pytest๋ฅผ ์ง์ด๋ค.
์ฒซ ๋ฒ์งธ ํ๋์ค์ pytest --> unittest ๋ก ๋ฐ๊พธ๊ณ ,
๋ ๋ฒ์งธ ํ๋์ค์ pytest --> python -m unittest discover -p 'test*.py' ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
๋ ๋ฒ์งธ ํ๋์ค์ ๊ฒฝ์ฐ ํ์ฌ ๋๋ ํ ๋ฆฌ์์ ์๋ธ ๋๋ ํ ๋ฆฌ๊น์ง test๋ก ์์ํ๋ ๋ชจ๋ python ํ์ผ์ unittest ํ๋ผ๋ ๋ช ๋ น์ด์ด๋ค.
์์ ํ์๋ ์ด๋ฌํ ํํ๊ฐ ๋์์ผํ๋ค.
์ด์ CI๊ฐ ์ ๋๋ก ๊ตฌ๋๋๋์ง ํ์ธํด๋ณด์.
๋๋ ๊ฐ๋จํ๊ฒ README ํ์ผ์ ๊ณ ์ณ์ main ๋ธ๋์น์ push ํด๋ณด์๋ค.
๊ทธ๋ฆฌ๊ณ Repo๋ก ๋์๊ฐ๋ฉด, ์๋ ์ด๋ฏธ์ง ๋นจ๊ฐ ๋ฐ์ค ์์ now๋ฅผ ํ์ธํ ์ ์๋ค.
now๋ฅผ ๋๋ฌ๋ณด๋ฉด, ๋ง๋ค์๋ Python application์ด ๊ตฌ๋๋๊ณ ์๋ ๊ฑธ ์ ์ ์๋ค.
์ฌ๊ธฐ์ Details ๋ฅผ ํด๋ฆญํด๋ณด๋ฉด ์งํ๋ Actions๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค.
์๋ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ์งํ์ด ์๋ฃ๋์ด ํ ์คํธ์ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋์๋์ง ํ์ธํ ์ ์๋ค.
์ฑ๊ณต์ ์ผ๋ก CI๊ฐ ์งํ๋์๋ค!
2. Github Actions ๊ธฐ๋ฅ์ผ๋ก CD ๊ตฌํํ๊ธฐ(with Docker)
์ฝ๋๋ฅผ ๋ฐฐํฌํ๋ ๊ณผ์ ์ Actions๋ก ๊ตฌํํ๋๋ฐ, Docker hub์ Docker Image๋ฅผ ์ฌ๋ฆฌ๋ ํํ๋ก ๊ตฌํํ๋ ค๊ณ ํ๋ค.
์ด ๊ณผ์ ์๋ Docker hub์ ๋ํ ์กฐ๊ธ์ ๋ช ๋ น์ด์ Docker hub ๊ณ์ ์ด ํ์ํ๋ค.
Docker hub์ ๊ณ์ ์ ๋ง๋ค๊ณ Docker Image๋ฅผ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ ์ด์ ๊ธ์์ ์ด์ฌํ ์ค์ตํด๋ดค์ผ๋ ๊ด๋ จ ๋ด์ฉ์ ๋ชจ๋ ์คํต!
https://sunhokimdev.tistory.com/45
CD ๊ตฌํ์ ์ํ Workflow๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด Actions ํญ์ ๋ค์ด๊ฐ๋ค.
์๋ ์ด๋ฏธ์ง ๋นจ๊ฐ ๋ฐ์ค์ New workflow ๋ฒํผ์ ํตํด ์๋ก์ด Workflow๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
์๋ ์ด๋ฏธ์ง์ฒ๋ผ Docker Image๋ฅผ ์ฐพ์์ Configure ๋ฒํผ์ ํด๋ฆญํ๋ค.
Configure ๋ฒํผ์ ๋๋ ๋ค๋ฉด ์๊น์ฒ๋ผ yml ํ์ผ์ด ํ๋ ์์ฑ๋์ด ํธ์งํ ์ ์๋ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ Docker hub์ ๋ก๊ทธ์ธํ๊ณ , docker build ๋ฐ push ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ Docker hub์ image๋ฅผ ๋ฑ๋กํ๋ ๋ช ๋ น์ด๋ฅผ ์จ์ผํ๋ค.
์๋๋ ํธ์งํ ๋ด์ฉ์ด๋ค.
๋นจ๊ฐ ๋ฐ์ค์ ๋ด์ฉ์ ๋ด Docker hub์ ๊ณ์ ๋ด์ฉ์ด ๋ค์ด๊ฐ๋ค.
DOCKER_USER์ DOCKER_PASSWORD๋ฅผ ๋ณ์์ฒ๋ผ ์ฌ์ฉํด์ ๋ด ๊ณ์ ์ ๋ณด๋ฅผ ๊ธฐ์ ํ๊ฒ ๋๋๋ฐ,
์ฌ๊ธฐ์ ํ๋์ฝ๋ฉ์ผ๋ก ๋ด ๊ณ์ ์ ๋ณด๋ฅผ ์ง์ ์ ๋ ฅํ๋ค๋ฉด ๋ณด์์ ์๊ฐํ์ ๋ ๊ต์ฅํ ์ํํ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Github์์๋ ์ด๋ฅผ ์ํธํํด์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํ๋ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ด ๋ณด์ ๊ธฐ๋ฅ์ Dockerhub ๊ณ์ ์ DOCKER_USER ์ DOCKER_PASSWORD ์ด๋ฆ์ผ๋ก ์ ์ฅํ ๋ค,
์ ์ด๋ฏธ์ง์ฒ๋ผ ${{secrets.์ด๋ฆ}} ํํ๋ก ๋ถ๋ฌ์ฌ ์ ์๋ค.
์ด ๊ธฐ๋ฅ์ yml ํ์ผ์ ํธ์งํ ๋ค์ ๊ตฌํํ ์์ ์ด๋ฏ๋ก ์ผ๋จ ์ ์ด๋ฏธ์ง์ฒ๋ผ ์์ฑํด๋์.
+ DOCKER_USER์ DOCKER_PASSWORD ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ๋ ๋ฐ์ค์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด๋ณด์
+ ์ด์ธ์ ๋ช ๋ น์ด์ ๋ํ ์ค๋ช ์ ์ด์ ๊ธ์์ ์ค๋ช ํ์ผ๋ ํจ์คํ๊ฒ ๋ค..
์์ฑ์ด ์๋ฃ๋๋ฉด ์ปค๋ฐํด์ Repo์ ์ถ๊ฐํ๋๋ก ํ์.
๊ทธ๋ฆฌ๊ณ Repo๋ก ๋์์์ ์๋ ์ด๋ฏธ์ง์ ๋นจ๊ฐ ๋ฐ์ค ์์๋๋ก ํด๋ฆญํด์ Docker hub ๊ณ์ ์ ๋ณด๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
์๊น yml ํ์ผ์์ DOCKER_USER ์ DOCKER_PASSWORD ํํ๋ก ๋ถ๋ฌ์์ผ๋ ๊ทธ๋๋ก ์ ์ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ CI/CD๊ฐ ์ ๋์ํ๋์ง ์๋ฌด ๋ด์ฉ์ด๋ ์ปค๋ฐํด๋ณด๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ Docker-compose๋ฅผ ์ฌ์ฉํ ๊น? - TIL230615 (0) | 2023.06.15 |
---|---|
Docker Volume ์์๋ณด๊ณ ๊ฐ๋จํ ์ค์ตํด๋ณด๊ธฐ - TIL230614 (0) | 2023.06.15 |
๊ฐ๋จํ Docker ์ด๋ฏธ์ง ๋ง๋ค์ด์ Docker hub์ ๋ฃ๊ณ ์ค์ตํด๋ณด๊ธฐ - TIL230612 (0) | 2023.06.13 |
MySQL โก๏ธ Redshift์ Airflow ETL ๊ตฌํํด๋ณด๊ธฐ - TIL230609 (0) | 2023.06.09 |
Airflow Backfill - TIL230608 (0) | 2023.06.08 |