ืคืจื•ืก ื™ื™ืฉื•ืžื™ื ืขื Docker Swarm

ืžืขืจื›ืช ื”ืžืœืฆื•ืช ืชื•ื›ืŸ ื”ื•ื•ื™ื“ืื• ื”ืžืงื•ื•ื ืช ืขืœื™ื” ืื ื• ืขื•ื‘ื“ื™ื ื”ื™ื ืคื™ืชื•ื— ืžืกื—ืจื™ ืกื’ื•ืจ ื•ืžื”ื•ื•ื” ื˜ื›ื ื™ืช ืืฉื›ื•ืœ ืžืจื•ื‘ื” ืจื›ื™ื‘ื™ื ืฉืœ ืจื›ื™ื‘ื™ื ืงื ื™ื™ื ื™ื™ื ื•ืงื•ื“ ืคืชื•ื—. ืžื˜ืจืช ื›ืชื™ื‘ืช ืžืืžืจ ื–ื” ื”ื™ื ืœืชืืจ ืืช ื”ื”ื˜ืžืขื” ืฉืœ ืžืขืจื›ืช ื”ืืฉื›ื•ืœื•ืช ืฉืœ docker swarm ืขื‘ื•ืจ ืืชืจ ืกื˜aging ืžื‘ืœื™ ืœืฉื‘ืฉ ืืช ื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ื”ืžื‘ื•ืกืกืช ืฉืœ ื”ืชื”ืœื™ื›ื™ื ืฉืœื ื• ื‘ื–ืžืŸ ืžื•ื’ื‘ืœ. ื”ื ืจื˜ื™ื‘ ื”ืžื•ื‘ื ืœื™ื“ื™ืขืชืš ืžื—ื•ืœืง ืœืฉื ื™ ื—ืœืงื™ื. ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืžืชืืจ CI / CD ืœืคื ื™ ื”ืฉื™ืžื•ืฉ ื‘- Docker swarm, ื•ื”ืฉื ื™ ืžืชืืจ ืืช ืชื”ืœื™ืš ื”ื™ื™ืฉื•ื ืฉืœื•. ืžื™ ืฉืœื ืžืขื•ื ื™ื™ืŸ ืœืงืจื•ื ืืช ื”ื—ืœืง ื”ืจืืฉื•ืŸ ื™ื›ื•ืœ ืœืขื‘ื•ืจ ื‘ื‘ื˜ื—ื” ืืœ ื”ืฉื ื™.

ะงะฐัั‚ัŒ ืื ื™

ืขื•ื“ ื‘ืฉื ื” ื”ืจื—ื•ืงื”, ื”ืจื—ื•ืงื”, ื”ื™ื” ืฆื•ืจืš ืœื”ื’ื“ื™ืจ ืืช ืชื”ืœื™ืš ื”-CI/CD ื‘ืžื”ื™ืจื•ืช ื”ืืคืฉืจื™ืช. ืื—ื“ ื”ืชื ืื™ื ื”ื™ื” ืœื ืœื”ืฉืชืžืฉ ื‘-Docker ืœืคืจื™ืกื” ืคื™ืชื— ืจื›ื™ื‘ื™ื ืžื›ืžื” ืกื™ื‘ื•ืช:

  • ืœืคืขื•ืœื” ืืžื™ื ื” ื•ื™ืฆื™ื‘ื” ื™ื•ืชืจ ืฉืœ ืจื›ื™ื‘ื™ื ื‘-Production (ื›ืœื•ืžืจ, ืœืžืขืฉื”, ื”ื“ืจื™ืฉื” ืœื ืœื”ืฉืชืžืฉ ื‘ื•ื•ื™ืจื˜ื•ืืœื™ื–ืฆื™ื”)
  • ืžืคืชื—ื™ื ืžื•ื‘ื™ืœื™ื ืœื ืจืฆื• ืœืขื‘ื•ื“ ืขื Docker (ืžื•ื–ืจ, ืื‘ืœ ื›ื›ื” ื–ื” ื”ื™ื”)
  • ืœืคื™ ื”ืฉื™ืงื•ืœื™ื ื”ืื™ื“ื™ืื•ืœื•ื’ื™ื™ื ืฉืœ ื”ื ื”ืœืช ื”ืžื•"ืค

ืชืฉืชื™ื•ืช, ืขืจื™ืžื” ื•ื“ืจื™ืฉื•ืช ืจืืฉื•ื ื™ื•ืช ืžืฉื•ืขืจื•ืช ืœ-MVP ื”ื•ืฆื’ื• ื›ื“ืœืงืžืŸ:

  • 4 ืฉืจืชื™ Intelยฎ X5650 ืขื Debian (ืžื›ื•ื ื” ืื—ืช ื—ื–ืงื” ื™ื•ืชืจ ืคื•ืชื—ื” ื‘ืžืœื•ืื”)
  • ืคื™ืชื•ื— ืจื›ื™ื‘ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช ืžืฉืœื• ืžืชื‘ืฆืข ื‘-C++, Python3
  • ื›ืœื™ ืฆื“ ืฉืœื™ืฉื™ ืขื™ืงืจื™ื™ื ื‘ืฉื™ืžื•ืฉ: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, โ€ฆ
  • ืฆื™ื ื•ืจื•ืช ืœื‘ื ื™ื™ื” ื•ื‘ื“ื™ืงื” ืฉืœ ืจื›ื™ื‘ื™ื ื‘ื ืคืจื“ ืœืฆื•ืจืš ื ื™ืคื•ื™ ื•ืฉื—ืจื•ืจ

ืื—ืช ื”ืฉืืœื•ืช ื”ืจืืฉื•ื ื•ืช ืฉื™ืฉ ืœื”ืชื™ื™ื—ืก ืืœื™ื”ืŸ ื‘ืฉืœื‘ ื”ืจืืฉื•ื ื™ ื”ื™ื ื›ื™ืฆื“ ืจื›ื™ื‘ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช ื™ื™ืคืจืกื• ื‘ื›ืœ ืกื‘ื™ื‘ื” (CI / CD).

ื”ื—ืœื˜ื ื• ืœื”ืชืงื™ืŸ ืจื›ื™ื‘ื™ ืฆื“ ืฉืœื™ืฉื™ ื‘ืื•ืคืŸ ืžืขืจื›ืชื™ ื•ืœืขื“ื›ืŸ ืื•ืชื ื‘ืื•ืคืŸ ืžืขืจื›ืชื™. ื ื™ืชืŸ ืœืคืจื•ืก ื™ื™ืฉื•ืžื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช ืฉืคื•ืชื—ื• ื‘-C++ ืื• Python ื‘ื›ืžื” ื“ืจื›ื™ื. ื‘ื™ื ื™ื”ื, ืœืžืฉืœ: ื™ืฆื™ืจืช ื—ื‘ื™ืœื•ืช ืžืขืจื›ืช, ืฉืœื™ื—ืชืŸ ืœืžืื’ืจ ื”ืชืžื•ื ื•ืช ื”ื‘ื ื•ื™ื•ืช ื•ืœืื—ืจ ืžื›ืŸ ื”ืชืงื ืชืŸ ื‘ืฉืจืชื™ื. ืžืกื™ื‘ื” ืœื ื™ื“ื•ืขื”, ื ื‘ื—ืจื” ืฉื™ื˜ื” ืื—ืจืช, ื›ืœื•ืžืจ: ื‘ืืžืฆืขื•ืช CI, ืงื‘ืฆื™ ื”ืคืขืœื” ื ื™ืชื ื™ื ืœื”ื™ื“ื•ืจ ืฉืœ ื™ื™ืฉื•ืžื™ื, ื ื•ืฆืจืช ืกื‘ื™ื‘ืช ืคืจื•ื™ืงื˜ ื•ื™ืจื˜ื•ืืœื™ืช, ืžื•ืชืงื ื™ื ืžื•ื“ื•ืœื™ py ืž- requirements.txt, ื•ื›ืœ ื”ื—ืคืฆื™ื ื”ืœืœื• ื ืฉืœื—ื™ื ื™ื—ื“ ืขื ื”ื’ื“ืจื•ืช, ืกืงืจื™ืคื˜ื™ื ื•- ืกื‘ื™ื‘ืช ืืคืœื™ืงืฆื™ื” ื ืœื•ื•ื™ืช ืœืฉืจืชื™ื. ืœืื—ืจ ืžื›ืŸ, ื™ื™ืฉื•ืžื™ื ืžื•ืคืขืœื™ื ื›ืžืฉืชืžืฉ ื•ื™ืจื˜ื•ืืœื™ ืœืœื ื–ื›ื•ื™ื•ืช ืžื ื”ืœ.

Gitlab-CI ื ื‘ื—ืจื” ื›ืžืขืจื›ืช CI/CD. ื”ืฆื™ื ื•ืจ ืฉื”ืชืงื‘ืœ ื ืจืื” ื‘ืขืจืš ื›ืš:

ืคืจื•ืก ื™ื™ืฉื•ืžื™ื ืขื Docker Swarm
ืžื‘ื—ื™ื ื” ืžื‘ื ื™ืช, 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

ืจืื•ื™ ืœืฆื™ื™ืŸ ื›ื™ ื”ื”ืจื›ื‘ื” ื•ื”ื‘ื“ื™ืงื” ืžืชื‘ืฆืขืช ืขืœ ืชืžื•ื ื” ืžืฉืœื”, ืฉื‘ื” ื›ืœ ื—ื‘ื™ืœื•ืช ื”ืžืขืจื›ืช ื”ื“ืจื•ืฉื•ืช ื›ื‘ืจ ื”ื•ืชืงื ื• ื•ื ืขืฉื• ื”ื’ื“ืจื•ืช ืื—ืจื•ืช.

ืืžื ื ื›ืœ ืื—ื“ ืžื”ืชืกืจื™ื˜ื™ื ื”ืœืœื• ื‘ืขื‘ื•ื“ื•ืช ืžืขื ื™ื™ืŸ ื‘ื“ืจื›ื• ืฉืœื•, ืื‘ืœ ื›ืžื•ื‘ืŸ ืฉืœื ืื“ื‘ืจ ืขืœื™ื”ื, ื”ืชื™ืื•ืจ ืฉืœ ื›ืœ ืื—ื“ ืžื”ื ื™ื™ืงื— ื”ืจื‘ื” ื–ืžืŸ ื•ื–ื• ืœื ืžื˜ืจืช ื”ืžืืžืจ. ืื ื™ ืจืง ืืคื ื” ืืช ืชืฉื•ืžืช ืœื‘ืš ืœืขื•ื‘ื“ื” ืฉืฉืœื‘ ื”ืคืจื™ืกื” ืžื•ืจื›ื‘ ืžืจืฆืฃ ืฉืœ ืชืกืจื™ื˜ื™ ืงืจื™ืื”:

  1. createconfig.py - ื™ื•ืฆืจ ืงื•ื‘ืฅ settings.ini ืขื ื”ื’ื“ืจื•ืช ืจื›ื™ื‘ื™ื ื‘ืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช ืœืคืจื™ืกื” ืœืื—ืจ ืžื›ืŸ (ืงื“ื ื™ื™ืฆื•ืจ, ื™ื™ืฆื•ืจ, ื‘ื“ื™ืงื”, ...)
  2. install_venv.sh - ื™ื•ืฆืจ ืกื‘ื™ื‘ื” ื•ื™ืจื˜ื•ืืœื™ืช ืขื‘ื•ืจ ืจื›ื™ื‘ื™ py ื‘ืกืคืจื™ื™ื” ืกืคืฆื™ืคื™ืช ื•ืžืขืชื™ืง ืื•ืชื” ืœืฉืจืชื™ื ืžืจื•ื—ืงื™ื
  3. prepare_init.d.py - ืžื›ื™ืŸ ืกืงืจื™ืคื˜ื™ื ืฉืœ ื”ืชื—ืœื”-ืขืฆื™ืจื” ืขื‘ื•ืจ ื”ืจื›ื™ื‘ ื‘ื”ืชื‘ืกืก ืขืœ ื”ืชื‘ื ื™ืช
  4. deploy.py - ืžืคืจืง ื•ืžืคืขื™ืœ ืžื—ื“ืฉ ืจื›ื™ื‘ื™ื ื—ื“ืฉื™ื

ื”ื–ืžืŸ ืขื‘ืจ. ืฉืœื‘ ื”ื‘ื™ืžื•ื™ ื”ื•ื—ืœืฃ ื‘ืงื“ื ื™ื™ืฆื•ืจ ื•ื”ืคืงื”. ื ื•ืกืคื” ืชืžื™ื›ื” ื‘ืžื•ืฆืจ ื‘ื”ืคืฆื” ืื—ืช ื ื•ืกืคืช (CentOS). ื ื•ืกืคื• ืขื•ื“ 5 ืฉืจืชื™ื ืคื™ื–ื™ื™ื ื—ื–ืงื™ื ื•ืชืจื™ืกืจ ื•ื™ืจื˜ื•ืืœื™ื™ื. ื•ืžืคืชื—ื™ื ื•ื‘ื•ื“ืงื™ื ื ื”ื™ื” ื™ื•ืชืจ ื•ื™ื•ืชืจ ืงืฉื” ืœื‘ื“ื•ืง ืืช ื”ืžืฉื™ืžื•ืช ืฉืœื”ื ื‘ืกื‘ื™ื‘ื” ืงืจื•ื‘ื” ืคื—ื•ืช ืื• ื™ื•ืชืจ ืœืžืฆื‘ ื”ืขื‘ื•ื“ื”. ื‘ืฉืœื‘ ื–ื” ื”ืชื‘ืจืจ ืฉืื™ ืืคืฉืจ ื‘ืœืขื“ื™ื•...

ื—ืœืง ื‘ '

ืคืจื•ืก ื™ื™ืฉื•ืžื™ื ืขื Docker Swarm

ืื–, ื”ืืฉื›ื•ืœ ืฉืœื ื• ื”ื•ื ืžืขืจื›ืช ืžืจื”ื™ื‘ื” ืฉืœ ื›ืžื” ืขืฉืจื•ืช ืจื›ื™ื‘ื™ื ื ืคืจื“ื™ื ืฉืื™ื ื ืžืชื•ืืจื™ื ืขืœ ื™ื“ื™ 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

ืœืื—ืจ ืžื›ืŸ, ื—ื™ื‘ืจื ื• ืฆืžืชื™ื Gitlab-CI ื•-Swarm ืžื‘ื—ื™ื ืช ืฉืœื™ื˜ื” ืžืจื—ื•ืง ืขืœ ืฆืžืชื™ื ืž-CI: ื”ืชืงื ืช ืชืขื•ื“ื•ืช, ื”ื’ื“ืจืช ืžืฉืชื ื™ื ืกื•ื“ื™ื™ื ื•ื”ื’ื“ืจืช ืฉื™ืจื•ืช 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) ื ื•ืกืคื• ืœ-Pipelines, ื”ื“ื•ืจืฉื™ื ืคืขื•ืœื” ื™ื“ื ื™ืช.

ืคืจื•ืก ื™ื™ืฉื•ืžื™ื ืขื Docker Swarm
ืฉื ื”ืžื—ืกื ื™ืช ืชื•ืื ืœืฉื ื”ืกื ื™ืฃ ื•ื”ื™ื™ื—ื•ื“ื™ื•ืช ื”ื–ื• ืืžื•ืจื” ืœื”ืกืคื™ืง. ื”ืฉื™ืจื•ืชื™ื ื‘ืขืจื™ืžื” ืžืงื‘ืœื™ื ื›ืชื•ื‘ื•ืช IP ื™ื™ื—ื•ื“ื™ื•ืช, ื•ื™ืฆื™ืื•ืช, ืกืคืจื™ื•ืช ื•ื›ื•'. ื™ื”ื™ื” ืžื‘ื•ื“ื“, ืื‘ืœ ื–ื”ื” ืžื—ืกื ื™ืช ืœื—ืกื™ืžื” (ื›ื™ ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ื–ื”ื” ืœื›ืœ ื”ืขืจื™ืžื•ืช) - ืžื” ืฉืจืฆื™ื ื•. ืื ื• ืคื•ืจืกื™ื ืืช ื”ืžื—ืกื ื™ืช (ืืฉื›ื•ืœ) ื‘ืืžืฆืขื•ืช docker-compose.ym, ืฉืžืชืืจ ืืช ื”ืืฉื›ื•ืœ ืฉืœื ื•.

docker-compose.ym

---
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, ืœืื—ืจ ืคืจื™ืกืช ืžื—ืกื ื™ืช ื”ืืฉื›ื•ืœื•ืช, ืื ื• ืžื•ืกื™ืคื™ื ืืช ืฉื•ืจืช ื”ืคืจื™ืกื” ืฉืœ ื”-balancer (ืืฉืจ, ื‘ืขืช commit, ืžืขื“ื›ืŸ ืจืง ืืช ื”ืชืฆื•ืจื” ืฉืœื• (ื™ื•ืฆืจ ืงื‘ืฆื™ ืชืฆื•ืจื” ื—ื“ืฉื™ื ืฉืœ 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:

10.50.173.106 staging_BRANCH-1831_cluster.dev

ืœื›ืŸ, ื”ืคืจื™ืกื” ืฉืœ ืืฉื›ื•ืœื•ืช ื‘ื™ืžื•ื™ ืžื‘ื•ื“ื“ื™ื ื™ื•ืฉืžื” ื•ืžืคืชื—ื™ื ื™ื›ื•ืœื™ื ื›ืขืช ืœื”ืคืขื™ืœ ืื•ืชื ื‘ื›ืœ ืžืกืคืจ ืžืกืคื™ืง ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื”ืžืฉื™ืžื•ืช ืฉืœื”ื.

ืชื•ื›ื ื™ื•ืช ืขืชื™ื“ื™ื•ืช:

  • ื”ืคืจื“ ืืช ื”ืจื›ื™ื‘ื™ื ืฉืœื ื• ื›ืฉื™ืจื•ืชื™ื
  • ื™ืฉ ืขื‘ื•ืจ ื›ืœ Dockerfile
  • ื–ื™ื”ื•ื™ ืื•ื˜ื•ืžื˜ื™ ืฉืœ ืฆืžืชื™ื ืคื—ื•ืช ื˜ืขื•ื ื™ื ื‘ืขืจื™ืžื”
  • ืฆื™ื™ืŸ ืฆืžืชื™ื ืœืคื™ ื“ืคื•ืก ืฉืžื•ืช (ื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘-id ื›ืžื• ื‘ืžืืžืจ)
  • ื”ื•ืกืฃ ืกื™ืžื•ืŸ ืฉื”ืžื—ืกื ื™ืช ื ื”ืจืกื”
  • ...

ืชื•ื“ื” ืžื™ื•ื—ื“ืช ืขืœ ืžืืžืจ.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”