เช
เชฎเซ เชเซ เชเชจเชฒเชพเชเชจ เชตเชฟเชกเชฟเชฏเซ เชเชจเซเชเซเชจเซเช เชญเชฒเชพเชฎเชฃ เชธเชฟเชธเซเชเชฎ เชชเชฐ เชเชพเชฎ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช เชคเซ เชเช เชฌเชเชง เชตเซเชฏเชพเชชเชพเชฐเซ เชตเชฟเชเชพเชธ เชเซ เช
เชจเซ เชคเชเชจเซเชเซ เชฐเซเชคเซ เชฎเชพเชฒเชฟเชเซ เช
เชจเซ เชเชชเชจ เชธเซเชฐเซเชธ เชเชเชเซเชจเซเช เชฌเชนเซ-เชเชเช เชเซเชฒเชธเซเชเชฐ เชเซ. เช เชฒเซเช เชฒเชเชตเชพเชจเซ เชนเซเชคเซ เชธเซเชเซเชเซเชเช เชธเชพเชเช เชฎเชพเชเซ เชกเซเชเชฐ เชธเซเชตเซเชฐเซเชฎ เชเซเชฒเชธเซเชเชฐเซเชเช เชธเชฟเชธเซเชเชฎเชจเชพ เช
เชฎเชฒเซเชเชฐเชฃเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชตเชพเชจเซ เชเซ เช
เชฎเชพเชฐเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเชพ เชธเซเชฅเชพเชชเชฟเชค เชตเชฐเซเชเชซเซเชฒเซเชจเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเชฎเชฏเชฎเชพเช เชตเชฟเชเซเชทเซเชชเชฟเชค เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ. เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชชเชฐ เชชเซเชฐเชธเซเชคเซเชค เชตเชฐเซเชฃเชจ เชฌเซ เชญเชพเชเชฎเชพเช เชตเชนเซเชเชเชพเชฏเซเชฒเซเช เชเซ. เชชเซเชฐเชฅเชฎ เชญเชพเช เชกเซเชเชฐ เชธเซเชตเซเชฐเซเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเชคเชพ เชชเชนเซเชฒเชพ CI/CD เชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ, เช
เชจเซ เชฌเซเชเซ เชคเซเชจเชพ เช
เชฎเชฒเซเชเชฐเชฃเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ. เชเซเชฎเชจเซ เชชเซเชฐเชฅเชฎ เชญเชพเช เชตเชพเชเชเชตเชพเชฎเชพเช เชฐเชธ เชจเชฅเซ เชคเซเช เชธเซเชฐเชเซเชทเชฟเชค เชฐเซเชคเซ เชฌเซเชเชพ เชญเชพเช เชชเชฐ เชเช เชถเชเซ เชเซ.
เชญเชพเช I
เชชเชพเชเชพ เชฆเซเชฐเชจเชพ, เชฆเซเชฐเชจเชพ เชตเชฐเซเชทเชฎเชพเช, เชถเชเซเชฏ เชคเซเชเชฒเซ เชเชกเชชเชฅเซ CI/CD เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเซเช เชเชฐเชตเซ เชเชฐเซเชฐเซ เชนเชคเซ. เชกเซเชเชฐเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเชตเชพเชจเซ เชเช เชถเชฐเชค เชนเชคเซ เชเชฎเชพเชตเช เชฎเชพเชเซ เชเชฃเชพ เชเชพเชฐเชฃเซเชธเชฐ เชตเชฟเชเชธเชฟเชค เชเชเชเซ:
- เชเชคเซเชชเชพเชฆเชจเชฎเชพเช เชเชเชเซเชจเซ เชตเชงเซ เชตเชฟเชถเซเชตเชธเชจเซเชฏ เช เชจเซ เชธเซเชฅเชฟเชฐ เชเชพเชฎเชเซเชฐเซ เชฎเชพเชเซ (เชเชเชฒเซ โโโโเชเซ, เชนเชเซเชเชคเชฎเชพเช, เชตเชฐเซเชเซเชฏเซเช เชฒเชพเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชค)
- เช เชเซเชฐเชฃเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชกเซเชเชฐ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชจ เชนเชคเชพ (เชตเชฟเชเชฟเชคเซเชฐ, เชชเชฐเชเชคเซ เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชนเชคเซเช)
- เชเชฐ เชเชจเซเชก เชกเซ เชฎเซเชจเซเชเชฎเซเชจเซเชเชจเซ เชตเซเชเชพเชฐเชฟเช เชตเชฟเชเชพเชฐเชฃเชพเช เช เชจเซเชธเชพเชฐ
MVP เชฎเชพเชเซ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ, เชธเซเชเซเช เช เชจเซ เช เชเชฆเชพเชเชฟเชค เชชเซเชฐเชพเชฐเชเชญเชฟเช เชเชฐเซเชฐเชฟเชฏเชพเชคเซ เชจเซเชเซ เชชเซเชฐเชฎเชพเชฃเซ เชฐเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ:
- เชกเซเชฌเชฟเชฏเชจ เชธเชพเชฅเซ 4 Intelยฎ X5650 เชธเชฐเซเชตเชฐเซเชธ (เชเช เชตเชงเซ เชถเชเซเชคเชฟเชถเชพเชณเซ เชฎเชถเซเชจ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชตเชฟเชเชธเชฟเชค เชเซ)
- C++, Python3 เชฎเชพเช เชชเซเชคเชพเชจเชพ เชเชธเซเชเชฎ เชเชเชเซเชจเซ เชตเชฟเชเชพเชธ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ
- เชตเชชเชฐเชพเชฏเซเชฒ เชฎเซเชเซเชฏ 3เชเซ เชชเชเซเชท เชธเชพเชงเชจเซ: เชเชพเชซเชเชพ, เชเซเชฒเชฟเชเชนเชพเชเชธ, เชเชฐเชซเซเชฒเซ, เชฐเซเชกเชฟเชธ, เชเซเชฐเชพเชซเชจเชพ, เชชเซเชธเซเชเชเซเชฐเซเชธเซเชเชฒ, เชฎเชพเชฏเชเชธเชเซเชฏเซเชเชฒ, โฆ
- เชกเซเชฌเช เช เชจเซ เชฐเซเชฒเซเช เชฎเชพเชเซ เช เชฒเชเชฅเซ เชเชเชเซเชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃ เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชชเชพเชเชชเชฒเชพเชเชจเซเชธ
เชชเซเชฐเชฅเชฎ เชชเซเชฐเชถเซเชจเซเชฎเชพเชเชฅเซ เชเช เชเซ เชเซเชจเซ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชคเชฌเชเซเชเซ เชธเชเชฌเซเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชคเซ เช เชเซ เชเซ เชเชธเซเชเชฎ เชเชเชเซ เชเซเชเชชเชฃ เชชเชฐเซเชฏเชพเชตเชฐเชฃ (CI/CD) เชฎเชพเช เชเซเชตเซ เชฐเซเชคเซ เชเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ.
เช เชฎเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชเชเชเซเชจเซ เชชเซเชฐเชฃเชพเชฒเซเชเชค เชฐเซเชคเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซเช เช เชจเซ เชคเซเชฎเชจเซ เชตเซเชฏเชตเชธเซเชฅเชฟเชค เชฐเซเชคเซ เช เชชเชกเซเช เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช. C++ เช เชฅเชตเชพ Python เชฎเชพเช เชตเชฟเชเชธเชฟเชค เชเชธเซเชเชฎ เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชเชฃเซ เชฐเซเชคเซ เชเซเช เชตเซ เชถเชเชพเชฏ เชเซ. เชคเซเชฎเชพเชเชฅเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ: เชธเชฟเชธเซเชเชฎ เชชเซเชเซเชเซ เชฌเชจเชพเชตเชตเชพ, เชคเซเชฎเชจเซ เชฌเชฟเชฒเซเช เชเชฎเซเชเซเชจเชพ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชฎเซเชเชฒเชตเชพ เช เชจเซ เชชเชเซ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ. เช เชเซเชเชพเชค เชเชพเชฐเชฃเซเชธเชฐ, เชฌเซเชเซ เชชเชฆเซเชงเชคเชฟ เชชเชธเชเชฆ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ, เชเชเชฒเซ เชเซ: CI เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชเซเชเชฟเชเซเชฏเซเชเซเชฌเชฒ เชซเชพเชเชฒเซ เชเชฎเซเชชเชพเชเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชตเชฐเซเชเซเชฏเซเช เชฒ เชชเซเชฐเซเชเซเชเซเช เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ, py เชฎเซเชกเซเชฏเซเชฒเซ เชเชฐเซเชฐเซเชฏเชพเชค.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 เชเชเชเซ เชฎเชพเชเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชฌเชจเชพเชตเซ เชเซ เช เชจเซ เชคเซเชจเซ เชฐเชฟเชฎเซเช เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชจเชเชฒ เชเชฐเซ เชเซ
- เชคเซเชฏเชพเชฐเซ_init.d.py - เชจเชฎเซเชจเชพเชจเชพ เชเชงเชพเชฐเซ เชเชเช เชฎเชพเชเซ เชธเซเชเชพเชฐเซเช-เชธเซเชเซเชช เชธเซเชเซเชฐเชฟเชชเซเชเซ เชคเซเชฏเชพเชฐ เชเชฐเซ เชเซ
- deploy.py - เชจเชตเชพ เชเชเชเซเชจเซเช เชตเชฟเชเชเชจ เช เชจเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ เชเซ
เชธเชฎเชฏ เชชเชธเชพเชฐ เชฅเชฏเซ. เชธเซเชเซเชเซเชเช เชธเซเชเซเชเชจเซ เชชเซเชฐเซเชตเชเชคเซเชชเชพเชฆเชจ เช เชจเซ เชเชคเซเชชเชพเชฆเชจ เชฆเซเชตเชพเชฐเชพ เชฌเชฆเชฒเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เชเช เชตเชงเซ เชตเชฟเชคเชฐเชฃ (CentOS) เชชเชฐ เชเชคเซเชชเชพเชฆเชจ เชฎเชพเชเซ เชธเชฎเชฐเซเชฅเชจ เชเชฎเซเชฐเซเชฏเซเช. 5 เชตเชงเซ เชถเชเซเชคเชฟเชถเชพเชณเซ เชญเซเชคเชฟเช เชธเชฐเซเชตเชฐ เช เชจเซ เชเช เชกเชเชจ เชตเชฐเซเชเซเชฏเซเช เชฒ เชธเชฐเซเชตเชฐ เชเชฎเซเชฐเซเชฏเชพ. เช เชจเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เช เชจเซ เชชเชฐเซเชเซเชทเชเซ เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชธเซเชฅเชฟเชคเชฟเชจเซ เชจเชเซเชเชจเชพ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชคเซเชฎเชจเชพ เชเชพเชฐเซเชฏเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเซเช เชตเชงเซเชจเซ เชตเชงเซ เชฎเซเชถเซเชเซเชฒ เชฌเชจเซเชฏเซเช. เช เชธเชฎเชฏเซ, เชคเซ เชธเซเชชเชทเซเช เชฅเช เชเชฏเซเช เชเซ เชคเซเชจเชพ เชตเชฟเชจเชพ เชเชฐเชตเซเช เช เชถเชเซเชฏ เชนเชคเซเช ...
เชญเชพเช II
เชคเซเชฅเซ, เช
เชฎเชพเชฐเซเช เชเซเชฒเชธเซเชเชฐ เช เชฌเซ เชกเชเชจ เช
เชฒเช เชเชเชเซเชจเซ เช
เชฆเชญเซเชค เชธเชฟเชธเซเชเชฎ เชเซ เชเซเชจเซเช เชตเชฐเซเชฃเชจ Dockerfiles เชฆเซเชตเชพเชฐเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชจเชฅเซ. เชคเชฎเซ เชคเซเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชเซเชเซเชเชธ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชเชฎเชพเชตเช เชฎเชพเชเซ เช เชเซเช เชตเซ เชถเชเซ เชเซ. เช
เชฎเชพเชฐเซเช เชเชพเชฐเซเชฏ เชเซเชฒเชธเซเชเชฐเชจเซ เชชเซเชฐเซ-เชฐเชฟเชฒเซเช เชเซเชธเซเชเชฟเชเช เชชเชนเซเชฒเชพเช เชเชเชพเชธเชตเชพ เชฎเชพเชเซ เชธเซเชเซเชเซเชเช เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซเชจเซเชเชฎเชพเช เชเชฎเชพเชตเชตเชพเชจเซเช เชเซ.
เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ, เชเชเชธเชพเชฅเซ เชเชพเชฒเซ เชฐเชนเซเชฒเชพ เชเชฃเชพ เชเซเชฒเชธเซเชเชฐเซ เชนเซเช เชถเชเซ เชเซ: เชเซเชเชฒเชพ เชเชพเชฐเซเชฏเซ เชชเซเชฐเซเชฃ เชธเซเชฅเชฟเชคเชฟเชฎเชพเช เชนเซเชฏ เช เชฅเชตเชพ เชชเซเชฐเซเชฃ เชฅเชตเชพเชจเซ เชจเชเซเช เชนเซเชฏ. เช เชฎเชพเชฐเชพ เชจเชฟเชเชพเชฒ เชชเชฐ เชธเชฐเซเชตเชฐเชจเซ เชเซเชทเชฎเชคเชพ เช เชฎเชจเซ เชฆเชฐเซเช เชธเชฐเซเชตเชฐ เชชเชฐ เชเชฃเชพ เชเซเชฒเชธเซเชเชฐ เชเชฒเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เชฆเชฐเซเช เชธเซเชเซเชเซเชเช เชเซเชฒเชธเซเชเชฐเชจเซ เช เชฒเช เชเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ (เชฌเชเชฆเชฐเซ, เชกเชฟเชฐเซเชเซเชเชฐเซเช เชตเชเซเชฐเซเชฎเชพเช เชเซเช เชเชตเชฐเชฒเซเชช เชนเซเชตเซเช เชเซเชเช เชจเชนเซเช).
เช เชฎเชพเชฐเซเช เชธเซเชฅเซ เชฎเซเชฒเซเชฏเชตเชพเชจ เชธเชเชธเชพเชงเชจ เช เชฎเชพเชฐเซ เชธเชฎเชฏ เชเซ, เช เชจเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชคเซเชฎเชพเชเชฅเซ เชตเชงเซ เชจเชนเซเชคเซเช.
เชเชกเชชเซ เชถเชฐเซเชเชค เชฎเชพเชเซ, เช เชฎเซ เชคเซเชจเซ เชธเชฐเชณเชคเชพ เช เชจเซ เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชฒเชตเชเซเชเชคเชพเชจเซ เชเชพเชฐเชฃเซ เชกเซเชเชฐ เชธเซเชตเซเชฐเซเชฎ เชชเชธเชเชฆ เชเชฐเซเชฏเซเช เชเซ. เช เชฎเซ เชเซ เชชเซเชฐเชฅเชฎ เชตเชธเซเชคเซ เชเชฐเซ เชคเซ เชฐเซเชฎเซเช เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชฎเซเชจเซเชเชฐ เช เชจเซ เชเชฃเชพ เชจเซเชกเซเชธ เชฌเชจเชพเชตเซเชฏเชพ:
$ 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 เชจเซเชกเซเชธเชจเซ เชเชจเซเชเซเช เชเชฐเซเชฏเชพ: เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ, เชเซเชชเซเชค เชเชฒเซ เชธเซเช เชเชฐเชตเชพ เช
เชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฃ เชธเชฐเซเชตเชฐ เชชเชฐ เชกเซเชเชฐ เชธเซเชตเชพ เชธเซเช เชเชฐเชตเซ. เช เชเช
เชเชเชณ, เช เชฎเซ .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
เชเชชเชฐเซเชเซเชค เชเซเชก เชธเซเชจเชฟเชชเซเชเชฎเชพเชเชฅเซ, เชคเชฎเซ เชเซเช เชถเชเซ เชเซ เชเซ เชฌเซ เชฌเชเชจเซ (เชกเชฟเชชเซเชฒเซเชฏ_เชธเซเชเซเชเชฟเชเช, เชธเซเชเซเชช_เชธเซเชเซเชเชฟเชเช) เชชเชพเชเชชเชฒเชพเชเชจเซเชธเชฎเชพเช เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชเซ, เชเซเชจเซ เชฎเซเชจเซเชฏเซเช เชฒ เชเชเซเชถเชจเชจเซ เชเชฐเซเชฐ เชเซ.
เชธเซเชเซเชเชจเซเช เชจเชพเชฎ เชถเชพเชเชพเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ เชฎเซเชณ เชเชพเชฏ เชเซ เช
เชจเซ เช เชตเชฟเชถเชฟเชทเซเชเชคเชพ เชชเซเชฐเชคเซ เชนเซเชตเซ เชเซเชเช. เชธเซเชเซเชเชฎเชพเชเชจเซ เชธเซเชตเชพเช เช
เชจเชจเซเชฏ เชเชเชชเซ เชเชกเซเชฐเซเชธ เช
เชจเซ เชชเซเชฐเซเชเซเชธ, เชกเชฟเชฐเซเชเซเชเชฐเซเช เชตเชเซเชฐเซ เชฎเซเชณเชตเซ เชเซ. เช
เชฒเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชชเชฐเชเชคเซ เชธเซเชเซเชเชฅเซ เชธเซเชเซเช เชธเซเชงเซ เชธเชฎเชพเชจ (เชเชพเชฐเชฃ เชเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒ เชฌเชงเชพ เชธเซเชเซเชเซเชธ เชฎเชพเชเซ เชธเชฎเชพเชจ เชเซ) - เช
เชฎเซ เชเซ เชเชเซเชเชคเชพ เชนเชคเชพ. เช
เชฎเซ เชธเซเชเซเช (เชเซเชฒเชธเซเชเชฐ) เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฎเชพเชตเช เชเชฐเซเช เชเซเช เชกเซเชเชฐ-เชเชเชชเซเช.เชเชฎเชเชฎเชเชฒ, เชเซ เช
เชฎเชพเชฐเชพ เชเซเชฒเชธเซเชเชฐเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ.
เชกเซเชเชฐ-เชเชเชชเซเช.เชเชฎเชเชฎเชเชฒ
---
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 เชชเชธเชพเชฐ เชเชฐเชตเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ เช เชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชญเชพเช I เชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชเชฎเชพเชตเชเชฅเซ เชตเซเชฏเชตเชนเชพเชฐเซเช เชฐเซเชคเซ เช เชฒเช เชจเชฅเซ. เชนเซเช เชคเชซเชพเชตเชคเซเชจเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซเชถ:
- git เชเซเชฒเซเชจ... - เชเชฎเชพเชตเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชซเชพเชเชฒเซ เชฎเซเชณเชตเซ (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
docker-compose-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
เชคเซเชฅเซ, เชเชเชธเซเชฒเซเชเซเชก เชธเซเชเซเชเซเชเช เชเซเชฒเชธเซเชเชฐเซเชจเซ เชเชฎเชพเชตเช เชฒเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช
เชจเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชนเชตเซ เชคเซเชฎเชจเชพ เชเชพเชฐเซเชฏเซเชจเซ เชคเชชเชพเชธเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชคเซเชฎเชจเซ เชเชฒเชพเชตเซ เชถเชเซ เชเซ.
เชญเชตเชฟเชทเซเชฏ เชจเซ เชฏเซเชเชจเชพเช:
- เช เชฎเชพเชฐเชพ เชเชเชเซเชจเซ เชธเซเชตเชพ เชคเชฐเซเชเซ เช เชฒเช เชเชฐเซ
- เชฆเชฐเซเช เชกเซเชเชฐเชซเชพเชเชฒ เชฎเชพเชเซ เชนเซเชฏ
- เชธเซเชเซเชเชฎเชพเช เชเชเชพ เชฒเซเชก เชเชฐเซเชฒเชพ เชจเซเชกเซเชธเชจเซ เชเชชเชฎเซเชณเซ เชถเซเชงเซ
- เชจเชพเชฎ เชชเซเชเชฐเซเชจ เชฆเซเชตเชพเชฐเชพ เชจเซเชกเซเชธเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ (เชฒเซเชเชฎเชพเชเชจเซ เชเซเชฎ เชเชเชกเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชฌเชฆเชฒเซ)
- เชเช เชเซเช เชเชฎเซเชฐเซ เชเซ เชธเซเชเซเช เชจเชพเชถ เชชเชพเชฎเซ เชเซ
- ...
เชฎเชพเชเซ เชเชพเชธ เชเชญเชพเชฐ
เชธเซเชฐเซเชธ: www.habr.com