เจกเฉŒเจ•เจฐ เจธเจตเจพเจฐเจฎ เจจเจพเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‹

เจ”เจจเจฒเจพเจˆเจจ เจตเฉ€เจกเฉ€เจ“ เจธเจฎเจ—เจฐเฉ€ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจœเจฟเจธ 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ เจ‡เฉฑเจ• เจฌเฉฐเจฆ เจตเจชเจพเจฐเจ• เจตเจฟเจ•เจพเจธ เจนเฉˆ เจ…เจคเฉ‡ เจคเจ•เจจเฉ€เจ•เฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเจฒเจ•เฉ€เจ…เจค เจ…เจคเฉ‡ เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจญเจพเจ—เจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจฌเจนเฉ-เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจ•เจฒเฉฑเจธเจŸเจฐ เจนเฉˆเฅค เจ‡เจธ เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ เจ‡เฉฑเจ• เจธเฉ€เจฎเจค เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš เจธเจพเจกเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ‡ เจธเจฅเจพเจชเจฟเจค เจตเจฐเจ•เจซเจฒเฉ‹ เจตเจฟเฉฑเจš เจตเจฟเจ˜เจจ เจชเจพเจ เจฌเจฟเจจเจพเจ‚ เจ‡เฉฑเจ• เจธเจŸเฉ‡เจœเจฟเฉฐเจ— เจธเจพเจˆเจŸ เจฒเจˆ เจกเฉŒเจ•เจฐ เจธเจตเฉˆเจฐเจฎ เจ•เจฒเฉฑเจธเจŸเจฐเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจฌเจฟเจฐเจคเจพเจ‚เจค เจฆเฉ‹ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจชเจนเจฟเจฒเจพ เจญเจพเจ— เจกเฉŒเจ•เจฐ เจธเจตเฉˆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเฉ€เจ†เจˆ / เจธเฉ€เจกเฉ€ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเจพ เจ‡เจธเจฆเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเจฟเจนเฉœเฉ‡ เจฒเฉ‹เจ• เจชเจนเจฟเจฒเฉ‡ เจญเจพเจ— เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเฉ‡ เจ‰เจน เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจฆเฉ‚เจœเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจญเจพเจ— I

เจตเจพเจชเจธ เจฆเฉ‚เจฐ, เจฆเฉ‚เจฐ เจฆเฉ‡ เจธเจพเจฒ เจตเจฟเฉฑเจš, เจœเจฟเฉฐเจจเฉ€ เจœเจฒเจฆเฉ€ เจนเฉ‹ เจธเจ•เฉ‡ เจธเฉ€เจ†เจˆ / เจธเฉ€เจกเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจธเฉ€. เจธเจผเจฐเจคเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เจน เจธเฉ€ เจ•เจฟ เจกเฉŒเจ•เจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡ เจคเจพเจ‡เจจเจพเจคเฉ€ เจฒเจˆ เจ•เจˆ เจ•เจพเจฐเจจเจพเจ‚ เจ•เจฐเจ•เฉ‡ เจตเจฟเจ•เจธเจค เจนเจฟเฉฑเจธเฉ‡:

  • เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš เจญเจพเจ—เจพเจ‚ เจฆเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ เจ…เจคเฉ‡ เจธเจฅเจฟเจฐ เจธเฉฐเจšเจพเจฒเจจ เจฒเจˆ (เจœเฉ‹ เจ•เจฟ เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจตเจฐเจšเฉเจ…เจฒเจพเจˆเจœเฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจพ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ)
  • เจชเฉเจฐเจฎเฉเฉฑเจ– เจกเจฟเจตเฉˆเจฒเจชเจฐ เจกเฉŒเจ•เจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจธเจจ (เจ…เจœเฉ€เจฌ, เจชเจฐ เจ‡เจน เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเฉ€)
  • เจ–เฉ‹เจœ เจ…เจคเฉ‡ เจตเจฟเจ•เจพเจธ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฆเฉ‡ เจตเจฟเจšเจพเจฐเจงเจพเจฐเจ• เจตเจฟเจšเจพเจฐเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ

MVP เจฒเจˆ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเจพ, เจธเจŸเฉˆเจ• เจ…เจคเฉ‡ เจ…เฉฐเจฆเจพเจœเจผเจจ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจฒเฉ‹เฉœเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€:

  • เจกเฉ‡เจฌเฉ€เจ…เจจ เจฆเฉ‡ เจจเจพเจฒ 4 Intelยฎ X5650 เจธเจฐเจตเจฐ (เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจฎเจธเจผเฉ€เจจ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจตเจฟเจ•เจธเจค เจนเฉˆ)
  • เจ†เจชเจฃเฉ‡ เจ•เจธเจŸเจฎ เจญเจพเจ—เจพเจ‚ เจฆเจพ เจตเจฟเจ•เจพเจธ C++, Python3 เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ
  • เจฎเฉเฉฑเจ– 3rd เจชเจพเจฐเจŸเฉ€ เจŸเฉ‚เจฒ เจตเจฐเจคเฉ‡ เจ—เจ: เจ•เจพเจซเจ•เจพ, เจ•เจฒเจฟเจ•เจนเจพเจŠเจธ, เจเจ…เจฐเจซเจฒเฉ‹, เจฐเฉ‡เจกเจฟเจธ, เจ—เฉเจฐเจพเจซเจพเจจเจพ, เจชเฉ‹เจธเจŸเจ—เฉเจฐเฉ‡เจธเจ•เจฟเจฒ, เจฎเจพเจˆเจเจธเจ•เจเจฒ, ...
  • เจกเฉ€เจฌเฉฑเจ— เจ…เจคเฉ‡ เจฐเฉ€เจฒเฉ€เจœเจผ เจฒเจˆ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚

เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจชเฉœเจพเจ… 'เจคเฉ‡ เจธเฉฐเจฌเฉ‹เจงเจฟเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจธเจตเจพเจฒเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เจน เจนเฉˆ เจ•เจฟ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจตเจพเจคเจพเจตเจฐเจฃ (CI / CD) เจตเจฟเฉฑเจš เจ•เจธเจŸเจฎ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸเจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจคเจพเจ‡เจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจ…เจธเฉ€เจ‚ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ‡ เจญเจพเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ—เจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ—เจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆเฅค C++ เจœเจพเจ‚ Python เจตเจฟเฉฑเจš เจตเจฟเจ•เจธเจค เจ•เจธเจŸเจฎ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจˆ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเจพเจฒ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ: เจธเจฟเจธเจŸเจฎ เจชเฉˆเจ•เฉ‡เจœ เจฌเจฃเจพเจ‰เจฃเจพ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฟเจฒเจŸ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฃเจพ เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฐเจตเจฐเจพเจ‚ เจ‰เฉฑเจคเฉ‡ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพเฅค เจ•เจฟเจธเฉ‡ เจ…เจฃเจœเจพเจฃ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡, เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจคเจฐเฉ€เจ•เจพ เจšเฉเจฃเจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจ…เจฐเจฅเจพเจค: CI เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡, เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเฉ‡เจฌเจฒ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจพเจคเจพเจตเจฐเจฃ เจฌเจฃเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, py เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ requirements.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

เจกเฉŒเจ•เจฐ เจธเจตเจพเจฐเจฎ เจจเจพเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‹

เจ‡เจธ เจฒเจˆ, เจธเจพเจกเจพ เจ•เจฒเฉฑเจธเจŸเจฐ เจ•เฉเจ เจฆเจฐเจœเจจ เจตเฉฑเจ–เจฐเฉ‡ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจนเฉˆ เจœเฉ‹ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจตเจฐเจฃเจจ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจตเจพเจคเจพเจตเจฐเจฃ เจฒเจˆ เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจธเจพเจกเจพ เจ•เฉฐเจฎ เจชเฉ‚เจฐเจต-เจฐเจฟเจฒเฉ€เจœเจผ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจธเจŸเฉ‡เจœเจฟเฉฐเจ— เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจนเฉˆเฅค

เจธเจฟเจงเจพเจ‚เจคเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจšเฉฑเจฒ เจฐเจนเฉ‡ เจ•เจˆ เจ•เจฒเฉฑเจธเจŸเจฐ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ: เจœเจฟเฉฐเจจเฉ‡ เจ•เฉฐเจฎ เจฎเฉเจ•เฉฐเจฎเจฒ เจนเฉ‹ เจšเฉเฉฑเจ•เฉ‡ เจนเจจ เจœเจพเจ‚ เจฎเฉเจ•เฉฐเจฎเจฒ เจนเฉ‹เจฃ เจฆเฉ‡ เจจเฉ‡เฉœเฉ‡ เจนเจจเฅค เจธเจพเจกเฉ‡ เจจเจฟเจชเจŸเจพเจฐเฉ‡ 'เจคเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจธเจพเจจเฉ‚เฉฐ เจนเจฐเฉ‡เจ• เจธเจฐเจตเจฐ 'เจคเฉ‡ เจ•เจˆ เจ•เจฒเฉฑเจธเจŸเจฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจนเจฐเฉ‡เจ• เจธเจŸเฉ‡เจœเจฟเฉฐเจ— เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจ…เจฒเฉฑเจ— เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ (เจชเฉ‹เจฐเจŸเจพเจ‚, เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚, เจ†เจฆเจฟ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจ‡เฉฐเจŸเจฐเจธเฉˆเจ•เจธเจผเจจ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ)เฅค

เจธเจพเจกเจพ เจธเจญ เจคเฉ‹เจ‚ เจ•เฉ€เจฎเจคเฉ€ เจธเจฐเฉ‹เจค เจธเจพเจกเจพ เจธเจฎเจพเจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เจธเจฆเจพ เจฌเจนเฉเจคเจพ เจนเจฟเฉฑเจธเจพ เจจเจนเฉ€เจ‚ เจธเฉ€เฅค

เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจธเจผเฉเจฐเฉ‚เจ†เจค เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ€ เจธเจพเจฆเจ—เฉ€ เจ…เจคเฉ‡ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฒเจšเจ•เจคเจพ เจฆเฉ‡ เจ•เจพเจฐเจจ เจกเฉŒเจ•เจฐ เจธเจตเฉˆเจฐเจฎ เจจเฉ‚เฉฐ เจšเฉเจฃเจฟเจ† เจนเฉˆเฅค เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ‰เจน เจฐเจฟเจฎเฉ‹เจŸ เจธเจฐเจตเจฐเจพเจ‚ 'เจคเฉ‡ เจ‡เฉฑเจ• เจฎเฉˆเจจเฉ‡เจœเจฐ เจ…เจคเฉ‡ เจ•เจˆ เจจเฉ‹เจก เจฌเจฃเจพเจ‰เจฃเจพ เจธเฉ€:

$ 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 .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) เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ, เจœเจฟเจธ เจฒเจˆ เจฆเจธเจคเฉ€ เจ•เจพเจฐเจตเจพเจˆ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

เจกเฉŒเจ•เจฐ เจธเจตเจพเจฐเจฎ เจจเจพเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‹
เจธเจŸเฉˆเจ• เจจเจพเจฎ เจธเจผเจพเจ–เจพ เจฆเฉ‡ เจจเจพเจฎ เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน เจตเจฟเจฒเฉฑเจ–เจฃเจคเจพ เจ•เจพเจซเจผเฉ€ เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค เจธเจŸเฉˆเจ• เจตเจฟเฉฑเจš เจธเฉ‡เจตเจพเจตเจพเจ‚ เจตเจฟเจฒเฉฑเจ–เจฃ เจ†เจˆเจชเฉ€ เจชเจคเฉ‡, เจ…เจคเฉ‡ เจชเฉ‹เจฐเจŸเจพเจ‚, เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚, เจ†เจฆเจฟ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ…เจฒเฉฑเจ— เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ, เจชเจฐ เจธเจŸเฉˆเจ• เจคเฉ‹เจ‚ เจธเจŸเฉˆเจ• เจคเฉฑเจ• เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเจพ (เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจธเจพเจฐเฉ‡ เจธเจŸเฉˆเจ• เจฒเจˆ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ€ เจนเฉˆ) - เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจธเฉ€เฅค เจ…เจธเฉ€เจ‚ เจธเจŸเฉˆเจ• (เจ•เจฒเฉฑเจธเจŸเจฐ) เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ.เจ†เจˆ.เจเจฎ.เจเจฒ., เจœเฉ‹ เจธเจพเจกเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ.เจ†เจˆ.เจเจฎ.เจเจฒ.

---
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 เจตเจฟเฉฑเจš, เจ•เจฒเฉฑเจธเจŸเจฐ เจธเจŸเฉˆเจ• เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจฌเฉˆเจฒเฉ‡เจ‚เจธเจฐ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเจพเจˆเจจ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚ (เจœเฉ‹, เจœเจฆเฉ‹เจ‚ เจ•เจฎเจฟเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจธเจฟเจฐเจซ เจ‡เจธเจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ (เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ: /etc/nginx/conf เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจจเจตเฉ€เจ‚ nginx เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒเจพเจ‚ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹