แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แžถแž˜แžฝแž™ Docker Swarm

แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŽแŸ‚แž“แžถแŸ†แž˜แžถแžแžทแž€แžถแžœแžธแžŠแŸแžขแžผแžขแž“แžกแžถแž‰แžŠแŸ‚แž›แž™แžพแž„แž€แŸ†แž–แžปแž„แž’แŸ’แžœแžพแž€แžถแžšแž‚แžบแž‡แžถแž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž–แžถแžŽแžทแž‡แŸ’แž‡แž€แž˜แŸ’แž˜แž”แžทแž‘แž‡แžทแž แž แžพแž™แžแžถแž˜แž”แž…แŸ’แž…แŸแž€แž‘แŸแžŸแž‡แžถแž…แž„แŸ’แž€แŸ„แž˜แž–แž แžปแž•แŸ’แž“แŸ‚แž€แž“แŸƒแžŸแž˜แžถแžŸแž’แžถแžแžปแž€แž˜แŸ’แž˜แžŸแžทแž‘แŸ’แž’แžท แž“แžทแž„แž”แŸ’แžšแž—แž–แž”แžพแž€แž…แŸ†แž แŸ” แž‚แŸ„แž›แž”แŸ†แžŽแž„แž“แŸƒแž€แžถแžšแžŸแžšแžŸแŸแžšแžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แž‚แžบแžŠแžพแž˜แŸ’แž”แžธแž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž”แŸ’แžšแž–แŸแž“แŸ’แž’ docker swarm clustering แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แž˜แžฝแž™แžŠแŸ„แž™แž˜แžทแž“แžšแŸ†แžแžถแž“แžŠแž›แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แžถแžšแž„แžถแžšแžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แž“แŸƒแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž”แžŸแŸ‹แž™แžพแž„แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แž€แŸ†แžŽแžแŸ‹แž˜แžฝแž™แŸ” แžšแžฟแž„โ€‹แžŠแŸ‚แž›โ€‹แž”แž„แŸ’แž แžถแž‰โ€‹แžŠแž›แŸ‹โ€‹แž€แžถแžšโ€‹แž…แžถแž”แŸ‹โ€‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸโ€‹แžšแž”แžŸแŸ‹โ€‹แžขแŸ’แž“แž€โ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แž”แŸ‚แž„โ€‹แž…แŸ‚แž€โ€‹แž‡แžถโ€‹แž–แžธแžšโ€‹แž•แŸ’แž“แŸ‚แž€แŸ” แž•แŸ’แž“แŸ‚แž€แž‘แžธแž˜แžฝแž™แž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธ CI/CD แž˜แžปแž“แž–แŸแž›แž”แŸ’แžšแžพ docker swarm แž แžพแž™แž•แŸ’แž“แŸ‚แž€แž‘แžธแž–แžธแžšแž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸƒแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžšแž”แžŸแŸ‹แžœแžถแŸ” แžขแŸ’แž“แž€โ€‹แžŠแŸ‚แž›โ€‹แž˜แžทแž“โ€‹แž…แžถแž”แŸ‹โ€‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸโ€‹แž“แžนแž„โ€‹แž€แžถแžšโ€‹แžขแžถแž“โ€‹แž•แŸ’แž“แŸ‚แž€โ€‹แž‘แžธโ€‹แž˜แžฝแž™โ€‹แžขแžถแž…โ€‹แž”แž“แŸ’แžโ€‹แž‘แŸ…โ€‹แžœแž‚แŸ’แž‚โ€‹แž‘แžธแž–แžธแžšโ€‹แžŠแŸ„แž™โ€‹แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž–แŸ”

แž•แŸ’แž“แŸ‚แž€แž‘แžธ แŸก

แžแŸ’แžšแž›แž”แŸ‹แž˜แž€แž†แŸ’แž“แžถแŸ†แžŠแŸแžŸแŸ‚แž“แž†แŸ’แž„แžถแž™ แž…แžถแŸ†แž”แžถแž…แŸ‹แžแŸ’แžšแžผแžœแžšแŸ€แž”แž…แŸ†แžŠแŸ†แžŽแžพแžšแž€แžถแžš CI/CD แžฑแŸ’แž™แž”แžถแž“แž›แžฟแž“แžแžถแž˜แžŠแŸ‚แž›แžขแžถแž…แž’แŸ’แžœแžพแž‘แŸ…แž”แžถแž“แŸ” แž›แž€แŸ’แžแžแžŽแŸ’แžŒแž˜แžฝแž™แž‚แžบแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แŸ’แžšแžพ Docker แž‘แŸแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™ แžŸแž˜แžถแžŸแž’แžถแžแžปแžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž แŸแžแžปแž•แž›แž‡แžถแž…แŸ’แžšแžพแž“:

  • แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“ แž“แžทแž„แžŸแŸ’แžแžทแžšแž—แžถแž–แž“แŸƒแžŸแž˜แžถแžŸแž—แžถแž‚แž“แŸ…แž€แŸ’แž“แžปแž„แž•แž›แžทแžแž€แž˜แŸ’แž˜ (แž“แŸ„แŸ‡แž‡แžถแž€แžถแžšแž–แžทแž แžแž˜แŸ’แžšแžผแžœแž€แžถแžšแž˜แžทแž“แž”แŸ’แžšแžพแž“แžทแž˜แŸ’แž˜แžทแž)
  • แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžˆแžถแž“แž˜แžปแžแž‚แŸแž˜แžทแž“แž…แž„แŸ‹แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™ Docker แž‘แŸ (แž…แž˜แŸ’แž›แŸ‚แž€ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸ„แŸ‡แž‡แžถแžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแž€แžพแžแžกแžพแž„)
  • แž“แŸแŸ‡แž”แžพแž™แŸ„แž„แžแžถแž˜แž€แžถแžšแž–แžทแž…แžถแžšแžŽแžถแž˜แž“แŸ„แž‚แž˜แžœแžทแž‡แŸ’แž‡แžถแž“แŸƒแž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ R&D

แž แŸแžŠแŸ’แž‹แžถแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ แž‡แž„แŸ‹ แž“แžทแž„แžแž˜แŸ’แžšแžผแžœแž€แžถแžšแžŠแŸ†แž”แžผแž„แž”แŸ’แžšแž แžถแž€แŸ‹แž”แŸ’แžšแž แŸ‚แž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹ MVP แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แžถแž‰แžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ–

  • แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ Intelยฎ X4 แž…แŸ†แž“แžฝแž“ 5650 แž‡แžถแž˜แžฝแž™ Debian (แž˜แŸ‰แžถแžŸแŸŠแžธแž“แžŠแŸแž˜แžถแž“แžฅแž‘แŸ’แž’แžทแž–แž›แž˜แžฝแž™แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž—แžทแžœแžŒแŸ’แžแž™แŸ‰แžถแž„แž–แŸแž‰แž›แŸแž‰)
  • แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžŸแž˜แžถแžŸแž’แžถแžแžปแž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแž“แŸ…แž€แŸ’แž“แžปแž„ C ++, Python3
  • แžงแž”แž€แžšแžŽแŸแž—แžถแž‚แžธแž‘แžธ 3 แžŸแŸ†แžแžถแž“แŸ‹แŸ—แžŠแŸ‚แž›แž”แŸ’แžšแžพแŸ– Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, โ€ฆ
  • แž”แŸ†แž–แž„แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแžถแž„แžŸแž„แŸ‹ แž“แžทแž„แžŸแžถแž€แž›แŸ’แž”แž„แžŸแž˜แžถแžŸแž’แžถแžแžปแžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ†แž”แžถแžแŸ‹แž€แŸ†แž แžปแžŸ แž“แžทแž„แž€แžถแžšแž”แž‰แŸ’แž…แŸแž‰

แžŸแŸ†แžŽแžฝแžšแž˜แžฝแž™แž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แžŸแŸ†แžŽแžฝแžšแžŠแŸ†แž”แžผแž„แžŠแŸ‚แž›แž…แžถแŸ†แž”แžถแž…แŸ‹แžแŸ’แžšแžผแžœแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž“แŸ…แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แžŠแŸ†แž”แžผแž„แž‚แžบแžแžถแžแžพแžŸแž˜แžถแžŸแž’แžถแžแžปแž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แž“แžนแž„แžแŸ’แžšแžผแžœแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž€แŸ’แž“แžปแž„แž”แžšแžทแž™แžถแž€แžถแžŸแž”แŸ‚แž”แžŽแžถ (CI/CD)แŸ”

แž™แžพแž„แž”แžถแž“แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแžŠแŸ†แžกแžพแž„แžŸแž˜แžถแžŸแž—แžถแž‚แž—แžถแž‚แžธแž‘แžธแž”แžธแž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž“แžทแž„แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž–แž–แžฝแž€แžœแžถแž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’แŸ” แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แž“แŸ…แž€แŸ’แž“แžปแž„ C ++ แžฌ Python แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแžถแž€แŸ‹แžฑแŸ’แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžแžถแž˜แžœแžทแž’แžธแž‡แžถแž…แŸ’แžšแžพแž“แŸ” แžงแž‘แžถแž แžšแžŽแŸแž€แŸ’แž“แžปแž„แž…แŸ†แž“แŸ„แž˜แž–แžฝแž€แž‚แŸแŸ– แž”แž„แŸ’แž€แžพแžแž€แž‰แŸ’แž…แž”แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž”แž‰แŸ’แž‡แžผแž“แžœแžถแž‘แŸ…แžƒแŸ’แž›แžถแŸ†แž„แž“แŸƒแžšแžผแž”แž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแž แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แžŠแŸ†แžกแžพแž„แž–แžฝแž€แžœแžถแž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž แŸแžแžปแž•แž›แžŠแŸ‚แž›แž˜แžทแž“แžŸแŸ’แž‚แžถแž›แŸ‹ แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžšแž˜แžฝแž™แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžแŸ’แžšแžผแžœแž”แžถแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž‚แžบแŸ– แžŠแŸ„แž™แž”แŸ’แžšแžพ CI แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แžขแžถแž…แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž”แžถแž“แžšแž”แžŸแŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžแŸ’แžšแžผแžœแž”แžถแž“แž…แž„แž€แŸ’แžšแž„ แž”แžšแžทแž™แžถแž€แžถแžŸแž‚แž˜แŸ’แžšแŸ„แž„แž“แžทแž˜แŸ’แž˜แžทแžแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแž แž˜แŸ‰แžผแžŒแžปแž› py แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžกแžพแž„แž–แžธ requirement.txt แž แžพแž™แžœแžแŸ’แžแžปแž”แžปแžšแžถแžŽแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‰แžพแžšแžฝแž˜แž‡แžถแž˜แžฝแž™ configs, scripts แž“แžทแž„ แžขแž˜แž‡แžถแž˜แžฝแž™แž”แžšแžทแž™แžถแž€แžถแžŸแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‘แŸ…แž€แžถแž“แŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹โ€‹แž˜แž€ แž€แž˜แŸ’แž˜แžœแžทแž’แžธโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แž”แžพแž€โ€‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšโ€‹แž‡แžถโ€‹แžขแŸ’แž“แž€โ€‹แž”แŸ’แžšแžพโ€‹แž“แžทแž˜แŸ’แž˜แžทแžโ€‹แžŠแŸ„แž™โ€‹แž‚แŸ’แž˜แžถแž“โ€‹แžŸแžทแž‘แŸ’แž’แžทโ€‹แžขแŸ’แž“แž€โ€‹แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แŸ”

Gitlab-CI แžแŸ’แžšแžผแžœแž”แžถแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’ CI/CD แŸ” แž”แŸ†แž–แž„แŸ‹แž›แž‘แŸ’แž’แž•แž›แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž“แŸแŸ‡แŸ–

แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แžถแž˜แžฝแž™ Docker Swarm
แžแžถแž˜แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ gitlab-ci.yml แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž“แŸแŸ‡

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

  DEBIAN: "MYREGISTRY:5000/debian:latest"

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

stages:
  - build
  - testing
  - deploy

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

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

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

แžœแžถแž‚แžฝแžšแžฑแŸ’แž™แž€แžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžแžถแž€แžถแžšแž‡แžฝแž”แž”แŸ’แžšแž‡แžปแŸ†แž‚แŸ’แž“แžถแž“แžทแž„แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแž“แŸ…แž›แžพแžšแžผแž”แž—แžถแž–แžšแž”แžŸแŸ‹แžœแžถแž•แŸ’แž‘แžถแž›แŸ‹แžŠแŸ‚แž›แž€แž‰แŸ’แž…แž”แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž…แžถแŸ†แž”แžถแž…แŸ‹แž‘แžถแŸ†แž„แžขแžŸแŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžกแžพแž„แžšแžฝแž…แž แžพแž™แž“แžทแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžกแžพแž„แŸ”

แž‘แŸ„แŸ‡แž”แžธแž‡แžถแžŸแŸ’แž‚แŸ’แžšแžธแž”แž‘แžถแŸ†แž„แž“แŸแŸ‡แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแž„แžถแžšแž“แžธแž˜แžฝแž™แŸ—แž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžแžถแž˜แžšแž”แŸ€แž”แžšแž”แžŸแŸ‹แžœแžถแž€แŸแžŠแŸ„แž™ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž˜แžทแž“แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž–แžฝแž€แžœแžถแž‘แŸแŸ” แž€แžถแžšแž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแž–แžฝแž€แžœแžถแž“แžธแž˜แžฝแž™แŸ—แž“แžนแž„แž…แŸ†แžŽแžถแž™แž–แŸแž›แž…แŸ’แžšแžพแž“ แž แžพแž™แž“แŸแŸ‡แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž‚แŸ„แž›แž”แŸ†แžŽแž„แž“แŸƒแžขแžแŸ’แžแž”แž‘แž“แŸ„แŸ‡แž‘แŸแŸ” แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž‘แžถแž€แŸ‹แž‘แžถแž‰แž€แžถแžšแž™แž€แž…แžทแžแŸ’แžแž‘แžปแž€แžŠแžถแž€แŸ‹แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž…แŸ†แž–แŸ„แŸ‡แž€แžถแžšแž–แžทแžแžŠแŸ‚แž›แžแžถแžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž˜แžถแž“แž›แŸ†แžŠแžถแž”แŸ‹แž“แŸƒแž€แžถแžšแž แŸ…แžŸแŸ’แž‚แŸ’แžšแžธแž”แŸ–

  1. แž”แž„แŸ’แž€แžพแžconfig.py - แž”แž„แŸ’แž€แžพแžแžฏแž€แžŸแžถแžš settings.ini แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžŸแž˜แžถแžŸแž’แžถแžแžปแž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแžŸแŸ’แžแžถแž“แž•แŸ’แžŸแŸแž„แŸ—แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž‡แžถแž”แž“แŸ’แžแž”แž“แŸ’แž‘แžถแž”แŸ‹ (แž€แžถแžšแž•แž›แžทแž แž€แžถแžšแž•แž›แžทแž แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แž ... )
  2. install_venv.sh - แž”แž„แŸ’แž€แžพแžแž”แžšแžทแž™แžถแž€แžถแžŸแž“แžทแž˜แŸ’แž˜แžทแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแž˜แžถแžŸแž’แžถแžแžป py แž“แŸ…แž€แŸ’แž“แžปแž„แžแžแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™ แž แžพแž™แž…แž˜แŸ’แž›แž„แžœแžถแž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž–แžธแž…แž˜แŸ’แž„แžถแž™
  3. แžšแŸ€แž”แž…แŸ†_init.d.py โ€” แžšแŸ€แž”แž…แŸ†แžŸแŸ’แž‚แŸ’แžšแžธแž” start-stop แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแž˜แžถแžŸแž—แžถแž‚แžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแž‚แŸ†แžšแžผ
  4. deploy.py - แž”แŸ†แž”แŸ‚แž€ แž“แžทแž„แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŸแž˜แžถแžŸแž’แžถแžแžปแžแŸ’แž˜แžธแŸ”

แž–แŸแž›แžœแŸแž›แžถแž”แžถแž“แž€แž“แŸ’แž›แž„แž•แžปแžแž‘แŸ…แŸ” แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แžแŸ’แžšแžผแžœแž”แžถแž“แž‡แŸ†แž“แžฝแžŸแžŠแŸ„แž™แž€แžถแžšแž•แž›แžทแž แž“แžทแž„แž€แžถแžšแž•แž›แžทแžแž‡แžถแž˜แžปแž“แŸ” แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž€แžถแžšแž‚แžถแŸ†แž‘แŸ’แžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž•แž›แžทแžแž•แž›แž“แŸ…แž›แžพแž€แžถแžšแž…แŸ‚แž€แž…แžถแž™แž˜แžฝแž™แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แž (CentOS) แŸ” แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžŠแŸ‚แž›แž˜แžถแž“แžแžถแž˜แž–แž›แžแŸ’แž›แžถแŸ†แž„แž‡แžถแž„ 5 แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแžแž…แŸ†แž“แžฝแž“แžŠแž”แŸ‹แŸ” แž แžพแž™แžœแžถแž€แžถแž“แŸ‹แžแŸ‚แž–แžทแž”แžถแž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แž“แžทแž„แžขแŸ’แž“แž€แžŸแžถแž€แž›แŸ’แž”แž„แžŠแžพแž˜แŸ’แž”แžธแžŸแžถแž€แž›แŸ’แž”แž„แž€แžทแž…แŸ’แž…แž€แžถแžšแžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแž™แžถแž€แžถแžŸแž‡แžทแž แžฌแžแžทแž…แž‡แžถแž„แž“แŸแŸ‡แž‘แŸ…แž“แžนแž„แžŸแŸ’แžแžถแž“แž—แžถแž–แž€แžถแžšแž„แžถแžšแŸ” แž“แŸ…แž–แŸแž›แž“แŸแŸ‡แžœแžถแž…แŸ’แž”แžถแžŸแŸ‹แžŽแžถแžŸแŸ‹แžแžถแžœแžถแž˜แžทแž“แžขแžถแž…แž‘แŸ…แžšแžฝแž…แž‘แŸแž€แŸ’แž“แžปแž„แž€แžถแžšแž’แŸ’แžœแžพแžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž‚แžถแžแŸ‹ ...

แž•แŸ’แž“แŸ‚แž€แž‘แžธ II

แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แžถแž˜แžฝแž™ Docker Swarm

แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž…แž„แŸ’แž€แŸ„แž˜แžšแž”แžŸแŸ‹แž™แžพแž„แž‚แžบแž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸแžขแžŸแŸ’แž…แžถแžšแŸ’แž™แž“แŸƒแžŸแž˜แžถแžŸแž’แžถแžแžปแžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แž–แžธแž‚แŸ’แž“แžถแž‡แžถแž…แŸ’แžšแžพแž“แžŠแŸ‚แž›แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž–แžทแž–แžŽแŸŒแž“แžถแžŠแŸ„แž™ Dockerfiles แŸ” แžขแŸ’แž“แž€โ€‹แžขแžถแž…โ€‹แž€แŸ†แžŽแžแŸ‹โ€‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’โ€‹แžœแžถโ€‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹โ€‹แž€แžถแžšโ€‹แžŠแžถแž€แŸ‹โ€‹แž–แž„แŸ’แžšแžถแž™โ€‹แž‘แŸ…โ€‹แž”แžšแžทแž™แžถแž€แžถแžŸโ€‹แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹โ€‹แž‡แžถโ€‹แž‘แžผแž‘แŸ…โ€‹แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แŸ” แž—แžถแžšแž€แžทแž…แŸ’แž…แžšแž”แžŸแŸ‹แž™แžพแž„แž‚แžบแžŠแžพแž˜แŸ’แž”แžธแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž…แž„แŸ’แž€แŸ„แž˜แž‘แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแž™แžถแž€แžถแžŸแžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แžŠแžพแž˜แŸ’แž”แžธแžŸแžถแž€แž›แŸ’แž”แž„แžœแžถแž˜แžปแž“แž–แŸแž›แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แž˜แžปแž“แž€แžถแžšแž…แŸแž‰แž•แŸ’แžŸแžถแž™แŸ”

แžแžถแž˜แž‘แŸ’แžšแžนแžŸแŸ’แžแžธ แžขแžถแž…แž˜แžถแž“แž…แž„แŸ’แž€แŸ„แž˜แž‡แžถแž…แŸ’แžšแžพแž“แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„แž–แŸแž›แžŠแŸ†แžŽแžถแž›แž‚แŸ’แž“แžถแŸ– แžŠแžผแž…แž‡แžถแž˜แžถแž“แž€แžทแž…แŸ’แž…แž€แžถแžšแž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸ’แžแžถแž“แž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž…แž”แŸ‹ แžฌแž‡แžทแžแžŠแž›แŸ‹แž€แžถแžšแž”แž‰แŸ’แž…แž”แŸ‹แŸ” แžŸแž˜แžแŸ’แžแž—แžถแž–แžšแž”แžŸแŸ‹ servers แž€แŸ’แž“แžปแž„แž€แžถแžšแž…แŸ„แž›แžšแž”แžŸแŸ‹แž™แžพแž„แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž™แžพแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš clusters แž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž›แžพ server แž“แžธแž˜แžฝแž™แŸ—แŸ” แž…แž„แŸ’แž€แŸ„แž˜แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แž“แžธแž˜แžฝแž™แŸ—แžแŸ’แžšแžผแžœแžแŸ‚แžŠแžถแž…แŸ‹แž†แŸ’แž„แžถแž™แž–แžธแž‚แŸ’แž“แžถ (แž˜แžทแž“แžแŸ’แžšแžผแžœแž˜แžถแž“แž…แŸ†แž“แžปแž…แž”แŸ’แžšแžŸแž–แŸ’แžœแž“แŸ…แž€แŸ’แž“แžปแž„แž…แŸ’แžšแž€ แžแžแŸ”แž›แŸ”)แŸ”

แž’แž“แž’แžถแž“แžŠแŸแž˜แžถแž“แžแž˜แŸ’แž›แŸƒแž”แŸ†แž•แžปแžแžšแž”แžŸแŸ‹แž™แžพแž„แž‚แžบแž–แŸแž›แžœแŸแž›แžถแžšแž”แžŸแŸ‹แž™แžพแž„ แž แžพแž™แž™แžพแž„แž˜แžทแž“แž˜แžถแž“แžœแžถแž…แŸ’แžšแžพแž“แž‘แŸแŸ”

แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž›แžฟแž“แž‡แžถแž„แž˜แžปแž“ แž™แžพแž„แž”แžถแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ Docker Swarm แžŠแŸ„แž™แžŸแžถแžšแžแŸ‚แž—แžถแž–แžŸแžถแž˜แž‰แŸ’แž‰ แž“แžทแž„แž—แžถแž–แž”แžแŸ‹แž”แŸ‚แž“แž“แŸƒแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แžšแž”แžŸแŸ‹แžœแžถแŸ” แžšแžฟแž„แžŠแŸ†แž”แžผแž„แžŠแŸ‚แž›แž™แžพแž„แž”แžถแž“แž’แŸ’แžœแžพแž‚แžบแž”แž„แŸ’แž€แžพแžแžขแŸ’แž“แž€แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ แž“แžทแž„แžแŸ’แž“แžถแŸ†แž„แž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž–แžธแž…แž˜แŸ’แž„แžถแž™แŸ–

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kilqc94pi2upzvabttikrfr5d     nop-test-1     Ready               Active                                  19.03.2
jilwe56pl2zvabupryuosdj78     nop-test-2     Ready               Active                                  19.03.2
j5a4yz1kr2xke6b1ohoqlnbq5 *   nop-test-3     Ready               Active              Leader              19.03.2

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž”แž„แŸ’แž€แžพแžแž”แžŽแŸ’แžแžถแž‰แž˜แžฝแž™แŸ–


$ docker network create --driver overlay --subnet 10.10.10.0/24 nw_swarm

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ แž™แžพแž„แž—แŸ’แž‡แžถแž”แŸ‹ Gitlab-CI แž“แžทแž„ Swarm nodes แž€แŸ’แž“แžปแž„แž›แž€แŸ’แžแžแžŽแŸ’แžŒแž“แŸƒแž€แžถแžšแž”แž‰แŸ’แž‡แžถแž–แžธแž…แž˜แŸ’แž„แžถแž™แž“แŸƒแžแŸ’แž“แžถแŸ†แž„แž–แžธ CIแŸ– แž€แžถแžšแžŠแŸ†แžกแžพแž„แžœแžทแž‰แŸ’แž‰แžถแž”แž“แž”แžแŸ’แžš แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžขแžแŸแžšแžŸแž˜แŸ’แž„แžถแžแŸ‹ แž“แžทแž„แž€แžถแžšแžŠแŸ†แžกแžพแž„แžŸแŸแžœแžถแž€แž˜แŸ’แž˜ Docker แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž”แž‰แŸ’แž‡แžถแŸ” แž˜แžฝแž™โ€‹แž“แŸแŸ‡ แžขแžแŸ’แžแž”แž‘ แž”แžถแž“แžŸแž„แŸ’แž‚แŸ’แžšแŸ„แŸ‡แž™แžพแž„แž–แŸแž›แžœแŸแž›แžถแž…แŸ’แžšแžพแž“แŸ”

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ แž™แžพแž„แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž€แžถแžšแž„แžถแžšแž”แž„แŸ’แž€แžพแž แž“แžทแž„แž”แŸ†แž•แŸ’แž›แžถแž‰แž‡แž„แŸ‹แž‘แŸ… .gitlab-ci .yml แŸ”

แž€แžถแžšแž„แžถแžšแž–แžธแžšแž”แžธแž‘แŸ€แžแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ… .gitlab-ci .yml

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

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

แž–แžธแžขแžแŸ’แžแž”แž‘แž€แžผแžŠแžแžถแž„แž›แžพ แžขแŸ’แž“แž€แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แžแžถแž”แŸŠแžผแžแžปแž„แž–แžธแžš (deploy_staging, stop_staging) แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ… Pipelines แžŠแŸ‚แž›แž‘แžถแž˜แž‘แžถแžšแžŸแž€แž˜แŸ’แž˜แž—แžถแž–แžŠแŸ„แž™แžŠแŸƒแŸ”

แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แžถแž˜แžฝแž™ Docker Swarm
แžˆแŸ’แž˜แŸ„แŸ‡แž‡แž„แŸ‹แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแž“แžนแž„แžˆแŸ’แž˜แŸ„แŸ‡แžŸแžถแžแžถ แž แžพแž™แž—แžถแž–แž”แŸ’แž›แŸ‚แž€แž“แŸแŸ‡แž‚แžฝแžšแžแŸ‚แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แŸ” แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แž“แŸ…แž€แŸ’แž“แžปแž„แž‡แž„แŸ‹แž‘แž‘แžฝแž›แž”แžถแž“แžขแžถแžŸแž™แžŠแŸ’แž‹แžถแž“ ip แžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹ แž“แžทแž„แž…แŸ’แžšแž€ แžแžแŸ”แž›แŸ” แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแžถแž…แŸ‹แž†แŸ’แž„แžถแž™ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŠแžผแž…แž‚แŸ’แž“แžถแž–แžธแž‡แž„แŸ‹แž‘แŸ…แž‡แž„แŸ‹ (แž–แŸ’แžšแŸ„แŸ‡แžฏแž€แžŸแžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž‚แžบแžŠแžผแž…แž‚แŸ’แž“แžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‡แž„แŸ‹แž‘แžถแŸ†แž„แžขแžŸแŸ‹) - แžขแŸ’แžœแžธแžŠแŸ‚แž›แž™แžพแž„แž…แž„แŸ‹แž”แžถแž“แŸ” แž™แžพแž„แžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž‡แž„แŸ‹ (แž…แž„แŸ’แž€แŸ„แž˜) แžŠแŸ„แž™แž”แŸ’แžšแžพ docker-compose.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 แž‘แŸ…แž€แŸ’แž“แžปแž„แžšแžผแž”แž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž’แŸ†แž˜แžฝแž™แžšแž”แžŸแŸ‹แž™แžพแž„ แž แžพแž™แž‡แžถแž‘แžผแž‘แŸ… แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž˜แžทแž“แžแžปแžŸแž‚แŸ’แž“แžถแž–แžธแž€แžถแžšแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แžŠแŸ‚แž›แž”แžถแž“แž–แžทแž–แžŽแŸŒแž“แžถแž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž“แŸ‚แž€แž‘แžธ XNUMX แž“แŸ„แŸ‡แž‘แŸแŸ” แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž‚แžผแžŸแž”แž‰แŸ’แž‡แžถแž€แŸ‹แž–แžธแž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแŸ–

  • git แž€แŸ’แž›แžผแž“... - แž‘แž‘แžฝแž›แž”แžถแž“แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž€แžถแžšแžŠแžพแž˜แŸ’แž”แžธแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™ (createconfig.py, install_venv.sh แŸ”แž›แŸ”)
  • curl... && แž–แž“แŸ’แž›แžถ... - แž‘แžถแž‰แž™แž€แž“แžทแž„แž–แž“แŸ’แž›แžถแžœแžแŸ’แžแžปแž”แžปแžšแžถแžŽแž”แž„แŸ’แž€แžพแž (แžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŠแŸ‚แž›แž”แžถแž“แž…แž„แž€แŸ’แžšแž„)

แž˜แžถแž“แž”แž‰แŸ’แž แžถแžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹แžŠแŸ‚แž›แž˜แžทแž“แž‘แžถแž“แŸ‹แž”แžถแž“แž–แžทแž–แžŽแŸŒแž“แžถแŸ– แžŸแž˜แžถแžŸแž’แžถแžแžปแžŠแŸ‚แž›แž˜แžถแž“แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแž˜แžทแž“แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž”แžถแž“แž–แžธแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแŸ” แž™แžพแž„แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแž“แŸแŸ‡แžŠแŸ„แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž”แž‰แŸ’แž…แŸ’แžšแžถแžŸแžŠแžผแž…แŸ’แž“แŸแŸ‡แŸ–

แž“แŸ…แž€แŸ’แž“แžปแž„ .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; แž…แŸแž‰แžœแŸแž‡แŸ’แž‡แž”แž‰แŸ’แž‡แžถ url แž‘แŸ… nginxแŸ–

10.50.173.106 staging_BRANCH-1831_cluster.dev

แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž€แžถแžšแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž”แžŽแŸ’แžแžปแŸ†แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แž แž แžพแž™แžฅแžกแžผแžœแž“แŸแŸ‡แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แžฝแž€แžœแžถแž€แŸ’แž“แžปแž„แž…แŸ†แž“แžฝแž“แžŽแžถแž˜แžฝแž™แžŠแŸ‚แž›แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แžŠแžพแž˜แŸ’แž”แžธแž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แž€แžทแž…แŸ’แž…แž€แžถแžšแžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแŸ”

แž‚แŸ†แžšแŸ„แž„โ€‹แžขแž“แžถแž‚แž:

  • แž‰แŸ‚แž€แžŸแž˜แžถแžŸแž’แžถแžแžปแžšแž”แžŸแŸ‹แž™แžพแž„แž‡แžถแžŸแŸแžœแžถแž€แž˜แŸ’แž˜
  • แž˜แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Dockerfile แž“แžธแž˜แžฝแž™แŸ—
  • แžšแž€แžƒแžพแž‰แžแŸ’แž“แžถแŸ†แž„แžŠแŸ‚แž›แž•แŸ’แž‘แžปแž€แžแžทแž…แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸ…แž€แŸ’แž“แžปแž„แž‡แž„แŸ‹
  • แž”แž‰แŸ’แž‡แžถแž€แŸ‹แžแŸ’แž“แžถแŸ†แž„แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžˆแŸ’แž˜แŸ„แŸ‡ (แž‡แžถแž‡แžถแž„แž”แŸ’แžšแžพแž›แŸแžแžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžŠแžผแž…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘)
  • แž”แž“แŸ’แžแŸ‚แž˜แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžแžถแž‡แž„แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ†แž•แŸ’แž›แžถแž‰
  • ...

แžŸแžผแž˜แžขแžšแž‚แžปแžŽแž‡แžถแž–แžทแžŸแŸแžŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹ แžขแžแŸ’แžแž”แž‘.

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹