์ฐ๋ฆฌ๊ฐ ์์
ํ๊ณ ์๋ ์จ๋ผ์ธ ๋น๋์ค ์ฝํ
์ธ ์ถ์ฒ ์์คํ
์ ํ์ํ ์์ฉ ๊ฐ๋ฐ์ด๋ฉฐ ๊ธฐ์ ์ ์ผ๋ก ๋
์ ๋ฐ ์คํ ์์ค ๊ตฌ์ฑ ์์์ ๋ค์ค ๊ตฌ์ฑ ์์ ํด๋ฌ์คํฐ์
๋๋ค. ์ด ๊ธฐ์ฌ๋ฅผ ์์ฑํ๋ ๋ชฉ์ ์ ์ ํ๋ ์๊ฐ ๋ด์ ํ๋ก์ธ์ค์ ํ๋ฆฝ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๋ฐฉํดํ์ง ์๊ณ ์คํ
์ด์ง ์ฌ์ดํธ์ ๋ํ docker swarm ํด๋ฌ์คํฐ๋ง ์์คํ
์ ๊ตฌํ์ ์ค๋ช
ํ๋ ๊ฒ์
๋๋ค. ๊ทํ์ ๊ด์ฌ์ ๋๊ธฐ ์ํด ์ ์๋ ๋ด๋ฌํฐ๋ธ๋ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ docker swarm์ ์ฌ์ฉํ๊ธฐ ์ ์ CI/CD๋ฅผ ์ค๋ช
ํ๊ณ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ๊ตฌํ ๊ณผ์ ์ ์ค๋ช
ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ์ฝ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ์ฌ๋๋ค์ ์์ ํ๊ฒ ๋ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก ๋์ด๊ฐ ์ ์์ต๋๋ค.
์ 1 ๋ถ
๋ฉ๊ณ ๋จผ ํด์ CI / CD ํ๋ก์ธ์ค๋ฅผ ์ต๋ํ ๋นจ๋ฆฌ ์ค์ ํด์ผํ์ต๋๋ค. ์กฐ๊ฑด ์ค ํ๋๋ Docker๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด์์ต๋๋ค. ๋ฐฐ์น๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ด์ ๋ก ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
- ํ๋ก๋์ ์์ ๊ตฌ์ฑ ์์์ ๋ณด๋ค ์์ ์ ์ด๊ณ ์์ ์ ์ธ ์๋์ ์ํด(์ฆ, ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์๊ตฌ ์ฌํญ)
- ์ ๋์ ์ธ ๊ฐ๋ฐ์๋ค์ Docker๋ก ์์ ํ๊ธฐ๋ฅผ ์ํ์ง ์์์ต๋๋ค(์ด์ํ์ง๋ง ๊ทธ๋ฌ์ต๋๋ค).
- R&D ๊ด๋ฆฌ์ ์ด๋ฐ์ฌ๋ก๊ธฐ์ ๊ณ ๋ ค์ ๋ฐ๋ผ
MVP์ ๋ํ ์ธํ๋ผ, ์คํ ๋ฐ ๋๋ต์ ์ธ ์ด๊ธฐ ์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์์ต๋๋ค.
- Debian์ด ํ์ฌ๋ Intelยฎ X4 ์๋ฒ 5650๋(๊ฐ๋ ฅํ ๋จธ์ ํ ๋ ๋ ๊ฐ๋ฐ ์๋ฃ)
- ์์ฒด ์ปค์คํ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ C++, Python3๋ก ์งํ
- ์ฌ์ฉ๋ ์ฃผ์ ํ์ฌ ๋๊ตฌ: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, โฆ
- ๋๋ฒ๊ทธ ๋ฐ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํด ๊ตฌ์ฑ ์์๋ฅผ ๋ณ๋๋ก ๋น๋ํ๊ณ ํ ์คํธํ๊ธฐ ์ํ ํ์ดํ๋ผ์ธ
์ด๊ธฐ ๋จ๊ณ์์ ํด๊ฒฐํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ ์ค ํ๋๋ ๋ชจ๋ ํ๊ฒฝ(CI/CD)์์ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ค์นํ๊ณ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. C++ ๋๋ Python์ผ๋ก ๊ฐ๋ฐ๋ ์ฌ์ฉ์ ์ง์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์คํ ํจํค์ง๋ฅผ ์์ฑํ๊ณ ๋น๋๋ ์ด๋ฏธ์ง ์ ์ฅ์๋ก ๋ณด๋ธ ๋ค์ ์๋ฒ์ ์ค์นํฉ๋๋ค. ์ ์ ์๋ ์ด์ ๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์ ํ๋์์ต๋๋ค. ์ฆ, CI๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ์ผ์ด ์ปดํ์ผ๋๊ณ ๊ฐ์ ํ๋ก์ ํธ ํ๊ฒฝ์ด ์์ฑ๋๊ณ py ๋ชจ๋์ด requirements.txt์์ ์ค์น๋๋ฉฐ ์ด๋ฌํ ๋ชจ๋ ์ํฐํฉํธ๊ฐ ๊ตฌ์ฑ, ์คํฌ๋ฆฝํธ ๋ฐ ์๋ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ ํ๊ฒฝ์ ์๋ฐํฉ๋๋ค. ๋ค์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌ์ ๊ถํ์ด ์๋ ๊ฐ์ ์ฌ์ฉ์๋ก ์คํ๋ฉ๋๋ค.
Gitlab-CI๋ CI/CD ์์คํ ์ผ๋ก ์ ํ๋์์ต๋๋ค. ๊ฒฐ๊ณผ ํ์ดํ๋ผ์ธ์ ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ์ต๋๋ค.
๊ตฌ์กฐ์ ์ผ๋ก gitlab-ci.yml์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
---
variables:
# ะผะธะฝะธะผะฐะปัะฝะฐั ะฒะตััะธั ะฆะะฃ ะฝะฐ ัะตัะฒะตัะฐั
, ะณะดะต ัะฐะทะฒะพัะฐัะธะฒะฐะตััั ะบะปะฐััะตั
CMAKE_CPUTYPE: "westmere"
DEBIAN: "MYREGISTRY:5000/debian:latest"
before_script:
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config
stages:
- build
- testing
- deploy
debug.debian:
stage: build
image: $DEBIAN
script:
- cd builds/release && ./build.sh
paths:
- bin/
- builds/release/bin/
when: always
release.debian:
stage: build
image: $DEBIAN
script:
- cd builds/release && ./build.sh
paths:
- bin/
- builds/release/bin/
when: always
## testing stage
tests.codestyle:
stage: testing
image: $DEBIAN
dependencies:
- release.debian
script:
- /bin/bash run_tests.sh -t codestyle -b "${CI_COMMIT_REF_NAME}_codestyle"
tests.debug.debian:
stage: testing
image: $DEBIAN
dependencies:
- debug.debian
script:
- /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_debug"
artifacts:
paths:
- run_tests/username/
when: always
expire_in: 1 week
tests.release.debian:
stage: testing
image: $DEBIAN
dependencies:
- release.debian
script:
- /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_release"
artifacts:
paths:
- run_tests/username/
when: always
expire_in: 1 week
## staging stage
deploy_staging:
stage: deploy
environment: staging
image: $DEBIAN
dependencies:
- release.debian
script:
- cd scripts/deploy/ &&
python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
/bin/bash install_venv.sh -d -r ../../requirements.txt &&
python3 prepare_init.d.py &&
python3 deploy.py -s $CI_ENVIRONMENT_NAME
when: manual
ํ์ํ ๋ชจ๋ ์์คํ ํจํค์ง๊ฐ ์ด๋ฏธ ์ค์น๋๊ณ ๊ธฐํ ์ค์ ์ด ์๋ฃ๋ ์์ฒด ์ด๋ฏธ์ง์์ ์กฐ๋ฆฝ ๋ฐ ํ ์คํธ๊ฐ ์ํ๋๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์์ ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ ๋๋ฆ๋๋ก ํฅ๋ฏธ๋กญ์ง ๋ง ๋ฌผ๋ก ์ด์ผ๊ธฐํ์ง๋ ์๊ฒ ์ต๋๋ค ๊ฐ๊ฐ์ ๋ํ ์ค๋ช ์ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉฐ ์ด๊ฒ์ด ๊ธฐ์ฌ์ ๋ชฉ์ ์ด ์๋๋๋ค. ๋ฐฐํฌ ๋จ๊ณ๊ฐ ์ผ๋ จ์ ํธ์ถ ์คํฌ๋ฆฝํธ๋ก ๊ตฌ์ฑ๋๋ค๋ ์ฌ์ค์๋ง ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ฒ ์ต๋๋ค.
- createconfig.py - ํ์ ๋ฐฐํฌ๋ฅผ ์ํด ๋ค์ํ ํ๊ฒฝ์์ ๊ตฌ์ฑ ์์ ์ค์ ์ด ํฌํจ๋ settings.ini ํ์ผ ์์ฑ(์ฌ์ ํ๋ก๋์ , ํ๋ก๋์ , ํ ์คํธ ๋ฑ)
- install_venv.sh - ํน์ ๋๋ ํฐ๋ฆฌ์ py ๊ตฌ์ฑ ์์์ ๋ํ ๊ฐ์ ํ๊ฒฝ์ ์์ฑํ๊ณ ์๊ฒฉ ์๋ฒ์ ๋ณต์ฌ
- ์ค๋น_์ด๊ธฐํ.d.py โ ํ ํ๋ฆฟ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ ์์์ ๋ํ ์์-์ค์ง ์คํฌ๋ฆฝํธ๋ฅผ ์ค๋นํฉ๋๋ค.
- ๋ฐฐํฌ.py - ์๋ก์ด ๊ตฌ์ฑ ์์๋ฅผ ๋ถํดํ๊ณ ๋ค์ ์์ํฉ๋๋ค.
์๊ฐ์ด ์ง๋ฌ์ต๋๋ค. ์คํ ์ด์ง ๋จ๊ณ๋ ํ๋ฆฌํ๋ก๋์ ๊ณผ ํ๋ก๋์ ์ผ๋ก ๋์ฒด๋์์ต๋๋ค. ํ๋ ์ด์์ ๋ฐฐํฌ(CentOS)์์ ์ ํ์ ๋ํ ์ง์์ ์ถ๊ฐํ์ต๋๋ค. 5๊ฐ์ ๋ ๊ฐ๋ ฅํ ๋ฌผ๋ฆฌ์ ์๋ฒ์ XNUMX๊ฐ์ ๊ฐ์ ์๋ฒ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์ ํ ์คํฐ๊ฐ ์์ ์ํ์ ์ด๋ ์ ๋ ๊ฐ๊น์ด ํ๊ฒฝ์์ ์์ ์ ํ ์คํธํ๋ ๊ฒ์ด ์ ์ ๋ ์ด๋ ค์์ก์ต๋๋ค. ์ด๋ ๊ทธ ์์ด๋ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํด์ก์ต๋๋ค ...
2 ๋ถ
๋ฐ๋ผ์ ์ฐ๋ฆฌ ํด๋ฌ์คํฐ๋ Dockerfiles์์ ์ค๋ช
ํ์ง ์๋ ์์ญ ๊ฐ์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋ ๋ฉ์ง ์์คํ
์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํน์ ํ๊ฒฝ์ ๋ํ ๋ฐฐํฌ์ฉ์ผ๋ก๋ง ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ์๋ฌด๋ ์ํํ ํ
์คํธ ์ ์ ํด๋ฌ์คํฐ๋ฅผ ์คํ
์ด์ง ํ๊ฒฝ์ ๋ฐฐํฌํ์ฌ ํ
์คํธํ๋ ๊ฒ์
๋๋ค.
์ด๋ก ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ํด๋ฌ์คํฐ๊ฐ ๋์์ ์คํ๋ ์ ์์ต๋๋ค. ์๋ฃ๋ ์ํ์ด๊ฑฐ๋ ์๋ฃ์ ๊ฐ๊น์ด ์์ ์ด ์๋ ๋งํผ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ง์๋๋ก ์ฌ์ฉํ ์ ์๋ ์๋ฒ์ ์ฉ๋์ ํตํด ๊ฐ ์๋ฒ์์ ์ฌ๋ฌ ํด๋ฌ์คํฐ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ฐ ์คํ ์ด์ง ํด๋ฌ์คํฐ๋ ๊ฒฉ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(ํฌํธ, ๋๋ ํฐ๋ฆฌ ๋ฑ์ ๊ต์ฐจ๊ฐ ์์ด์ผ ํจ).
์ฐ๋ฆฌ์ ๊ฐ์ฅ ๊ท์คํ ์์์ ์ฐ๋ฆฌ์ ์๊ฐ์ธ๋ฐ, ์ฐ๋ฆฌ์๊ฒ๋ ๊ทธ ์๊ฐ์ด ๋ง์ง ์์์ต๋๋ค.
๋ ๋น ๋ฅธ ์์์ ์ํด ๋จ์์ฑ๊ณผ ์ํคํ ์ฒ ์ ์ฐ์ฑ์ผ๋ก ์ธํด Docker Swarm์ ์ ํํ์ต๋๋ค. ๊ฐ์ฅ ๋จผ์ ํ ์ผ์ ์๊ฒฉ ์๋ฒ์ ๊ด๋ฆฌ์์ ์ฌ๋ฌ ๋ ธ๋๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
kilqc94pi2upzvabttikrfr5d nop-test-1 Ready Active 19.03.2
jilwe56pl2zvabupryuosdj78 nop-test-2 Ready Active 19.03.2
j5a4yz1kr2xke6b1ohoqlnbq5 * nop-test-3 Ready Active Leader 19.03.2
๋ค์์ผ๋ก ๋คํธ์ํฌ๋ฅผ ๋ง๋ญ๋๋ค.
$ docker network create --driver overlay --subnet 10.10.10.0/24 nw_swarm
๋ค์์ผ๋ก CI์์ ๋
ธ๋ ์๊ฒฉ ์ ์ด ์ธก๋ฉด์์ Gitlab-CI ๋ฐ Swarm ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ์ต๋๋ค. ์ธ์ฆ์ ์ค์น, ๋น๋ฐ ๋ณ์ ์ค์ ๋ฐ ์ ์ด ์๋ฒ์์ Docker ์๋น์ค ์ค์ . ์ด ํ๋
๋ค์์ผ๋ก ์คํ ์์ฑ ๋ฐ ์ ๊ฑฐ ์์ ์ .gitlab-ci .yml์ ์ถ๊ฐํ์ต๋๋ค.
.gitlab-ci .yml์ ๋ช ๊ฐ์ง ๋ ๋ง์ ์์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.
## staging stage
deploy_staging:
stage: testing
before_script:
- echo "override global 'before_script'"
image: "REGISTRY:5000/docker:latest"
environment: staging
dependencies: []
variables:
DOCKER_CERT_PATH: "/certs"
DOCKER_HOST: tcp://10.50.173.107:2376
DOCKER_TLS_VERIFY: 1
CI_BIN_DEPENDENCIES_JOB: "release.centos.7"
script:
- mkdir -p $DOCKER_CERT_PATH
- echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
- echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
- echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
- docker stack deploy -c docker-compose.yml ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME} --with-registry-auth
- rm -rf $DOCKER_CERT_PATH
when: manual
## stop staging stage
stop_staging:
stage: testing
before_script:
- echo "override global 'before_script'"
image: "REGISTRY:5000/docker:latest"
environment: staging
dependencies: []
variables:
DOCKER_CERT_PATH: "/certs"
DOCKER_HOST: tcp://10.50.173.107:2376
DOCKER_TLS_VERIFY: 1
script:
- mkdir -p $DOCKER_CERT_PATH
- echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
- echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
- echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
- docker stack rm ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME}
# TODO: need check that stopped
when: manual
์์ ์ฝ๋ ์กฐ๊ฐ์์ ๋ ๊ฐ์ ๋ฒํผ(deploy_staging, stop_staging)์ด ํ์ดํ๋ผ์ธ์ ์ถ๊ฐ๋์ด ์๋ ์์ ์ด ํ์ํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์คํ ์ด๋ฆ์ ๋ถ๊ธฐ ์ด๋ฆ๊ณผ ์ผ์นํ๋ฉฐ ์ด ๊ณ ์ ์ฑ์ผ๋ก ์ถฉ๋ถํด์ผ ํฉ๋๋ค. ์คํ์ ์๋น์ค๋ ๊ณ ์ ํ IP ์ฃผ์, ํฌํธ, ๋๋ ํฐ๋ฆฌ ๋ฑ์ ๋ฐ์ต๋๋ค. ๊ฒฉ๋ฆฌ๋์ง๋ง ์คํ๋ง๋ค ๋์ผํฉ๋๋ค(๊ตฌ์ฑ ํ์ผ์ด ๋ชจ๋ ์คํ์ ๋ํด ๋์ผํ๊ธฐ ๋๋ฌธ์) - ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์
๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ์คํ(ํด๋ฌ์คํฐ)์ ๋ฐฐํฌํฉ๋๋ค. docker-compose.yml, ํด๋ฌ์คํฐ๋ฅผ ์ค๋ช
ํฉ๋๋ค.
docker-compose.yml
---
version: '3'
services:
userprop:
image: redis:alpine
deploy:
replicas: 1
placement:
constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
restart_policy:
condition: none
networks:
nw_swarm:
celery_bcd:
image: redis:alpine
deploy:
replicas: 1
placement:
constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
restart_policy:
condition: none
networks:
nw_swarm:
schedulerdb:
image: mariadb:latest
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_DATABASE: schedulerdb
MYSQL_USER: ****
MYSQL_PASSWORD: ****
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--explicit_defaults_for_timestamp=1']
deploy:
replicas: 1
placement:
constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
restart_policy:
condition: none
networks:
nw_swarm:
celerydb:
image: mariadb:latest
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_DATABASE: celerydb
MYSQL_USER: ****
MYSQL_PASSWORD: ****
deploy:
replicas: 1
placement:
constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
restart_policy:
condition: none
networks:
nw_swarm:
cluster:
image: $CENTOS7
environment:
- CENTOS
- CI_ENVIRONMENT_NAME
- CI_API_V4_URL
- CI_REPOSITORY_URL
- CI_PROJECT_ID
- CI_PROJECT_URL
- CI_PROJECT_PATH
- CI_PROJECT_NAME
- CI_COMMIT_REF_NAME
- CI_BIN_DEPENDENCIES_JOB
command: >
sudo -u myusername -H /bin/bash -c ". /etc/profile &&
mkdir -p /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
git clone -b $CI_COMMIT_REF_NAME $CI_REPOSITORY_URL . &&
curl $CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_BIN_DEPENDENCIES_JOB -o artifacts.zip &&
unzip artifacts.zip ;
cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME/scripts/deploy/ &&
python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
/bin/bash install_venv.sh -d -r ../../requirements.txt &&
python3 prepare_init.d.py &&
python3 deploy.py -s $CI_ENVIRONMENT_NAME"
deploy:
replicas: 1
placement:
constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
restart_policy:
condition: none
tty: true
stdin_open: true
networks:
nw_swarm:
networks:
nw_swarm:
external: true
์ฌ๊ธฐ์์ ๊ตฌ์ฑ ์์๊ฐ ํ๋์ ๋คํธ์ํฌ(nw_swarm)๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ ์๋ก ์ฌ์ฉํ ์ ์์์ ์ ์ ์์ต๋๋ค.
์์คํ ๊ตฌ์ฑ ์์(redis, mysql ๊ธฐ๋ฐ)๋ ์ฌ์ฉ์ ์ ์ ๊ตฌ์ฑ ์์์ ์ผ๋ฐ ํ๊ณผ ๋ถ๋ฆฌ๋ฉ๋๋ค(๊ณํ ๋ฐ ์ฌ์ฉ์ ์ ์ ๊ตฌ์ฑ ์์๋ ์๋น์ค๋ก ๋๋ฉ๋๋ค). ํด๋ฌ์คํฐ์ ๋ฐฐํฌ ๋จ๊ณ๋ CMD๋ฅผ ํ๋์ ํฐ ๊ตฌ์ฑ๋ ์ด๋ฏธ์ง์ ์ ๋ฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก XNUMX๋ถ์์ ์ค๋ช ํ ๋ฐฐํฌ์ ์ค์ง์ ์ผ๋ก ๋ค๋ฅด์ง ์์ต๋๋ค. ์ฐจ์ด์ ์ ๊ฐ์กฐํ๊ฒ ์ต๋๋ค.
- ์์ ๋ณต์ ... - ๋ฐฐํฌ์ ํ์ํ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ(createconfig.py, install_venv.sh ๋ฑ)
- ์ปฌ... && ์์ถ ํด์ ... - ๋น๋ ์ํฐํฉํธ ๋ค์ด๋ก๋ ๋ฐ ์์ถ ํด์ (์ปดํ์ผ๋ ์ ํธ๋ฆฌํฐ)
์์ง ์ค๋ช ๋์ง ์์ ๋ฌธ์ ๊ฐ ํ๋ ์์ต๋๋ค. ์น ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ตฌ์ฑ ์์๋ ๊ฐ๋ฐ์์ ๋ธ๋ผ์ฐ์ ์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
.gitlab-ci.yml์์ ํด๋ฌ์คํฐ ์คํ์ ๋ฐฐํฌํ ํ ๋ฐธ๋ฐ์๋ฅผ ๋ฐฐํฌํ๋ ์ค์ ์ถ๊ฐํฉ๋๋ค(์ปค๋ฐํ ๋ ๊ตฌ์ฑ๋ง ์ ๋ฐ์ดํธํฉ๋๋ค(ํ ํ๋ฆฟ์ ๋ฐ๋ผ ์ nginx ๊ตฌ์ฑ ํ์ผ ์์ฑ: /etc/nginx/conf. d/${CI_COMMIT_REF_NAME}.conf) - docker-compose-nginx.yml ์ฝ๋ ์ฐธ์กฐ)
- docker stack deploy -c docker-compose-nginx.yml ${CI_ENVIRONMENT_NAME} --with-registry-auth
๋์ปค ์์ฑ-nginx.yml
---
version: '3'
services:
nginx:
image: nginx:latest
environment:
CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}
NGINX_CONFIG: |-
server {
listen 8080;
server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;
location / {
proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:8080;
}
}
server {
listen 5555;
server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;
location / {
proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:5555;
}
}
volumes:
- /tmp/staging/nginx:/etc/nginx/conf.d
command:
/bin/bash -c "echo -e "$$NGINX_CONFIG" > /etc/nginx/conf.d/${CI_COMMIT_REF_NAME}.conf;
nginx -g "daemon off;";
/etc/init.d/nginx reload"
ports:
- 8080:8080
- 5555:5555
- 3000:3000
- 443:443
- 80:80
deploy:
replicas: 1
placement:
constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
restart_policy:
condition: none
networks:
nw_swarm:
networks:
nw_swarm:
external: true
๊ฐ๋ฐ ์ปดํจํฐ์์ /etc/hosts๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. nginx์ URL์ ์ง์ ํ์ญ์์ค.
10.50.173.106 staging_BRANCH-1831_cluster.dev
๋ฐ๋ผ์ ๊ฒฉ๋ฆฌ๋ ์คํ
์ด์ง ํด๋ฌ์คํฐ์ ๋ฐฐํฌ๊ฐ ๊ตฌํ๋์์ผ๋ฉฐ ๊ฐ๋ฐ์๋ ์ด์ ์์
์ ํ์ธํ๊ธฐ์ ์ถฉ๋ถํ ์๋งํผ ํด๋ฌ์คํฐ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
ํฅํ ๊ณํ:
- ๊ตฌ์ฑ ์์๋ฅผ ์๋น์ค๋ก ๋ถ๋ฆฌ
- Dockerfile๋ง๋ค ์์
- ์คํ์์ ๋ถํ๊ฐ ์ ์ ๋ ธ๋๋ฅผ ์๋์ผ๋ก ๊ฐ์ง
- ์ด๋ฆ ํจํด์ผ๋ก ๋ ธ๋ ์ง์ (๊ธฐ์ฌ์์์ ๊ฐ์ด id๋ฅผ ์ฌ์ฉํ๋ ๋์ )
- ์คํ์ด ํ๊ดด๋์๋์ง ํ์ธ ์ถ๊ฐ
- ...
ํน๋ณํ ๊ฐ์ฌ
์ถ์ฒ : habr.com