เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•

เดžเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด“เตบเดฒเตˆเตป เดตเต€เดกเดฟเดฏเต‹ เด‰เดณเตเดณเดŸเด•เตเด• เดถเตเดชเดพเตผเดถ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เด’เดฐเต เด…เดŸเดžเตเดž เดตเดพเดฃเดฟเดœเตเดฏ เดตเดฟเด•เดธเดจเดฎเดพเดฃเต, เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดฎเดพเดฏเดฟ เด•เตเดคเตเดคเด•, เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดฎเตพเดŸเตเดŸเดฟ-เด˜เดŸเด• เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดพเดฃเต. เดˆ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฑเต† เด‰เดฆเตเดฆเต‡เดถเตเดฏเด‚, เดชเดฐเดฟเดฎเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏ เดธเดพเดนเดšเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเตเดŸเต† เดธเตเดฅเดพเดชเดฟเดค เดตเตผเด•เตเด•เตเดซเตเดฒเต‹เดฏเต† เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดคเต†, เด’เดฐเต เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเดจเดพเดฏเดฟ เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเดฟเตฝเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏ เด†เด–เตเดฏเดพเดจเด‚ เดฐเดฃเตเดŸเต เดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดกเต‹เด•เตเด•เตผ เดธเตเดตเต‹เด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เด†เดฆเตเดฏ เดญเดพเด—เด‚ CI/CD เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดฐเดฃเตเดŸเดพเด‚ เดญเดพเด—เด‚ เด…เดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด†เดฆเตเดฏเดญเดพเด—เด‚ เดตเดพเดฏเดฟเด•เตเด•เดพเตป เดคเดพเดฒเตเดชเดฐเตเดฏเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดตเตผเด•เตเด•เต เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเดฟเดฒเต‡เด•เตเด•เต เด•เดŸเด•เตเด•เดพเด‚.

เดšเดพเดธเตเดฑเตเดฑเต เด

เด’เดฐเต เด•เดพเดฒเดคเตเดคเต, เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดฐ เดตเต‡เด—เดคเตเดคเดฟเตฝ เด’เดฐเต CI/CD เดชเตเดฐเต‹เดธเดธเตเดธเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดค เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดกเต‹เด•เตเด•เตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฐเตเดคเต เดŽเดจเตเดจเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต เด’เดฐเต เดจเดฟเดฌเดจเตเดงเดจ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ เด˜เดŸเด•เด™เตเด™เตพ เดชเดฒ เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเด•เตเด•เตเดจเตเดจเต:

  • เด‰เตฝโ€Œเดชเดพเดฆเดจเดคเตเดคเดฟเดฒเต† เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดตเตเด‚ เดธเตเดธเตเดฅเดฟเดฐเดตเตเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเต (เด…เดคเดพเดฏเดคเต, เดธเดพเดฐเดพเด‚เดถเดคเตเดคเดฟเตฝ, เดตเดฟเตผเดšเตเดšเตเดตเดฒเตˆเดธเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ เดŽเดจเตเดจ เด†เดตเดถเตเดฏเด•เดค)
  • เดฎเตเตปเดจเดฟเดฐ เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดกเต‹เด•เตเด•เดฑเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเดฟเดฒเตเดฒ (เดตเดฟเดšเดฟเดคเตเดฐเด‚, เดชเด•เตเดทเต‡ เด…เด™เตเด™เดจเต†เดฏเดพเดฏเดฟเดฐเตเดจเตเดจเต)
  • เด†เตผ เด†เตปเดกเต เดกเดฟ เดฎเดพเดจเต‡เดœเตโ€Œเดฎเต†เดจเตเดฑเดฟเดจเตเดฑเต† เดชเตเดฐเดคเตเดฏเดฏเดถเดพเดธเตเดคเตเดฐเดชเดฐเดฎเดพเดฏ เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ

MVP-เดฏเตเดŸเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เดณเตเด‚ เดธเตเดฑเตเดฑเดพเด•เตเด•เตเด‚ เดเด•เดฆเต‡เดถ เดชเตเดฐเดพเดฐเด‚เดญ เด†เดตเดถเตเดฏเด•เดคเด•เดณเตเด‚ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดตเดฏเดพเดฃเต:

  • 4 Debian เด‰เดณเตเดณ Intelยฎ X5650 เดธเต†เตผเดตเดฑเตเด•เตพ (เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด’เดฐเต เดถเด•เตเดคเดฎเดพเดฏ เดฏเดจเตเดคเตเดฐเด‚)
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เดตเดฟเด•เดธเดจเด‚ C++, Python3-เตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต
  • เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดชเตเดฐเดงเดพเดจ เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เดŸเต‚เดณเตเด•เตพ: เด•เดพเดซเตเด•, เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเต, เดŽเดฏเตผเดซเตเดฒเต‹, เดฑเต†เดกเดฟเดธเต, เด—เตเดฐเดพเดซเดพเดจ, เดชเต‹เดธเตเดฑเตเดฑเตเด—เตเดฐเต†เดธเตโ€Œเด•เตเดŽเตฝ, เดฎเตˆเดธเตโ€Œเด•เตเดฏเตเดŽเตฝ, โ€ฆ
  • เดกเต€เดฌเด—เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเดพเดฏเดฟ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เด˜เดŸเด•เด™เตเด™เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตˆเดชเตเดชเต เดฒเตˆเดจเตเด•เตพ

เดชเตเดฐเดพเดฐเด‚เดญ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸ เด†เดฆเตเดฏเดคเตเดคเต† เดšเต‹เดฆเตเดฏเด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเต, เดเดคเต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเตเด‚ (CI/CD) เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เด˜เดŸเด•เด™เตเด™เตพ เดŽเด™เตเด™เดจเต† เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด‚ เดŽเดจเตเดจเดคเดพเดฃเต.

เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เด˜เดŸเด•เด™เตเด™เตพ เดตเตเดฏเดตเดธเตเดฅเดพเดชเดฟเดคเดฎเดพเดฏเดฟ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดตเตเดฏเดตเดธเตเดฅเดพเดชเดฟเดคเดฎเดพเดฏเดฟ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. C++ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ Python-เตฝ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดš เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดชเดฒ เดคเดฐเดคเตเดคเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เด…เดตเดฏเดฟเตฝ, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต: เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•, เดถเต‡เด–เดฐเดฟเดšเตเดš เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เตเด•, เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เด…เดตเดฏเตเดŸเต† เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเตป. เด‡เดคเดฟเดจเด•เด‚ เด…เดœเตเดžเดพเดคเดฎเดพเดฏ เด’เดฐเต เด•เดพเดฐเดฃเดคเตเดคเดพเตฝ, เดฎเดฑเตเดฑเตŠเดฐเต เดฐเต€เดคเดฟ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต, เด…เดคเดพเดฏเดคเต: CI เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฌเดฟเตพ เดซเดฏเดฒเตเด•เตพ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต, เด†เดตเดถเตเดฏเด•เดคเด•เตพ.txt-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ py เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเต, เด•เต‚เดŸเดพเดคเต† เดˆ เด†เตผเดŸเตเดŸเดฟเดซเดพเด•เตเดฑเตเดฑเตเด•เดณเต†เดฒเตเดฒเดพเด‚ เด•เต‹เตบเดซเดฟเด—เดฑเตเด•เตพ, เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตŠเดชเตเดชเด‚ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต. เดธเต†เตผเดตเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟ. เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เด…เดกเตเดฎเดฟเดจเดฟเดธเตเดŸเตเดฐเต‡เดฑเตเดฑเตผ เด…เดตเด•เดพเดถเด™เตเด™เดณเดฟเดฒเตเดฒเดพเดคเต† เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเตฝ เดจเดฟเดจเตเดจเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต.

CI/CD เดธเดฟเดธเตเดฑเตเดฑเดฎเดพเดฏเดฟ Gitlab-CI เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต. เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดชเตˆเดชเตเดชเตเดฒเตˆเตป เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•
เด˜เดŸเดจเดพเดชเดฐเดฎเดพเดฏเดฟ, gitlab-ci.yml เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

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

  DEBIAN: "MYREGISTRY:5000/debian:latest"

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

stages:
  - build
  - testing
  - deploy

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

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

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

เด…เดธเด‚เดฌเตเดฒเดฟเดฏเตเด‚ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เตเด‚ เด…เดคเดฟเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เด‡เดฎเต‡เดœเดฟเดฒเดพเดฃเต เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต, เด…เดตเดฟเดŸเต† เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเด‚ เด‡เดคเดฟเดจเด•เด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดฎเดฑเตเดฑเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดœเต‹เดฒเดฟเด•เดณเดฟเดฒเต† เดˆ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เด“เดฐเต‹เดจเตเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต‡เดคเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดฐเดธเด•เดฐเดฎเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เดžเดพเตป เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เด…เดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดฟเดฒเตเดฒ; เด…เดต เด“เดฐเต‹เดจเตเดจเตเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป เด—เดฃเตเดฏเดฎเดพเดฏ เดธเดฎเดฏเดฎเต†เดŸเตเด•เตเด•เตเด‚, เด‡เดคเต เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เด‰เดฆเตเดฆเต‡เดถเตเดฏเดฎเดฒเตเดฒ. เดตเดฟเดจเตเดฏเดพเดธ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เด•เต‹เดณเดฟเด‚เด—เต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดถเตเดฐเต‡เดฃเดฟ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจ เดตเดธเตเดคเตเดคเดฏเดฟเดฒเต‡เด•เตเด•เต เดžเดพเตป เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดง เด•เตเดทเดฃเดฟเด•เตเด•เดŸเตเดŸเต†:

  1. createconfig.py โ€” เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ เดตเตเดฏเดคเตเดฏเดธเตโ€Œเดค เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเดฟเดฒเต† เด˜เดŸเด•เด™เตเด™เตพเด•เตเด•เตเดณเตเดณ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเตเดณเตเดณ เด’เดฐเต settings.ini เดซเดฏเตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต (เดชเตเดฐเต€เดชเตเดฐเตŠเดกเด•เตเดทเตป, เดชเตเดฐเตŠเดกเด•เตเดทเตป, เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต, ...)
  2. install_venv.sh โ€” เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเดฏเดฟเตฝ py เด˜เดŸเด•เด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเต เดตเดฟเดฆเต‚เดฐ เดธเต†เตผเดตเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเด•เตผเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต
  3. ready_init.d.py โ€” เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเดฟเดจเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเต-เดธเตเดฑเตเดฑเต‹เดชเตเดชเต เด˜เดŸเด•เด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเดจเตเดจเต
  4. deploy.py - เดชเตเดคเดฟเดฏ เด˜เดŸเด•เด™เตเด™เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดธเดฎเดฏเด‚ เด•เดŸเดจเตเดจเตเดชเต‹เดฏเดฟ. เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เด˜เดŸเตเดŸเด‚ เดชเตเดฐเต€ เดชเตเดฐเตŠเดกเด•เตเดทเดจเตเด‚ เดชเตเดฐเตŠเดกเด•เตเดทเดจเตเด‚ เดตเดดเดฟ เดฎเดพเดฑเตเดฑเดฟ. เด’เดฐเต เดตเดฟเดคเดฐเดฃเดคเตเดคเดฟเตฝ (CentOS) เด‰เตฝเดชเตเดชเดจเตเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃ เดšเต‡เตผเดคเตเดคเต. เดฎเดฑเตเดฑเตŠเดฐเต 5 เดถเด•เตเดคเดฎเดพเดฏ เดซเดฟเดธเดฟเด•เตเด•เตฝ เดธเต†เตผเดตเดฑเตเด•เดณเตเด‚ เด’เดฐเต เดกเดธเตป เดตเต†เตผเดšเตเดตเตฝ เดธเต†เตผเดตเดฑเตเด•เดณเตเด‚ เดšเต‡เตผเดคเตเดคเต. เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เตเด‚ เดŸเต†เดธเตเดฑเตเดฑเตผเดฎเดพเตผเด•เตเด•เตเด‚ เด…เดตเดฐเตเดŸเต† เดœเต‹เดฒเดฟเด•เตพ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด…เดตเดธเตเดฅเดฏเต‹เดŸเต เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เด…เดŸเตเดคเตเดคเตเดณเตเดณ เด’เดฐเต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเตฝ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฏเดฟ. เด…เดตเดจเดฟเดฒเตเดฒเดพเดคเต† เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒเต†เดจเตเดจเต เดˆ เดธเดฎเดฏเดคเตเดคเต เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ ...

เดญเดพเด—เด‚ II

เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•

เด…เดคเดฟเดจเดพเตฝ, เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเดคเตเดค เดฐเดฃเตเดŸเต เดกเดธเตป เดตเตเดฏเด•เตเดคเดฟเด—เดค เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เด—เด‚เดญเต€เดฐเดฎเดพเดฏ เดธเด‚เดตเดฟเดงเดพเดจเดฎเดพเดฃเต เดžเด™เตเด™เดณเตเดŸเต† เด•เตเดฒเดธเตเดฑเตเดฑเตผ. เดชเตŠเดคเตเดตเดพเดฏเดฟ เดฎเดพเดคเตเดฐเด‚ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดชเตเดฐเต€-เดฑเดฟเดฒเต€เดธเต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เดฟเดจเต เดฎเตเดฎเตเดชเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดจเต† เด’เดฐเต เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดžเด™เตเด™เดณเตเดŸเต† เดšเตเดฎเดคเดฒ.

เดธเตˆเดฆเตเดงเดพเดจเตเดคเดฟเด•เดฎเดพเดฏเดฟ, เด’เดฐเต‡เดธเดฎเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดจเดฟเดฐเดตเดงเดฟ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เตพ เด‰เดฃเตเดŸเดพเด•เดพเด‚: เดชเต‚เตผเดคเตเดคเต€เด•เดฐเดฟเดšเตเดš เด…เดตเดธเตเดฅเดฏเดฟเดฒเต‹ เดชเต‚เตผเดคเตเดคเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเดŸเตเดคเตเดคเต‹ เด‰เดณเตเดณ เดœเต‹เดฒเดฟเด•เตพ. เดžเด™เตเด™เดณเตเดŸเต† เดชเด•เตเด•เดฒเตเดณเตเดณ เดธเต†เตผเดตเดฑเตเด•เดณเตเดŸเต† เดถเด•เตเดคเดฟ เด“เดฐเต‹ เดธเต†เตผเดตเดฑเดฟเดฒเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด“เดฐเต‹ เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด‚ เด’เดฑเตเดฑเดชเตเดชเต†เดŸเตเดŸเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ (เดชเต‹เตผเดŸเตเดŸเตเด•เตพ, เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เตพ เดฎเตเดคเดฒเดพเดฏเดตเดฏเดฟเตฝ เด“เดตเตผเดฒเดพเดชเตเดชเต เด‰เดฃเตเดŸเดพเด•เดฐเตเดคเต).

เดžเด™เตเด™เดณเตเดŸเต† เดเดฑเตเดฑเดตเตเด‚ เดตเดฟเดฒเดชเตเดชเต†เดŸเตเดŸ เดตเดฟเดญเดตเด‚ เดจเดฎเตเดฎเตเดŸเต† เดธเดฎเดฏเดฎเดพเดฃเต, เดžเด™เตเด™เตพเด•เตเด•เต เด…เดคเดฟเตฝ เด…เดงเดฟเด•เดฎเดฟเดฒเตเดฒ.

เดตเต‡เด—เดฎเต‡เดฑเดฟเดฏ เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเดจเดพเดฏเดฟ, เดฒเดพเดณเดฟเดคเตเดฏเดตเตเด‚ เดตเดดเด•เตเด•เดฎเตเดณเตเดณ เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเตเด‚ เด•เดพเดฐเดฃเด‚ เดžเด™เตเด™เตพ เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต. เดฑเดฟเดฎเต‹เดŸเตเดŸเต เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เด’เดฐเต เดฎเดพเดจเต‡เดœเดฐเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เดจเต‹เดกเตเด•เดณเตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดžเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดšเต†เดฏเตเดคเดคเต:

$ 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

เดฎเดพเดจเตเดตเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเตˆเดชเตเดชเต เดฒเตˆเดจเตเด•เดณเดฟเตฝ (เดกเดฟเดชเตเดฒเต‹เดฏเต_เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต, เดธเตเดฑเตเดฑเต‹เดชเตเดชเต_เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต) เดฐเดฃเตเดŸเต เดฌเดŸเตเดŸเดฃเตเด•เตพ เดšเต‡เตผเดคเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เดฎเตเด•เดณเดฟเดฒเต† เด•เต‹เดกเต เดถเด•เดฒเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเดฃเต.

เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•
เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดจเดพเดฎเด‚ เดฌเตเดฐเดพเดžเตเดšเดฟเดจเตเดฑเต† เดชเต‡เดฐเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต, เดˆ เดชเตเดฐเดคเตเดฏเต‡เด•เดค เดฎเดคเดฟเดฏเดพเด•เตเด‚. เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเดฒเต† เดธเต‡เดตเดจเด™เตเด™เตพเด•เตเด•เต เด…เดฆเตเดตเดฟเดคเต€เดฏ เดเดชเดฟ เดตเดฟเดฒเดพเดธเด™เตเด™เดณเตเด‚ เดชเต‹เตผเดŸเตเดŸเตเด•เดณเตเด‚ เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเด•เดณเตเด‚ เดฎเดฑเตเดฑเตเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚. เด’เดฑเตเดฑเดชเตเดชเต†เดŸเตเดŸเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดฎเตเดคเตฝ เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดตเดฐเต† เด’เดฐเต‡เดชเต‹เดฒเต†เดฏเดพเดฃเต (เดŽเดฒเตเดฒเดพ เดธเตเดฑเตเดฑเดพเด•เตเด•เตเด•เตพเด•เตเด•เตเด‚ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเตฝ เด’เดฐเตเดชเต‹เดฒเต†เดฏเดพเดฃเต) - เด…เดคเดพเดฃเต เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเดšเตเดšเดคเต. เดžเด™เตเด™เตพ เดธเตเดฑเตเดฑเดพเด•เตเด•เต (เด•เตเดฒเดธเตเดฑเตเดฑเตผ) เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเต 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-เตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดฒเตเดฒ. เดžเดพเตป เดตเตเดฏเดคเตเดฏเดพเดธเด™เตเด™เตพ เดŠเดจเตเดจเดฟเดชเตเดชเดฑเดฏเดพเด‚:

  • เดœเดฟเดฑเตเดฑเต เด•เตเดฒเต‹เตบ... โ€” เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดŸเดคเตเดคเดพเตป เด†เดตเดถเตเดฏเดฎเดพเดฏ เดซเดฏเดฒเตเด•เตพ เดžเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต (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; url nginx เด†เดฏเดฟ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•:

10.50.173.106 staging_BRANCH-1831_cluster.dev

เด…เดคเดฟเดจเดพเตฝ, เด’เดฑเตเดฑเดชเตเดชเต†เดŸเตเดŸ เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เดณเตเดŸเต† เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ, เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เต เด…เดตเดฐเตเดŸเต† เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดเดคเต เด…เดณเดตเดฟเดฒเตเด‚ เด‡เดชเตเดชเต‹เตพ เด…เดต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚.

เดญเดพเดตเดฟ เดชเดฐเดฟเดชเดพเดŸเดฟเด•เดณเต:

  • เดžเด™เตเด™เดณเตเดŸเต† เด˜เดŸเด•เด™เตเด™เดณเต† เดธเต‡เดตเดจเด™เตเด™เดณเดพเดฏเดฟ เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เตเด•
  • เด“เดฐเต‹เดจเตเดจเดฟเดจเตเด‚ เด’เดฐเต เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
  • เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเตฝ เดฒเต‹เดกเต เด•เตเดฑเดžเตเดž เดจเต‹เดกเตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เด•เดฃเตเดŸเต†เดคเตเดคเตเด•
  • เด’เดฐเต เดจเต†เดฏเดฟเด‚ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเต‹เดกเตเด•เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเด• (เดฒเต‡เด–เดจเดคเตเดคเดฟเดฒเต† เดชเต‹เดฒเต† เดเดกเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเด•เดฐเด‚)
  • เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดจเดถเดฟเดšเตเดšเตเดตเต†เดจเตเดจเต เด’เดฐเต เดšเต†เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเด•
  • เดชเด™เตเด•เต โ‚ฌ |

เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดจเดจเตเดฆเดฟ เด’เดฐเต เดฒเต‡เด–เดจเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•