๐ย ๊ณต๋ถ ๋ด์ฉ
hangman web ์ค์ต
flask web page ์คํํด๋ณด๊ธฐ
play-with-docker ์ฌ์ดํธ๋ฅผ ํ์ฉํด์ ํ
์คํธ
git clone์ผ๋ก fork ํด๋ repo๋ฅผ ๋ฐ์์ค๊ณ , ์คํํ๊ธฐ
1
2
3
4
| git clone https://github.com/srlee056/hangman_web.git
cd hangman_web/
pip install -r requirements.txt
python3 -m flask run --host 0.0.0.0 --port=4000
|
docker ์ด๋ฏธ์ง ๋น๋ ์ค์ต
Dockerfile ์์ฑ
1
2
3
4
5
6
7
8
9
| FROM python:3.8-slim-buster
WORKDIR /app
COPY app.py ./
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
EXPOSE 4000
CMD python3 -m flask run --host 0.0.0.0 --port=4000
# ๋ฆฌ์คํธ ํํ๋ก ์ ์ด๋ ๋์์ ๊ฐ์
CMD ["python3", "-m", "flask", "run", "--host", "0.0.0.0", "--port=4000"]
|
docker build & test
1
| docker build -t hangman-web .
|
- run
-p
์ต์
์ ์ฌ์ฉํด์ ํฌํธ ํฌ์๋ฉ ์งํ- ์ธ๋ถ ํฌํธ : ๋ด๋ถ ํฌํธ ์์๋ก ์์ฑํ๋ค
1
| docker run -p 4000:4000 hangman-web
|
push image to docker Hub
1
2
3
| docker tag hangman-web seorim/hangman-web
docker login --username=seorim
docker push seorim/hangman-web
|
test in another host
1
2
| docker pull seorim/hangman-web
docker run -p 4000:4000 seorim/hangman-web
|
docker run detach ์ต์
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๊ฒ ํด์ฃผ๋ ์ต์
1
| docker run -p 4000:4000 -d seorim/hangman-test
|
CI/CD
Continuous Integration
One of Software Engineering Practice
๊ธฐ๋ณธ ์์น
- ์ฝ๋ Repository๋ ํ๋๋ง ์ ์ง (Main)
- ์ฝ๋ ๋ณ๊ฒฝ์ ์์ฃผ ๋ฐ์
- ํ
์คํธ๋ฅผ ์ต๋ํ ์ถ๊ฐ (Test Coverage)
- ๋น๋์ ์๋ํ (Commit Build vs. Nightly Build)
- ์ฑ๊ณตํ ๋น๋๋ฅผ ํ๋ก๋์
์ผ๋ก ๋ฆด๋ฆฌ์ค ์๋ํ: CD
- CI/CD ์๋ํ ๊ณผ์ ์ ๋์ปค๋ฅผ ํ์ฉ
GitHub Actions
GitHub์ CI/CD service
workflow
Push, PR ๋ฑ ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์์๋๋ ์ผ๋ จ์ ๋์์ ์ง์นญ
- {workflow_name}.yaml(or .yml)
- Job์ผ๋ก ๋๋์ด์ง๋ฉฐ, ๊ฐ Job์ ์ผ๋ จ์ Step์ ์ํํจ
GitHub Actions ์ฌ์ฉ ์ค์ต
- ๊ณตํต์ ์ธ ๋ถ๋ถ
workflow ํ์ผ์ ๊ตฌ์กฐ๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| name: app-name
on: # trigger events
push:
branches: ["main"] # name of branches
pull_request:
branches: ["main"]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
...
|
- ํ
์คํธ ์๋ํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with unittest
run: |
python3 -m unittest discover -p 'test*.py' # python3 test.py
|
- Docker Build & Push ์๋ํ
- repository settings -> secrets & variables -> Actions ์์ ๋ก๊ทธ์ธ ์ ๋ณด (ID/PW) ์ ์ฅํ๊ณ ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์๋ค.
- ${{secrets.DOCKER_USER}} ํ์์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ํ์ผ์์ ์ฌ์ฉํ ๋
env
์์ ์ง์ ํ๊ฑฐ๋, ๋ฐ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
1
2
3
4
5
6
7
8
9
| - name: Login to the Docker Hub
env:
DOCKER_USER: ${{secrets.DOCKER_USER}}
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
run: docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
- name: Build the Docker image
run: docker build --tag ${{secrets.DOCKER_USER}}/hangman-web:latest .
- name : Push the Docker image to the Docker Hub
run: docker push ${{secrets.DOCKER_USER}}/hangman-web:latest
|
๐ย CHECK
(์ด๋ ต๊ฑฐ๋ ์๋กญ๊ฒ ์๊ฒ ๋ ๊ฒ ๋ฑ ๋ค์ ํ์ธํ ๊ฒ๋ค)
โ ๋๋ ์
์ค๋์ dockerfile์ ์ง์ ์์ฑํด๋ณด๊ณ , GitHub Actions๋ฅผ ์ฌ์ฉํด๋ณด์๋ค.
Dockerfile์ ์ง์ ์์ฑํด์ ๋ฌธ์ ์์ด ๋น๋ ๋๋ค๋ ๊ฒ์ ์์๋ฅผ ๋๊ณ , GitHub Actions๋ ์ด๋ฏธ ์ฌ์ฉํด ๋ณธ ์ ์ด ๋ช๋ฒ ์์ด์ ์ฝ๊ฒ ์ดํดํ๊ณ ๋์ด๊ฐ ์ ์์๋ค.
๊ฐ์ ๋ฃ๊ณ ์ ๋ฆฌํ๋๊ฒ ์ผ์ฐ ๋๋์ ๋ธ๋ก๊ทธ์ ๋๊ธ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค. ๋ค์์ viewer ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊น ๊ณ ๋ฏผ์ค.