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

рд╣рд╛рдореАрд▓реЗ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдЕрдирд▓рд╛рдЗрди рднрд┐рдбрд┐рдпреЛ рд╕рд╛рдордЧреНрд░реА рд╕рд┐рдлрд╛рд░рд┐рд╕ рдкреНрд░рдгрд╛рд▓реА рдПрдХ рдмрдиреНрдж рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд┐рдХрд╛рд╕ рд╣реЛ рд░ рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рд░реВрдкрдорд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрдХреЛ рдмрд╣реБ-рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рдХреНрд▓рд╕реНрдЯрд░ рд╣реЛред рдпреЛ рд▓реЗрдЦ рд▓реЗрдЦреНрдиреБрдХреЛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╕реНрдЯреЗрдЬрд┐рдЩ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рд▓рд╛рдЧрд┐ рдбрдХрд░ рд╕реНрд╡рд╛рд░реНрдо рдХреНрд▓рд╕реНрдЯрд░рд┐рдЩ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд╛рдИ рд╡рд░реНрдгрди рдЧрд░реНрдиреБ рд╣реЛ, рд╕реАрдорд┐рдд рд╕рдордпрдХрд╛ рд╕рд░реНрддрд╣рд░реВрдорд╛ рд╣рд╛рдореНрд░рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рдорд╛ рдмрд╛рдзрд╛ рдирдкрд░реНрдиреЗред рддрдкрд╛рдИрдВрдХреЛ рдзреНрдпрд╛рдирд╛рдХрд░реНрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрдерд╛рд▓рд╛рдИ рджреБрдИ рднрд╛рдЧрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдкрд╣рд┐рд▓реЛ рднрд╛рдЧрд▓реЗ рдбрдХрд░ рд╕реНрд╡рд╛рд░реНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдЕрдШрд┐ CI/CD рдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫ, рд░ рджреЛрд╕реНрд░реЛ рднрд╛рдЧрд▓реЗ рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫред рдкрд╣рд┐рд▓реЛ рднрд╛рдЧ рдкрдвреНрди рд░реБрдЪрд┐ рдирднрдПрдХрд╛рд╣рд░реВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рджреЛрд╕реНрд░реЛ рднрд╛рдЧрдорд╛ рдЬрд╛рди рд╕рдХреНрдЫрдиреНред

рднрд╛рдЧ I

рдПрдХ рдкрдЯрдХ, рддреНрдпрд╣рд╛рдБ рд╕рдХреЗрд╕рдореНрдо рдЪрд╛рдБрдбреЛ CI/CD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛред рд╕рд░реНрддрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рдбрдХрд░ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреБ рдерд┐рдпреЛ рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдзреЗрд░реИ рдХрд╛рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд╕рд┐рдд рднрдЗрд░рд╣реЗрдХрд╛ рдЫрдиреН:

  • рдЙрддреНрдкрд╛рджрдирдорд╛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрдХреЛ рдердк рднрд░рдкрд░реНрджреЛ рд░ рд╕реНрдерд┐рд░ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд▓рд╛рдЧрд┐ (рдЕрд░реНрдерд╛рдд, рд╕рд╛рд░рдорд╛, рднрд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛)
  • рдкреНрд░рдореБрдЦ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ рдбрдХрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдЪрд╛рд╣рдБрджреИрдирдиреН (рдЕрдиреМрдареЛ, рддрд░ рдпреЛ рдХрд╕реНрддреЛ рдерд┐рдпреЛ)
  • R&D рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рд╡реИрдЪрд╛рд░рд┐рдХ рдХрд╛рд░рдгрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐

MVP рдХреЛ рд▓рд╛рдЧрд┐ рдкреВрд░реНрд╡рд╛рдзрд╛рд░, рд╕реНрдЯреНрдпрд╛рдХ рд░ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдерд┐рдП:

  • 4 Intel┬о X5650 рд╕рд░реНрднрд░рд╣рд░реВ рдбреЗрдмрд┐рдпрдирд╕рдБрдЧ (рд╡рд┐рдХрд╛рд╕рдХреЛ рд▓рд╛рдЧрд┐ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдПрдХ рдердк рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдореЗрд╕рд┐рди)
  • C++, Python3 рдорд╛ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рдЕрдиреБрдХреВрд▓рди рдШрдЯрдХрд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕ рдЧрд░рд┐рдиреНрдЫ
  • рдореБрдЦреНрдп 3rd рдкрд╛рд░реНрдЯреА рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдпреЛ: рдХрд╛рдлреНрдХрд╛, рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕, рдПрдпрд░рдлреНрд▓реЛ, рд░реЗрдбрд┐рд╕, рдЧреНрд░рд╛рдлрдирд╛, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рдХреНрд▓, Mysql, ...
  • рдбрд┐рдмрдЧ рд░ рд░рд┐рд▓реАрдЬрдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ

рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдЪрд░рдгрдорд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдкрд╣рд┐рд▓реЛ рдкреНрд░рд╢реНрдирд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рднрдиреЗрдХреЛ рдХреБрдиреИ рдкрдирд┐ рд╡рд╛рддрд╛рд╡рд░рдг (CI/CD) рдорд╛ рдХрд╕реНрдЯрдо рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫред

рд╣рд╛рдореАрд▓реЗ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдкреНрд░рдгрд╛рд▓реАрдЧрдд рд░реВрдкрдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рдгрд╛рд▓реАрдЧрдд рд░реВрдкрдорд╛ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВред C++ рд╡рд╛ рдкрд╛рдЗрдердирдорд╛ рд╡рд┐рдХрд╕рд┐рдд рдЧрд░рд┐рдПрдХрд╛ рдЕрдиреБрдХреВрд▓рди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдзреЗрд░реИ рддрд░рд┐рдХрд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рддрд┐рдиреАрд╣рд░реВ рдордзреНрдпреЗ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐: рдкреНрд░рдгрд╛рд▓реА рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ, рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдПрдХрд╛ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рднрдгреНрдбрд╛рд░рдорд╛ рдкрдард╛рдЙрдиреЗ рд░ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкрдЫрд┐рдХреЛ рд╕реНрдерд╛рдкрдирд╛ред рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐, рдЕрд░реНрдХреЛ рд╡рд┐рдзрд┐ рдЫрдиреЛрдЯ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдЕрд░реНрдерд╛рддреН: CI рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рд╣рд░реВ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдиреНрдЫ, рдПрдХ рднрд░реНрдЪреБрдЕрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫ, рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВрдмрд╛рдЯ 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 рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднреМрддрд┐рдХ рд╕рд░реНрднрд░ рд░ рдПрдХ рджрд░реНрдЬрди рднрд░реНрдЪреБрдЕрд▓ рдердкрд┐рдпреЛред рд░ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ рд░ рдкрд░реАрдХреНрд╖рдХрд╣рд░реВрд▓рд╛рдИ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрд╡рд╕реНрдерд╛рдХреЛ рдирдЬрд┐рдХрдХреЛ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдЙрдиреАрд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╣рд░реВ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдЭрдиреНрдЭрдиреН рдЧрд╛рд╣реНрд░реЛ рднрдпреЛред рдпрд╕ рд╕рдордпрдорд╛ рдпреЛ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ рдХрд┐ рдпреЛ рдЙрд╣рд╛рдБ рдмрд┐рдирд╛ рдЧрд░реНрди рдЕрд╕рдореНрднрд╡ рдерд┐рдпреЛ ...

рднрд╛рдЧ рджреЛрд╕реНрд░реЛ

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

рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореНрд░реЛ рдХреНрд▓рд╕реНрдЯрд░ 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

рдорд╛рдерд┐рдХреЛ рдХреЛрдб рдЯреБрдХреНрд░рд╛рдмрд╛рдЯ рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЫ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВрдорд╛ рджреБрдИ рдмрдЯрдирд╣рд░реВ рдердкрд┐рдПрдХрд╛ рдЫрдиреН (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) - рдХреЛрдб 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди