рдбреЙрдХрд░ рдЭреБрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ

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

рднрд╛рдЧ I

рдПрдХ рд╕рдордп, рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рд╕реАрдЖрдИ/рд╕реАрдбреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╢рд░реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбреЙрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдШрдЯрдХ:

  • рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рд╕реНрдерд┐рд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП (рдЕрд░реНрдерд╛рдд, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛)
  • рдкреНрд░рдореБрдЦ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдбреЙрдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ (рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реА рдерд╛)
  • рдЕрдиреБрд╕рдВрдзрд╛рди рдПрд╡рдВ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╡реИрдЪрд╛рд░рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ

рдПрдорд╡реАрдкреА рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪрд╛, рд╕реНрдЯреИрдХ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ:

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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рд╣рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд╛рддрд╛рд╡рд░рдг (рд╕реАрдЖрдИ/рд╕реАрдбреА) рдореЗрдВ рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдордиреЗ рддреГрддреАрдп-рдкрдХреНрд╖ рдШрдЯрдХреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред C++ рдпрд╛ Python рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд╕реНрдЯрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рдмрдирд╛рдирд╛, рдЙрдиреНрд╣реЗрдВ рдПрдХрддреНрд░рд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рднреЗрдЬрдирд╛ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдирдХреА рдмрд╛рдж рдХреА рд╕реНрдерд╛рдкрдирд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ, рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН: рд╕реАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, require.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 - рдмрд╛рдж рдХреА рддреИрдирд╛рддреА (рдкреНрд░реАрдкреНрд░реЛрдбрдХреНрд╢рди, рдкреНрд░реЛрдбрдХреНрд╢рди, рдЯреЗрд╕реНрдЯрд┐рдВрдЧ, ...) рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕.рдЖрдИрдПрдирдЖрдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред
  2. install_venv.sh - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ py рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ
  3. рддреИрдпрд╛рд░_init.d.py - рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдЯрд╛рд░реНрдЯ-рд╕реНрдЯреЙрдк рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ
  4. 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

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рд╕реАрдЖрдИ рд╕реЗ рдиреЛрдбреНрд╕ рдХреЗ рджреВрд░рд╕реНрде рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЧрд┐рдЯрд▓реИрдм-рд╕реАрдЖрдИ рдФрд░ рд╕реНрд╡рд╛рд░реНрдо рдиреЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рд╛: рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛, рдЧреБрдкреНрдд рдЪрд░ рд╕реЗрдЯ рдХрд░рдирд╛, рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рд░реНрд╡рд░ рдкрд░ рдбреЙрдХрд░ рд╕реЗрд╡рд╛ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред рдпрд╣ рд╡рд╛рд▓рд╛ рд▓реЗрдЦ рд╣рдорд╛рд░рд╛ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рдпрд╛.

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ .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

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЦрдВрдб рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ (рдбрд┐рдкреНрд▓реЙрдп_рд╕реНрдЯреЗрдЬрд┐рдВрдЧ, рд╕реНрдЯреЙрдк_рд╕реНрдЯреЗрдЬрд┐рдВрдЧ) рдореЗрдВ рджреЛ рдмрдЯрди рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдбреЙрдХрд░ рдЭреБрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ
рд╕реНрдЯреИрдХ рдХрд╛ рдирд╛рдо рд╢рд╛рдЦрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрдЯреИрдХ рдореЗрдВ рд╕реЗрд╡рд╛рдПрдБ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдкреА рдкрддреЗ, рдФрд░ рдкреЛрд░реНрдЯ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рдЖрджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВред рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рд╕реЗ рд╕реНрдЯреИрдХ рддрдХ рд╕рдорд╛рди (рдЪреВрдВрдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рднреА рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ) - рдпрд╣реА рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред рд╣рдо рд╕реНрдЯреИрдХ (рдХреНрд▓рд╕реНрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреИрдирд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдбреЛрдХрд░-compose.yml, рдЬреЛ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдбреЛрдХрд░-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) рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рддрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИрдВред

рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХреЛрдВ (рд░реЗрдбрд┐рд╕, рдорд╛рдпрдПрд╕рдХреНрдпреВрдПрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд) рдХреЛ рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреВрд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЪрд░рдг рд╕реАрдПрдордбреА рдХреЛ рд╣рдорд╛рд░реА рдПрдХ рдмрдбрд╝реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рдЫрд╡рд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рднрд╛рдЧ I рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЕрдВрддрд░реЛрдВ рдкрд░ рдЬреЛрд░ рджреВрдВрдЧрд╛:

  • рдЧрд┐рдЯ рдХреНрд▓реЛрди... - рд╣рдореЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ (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 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:

10.50.173.106 staging_BRANCH-1831_cluster.dev

рдЗрд╕рд▓рд┐рдП, рдкреГрдердХ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдХреНрд▓рд╕реНрдЯрд░реЛрдВ рдХреА рддреИрдирд╛рддреА рд▓рд╛рдЧреВ рдХрд░ рджреА рдЧрдИ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдм рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛рдПрдВ:

  • рд╣рдорд╛рд░реЗ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд▓рдЧ рдХрд░реЗрдВ
  • рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ Dockerfile рдмрдирд╛рдПрдВ
  • рд╕реНрдЯреИрдХ рдореЗрдВ рдХрдо рд▓реЛрдб рдХрд┐рдП рдЧрдП рдиреЛрдбреНрд╕ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
  • рдирд╛рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЛрдбреНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ (рд▓реЗрдЦ рдореЗрдВ рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп)
  • рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рдХрд┐ рд╕реНрдЯреИрдХ рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ
  • ...

рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рд▓реЗрдЦ.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ