เชกเซ‹เช•เชฐ เชธเซเชตเซ‹เชฐเซเชฎ เชธเชพเชฅเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชœเชฎเชพเชตเซ‹

เช…เชฎเซ‡ เชœเซ‡ เช“เชจเชฒเชพเชˆเชจ เชตเชฟเชกเชฟเชฏเซ‹ เช•เชจเซเชŸเซ‡เชจเซเชŸ เชญเชฒเชพเชฎเชฃ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช เชคเซ‡ เชเช• เชฌเช‚เชง เชตเซเชฏเชพเชชเชพเชฐเซ€ เชตเชฟเช•เชพเชธ เช›เซ‡ เช…เชจเซ‡ เชคเช•เชจเซ€เช•เซ€ เชฐเซ€เชคเซ‡ เชฎเชพเชฒเชฟเช•เซ€ เช…เชจเซ‡ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เช˜เชŸเช•เซ‹เชจเซเช‚ เชฌเชนเซ-เช˜เชŸเช• เช•เซเชฒเชธเซเชŸเชฐ เช›เซ‡. เช† เชฒเซ‡เช– เชฒเช–เชตเชพเชจเซ‹ เชนเซ‡เชคเซ เชธเซเชŸเซ‡เชœเซ€เช‚เช— เชธเชพเชˆเชŸ เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐ เชธเซเชตเซ‹เชฐเซเชฎ เช•เซเชฒเชธเซเชŸเชฐเซ€เช‚เช— เชธเชฟเชธเซเชŸเชฎเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡ เช…เชฎเชพเชฐเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเชพ เชธเซเชฅเชพเชชเชฟเชค เชตเชฐเซเช•เชซเซเชฒเซ‹เชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเชฎเชฏเชฎเชพเช‚ เชตเชฟเช•เซเชทเซ‡เชชเชฟเชค เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ. เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชชเชฐ เชชเซเชฐเชธเซเชคเซเชค เชตเชฐเซเชฃเชจ เชฌเซ‡ เชญเชพเช—เชฎเชพเช‚ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒเซเช‚ เช›เซ‡. เชชเซเชฐเชฅเชฎ เชญเชพเช— เชกเซ‹เช•เชฐ เชธเซเชตเซ‹เชฐเซเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ CI/CD เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชฌเซ€เชœเซ‹ เชคเซ‡เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‡เชฎเชจเซ‡ เชชเซเชฐเชฅเชฎ เชญเชพเช— เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เชฐเชธ เชจเชฅเซ€ เชคเซ‡เช“ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เชฌเซ€เชœเชพ เชญเชพเช— เชชเชฐ เชœเชˆ เชถเช•เซ‡ เช›เซ‡.

เชญเชพเช— I

เชชเชพเช›เชพ เชฆเซ‚เชฐเชจเชพ, เชฆเซ‚เชฐเชจเชพ เชตเชฐเซเชทเชฎเชพเช‚, เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซ€ เชเชกเชชเชฅเซ€ CI/CD เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซ€ เชœเชฐเซ‚เชฐเซ€ เชนเชคเซ€. เชกเซ‹เช•เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจ เช•เชฐเชตเชพเชจเซ€ เชเช• เชถเชฐเชค เชนเชคเซ€ เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เช•เชพเชฐเชฃเซ‹เชธเชฐ เชตเชฟเช•เชธเชฟเชค เช˜เชŸเช•เซ‹:

  • เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เช˜เชŸเช•เซ‹เชจเซ€ เชตเชงเซ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เช…เชจเซ‡ เชธเซเชฅเชฟเชฐ เช•เชพเชฎเช—เซ€เชฐเซ€ เชฎเชพเชŸเซ‡ (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡, เชนเช•เซ€เช•เชคเชฎเชพเช‚, เชตเชฐเซเชšเซเชฏเซเช…เชฒเชพเชˆเชเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค)
  • เช…เช—เซเชฐเชฃเซ€ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจ เชนเชคเชพ (เชตเชฟเชšเชฟเชคเซเชฐ, เชชเชฐเช‚เชคเซ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเชคเซเช‚)
  • เช†เชฐ เชเชจเซเชก เชกเซ€ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸเชจเซ€ เชตเซˆเชšเชพเชฐเชฟเช• เชตเชฟเชšเชพเชฐเชฃเชพเช“ เช…เชจเซเชธเชพเชฐ

MVP เชฎเชพเชŸเซ‡ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ, เชธเซเชŸเซ‡เช• เช…เชจเซ‡ เช…เช‚เชฆเชพเชœเชฟเชค เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€:

  • เชกเซ‡เชฌเชฟเชฏเชจ เชธเชพเชฅเซ‡ 4 Intelยฎ X5650 เชธเชฐเซเชตเชฐเซเชธ (เชเช• เชตเชงเซ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เชฎเชถเซ€เชจ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชตเชฟเช•เชธเชฟเชค เช›เซ‡)
  • C++, Python3 เชฎเชพเช‚ เชชเซ‹เชคเชพเชจเชพ เช•เชธเซเชŸเชฎ เช˜เชŸเช•เซ‹เชจเซ‹ เชตเชฟเช•เชพเชธ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡
  • เชตเชชเชฐเชพเชฏเซ‡เชฒ เชฎเซเช–เซเชฏ 3เชœเซ€ เชชเช•เซเชท เชธเชพเชงเชจเซ‹: เช•เชพเชซเช•เชพ, เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ, เชเชฐเชซเซเชฒเซ‹, เชฐเซ‡เชกเชฟเชธ, เช—เซเชฐเชพเชซเชจเชพ, เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธเซเช•เชฒ, เชฎเชพเชฏเชเชธเช•เซเชฏเซเชเชฒ, โ€ฆ
  • เชกเซ€เชฌเช— เช…เชจเซ‡ เชฐเซ€เชฒเซ€เช เชฎเชพเชŸเซ‡ เช…เชฒเช—เชฅเซ€ เช˜เชŸเช•เซ‹เชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ

เชชเซเชฐเชฅเชฎ เชชเซเชฐเชถเซเชจเซ‹เชฎเชพเช‚เชฅเซ€ เชเช• เช•เซ‡ เชœเซ‡เชจเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชคเชฌเช•เซเช•เซ‡ เชธเช‚เชฌเซ‹เชงเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เช เช›เซ‡ เช•เซ‡ เช•เชธเซเชŸเชฎ เช˜เชŸเช•เซ‹ เช•เซ‹เชˆเชชเชฃ เชชเชฐเซเชฏเชพเชตเชฐเชฃ (CI/CD) เชฎเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช…เชฎเซ‡ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เช˜เชŸเช•เซ‹เชจเซ‡ เชชเซเชฐเชฃเชพเชฒเซ€เช—เชค เชฐเซ€เชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซเช‚ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชตเซเชฏเชตเชธเซเชฅเชฟเชค เชฐเซ€เชคเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. C++ เช…เชฅเชตเชพ Python เชฎเชพเช‚ เชตเชฟเช•เชธเชฟเชค เช•เชธเซเชŸเชฎ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เช˜เชฃเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชฅเซ€, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡: เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชฌเชจเชพเชตเชตเชพ, เชคเซ‡เชฎเชจเซ‡ เชฌเชฟเชฒเซเชŸ เชˆเชฎเซ‡เชœเซ‹เชจเชพ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชฎเซ‹เช•เชฒเชตเชพ เช…เชจเซ‡ เชชเช›เซ€ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ. เช…เชœเซเชžเชพเชค เช•เชพเชฐเชฃเซ‹เชธเชฐ, เชฌเซ€เชœเซ€ เชชเชฆเซเชงเชคเชฟ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชเชŸเชฒเซ‡ เช•เซ‡: CI เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเช‡เชฒเซ‹ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, py เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชœเชฐเซ‚เชฐเซ€เชฏเชพเชค.txt เชฅเซ€ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เช† เชคเชฎเชพเชฎ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเซเชธ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“, เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เช…เชจเซ‡ เชธเชพเชฅเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชธเชฐเซเชตเชฐเซ‹ เชฎเชพเชŸเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชธเชพเชฅเซ‡. เช†เช—เชณ, เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐ เช…เชงเชฟเช•เชพเชฐเซ‹ เชตเชฟเชจเชพ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชคเชฐเซ€เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

Gitlab-CI CI/CD เชธเชฟเชธเซเชŸเชฎ เชคเชฐเซ€เช•เซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เชชเชฐเชฟเชฃเชพเชฎเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชคเซ€ เชนเชคเซ€:

เชกเซ‹เช•เชฐ เชธเซเชตเซ‹เชฐเซเชฎ เชธเชพเชฅเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชœเชฎเชพเชตเซ‹
เชฎเชพเชณเช–เชพเช•เซ€เชฏ เชฐเซ€เชคเซ‡, gitlab-ci.yml เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชคเซ‹ เชนเชคเซ‹

---
variables:
  # ะผะธะฝะธะผะฐะปัŒะฝะฐั ะฒะตั€ัะธั ะฆะŸะฃ ะฝะฐ ัะตั€ะฒะตั€ะฐั…, ะณะดะต ั€ะฐะทะฒะพั€ะฐั‡ะธะฒะฐะตั‚ัั ะบะปะฐัั‚ะตั€
  CMAKE_CPUTYPE: "westmere"

  DEBIAN: "MYREGISTRY:5000/debian:latest"

before_script:
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  - mkdir -p ~/.ssh && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config

stages:
  - build
  - testing
  - deploy

debug.debian:
  stage: build
  image: $DEBIAN
  script:
    - cd builds/release && ./build.sh
    paths:
      - bin/
      - builds/release/bin/
    when: always
release.debian:
  stage: build
  image: $DEBIAN
  script:
    - cd builds/release && ./build.sh
    paths:
      - bin/
      - builds/release/bin/
    when: always

## testing stage
tests.codestyle:
  stage: testing
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - /bin/bash run_tests.sh -t codestyle -b "${CI_COMMIT_REF_NAME}_codestyle"
tests.debug.debian:
  stage: testing
  image: $DEBIAN
  dependencies:
    - debug.debian
  script:
    - /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_debug"
  artifacts:
    paths:
      - run_tests/username/
    when: always
    expire_in: 1 week
tests.release.debian:
  stage: testing
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_release"
  artifacts:
    paths:
      - run_tests/username/
    when: always
    expire_in: 1 week

## staging stage
deploy_staging:
  stage: deploy
  environment: staging
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - cd scripts/deploy/ &&
        python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
        /bin/bash install_venv.sh -d -r ../../requirements.txt &&
        python3 prepare_init.d.py &&
        python3 deploy.py -s $CI_ENVIRONMENT_NAME
  when: manual

เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชคเซ‡เชจเซ€ เชชเซ‹เชคเชพเชจเซ€ เช‡เชฎเซ‡เชœ เชชเชฐ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซเชฏเชพเช‚ เชคเชฎเชพเชฎ เชœเชฐเซ‚เชฐเซ€ เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เชฅเชˆ เช—เชฏเชพ เช›เซ‡ เช…เชจเซ‡ เช…เชจเซเชฏ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.

เชœเซ‹ เช•เซ‡ เชจเซ‹เช•เชฐเซ€เช“เชฎเชพเช‚ เช† เชฆเชฐเซ‡เช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชคเซ‡เชจเซ€ เชฐเซ€เชคเซ‡ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฒเชฌเชคเซเชค เชนเซเช‚ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ เชจเชนเซ€เช‚. เชคเซ‡ เชฆเชฐเซ‡เช•เชจเชพ เชตเชฐเซเชฃเชจเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเชฎเชฏ เชฒเชพเช—เชถเซ‡ เช…เชจเซ‡ เช† เชฒเซ‡เช–เชจเซ‹ เชนเซ‡เชคเซ เชจเชฅเซ€. เชนเซเช‚ เชคเชฎเชพเชฐเซเช‚ เชงเซเชฏเชพเชจ เชซเช•เซเชค เช เชนเช•เซ€เช•เชค เชคเชฐเชซ เช–เซ‡เช‚เชšเซ€เชถ เช•เซ‡ เชœเชฎเชพเชตเชŸเชจเชพ เชคเชฌเช•เซเช•เชพเชฎเชพเช‚ เช•เซ‰เชฒเชฟเช‚เช— เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช•เซเชฐเชฎ เชนเซ‹เชฏ เช›เซ‡:

  1. createconfig.py - เช…เชจเซเช—เชพเชฎเซ€ เชœเชฎเชพเชตเชŸ (เชชเซ‚เชฐเซเชตเช‰เชคเซเชชเชพเชฆเชจ, เช‰เชคเซเชชเชพเชฆเชจ, เชชเชฐเซ€เช•เซเชทเชฃ, ...) เชฎเชพเชŸเซ‡ เชตเชฟเชตเชฟเชง เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เช˜เชŸเช• เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชธเชพเชฅเซ‡ settings.ini เชซเชพเช‡เชฒ เชฌเชจเชพเชตเซ‡ เช›เซ‡.
  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

เช†เช—เชณ, เช…เชฎเซ‡ CI เชจเชพ เชจเซ‹เชกเซเชธเชจเชพ เชฐเชฟเชฎเซ‹เชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ Gitlab-CI เช…เชจเซ‡ Swarm เชจเซ‹เชกเซเชธเชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซเชฏเชพ: เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ, เช—เซเชชเซเชค เชšเชฒเซ‹ เชธเซ‡เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชธเชฐเซเชตเชฐ เชชเชฐ เชกเซ‹เช•เชฐ เชธเซ‡เชตเชพ เชธเซ‡เชŸ เช•เชฐเชตเซ€. เช† เชเช• เชฒเซ‡เช– เช…เชฎเชพเชฐเซ‹ เช˜เชฃเซ‹ เชธเชฎเชฏ เชฌเชšเชพเชตเซเชฏเซ‹.

เช†เช—เชณ, เช…เชฎเซ‡ .gitlab-ci .yml เชฎเชพเช‚ เชธเซเชŸเซ‡เช• เชฌเชจเชพเชตเชŸ เช…เชจเซ‡ เชตเชฟเชจเชพเชถเชจเซ€ เชจเซ‹เช•เชฐเซ€เช“ เช‰เชฎเซ‡เชฐเซ€.

.gitlab-ci .yml เชฎเชพเช‚ เชฅเซ‹เชกเซ€ เชตเชงเซ เชจเซ‹เช•เชฐเซ€เช“ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡

## staging stage
deploy_staging:
  stage: testing
  before_script:
    - echo "override global 'before_script'"
  image: "REGISTRY:5000/docker:latest"
  environment: staging
  dependencies: []
  variables:
    DOCKER_CERT_PATH: "/certs"
    DOCKER_HOST: tcp://10.50.173.107:2376
    DOCKER_TLS_VERIFY: 1
    CI_BIN_DEPENDENCIES_JOB: "release.centos.7"
  script:
    - mkdir -p $DOCKER_CERT_PATH
    - echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
    - echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
    - echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
    - docker stack deploy -c docker-compose.yml ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME} --with-registry-auth
    - rm -rf $DOCKER_CERT_PATH
  when: manual

## stop staging stage
stop_staging:
  stage: testing
  before_script:
    - echo "override global 'before_script'"
  image: "REGISTRY:5000/docker:latest"
  environment: staging
  dependencies: []
  variables:
    DOCKER_CERT_PATH: "/certs"
    DOCKER_HOST: tcp://10.50.173.107:2376
    DOCKER_TLS_VERIFY: 1
  script:
    - mkdir -p $DOCKER_CERT_PATH
    - echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
    - echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
    - echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
    - docker stack rm ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME}
    # TODO: need check that stopped
  when: manual

เช‰เชชเชฐเซ‹เช•เซเชค เช•เซ‹เชก เชธเซเชจเชฟเชชเซ‡เชŸเชฎเชพเช‚เชฅเซ€, เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชฌเซ‡ เชฌเชŸเชจเซ‹ (เชกเชฟเชชเซเชฒเซ‹เชฏ_เชธเซเชŸเซ‡เชœเชฟเช‚เช—, เชธเซเชŸเซ‹เชช_เชธเซเชŸเซ‡เชœเชฟเช‚เช—) เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡, เชœเซ‡เชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชเช•เซเชถเชจเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชกเซ‹เช•เชฐ เชธเซเชตเซ‹เชฐเซเชฎ เชธเชพเชฅเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชœเชฎเชพเชตเซ‹
เชธเซเชŸเซ‡เช•เชจเซเช‚ เชจเชพเชฎ เชถเชพเช–เชพเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช† เชตเชฟเชถเชฟเชทเซเชŸเชคเชพ เชชเซ‚เชฐเชคเซ€ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช. เชธเซเชŸเซ‡เช•เชฎเชพเช‚เชจเซ€ เชธเซ‡เชตเชพเช“ เช…เชจเชจเซเชฏ เช†เชˆเชชเซ€ เชเชกเซเชฐเซ‡เชธ เช…เชจเซ‡ เชชเซ‹เชฐเซเชŸเซเชธ, เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“ เชตเช—เซ‡เชฐเซ‡ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡. เช…เชฒเช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชชเชฐเช‚เชคเซ เชธเซเชŸเซ‡เช•เชฅเซ€ เชธเซเชŸเซ‡เช• เชธเซเชงเซ€ เชธเชฎเชพเชจ (เช•เชพเชฐเชฃ เช•เซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เชฌเชงเชพ เชธเซเชŸเซ‡เช•เซเชธ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เช›เซ‡) - เช…เชฎเซ‡ เชœเซ‡ เช‡เชšเซเช›เชคเชพ เชนเชคเชพ. เช…เชฎเซ‡ เชธเซเชŸเซ‡เช• (เช•เซเชฒเชธเซเชŸเชฐ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชฎเชพเชตเชŸ เช•เชฐเซ€เช เช›เซ€เช เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช.เชเชฎเชเชฎเชเชฒ, เชœเซ‡ เช…เชฎเชพเชฐเชพ เช•เซเชฒเชธเซเชŸเชฐเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡.

เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช.เชเชฎเชเชฎเชเชฒ

---
version: '3'

services:
  userprop:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:
  celery_bcd:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  schedulerdb:
    image: mariadb:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: schedulerdb
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--explicit_defaults_for_timestamp=1']
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  celerydb:
    image: mariadb:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: celerydb
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  cluster:
    image: $CENTOS7
    environment:
      - CENTOS
      - CI_ENVIRONMENT_NAME
      - CI_API_V4_URL
      - CI_REPOSITORY_URL
      - CI_PROJECT_ID
      - CI_PROJECT_URL
      - CI_PROJECT_PATH
      - CI_PROJECT_NAME
      - CI_COMMIT_REF_NAME
      - CI_BIN_DEPENDENCIES_JOB
    command: >
      sudo -u myusername -H /bin/bash -c ". /etc/profile &&
        mkdir -p /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
        cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
            git clone -b $CI_COMMIT_REF_NAME $CI_REPOSITORY_URL . &&
            curl $CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_BIN_DEPENDENCIES_JOB -o artifacts.zip &&
            unzip artifacts.zip ;
        cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME/scripts/deploy/ &&
            python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
            /bin/bash install_venv.sh -d -r ../../requirements.txt &&
            python3 prepare_init.d.py &&
            python3 deploy.py -s $CI_ENVIRONMENT_NAME"
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    tty: true
    stdin_open: true
    networks:
      nw_swarm:

networks:
  nw_swarm:
    external: true

เช…เชนเซ€เช‚ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เช˜เชŸเช•เซ‹ เชเช• เชจเซ‡เชŸเชตเชฐเซเช• (nw_swarm) เชฆเซเชตเชพเชฐเชพ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ เช›เซ‡ เช…เชจเซ‡ เชเช•เชฌเซ€เชœเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡.

เชธเชฟเชธเซเชŸเชฎ เช˜เชŸเช•เซ‹ (redis, mysql เชชเชฐ เช†เชงเชพเชฐเชฟเชค) เช•เชธเซเชŸเชฎ เช˜เชŸเช•เซ‹เชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชชเซ‚เชฒเชฅเซ€ เช…เชฒเช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เชฏเซ‹เชœเชจเชพเช“เชฎเชพเช‚ เช…เชจเซ‡ เช•เชธเซเชŸเชฎเชจเซ‡ เชธเซ‡เชตเชพเช“ เชคเชฐเซ€เช•เซ‡ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡). เช…เชฎเชพเชฐเชพ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‹ เชœเชฎเชพเชตเชŸเชจเซ‹ เชคเชฌเช•เซเช•เซ‹ เช…เชฎเชพเชฐเซ€ เชเช• เชฎเซ‹เชŸเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เชˆเชฎเซ‡เชœเชฎเชพเช‚ CMD เชชเชธเชพเชฐ เช•เชฐเชตเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชญเชพเช— I เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชœเชฎเชพเชตเชŸเชฅเซ€ เชตเซเชฏเชตเชนเชพเชฐเซ€เช• เชฐเซ€เชคเซ‡ เช…เชฒเช— เชจเชฅเซ€. เชนเซเช‚ เชคเชซเชพเชตเชคเซ‹เชจเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เชถ:

  • git เช•เซเชฒเซ‹เชจ... - เชœเชฎเชพเชตเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชซเชพเช‡เชฒเซ‹ เชฎเซ‡เชณเชตเซ‹ (createconfig.py, install_venv.sh, เชตเช—เซ‡เชฐเซ‡)
  • เช•เชฐเซเชฒ... && เช…เชจเชเชฟเชช เช•เชฐเซ‹... - เชฌเชฟเชฒเซเชก เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเซเชธ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹ เช…เชจเซ‡ เช…เชจเชเชฟเชช เช•เชฐเซ‹ (เชธเช‚เช•เชฒเชฟเชค เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“)

เชคเซเชฏเชพเช‚ เชฎเชพเชคเซเชฐ เชเช• เชœ เชนเชœเซ เชธเซเชงเซ€ เชตเชฐเซเชฃเชตเซ€ เชจ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ เชธเชฎเชธเซเชฏเชพ เช›เซ‡: เชตเซ‡เชฌ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชงเชฐเชพเชตเชคเชพ เช˜เชŸเช•เซ‹ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเชพ เชฌเซเชฐเชพเช‰เชเชฐเซเชธเชฅเซ€ เชเช•เซเชธเซ‡เชธเชฟเชฌเชฒ เชจเชฅเซ€. เช…เชฎเซ‡ เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‹เช•เซเชธเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชนเชฒ เช•เชฐเซ€เช เช›เซ€เช, เช†เชฎ:

.gitlab-ci.yml เชฎเชพเช‚, เช•เซเชฒเชธเซเชŸเชฐ เชธเซเชŸเซ‡เช•เชจเซ‡ เชœเชฎเชพเชตเชตเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชฌเซ‡เชฒเซ‡เชจเซเชธเชฐเชจเซ‡ เชœเชฎเชพเชตเชตเชพเชจเซ€ เชฒเชพเช‡เชจ เช‰เชฎเซ‡เชฐเซ€เช เช›เซ€เช (เชœเซ‡, เชœเซเชฏเชพเชฐเซ‡ เช•เชฎเชฟเชŸ เช•เชฐเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชฎเชพเชคเซเชฐ เชคเซ‡เชจเซเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ (เชจเชฎเซ‚เชจเชพ เช…เชจเซเชธเชพเชฐ เชจเชตเซ€ nginx เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเซ‡ เช›เซ‡: /etc/nginx/conf. d/${CI_COMMIT_REF_NAME}.conf) - docker-compose-nginx.yml เช•เซ‹เชก เชœเซเช“)

    - docker stack deploy -c docker-compose-nginx.yml ${CI_ENVIRONMENT_NAME} --with-registry-auth

docker-compose-nginx.yml

---
version: '3'

services:
  nginx:
    image: nginx:latest
    environment:
      CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}
      NGINX_CONFIG: |-
            server {
                listen 8080;
                server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;

                location / {
                    proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:8080;
                }
            }
            server {
                listen 5555;
                server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;

                location / {
                    proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:5555;
                }
            }
    volumes:
      - /tmp/staging/nginx:/etc/nginx/conf.d
    command:
      /bin/bash -c "echo -e "$$NGINX_CONFIG" > /etc/nginx/conf.d/${CI_COMMIT_REF_NAME}.conf;
        nginx -g "daemon off;";
        /etc/init.d/nginx reload"
    ports:
      - 8080:8080
      - 5555:5555
      - 3000:3000
      - 443:443
      - 80:80
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

networks:
  nw_swarm:
    external: true

เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เช•เชฎเซเชชเซเชฏเซเชŸเชฐเซเชธ เชชเชฐ, เช…เชชเชกเซ‡เชŸ /etc/hosts; nginx เชจเซ‡ url เชฒเช–เซ‹:

10.50.173.106 staging_BRANCH-1831_cluster.dev

เชคเซ‡เชฅเซ€, เช†เช‡เชธเซ‹เชฒเซ‡เชŸเซ‡เชก เชธเซเชŸเซ‡เชœเซ€เช‚เช— เช•เซเชฒเชธเซเชŸเชฐเซ‹เชจเซ€ เชœเชฎเชพเชตเชŸ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช…เชจเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชนเชตเซ‡ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชคเซ‡เชฎเชจเซ‡ เชšเชฒเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

เชญเชตเชฟเชทเซเชฏ เชจเซ€ เชฏเซ‹เชœเชจเชพเช“:

  • เช…เชฎเชพเชฐเชพ เช˜เชŸเช•เซ‹เชจเซ‡ เชธเซ‡เชตเชพ เชคเชฐเซ€เช•เซ‡ เช…เชฒเช— เช•เชฐเซ‹
  • เชฆเชฐเซ‡เช• เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ เชฎเชพเชŸเซ‡ เชนเซ‹เชฏ
  • เชธเซเชŸเซ‡เช•เชฎเชพเช‚ เช“เช›เชพ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเชพ เชจเซ‹เชกเซเชธเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชถเซ‹เชงเซ‹
  • เชจเชพเชฎ เชชเซ‡เชŸเชฐเซเชจ เชฆเซเชตเชพเชฐเชพ เชจเซ‹เชกเซเชธเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‹ (เชฒเซ‡เช–เชฎเชพเช‚เชจเซ€ เชœเซ‡เชฎ เช†เชˆเชกเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡)
  • เชเช• เชšเซ‡เช• เช‰เชฎเซ‡เชฐเซ‹ เช•เซ‡ เชธเซเชŸเซ‡เช• เชจเชพเชถ เชชเชพเชฎเซ‡ เช›เซ‡
  • ...

เชฎเชพเชŸเซ‡ เช–เชพเชธ เช†เชญเชพเชฐ เชเช• เชฒเซ‡เช–.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹