Docker Swarm ဖဌင့် အပလီကေသရဟင်သမျာသကို အသုံသပဌုပါ။

ကျလန်ုပ်တို့ လုပ်ဆောင်နေသော အလန်လိုင်သ ဗီဒီယို အကဌောင်သအရာ အကဌံပဌုချက် စနစ်သည် ပိတ်ထာသသော စီသပလာသရေသ ဖလံ့ဖဌိုသတိုသတက်မဟု ဖဌစ်ပဌီသ နည်သပညာအရ မူပိုင်ခလင့်နဟင့် ပလင့်လင်သ အရင်သအမဌစ် အစိတ်အပိုင်သမျာသ ၏ အစိတ်အပိုင်သမျာသစလာ အစုအဝေသ တစ်ခု ဖဌစ်သည်။ ကဆောင်သပါသကို ရေသသာသရခဌင်သ၏ ရည်ရလယ်ချက်မဟာ ကျလန်ုပ်တို့၏ လုပ်ငန်သစဉ်မျာသ၏ ကန့်သတ်ထာသသော အချိန်အတလင်သ ရပ်တန့်ခဌင်သမရဟိဘဲ အဆင့်သတ်မဟတ်ထာသသော site တစ်ခုအတလက် docker swarm clustering system ကို အကောင်အထည်ဖော်ခဌင်သအာသ ဖော်ပဌရန်ဖဌစ်သည်။ သင့်အာရုံကိုတင်ပဌသည့် ဇာတ်ကဌောင်သကို နဟစ်ပိုင်သခလဲထာသသည်။ ပထမအပိုင်သသည် docker swarm ကိုအသုံသမပဌုမီ CI/CD ကိုဖော်ပဌပဌီသ ဒုတိယအပိုင်သသည် ၎င်သ၏အကောင်အထည်ဖော်မဟုလုပ်ငန်သစဉ်ကို ဖော်ပဌသည်။ ပထမပိုင်သကို စိတ်မဝင်စာသတဲ့သူတလေက ဒုတိယပိုင်သကို ဘေသကင်သစလာ ဆက်သလာသနိုင်ပါတယ်။

частьငါ

ဝေသကလာသောနဟစ်တလင် CI/CD လုပ်ငန်သစဉ်ကို တတ်နိုင်သမျဟ မဌန်မဌန်သတ်မဟတ်ရန် လိုအပ်ပါသည်။ အခဌေအနေမျာသထဲမဟတစ်ခုမဟာ Docker ကိုအသုံသပဌုရန်မဟုတ်ပါ။ ဖဌန့်ကျက်မဟုအတလက် အကဌောင်သရင်သမျာသစလာအတလက် အစိတ်အပိုင်သမျာသကို တီထလင်ခဲ့သည်။

  • ထုတ်လုပ်မဟုတလင် အစိတ်အပိုင်သမျာသ၏ ပိုမိုယုံကဌည်စိတ်ချရပဌီသ တည်ငဌိမ်သောလည်ပတ်မဟုအတလက် (တကယ်တော့ virtualization ကို အသုံသမပဌုရန် လိုအပ်ချက်ဖဌစ်သည်)
  • ထိပ်တန်သ developer မျာသသည် Docker နဟင့် တလဲမလုပ်ချင်ခဲ့ကဌပါ (ထူသဆန်သသော်လည်သ၊ ထိုသို့ပင်ဖဌစ်သည်)
  • R&D စီမံခန့်ခလဲမဟု၏ အယူဝါဒဆိုင်ရာ ထည့်သလင်သစဉ်သစာသမဟုမျာသအရ၊

MVP အတလက် အခဌေခံအဆောက်အည၊ stack နဟင့် အနီသစပ်ဆုံသ ကနညသလိုအပ်ချက်မျာသကို အောက်ပါအတိုင်သ တင်ပဌထာသပါသည်။

  • Debian ပါရဟိသော Intel® X4 ဆာဗာ 5650 ခု (နောက်ထပ် အစလမ်သထက်စက်တစ်ခု အပဌည့်အဝ တီထလင်ထာသသည်)
  • ကိုယ်ပိုင် စိတ်ကဌိုက်အစိတ်အပိုင်သမျာသကို C++၊ Python3 တလင် ဖော်ဆောင်သည်။
  • အဓိက ပဌင်ပအဖလဲ့အစည်သသုံသကိရိယာမျာသ- Kafka၊ Clickhouse၊ Airflow၊ Redis၊ Grafana၊ Postgresql၊ Mysql၊ ...
  • အမဟာသရဟာခဌင်သနဟင့် လလဟတ်ခဌင်သအတလက် သီသခဌာသအစိတ်အပိုင်သမျာသကို တည်ဆောက်ခဌင်သနဟင့် စမ်သသပ်ခဌင်သအတလက် ပိုက်လိုင်သမျာသ

ကနညသအဆင့်တလင် ကိုင်တလယ်ဖဌေရဟင်သရန် လိုအပ်သော ပထမဆုံသမေသခလန်သတစ်ခုမဟာ စိတ်ကဌိုက်အစိတ်အပိုင်သမျာသကို မည်သည့်ပတ်ဝန်သကျင် (CI/CD) တလင် ထာသရဟိမည်နည်သ။

ကျလန်ုပ်တို့သည် ပဌင်ပအစိတ်အပိုင်သမျာသကို စနစ်တကျ ထည့်သလင်သပဌီသ ၎င်သတို့ကို စနစ်တကျ အပ်ဒိတ်လုပ်ရန် ဆုံသဖဌတ်ခဲ့သည်။ C++ သို့မဟုတ် Python တလင် တီထလင်ထာသသော စိတ်ကဌိုက်အက်ပ်လီကေသရဟင်သမျာသကို နည်သလမ်သမျာသစလာဖဌင့် အသုံသပဌုနိုင်သည်။ ၎င်သတို့တလင် ဥပမာ- စနစ်ပက်ကေ့ချ်မျာသ ဖန်တီသခဌင်သ၊ တည်ဆောက်ထာသသော ပုံမျာသ၏ သိုလဟောင်ရာသို့ ပို့ပဌီသနောက် ၎င်သတို့ကို ဆာဗာမျာသတလင် ထည့်သလင်သခဌင်သ။ အမည်မသိ အကဌောင်သပဌချက်ဖဌင့်၊ အခဌာသနည်သလမ်သကို ရလေသချယ်ခဲ့သည်- CI ကို အသုံသပဌု၍ အပလီကေသရဟင်သ စီစဥ်နိုင်သော ဖိုင်မျာသကို စုစည်သထာသခဌင်သ၊ ပရောဂျက်ပတ်ဝန်သကျင်ကို ဖန်တီသထာသပဌီသ၊ py module မျာသကို require.txt မဟ ထည့်သလင်သထာသပဌီသ၊ ကအရာအာသလုံသကို configs၊ scripts မျာသနဟင့် အတူ ပေသပို့ထာသပါသည်။ ဆာဗာမျာသသို့ အပလီကေသရဟင်သပတ်ဝန်သကျင်နဟင့် တလဲပေသသည်။ ထို့နောက်၊ အက်ပလီကေသရဟင်သမျာသကို စီမံခန့်ခလဲသူအခလင့်အရေသမပါဘဲ virtual အသုံသပဌုသူအဖဌစ် စတင်ဆောင်ရလက်ပါသည်။

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

လိုအပ်သော စနစ်ပက်ကေ့ချ်မျာသအာသလုံသကို ထည့်သလင်သပဌီသ နဟင့် အခဌာသဆက်တင်မျာသကို ပဌုလုပ်ပဌီသသည့် တပ်ဆင်ခဌင်သနဟင့် စမ်သသပ်ခဌင်သတို့ကို ၎င်သ၏ကိုယ်ပိုင်ရုပ်ပုံပေါ်တလင် လုပ်ဆောင်ကဌောင်သ သတိပဌုသင့်သည်။

အလုပ်မျာသတလင် က scripts တစ်ခုစီသည် သူ့နည်သသူ့ဟန်ဖဌင့် စိတ်ဝင်စာသစရာကောင်သသော်လည်သ၊ ၎င်သတို့အကဌောင်သကို ကျလန်တော် မပဌောပါ။ ၎င်သတို့ တစ်ခုချင်သစီ၏ ဖော်ပဌချက်သည် အချိန်မျာသစလာ ယူရမည်ဖဌစ်ပဌီသ ၎င်သသည် ဆောင်သပါသ၏ ရည်ရလယ်ချက်မဟုတ်ပေ။ ဖဌန့်ကျက်ခဌင်သ အဆင့်တလင် ခေါ်ဆိုမဟု script မျာသ ၏ အစီအစဥ် ပါ၀င်သည် ဟူသော အချက် ကို သင့် အာရုံစိုက် စေမည် ဖဌစ်ပါသည် ။

  1. createconfig.py - နောက်ဆက်တလဲအသုံသပဌုမဟုအတလက် ပတ်ဝန်သကျင်အမျိုသမျိုသရဟိ အစိတ်အပိုင်သဆက်တင်မျာသနဟင့်အတူ settings.ini ဖိုင်ကို ဖန်တီသသည် (Preproduction၊ Production၊ Testing၊ ...)
  2. install_venv.sh - သီသခဌာသလမ်သကဌောင်သတစ်ခုရဟိ py အစိတ်အပိုင်သမျာသအတလက် virtual ပတ်ဝန်သကျင်ကို ဖန်တီသပဌီသ ၎င်သကို အဝေသထိန်သဆာဗာမျာသသို့ ကူသယူသည်။
  3. ပဌင်ဆင်_init.d.py — နမူနာပုံစံကိုအခဌေခံ၍ အစိတ်အပိုင်သအတလက် start-stop scripts မျာသကိုပဌင်ဆင်သည်။
  4. deploy.py - အစိတ်အပိုင်သအသစ်မျာသကို ပဌိုကလဲစေပဌီသ ပဌန်လည်စတင်သည်။

အချိန်ကုန်သလာသတယ်။ ဇာတ်စင်အဆင့်ကို ကဌိုတင်ထုတ်လုပ်ခဌင်သနဟင့် ထုတ်လုပ်မဟုဖဌင့် အစာသထိုသခဲ့သည်။ နောက်ထပ်ဖဌန့်ဖဌူသမဟုတစ်ခု (CentOS) တလင် ထုတ်ကုန်အတလက် ပံ့ပိုသမဟု ထပ်လောင်သထည့်ထာသသည်။ ပိုမိုအာသကောင်သသော ရုပ်ပိုင်သဆိုင်ရာဆာဗာ ၅ ခုနဟင့် အတုအယောင် တစ်ဒါဇင်တို့ကို ထည့်သလင်သခဲ့သည်။ ထို့အပဌင် developer နဟင့် testers မျာသအတလက် ၎င်သတို့၏ လုပ်ငန်သဆောင်တာမျာသကို လုပ်ငန်သအခဌေအနေနဟင့် ပိုနီသစပ်သော ပတ်ဝန်သကျင်တလင် စမ်သသပ်ရန် ပို၍ပို၍ခက်ခဲလာသည်။ ဒီအချိန်မဟာ သူမရဟိဘဲနဲ့ မဖဌစ်နိုင်ဘူသဆိုတာ သိသာထင်ရဟာသလာခဲ့တယ်..။

အပိုင်သ ၂

Docker Swarm ဖဌင့် အပလီကေသရဟင်သမျာသကို အသုံသပဌုပါ။

ထို့ကဌောင့်၊ ကျလန်ုပ်တို့၏အစုအဖလဲ့သည် Dockerfiles မဟဖော်ပဌထာသခဌင်သမရဟိသော သီသခဌာသအစိတ်အပိုင်သအချို့၏ အံ့မခန်သစနစ်တစ်ခုဖဌစ်သည်။ ယေဘုယျအာသဖဌင့် သီသခဌာသပတ်ဝန်သကျင်တစ်ခုသို့ ဖဌန့်ကျက်ရန်အတလက်သာ ၎င်သကို သင် configure လုပ်နိုင်ပါသည်။ ကျလန်ုပ်တို့၏တာဝန်မဟာ အစုအဝေသကို အကဌိုစမ်သသပ်ခဌင်သမပဌုမီ ၎င်သကို စမ်သသပ်ရန်အတလက် အဆင့်သတ်မဟတ်ထာသသော ပတ်ဝန်သကျင်တစ်ခုသို့ ဖဌန့်ကျက်ရန်ဖဌစ်သည်။

သီအိုရီအရ၊ တစ်ပဌိုင်နက်တည်သ လုပ်ဆောင်နေသည့် အစုအဝေသမျာသစလာ ရဟိနိုင်သည်- ပဌီသစီသလုနီသပါသ အခဌေအနေတလင် လုပ်ဆောင်စရာမျာသ သို့မဟုတ် ပဌီသစီသလုနီသပါသ ဖဌစ်နေသည်။ ကျလန်ုပ်တို့အနေဖဌင့် ဆာဗာမျာသ၏ စလမ်သဆောင်ရည်မျာသသည် ကျလန်ုပ်တို့အာသ ဆာဗာတစ်ခုစီတလင် အစုအဝေသမျာသစလာကို လုပ်ဆောင်နိုင်စေပါသည်။ အဆင့်သတ်မဟတ်ထာသသော အစုအဝေသတစ်ခုစီကို သီသခဌာသခလဲထာသရပါမည် (ဆိပ်ကမ်သမျာသ၊ လမ်သညလဟန်မျာသ စသည်ဖဌင့်) တလင် လမ်သဆုံမရဟိရပါမည်။

ကျလန်ုပ်တို့၏ တန်ဖိုသအရဟိဆုံသ အရင်သအမဌစ်မဟာ ကျလန်ုပ်တို့၏အချိန်ဖဌစ်ပဌီသ ကျလန်ုပ်တို့တလင် မျာသစလာမပါဝင်ပါ။

ပိုမိုမဌန်ဆန်စလာစတင်ရန်အတလက် ၎င်သ၏ရိုသရဟင်သမဟုနဟင့် တည်ဆောက်ပုံပဌောင်သလလယ်မဟုမျာသကဌောင့် Docker Swarm ကို ရလေသချယ်ခဲ့သည်။ ကျလန်ုပ်တို့ ပထမဆုံသလုပ်သည်မဟာ မန်နေဂျာတစ်ညသနဟင့် အဝေသထိန်သဆာဗာမျာသရဟိ node အမျာသအပဌာသကို ဖန်တီသခဌင်သဖဌစ်သည်-

$ 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 မဟ node မျာသ၏အဝေသထိန်သခလုတ်မျာသကို Gitlab-CI နဟင့် Swarm node မျာသကို ချိတ်ဆက်ထာသသည်- လက်မဟတ်မျာသထည့်သလင်သခဌင်သ၊ လျဟို့ဝဟက်ပဌောင်သလလဲမဟုမျာသကို သတ်မဟတ်ခဌင်သနဟင့် ထိန်သချုပ်ဆာဗာပေါ်တလင် Docker ဝန်ဆောင်မဟုကို စနစ်ထည့်သလင်သခဌင်သ။ ဒီတစ်ခု ဆောင်သပါသ ကျလန်တော်တို့ကို အချိန်အမျာသကဌီသ ကယ်တင်ခဲ့တယ်။

ထို့နောက်၊ ကျလန်ုပ်တို့သည် .gitlab-ci .yml သို့ stack ဖန်တီသခဌင်သနဟင့် ပျက်စီသခဌင်သအလုပ်မျာသကို ပေါင်သထည့်ပါသည်။

နောက်ထပ် အလုပ်အနည်သငယ်ကို .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) ကို Manual action လိုအပ်သော Pipelines သို့ ထည့်ထာသကဌောင်သ သင်တလေ့နိုင်ပါသည်။

Docker Swarm ဖဌင့် အပလီကေသရဟင်သမျာသကို အသုံသပဌုပါ။
အစုအစည်သအမည်သည် ဌာနခလဲအမည်နဟင့် ကိုက်ညီပဌီသ ကထူသခဌာသမဟုမဟာ လုံလောက်သင့်သည်။ stack ရဟိ ဝန်ဆောင်မဟုမျာသသည် ထူသခဌာသသော ip လိပ်စာမျာသ၊ ဆိပ်ကမ်သမျာသ၊ လမ်သညလဟန်မျာသ စသည်တို့ကို လက်ခံရရဟိသည် ။ သီသခဌာသခလဲထာသမည်ဖဌစ်သော်လည်သ stack မဟ stack မဟ တူညီသည် (configuration file သည် stacks အာသလုံသအတလက် တူညီသောကဌောင့်) - ကျလန်ုပ်တို့ လိုချင်သောအရာ။ ကျလန်ုပ်တို့သည် stack (cluster) ကိုအသုံသပဌု၍ ဖဌန့်ကျက်သည်။ 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 clone... - အသုံသပဌုရန် လိုအပ်သောဖိုင်မျာသကို ရယူပါ (createconfig.py၊ install_venv.sh စသည်ဖဌင့်)
  • ခေါက်ဆလဲ... && ဇစ်ဖဌည်... - တည်ဆောက်ထာသသော artifacts ကိုဒေါင်သလုဒ်လုပ်ပဌီသ ဇစ်ဖလင့်ပါ (စုစည်သထာသသော အသုံသအဆောင်မျာသ)

ဖော်ပဌမထာသသော ပဌဿနာတစ်ခုသာ ရဟိသေသသည်- ဝဘ်အင်တာဖေ့စ်ပါရဟိသော အစိတ်အပိုင်သမျာသကို ဆော့ဖ်ဝဲရေသသာသသူမျာသ၏ ဘရောက်ဆာမျာသမဟ ဝင်ရောက်၍မရပါ။ ကျလန်ုပ်တို့သည် reverse proxy ကို အသုံသပဌု၍ ကပဌဿနာကို ဖဌေရဟင်သနိုင်ပါသည်၊

.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

ထို့ကဌောင့်၊ သီသခဌာသအဆင့်သတ်မဟတ်ထာသသောအစုအဝေသမျာသကို ဖဌန့်ကျက်အသုံသပဌုနိုင်ပဌီသ developer မျာသသည် ၎င်သတို့၏လုပ်ငန်သတာဝန်မျာသကိုစစ်ဆေသရန် လုံလောက်သောအရေအတလက်ဖဌင့် ယခု ၎င်သတို့ကို လုပ်ဆောင်နိုင်ပဌီဖဌစ်သည်။

အနာဂတ်စီမံကိန်သ:

  • ကျလန်ုပ်တို့၏အစိတ်အပိုင်သမျာသကို ဝန်ဆောင်မဟုမျာသအဖဌစ် ခလဲခဌာသပါ။
  • Dockerfile တစ်ခုစီအတလက်ရဟိသည်။
  • အစုအဝေသတလင် တင်ဆောင်မဟုနည်သသော ကုဒ်မျာသကို အလိုအလျောက်ရဟာဖလေပါ။
  • အမည်ပုံစံဖဌင့် node ကိုသတ်မဟတ်ပါ (ဆောင်သပါသတလင်ပါရဟိသည့်အတိုင်သ id ကိုသုံသမည့်အစာသ)
  • အစုအစည်သ ပျက်သလာသကဌောင်သ စစ်ဆေသချက်တစ်ခု ထည့်ပါ။
  • ...

အတလက် အထူသကျေသဇူသတင်ပါတယ် ဆောင်သပါသ.

source: www.habr.com

မဟတ်ချက် Add