рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо рд╡рд╛рдкрд░реВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рдд рдХрд░рд╛

рдЖрдореНрд╣реА рдЬреНрдпрд╛ рдСрдирд▓рд╛рдЗрди рд╡реНрд╣рд┐рдбрд┐рдУ рд╕рд╛рдордЧреНрд░реА рд╢рд┐рдлрд╛рд░рд╕ рдкреНрд░рдгрд╛рд▓реАрд╡рд░ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЛрдд рддреА рдПрдХ рдмрдВрдж рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдЖрд╣реЗ рдЖрдгрд┐ рддрд╛рдВрддреНрд░рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рдорд╛рд▓рдХреА рдЖрдгрд┐ рдореБрдХреНрдд рд╕реНрд░реЛрдд рдШрдЯрдХрд╛рдВрдЪрд╛ рдПрдХ рдмрд╣реБ-рдШрдЯрдХ рдХреНрд▓рд╕реНрдЯрд░ рдЖрд╣реЗ. рд╣рд╛ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдЙрджреНрджреЗрд╢ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╕рд╛рдареА рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдордЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреЗ рд╣рд╛ рдЖрд╣реЗ, рдорд░реНрдпрд╛рджрд┐рдд рд╡реЗрд│реЗрдЪреНрдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рд╛рдд рд╡реНрдпрддреНрдпрдп рди рдЖрдгрддрд╛. рдЖрдкрд▓реНрдпрд╛ рд▓рдХреНрд╖ рд╡реЗрдзрдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рджрд░ рдХреЗрд▓реЗрд▓реЗ рд╡рд░реНрдгрди рджреЛрди рднрд╛рдЧрд╛рдд рд╡рд┐рднрд╛рдЧрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ. рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо рд╡рд╛рдкрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА CI/CD рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ рдЖрдгрд┐ рджреБрд╕рд░рд╛ рднрд╛рдЧ рддреЗ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ. рдЬреНрдпрд╛рдВрдирд╛ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рд╡рд╛рдЪрдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдирд╛рд╣реА рддреЗ рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рджреБрд╕рд▒реНрдпрд╛ рднрд╛рдЧрд╛рд╡рд░ рдЬрд╛рдК рд╢рдХрддрд╛рдд.

рднрд╛рдЧ I

рдПрдХреЗрдХрд╛рд│реА, рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рд▓рд╡рдХрд░ CI/CD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рд╣реЛрддреА. рдбреЙрдХрд░ рди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдПрдХ рдЕрдЯ рд╣реЛрддреА рддреИрдирд╛рддреАрд╕рд╛рдареА рдЕрдиреЗрдХ рдХрд╛рд░рдгрд╛рдВрд╕рд╛рдареА рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд:

  • рдЙрддреНрдкрд╛рджрдирд╛рддреАрд▓ рдШрдЯрдХрд╛рдВрдЪреНрдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЖрдгрд┐ рд╕реНрдерд┐рд░ рдСрдкрд░реЗрд╢рдирд╕рд╛рдареА (рдореНрд╣рдгрдЬреЗрдЪ, рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛)
  • рдЖрдШрд╛рдбреАрдЪреНрдпрд╛ рд╡рд┐рдХрд╕рдХрд╛рдВрдирд╛ рдбреЙрдХрд░рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рд╛рдпрдЪреЗ рдирд╡реНрд╣рддреЗ (рд╡рд┐рдЪрд┐рддреНрд░, рдкрдг рддреЗ рдЕрд╕реЗрдЪ рд╣реЛрддреЗ)
  • R&D рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рдЪреНрдпрд╛ рд╡реИрдЪрд╛рд░рд┐рдХ рдХрд╛рд░рдгрд╛рдВрд╕рд╛рдареА

MVP рд╕рд╛рдареА рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛, рд╕реНрдЯреЕрдХ рдЖрдгрд┐ рдЕрдВрджрд╛рдЬреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рд╣реЛрддреНрдпрд╛:

  • Debian рд╕рд╣ 4 Intel┬о X5650 рд╕рд░реНрд╡реНрд╣рд░ (рд╡рд┐рдХрд╛рд╕рд╛рд╕рд╛рдареА рдкреВрд░реНрдгрдкрдгреЗ рдПрдХ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдорд╢реАрди)
  • рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╕рд╛рдиреБрдХреВрд▓ рдШрдЯрдХрд╛рдВрдЪрд╛ рд╡рд┐рдХрд╛рд╕ C++, Python3 рдордзреНрдпреЗ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ
  • рд╡рд╛рдкрд░рд▓реЗрд▓реА рдореБрдЦреНрдп 3rdparty рдЯреВрд▓реНрд╕: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, тАж
  • рдбреАрдмрдЧ рдЖрдгрд┐ рд░рд┐рд▓реАрдЭрд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдШрдЯрдХ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдЗрдкрд▓рд╛рдЗрди

рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд (CI/CD) рд╕рд╛рдиреБрдХреВрд▓ рдШрдЯрдХ рдХрд╕реЗ рдЙрдкрдпреЛрдЬрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓ рд╣реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рд╕реЛрдбрд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдВрдкреИрдХреА рдПрдХ рдЖрд╣реЗ.

рдЖрдореНрд╣реА рддреГрддреАрдп-рдкрдХреНрд╖ рдШрдЯрдХ рдкрджреНрдзрддрд╢реАрд░рдкрдгреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдкрджреНрдзрддрд╢реАрд░рдкрдгреЗ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. C++ рдХрд┐рдВрд╡рд╛ Python рдордзреНтАНрдпреЗ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реЗ рд╕рд╛рдиреБрдХреВрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдиреЗрдХ рдкреНрд░рдХрд╛рд░реЗ рдЙрдкрдпреЛрдЬрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рддреНрдпрд╛рдкреИрдХреА, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде: рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ рддрдпрд╛рд░ рдХрд░рдгреЗ, рддреНрдпрд╛рдВрдирд╛ рдПрдХрддреНрд░рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рдорд╛рдВрдЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдд рдкрд╛рдард╡рдгреЗ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рддреНрдпрд╛рдВрдЪреА рддреНрдпрд╛рдирдВрддрд░рдЪреА рд╕реНрдерд╛рдкрдирд╛. рдЖрдзреАрдЪ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рджреБрд╕рд░реА рдкрджреНрдзрдд рдирд┐рд╡рдбрд▓реА рдЧреЗрд▓реА, рддреА рдореНрд╣рдгрдЬреЗ: CI рд╡рд╛рдкрд░реВрди, рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓реНрд╕ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдПрдХ рдЖрднрд╛рд╕реА рдкреНрд░рдХрд▓реНрдк рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, requirements.txt рд╡рд░реВрди py рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдпрд╛ рд╕рд░реНрд╡ рдХрд▓рд╛рдХреГрддреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдгрд┐ рд╕реЛрдмрдд рдкрд╛рдард╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реЛрдмрдд рдЕрд╕рд▓реЗрд▓реЗ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рддрд╛рд╡рд░рдг. рдкреБрдвреЗ, рдкреНрд░рд╢рд╛рд╕рдХ рдЕрдзрд┐рдХрд╛рд░рд╛рдВрд╢рд┐рд╡рд╛рдп рдЖрднрд╛рд╕реА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

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

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдкреНрд░рддрд┐рдореЗрд╡рд░ рдЪрд╛рд▓рддреЗ, рдЬрд┐рдереЗ рд╕рд░реНрд╡ рдЖрд╡рд╢реНрдпрдХ рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд╕реНрдерд╛рдкрд┐рдд рдЖрд╣реЗрдд рдЖрдгрд┐ рдЗрддрд░ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.

рдЬреЙрдмрдордзреАрд▓ рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдорд╛рд░реНрдЧрд╛рдиреЗ рдордиреЛрд░рдВрдЬрдХ рдЕрд╕рд▓реНрдпрд╛ рддрд░реА, рдореА рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рдирдХреНрдХреАрдЪ рдмреЛрд▓рдгрд╛рд░ рдирд╛рд╣реА; рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕ рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рд╣рд╛ рд▓реЗрдЦрд╛рдЪрд╛ рдЙрджреНрджреЗрд╢ рдирд╛рд╣реА. рдореА рдлрдХреНрдд рддреБрдордЪреЗ рд▓рдХреНрд╖ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдХрдбреЗ рд╡реЗрдзреВрди рдШреЗрддреЛ рдХреА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдЯреЗрдЬрдордзреНрдпреЗ рдХреЙрд▓рд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪрд╛ рдХреНрд░рдо рдЕрд╕рддреЛ:

  1. createconfig.py тАФ рдирдВрддрд░рдЪреНрдпрд╛ рдЙрдкрдпреЛрдЬрдирд╛рд╕рд╛рдареА (рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рддреА, рдЙрддреНрдкрд╛рджрди, рдЪрд╛рдЪрдгреА, ...) рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рддреАрд▓ рдШрдЯрдХрд╛рдВрд╕рд╛рдареА рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╕рд╣ settings.ini рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рддреЗ.
  2. install_venv.sh тАФ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрддреАрд▓ py рдШрдЯрдХрд╛рдВрд╕рд╛рдареА рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдХрд░рддреЗ рдЖрдгрд┐ рддреЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХреЙрдкреА рдХрд░рддреЗ
  3. ready_init.d.py тАФ рдЯреЗрдореНрдкрд▓реЗрдЯрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдЯрд╛рд░реНрдЯ-рд╕реНрдЯреЙрдк рдШрдЯрдХрд╛рдВрд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдпрд╛рд░ рдХрд░рддреЗ
  4. deploy.py тАФ рдирд╡реАрди рдШрдЯрдХ рддреИрдирд╛рдд рдЖрдгрд┐ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рддреЗ

рд╡реЗрд│ рдирд┐рдШреВрди рдЧреЗрд▓реА. рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╕реНрдЯреЗрдЬрдЪреА рдЬрд╛рдЧрд╛ рдкреВрд░реНрд╡рдЙрддреНрдкрд╛рджрди рдЖрдгрд┐ рдЙрддреНрдкрд╛рджрдирд╛рдиреЗ рдШреЗрддрд▓реА. рдЙрддреНрдкрд╛рджрдирд╛рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрдгрдЦреА рдПрдХрд╛ рд╡рд┐рддрд░рдгрд╛рд╡рд░ (CentOS) рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ. рдЖрдгрдЦреА 5 рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднреМрддрд┐рдХ рд╕рд░реНрд╡реНрд╣рд░ рдЖрдгрд┐ рдбрдЭрдирднрд░ рдЖрднрд╛рд╕реА рд╕рд░реНрд╡реНрд╣рд░ рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ. рдЖрдгрд┐ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдЖрдгрд┐ рдкрд░реАрдХреНрд╖рдХрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдВрдЪреА рдХрдореА-рдЕрдзрд┐рдХ рдкреНрд░рдорд╛рдгрд╛рдд рдХрд╛рд░реНрдпрд░рдд рд╕реНрдерд┐рддреАрдЪреНрдпрд╛ рдЬрд╡рд│ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рдЪрдгреА рдШреЗрдгреЗ рдХрдареАрдг рд╣реЛрдд рдЧреЗрд▓реЗ. рдпрд╛рд╡реЗрд│реА рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдХреА рддреНрдпрд╛рдЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХрд░рдгреЗ рдЕрд╢рдХреНрдп рдЖрд╣реЗ ...

рднрд╛рдЧ рджреБрд╕рд░рд╛

рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо рд╡рд╛рдкрд░реВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рдд рдХрд░рд╛

рддрд░, рдЖрдордЪрд╛ рдХреНрд▓рд╕реНрдЯрд░ рдбреЙрдХрд░рдлрд╛рдИрд▓реНрд╕рдиреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА рдЕрд╢рд╛ рджреЛрди рдбрдЭрди рд╡реИрдпрдХреНрддрд┐рдХ рдШрдЯрдХрд╛рдВрдЪреА рдПрдХ рдиреЗрддреНрд░рджреАрдкрдХ рдкреНрд░рдгрд╛рд▓реА рдЖрд╣реЗ. рддреБрдореНрд╣реА рддреЗ рдлрдХреНрдд рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛. рдкреНрд░реА-рд░рд┐рд▓реАрдЭ рдЪрд╛рдЪрдгреАрдкреВрд░реНрд╡реА рддреНрдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рддреИрдирд╛рдд рдХрд░рдгреЗ рд╣реЗ рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ.

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХрджреГрд╖реНрдЯреНрдпрд╛, рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдХрд╛рд░реНрдпрд░рдд рдЕрд╕реВ рд╢рдХрддрд╛рдд: рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рд╕реНрдерд┐рддреАрдд рдХрд┐рдВрд╡рд╛ рдкреВрд░реНрдгрддреНрд╡рд╛рдЪреНрдпрд╛ рдЬрд╡рд│ рдЕрд╕рд▓реЗрд▓реА рдХрд╛рд░реНрдпреЗ. рдЖрдордЪреНрдпрд╛ рд╡рд┐рд▓реНрд╣реЗрд╡рд╛рдЯреАрд╡рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рд╢рдХреНрддреА рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрдиреЗрдХ рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдХреНрд▓рд╕реНрдЯрд░ рд╡реЗрдЧрд│реЗ рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдкреЛрд░реНрдЯреНрд╕, рдбрд┐рд░реЗрдХреНрдЯрд░реА рдЗ. рдордзреНрдпреЗ рдУрд╡реНрд╣рд░рд▓реЕрдк рдирд╕рд╛рд╡реЗ).

рдЖрдордЪрд╛ рд╕рд░реНрд╡рд╛рдд рдореМрд▓реНрдпрд╡рд╛рди рд╕реНрддреНрд░реЛрдд рд╣рд╛ рдЖрдордЪрд╛ рд╡реЗрд│ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рддреЗ рдЬрд╛рд╕реНрдд рдирд╡реНрд╣рддреЗ.

рдЬрд▓рдж рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд╛рдзреЗрдкрдгрд╛рдореБрд│реЗ рдЖрдгрд┐ рд▓рд╡рдЪрд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдореБрд│реЗ рдирд┐рд╡рдбрд▓реЗ. рдЖрдореНрд╣реА рдХреЗрд▓реЗрд▓реА рдкрд╣рд┐рд▓реА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЖрдгрд┐ рдЕрдиреЗрдХ рдиреЛрдбреНрд╕ рддрдпрд╛рд░ рдХрд░рдгреЗ:

$ 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

рд╡рд░реАрд▓ рдХреЛрдбрдЪреНрдпрд╛ рддреБрдХрдбреНрдпрд╛рдВрд╡рд░реВрди рд╣реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддреЗ рдХреА рджреЛрди рдмрдЯрдгреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреНрдпреЗ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗрдд (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 рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реНрдпрд╛рд╕рд╛рд░рдЦреА рджрд┐рд╕рддреЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рднрд╛рдЧ I рдордзреНрдпреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рддреИрдирд╛рддреАрдкреЗрдХреНрд╖рд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рднрд┐рдиреНрди рдирд╛рд╣реА. рдореА рдлрд░рдХрд╛рдВрд╡рд░ рдЬреЛрд░ рджреЗрдИрди:

  • git рдХреНрд▓реЛрди... тАФ рдЙрдкрдпреЛрдЬрди (createconfig.py, install_venv.sh, рдЗ.) рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реНрд╕ рдорд┐рд│рддрд╛рдд.
  • рдХрд░реНрд▓... && рдЕрдирдЭрд┐рдк... - рдмрд┐рд▓реНрдб рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЖрдгрд┐ рдЕрдирдЭрд┐рдк рдХрд░рд╛ (рд╕рдВрдХрд▓рд┐рдд рдЙрдкрдпреБрдХреНрддрддрд╛)

рдЕрджреНрдпрд╛рдк рдЕрд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдлрдХреНрдд рдПрдХ рдЖрд╣реЗ: рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд╕рд▓реЗрд▓реЗ рдШрдЯрдХ рд╡рд┐рдХрд╕рдХрд╛рдВрдЪреНрдпрд╛ рдмреНрд░рд╛рдЙрдЭрд░рдордзреВрди рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдирд╛рд╣реАрдд. рдЖрдореНрд╣реА рд░рд┐рд╡реНрд╣рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рд╡рд╛рдкрд░реВрди рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рддреЛ, рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ:

.gitlab-ci.yml рдордзреНрдпреЗ, рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдЯреЕрдХ рддреИрдирд╛рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдмреЕрд▓рдиреНрд╕рд░ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдУрд│ рдЬреЛрдбрд╛ (рдЬреЗ, рд╡рдЪрдирдмрджреНрдз рдЕрд╕рддрд╛рдирд╛, рдлрдХреНрдд рддреНрдпрд╛рдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрджреНрдпрддрдирд┐рдд рдХрд░рддреЗ (рдЯреЗрдореНрдкреНрд▓реЗрдЯрдиреБрд╕рд╛рд░ рдирд╡реАрди nginx рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рддреЗ: /etc/nginx/conf.d) /${CI_COMMIT_REF_NAME}.conf) - рдХреЛрдб рдбреЙрдХрд░-рдХрдВрдкреЛрдЬ-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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛