เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

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

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

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

เจฒเฉ‡เจ– เจŸเฉ‚เจฒเจธ เจฌเจพเจฐเฉ‡ เจšเจฐเจšเจพ เจ•เจฐเฉ‡เจ—เจพ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ:
Hugo, qbec, เจ•เจจเฉ€เจ•เฉ‹, git-เจ•เฉเจฐเจฟเจชเจŸ ะธ เจ—เจฟเฉฑเจŸเจฒเจพเจฌ เจธเฉ€.เจ†เจˆ. เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉ€ เจธเจฟเจฐเจœเจฃเจพ เจฆเฉ‡ เจจเจพเจฒ.

เจธเจฎเจ—เจฐเฉ€

  1. เจนเจฟเจŠเจ—เฉ‹ เจจเฉ‚เฉฐ เจฎเจฟเจฒเฉ‹
  2. เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจคเจฟเจ†เจฐ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ
  3. เจ•เจจเจฟเจ•เฉ‹ เจœเจพเจฃเจจเจพ
  4. qbec เจจเฉ‚เฉฐ เจœเจพเจฃเจจเจพ
  5. เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ-เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเจฐ เจจเจพเจฒ เจ—เจฟเจŸเจฒเจฌ-เจฐเจจเจฐ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ
  6. qbec เจฆเฉ‡ เจจเจพเจฒ เจนเฉˆเจฒเจฎ เจšเจพเจฐเจŸ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจจเจพ
  7. เจ—เจฟเฉฑเจŸ-เจ•เฉเจฐเจฟเจชเจŸ เจชเฉ‡เจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ
  8. เจ‡เฉฑเจ• เจŸเฉ‚เจฒเจฌเจพเจ•เจธ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃเจพ
  9. เจธเจพเจกเฉ€ เจชเจนเจฟเจฒเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจ…เจคเฉ‡ เจŸเฉˆเจ— เจฆเฉเจ†เจฐเจพ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€
  10. เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจ†เจŸเฉ‹เจฎเฉ‡เจธเจผเจจ
  11. เจ•เจฒเจพเจคเจฎเจ• เจšเฉ€เจœเจผเจพเจ‚ เจ…เจคเฉ‡ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจœเจฆเฉ‹เจ‚ เจฎเจพเจธเจŸเจฐ เจตเฉฑเจฒ เจงเฉฑเจ•เจฆเฉ€ เจนเฉˆ
  12. เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจตเจพเจคเจพเจตเจฐเจฃ
  13. เจเจชเจพเจ‚ เจฆเฉ€ เจธเจฎเฉ€เจ–เจฟเจ† เจ•เจฐเฉ‹

1. เจนเจฟเจŠเจ—เฉ‹ เจจเฉ‚เฉฐ เจœเจพเจฃเจจเจพ

เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจนเจฟเจŠเจ—เฉ‹ 'เจคเฉ‡ เจฌเจฃเฉ€ เจ‡เฉฑเจ• เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจชเฉเจฐเจ•เจพเจธเจผเจจ เจธเจพเจˆเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจนเจฟเจŠเจ—เฉ‹ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ เจธเจฎเฉฑเจ—เจฐเฉ€ เจœเจจเจฐเฉ‡เจŸเจฐ เจนเฉˆเฅค

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

เจญเจพเจต, เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจขเจพเจ‚เจšเจพ เจ…เจคเฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€เจ†เจ‚ HTML เจซเจพเจˆเจฒเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจฎเจฟเจฒเฉ‡เจ—เจพ, เจœเจฟเจธ เจจเฉ‚เฉฐ เจคเฉเจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจธเจคเฉ€ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— 'เจคเฉ‡ เจ…เจชเจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจตเฉˆเจฌเจธเจพเจˆเจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจคเฉเจธเฉ€เจ‚ เจนเจฟเจŠเจ—เฉ‹ เจจเฉ‚เฉฐ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ…เจœเจผเจฎเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจธเจพเจˆเจŸ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค:

hugo new site docs.example.org

เจ…เจคเฉ‡ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€:

cd docs.example.org
git init

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

เจฅเฉ€เจฎ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจพเจ‚เจ—เฉ‡ เจธเจฟเฉฑเจ–เฉ‹, เจœเฉ‹ เจ•เจฟ, เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจฆเจธเจคเจพเจตเฉ‡เจœเจผเฉ€ เจธเจพเจˆเจŸ เจฒเจˆ เจฌเจฟเจฒเจ•เฉเจฒ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเฉˆ.

เจฎเฉˆเจ‚ เจ‡เจธ เจคเฉฑเจฅ เจตเฉฑเจฒ เจตเจฟเจธเจผเฉ‡เจธเจผ เจงเจฟเจ†เจจ เจฆเฉ‡เจฃเจพ เจšเจพเจนเจพเจ‚เจ—เจพ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฅเฉ€เจฎ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจจเจนเฉ€เจ‚ เจนเฉˆ; เจ‡เจธ เจฆเฉ€ เจฌเจœเจพเจ, เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจฐเจค เจ•เฉ‡ เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ git เจธเจฌเจฎเฉ‹เจกเจฟเจŠเจฒ:

git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn

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

เจ†เจ‰ เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเฉ€เจ config.toml:

baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"

เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เจธ เจชเฉœเจพเจ… 'เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

hugo server

เจ…เจคเฉ‡ เจชเจคเฉ‡ 'เจคเฉ‡ http://localhost:1313/ เจธเจพเจกเฉ€ เจจเจตเฉ€เจ‚ เจฌเจฃเจพเจˆ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‹, เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจฌเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจ–เฉเฉฑเจฒเฉเจนเฉ‡ เจชเฉฐเจจเฉ‡ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ•!

เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจตเจฐ เจชเฉ‡เจœ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ content/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

เจจเจตเฉ‡เจ‚ เจฌเจฃเฉ‡ เจชเฉฐเจจเฉ‡ เจฆเจพ เจธเจ•เจฐเฉ€เจจเจธเจผเจพเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจ‡เฉฑเจ• เจธเจพเจˆเจŸ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจฌเฉฑเจธ เจšเจฒเจพเจ“:

hugo

เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจœเจจเจคเจ•/ เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ€ เจตเฉˆเจฌเจธเจพเจˆเจŸ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค
เจนเจพเจ‚, เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ, เจ†เจ“ เจ‡เจธ เจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ€เจ .เจ—เจฟเฉฑเจŸเจพเจˆเจจเฉŒเจฐ:

echo /public > .gitignore

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .
git commit -m "New site created"

2. เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจคเจฟเจ†เจฐ เจ•เจฐเจจเจพ

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

.
โ”œโ”€โ”€ deploy
โ”‚   โ”œโ”€โ”€ app1
โ”‚   โ””โ”€โ”€ app2
โ””โ”€โ”€ dockerfiles
    โ”œโ”€โ”€ image1
    โ””โ”€โ”€ image2

  • dockerfiles/ - เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒเจพเจ‚ เจจเจพเจฒ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจนเจฐ เจšเฉ€เจœเจผ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค
  • เจคเฉˆเจจเจพเจค/ โ€” เจธเจพเจกเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ 'เจคเฉ‡ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฒเจˆ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจ…เจธเฉ€เจ‚ เจฎเจพเจฐเจ— เจฆเฉ‡ เจจเจพเจฒ เจ†เจชเจฃเฉ€ เจชเจนเจฟเจฒเฉ€ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ dockerfiles/website/dockerfile

FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src

FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฆเฉ‹ เจนเจจ เจคเฉ‹เจ‚, เจ‡เจธ เจฎเฉŒเจ•เฉ‡ เจจเฉ‚เฉฐ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจฌเจนเฉ-เจชเฉœเจพเจ… เจฆเจพ เจจเจฟเจฐเจฎเจพเจฃ เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เฉฐเจคเจฟเจฎ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจคเฉ‹เจ‚ เจฌเฉ‡เจฒเฉ‹เฉœเฉ€ เจนเจฐ เจšเฉ€เจœเจผ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค
เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจ…เฉฐเจคเจฟเจฎ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซ เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ darkhttpd (เจนเจฒเจ•เฉ‡ HTTP เจธเจฐเจตเจฐ) เจ…เจคเฉ‡ เจœเจจเจคเจ•/ โ€” เจธเจพเจกเฉ€ เจธเจฅเจฟเจฐ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€เฅค

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add dockerfiles/website
git commit -m "Add Dockerfile for website"

3. เจ•เจจเฉ€เจ•เฉ‹ เจจเฉ‚เฉฐ เจœเจพเจฃเจจเจพ

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

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

docker run -ti --rm 
  -v $PWD:/workspace 
  -v ~/.docker/config.json:/kaniko/.docker/config.json:ro 
  gcr.io/kaniko-project/executor:v0.15.0 
  --cache 
  --dockerfile=dockerfiles/website/Dockerfile 
  --destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1

เจ•เจฟเฉฑเจฅเฉ‡ registry.gitlab.com/kvaps/docs.example.org/website - เจคเฉเจนเจพเจกเฉ‡ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจฆเจพ เจจเจพเจฎ; เจฌเจฃเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ‡เจน เจ†เจชเจฃเฉ‡ เจ†เจช เจกเฉŒเจ•เจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ --เจ•เฉˆเจธเจผ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฒเฉ‡เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ; เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ registry.gitlab.com/kvaps/docs.example.org/website/cache, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจฎเจพเจฐเจ— เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ --cache-repo.

เจกเฉŒเจ•เจฐ-เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

4. qbec เจจเฉ‚เฉฐ เจœเจพเจฃเจจเจพ

Qbec เจ‡เฉฑเจ• เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจŸเฉ‚เจฒ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค Jsonnet เจจเฉ‚เฉฐ เจฎเฉเฉฑเจ– เจธเฉฐเจŸเฉˆเจ•เจธ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฃเจพ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจˆ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจ…เฉฐเจคเจฐเจพเจ‚ เจฆเฉ‡ เจตเจฐเจฃเจจ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจฐเจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ•เฉ‹เจก เจฆเฉเจนเจฐเจพเจ“ เจจเฉ‚เฉฐ เจฒเจ—เจญเจ— เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ–เจคเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจ‰เจนเจจเจพเจ‚ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเฉฑเจš เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจตเจพเจฒเฉ‡ เจ•เจˆ เจ•เจฒเฉฑเจธเจŸเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ Git เจตเจฟเฉฑเจš เจ˜เฉ‹เจธเจผเจฃเจพเจคเจฎเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฐเจฃเจจ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹เฅค

Qbec เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉˆเจฒเจฎ เจšเจพเจฐเจŸ เจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจ•เฉ‡ เจฐเฉˆเจ‚เจกเจฐ เจ•เจฐเจจ เจฆเฉ€ เจตเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฏเจฎเจค เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจพเจ‚เจ— เจนเฉ€ เจธเฉฐเจšเจพเจฒเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจคเฉเจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ 'เจคเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจชเจฐเจฟเจตเจฐเจคเจจ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ…เจคเฉ‡ เจ‡เจน, เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจคเฉ‹เจ‚ เจ›เฉเจŸเจ•เจพเจฐเจพ เจชเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจšเจพเจฐเจŸ เจฎเจฟเจŠเจœเจผเฉ€เจ…เจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค เจญเจพเจต, เจคเฉเจธเฉ€เจ‚ เจšเจพเจฐเจŸ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ‡ git เจคเฉ‹เจ‚ เจธเจŸเฉ‹เจฐ เจ…เจคเฉ‡ เจฐเฉˆเจ‚เจกเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจฟเฉฑเจฅเฉ‡ เจ‰เจน เจธเจฌเฉฐเจงเจค เจนเจจเฅค

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ•เจฟเจนเจพ เจธเฉ€, เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจคเฉˆเจจเจพเจค/:

mkdir deploy
cd deploy

เจ†เจ‰ เจธเจพเจกเฉ€ เจชเจนเจฟเจฒเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ:

qbec init website
cd website

เจนเฉเจฃ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจฌเจฃเจคเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ:

.
โ”œโ”€โ”€ components
โ”œโ”€โ”€ environments
โ”‚   โ”œโ”€โ”€ base.libsonnet
โ”‚   โ””โ”€โ”€ default.libsonnet
โ”œโ”€โ”€ params.libsonnet
โ””โ”€โ”€ qbec.yaml

เจ†เจ‰ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ qbec.yaml:

apiVersion: qbec.io/v1alpha1
kind: App
metadata:
  name: website
spec:
  environments:
    default:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443
  vars: {}

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚ spec.environments, qbec เจจเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจพเจกเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจกเจฟเจซเฉŒเจฒเจŸ เจตเจพเจคเจพเจตเจฐเจฃ เจฌเจฃเจพเจ‡เจ† เจนเฉˆ เจ…เจคเฉ‡ เจธเจฐเจตเจฐ เจเจกเจฐเฉˆเฉฑเจธ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจธเจพเจกเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจพ kubeconfig เจคเฉ‹เจ‚ เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจฒเจฟเจ† เจนเฉˆเฅค
'เจคเฉ‡ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจฎเฉ‚เจฒ เจตเจพเจคเจพเจตเจฐเจฃ, qbec เจนเจฎเฉ‡เจธเจผเจพ เจจเจฟเจธเจผเจšเจฟเจค เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจ…เจคเฉ‡ เจจเจฟเจธเจผเจšเจฟเจค เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจนเฉ€ เจคเฉˆเจจเจพเจค เจ•เจฐเฉ‡เจ—เจพ, เจฏเจพเจจเฉ€ เจ•เจฟ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉเจฃ เจคเฉˆเจจเจพเจคเฉ€ เจ•เจฐเจจ เจฒเจˆ เจธเฉฐเจฆเจฐเจญเจพเจ‚ เจ…เจคเฉ‡ เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค
เจœเฉ‡เจ•เจฐ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจนเจฎเฉ‡เจธเจผเจพ เจ‡เจธ เจซเจผเจพเจˆเจฒ เจตเจฟเฉฑเจš เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจคเฉเจนเจพเจกเฉ‡ เจธเจพเจฐเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ qbec.yaml, เจ…เจคเฉ‡ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš params.libsonnet, เจœเจฟเฉฑเจฅเฉ‡ เจ‡เจน เจฆเฉฑเจธเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจ•เจฟเฉฑเจฅเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเฉ‡ เจนเจจเฅค

เจ…เฉฑเจ—เฉ‡ เจ…เจธเฉ€เจ‚ เจฆเฉ‹ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚:

  • เจนเจฟเฉฑเจธเฉ‡/ - เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจˆ เจธเจพเจฐเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจ‡เฉฑเจฅเฉ‡ เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡; เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ jsonnet เจ…เจคเฉ‡ เจจเจฟเจฏเจฎเจค yaml เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‹เจตเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ
  • เจตเจพเจคเจพเจตเจฐเจฃ/ โ€” เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจตเจพเจคเจพเจตเจฐเจจ เจฒเจˆ เจธเจพเจฐเฉ‡ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ (เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ) เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฆเฉ‹ เจซเจพเจˆเจฒเจพเจ‚ เจนเจจ:

  • เจตเจพเจคเจพเจตเจฐเจฃ/base.libsonnet - เจ‡เจธ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจฒเจˆ เจธเจพเจ‚เจเฉ‡ เจฎเจพเจชเจฆเฉฐเจก เจธเจผเจพเจฎเจฒ เจนเฉ‹เจฃเจ—เฉ‡
  • เจตเจพเจคเจพเจตเจฐเจฃ/default.libsonnet โ€” เจตเจพเจคเจพเจตเจฐเจจ เจฒเจˆ เจ“เจตเจฐเจฐเจพเจˆเจก เจ•เฉ€เจคเฉ‡ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ เจฎเฉ‚เจฒ

เจšเจฒเฉ‹ เจ–เฉ‹เจฒเฉเจนเฉ€เจ เจตเจพเจคเจพเจตเจฐเจฃ/base.libsonnet เจ…เจคเฉ‡ เจ‰เฉฑเจฅเฉ‡ เจธเจพเจกเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจฒเจˆ เจฎเจพเจชเจฆเฉฐเจก เจœเฉ‹เฉœเฉ‹:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

เจ†เจ‰ เจ†เจชเจฃเจพ เจชเจนเจฟเจฒเจพ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจตเฉ€ เจฌเจฃเจพเจˆเจ components/website.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;

[
  {
    apiVersion: 'apps/v1',
    kind: 'Deployment',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      replicas: params.replicas,
      selector: {
        matchLabels: {
          app: params.name,
        },
      },
      template: {
        metadata: {
          labels: { app: params.name },
        },
        spec: {
          containers: [
            {
              name: 'darkhttpd',
              image: params.image,
              ports: [
                {
                  containerPort: params.containerPort,
                },
              ],
            },
          ],
          nodeSelector: params.nodeSelector,
          tolerations: params.tolerations,
          imagePullSecrets: [{ name: 'regsecret' }],
        },
      },
    },
  },
  {
    apiVersion: 'v1',
    kind: 'Service',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      selector: {
        app: params.name,
      },
      ports: [
        {
          port: params.servicePort,
          targetPort: params.containerPort,
        },
      ],
    },
  },
  {
    apiVersion: 'extensions/v1beta1',
    kind: 'Ingress',
    metadata: {
      annotations: {
        'kubernetes.io/ingress.class': params.ingressClass,
      },
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      rules: [
        {
          host: params.domain,
          http: {
            paths: [
              {
                backend: {
                  serviceName: params.name,
                  servicePort: params.servicePort,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

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

เจธเฉฐเจŸเฉˆเจ•เจธ jsonnet เจจเจฟเจฏเจฎเจค json เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉˆ, เจธเจฟเจงเจพเจ‚เจคเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจจเจฟเจฏเจฎเจค json เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจตเฉˆเจง jsonnet เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจชเจนเจฟเจฒเจพเจ‚ เจคเจพเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจ”เจจเจฒเจพเจˆเจจ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจ†เจธเจพเจจ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ yaml2json เจ†เจชเจฃเฉ‡ เจ†เจฎ yaml เจจเฉ‚เฉฐ json เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจฒเจˆ, เจœเจพเจ‚, เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเจนเฉ€เจ‚ เจนเจจ, เจคเจพเจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฏเจฎเจค yaml เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ jsonnet เจฎเฉˆเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจธเฉฐเจชเจพเจฆเจ• เจฒเจˆ เจ‡เฉฑเจ• เจชเจฒเฉฑเจ—เจ‡เจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจœเจผเฉ‹เจฐเจฆเจพเจฐ เจธเจฟเจซเจพเจฐเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚

เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, vim เจฒเจˆ เจ‡เฉฑเจ• เจชเจฒเฉฑเจ—เจ‡เจจ เจนเฉˆ vim-jsonnet, เจœเฉ‹ เจธเจฟเฉฐเจŸเฉˆเจ•เจธ เจนเจพเจˆเจฒเจพเจˆเจŸเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจšเจพเจฒเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ jsonnet fmt เจนเจฐ เจตเจพเจฐ เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจธเฉ‡เจต เจ•เจฐเจฆเฉ‡ เจนเฉ‹ (เจœเจธเฉ‹เจจเฉˆเจŸ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ)เฅค

เจธเจญ เจ•เฉเจ เจคเจฟเจ†เจฐ เจนเฉˆ, เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

เจ‡เจน เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจ•เฉ€ เจฎเจฟเจฒเจฟเจ†, เจšเจฒเฉ‹:

qbec show default

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

เจฌเจนเฉเจค เจตเจงเฉ€เจ†, เจนเฉเจฃ เจฒเจพเจ—เฉ‚ เจ•เจฐเฉ‹:

qbec apply default

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

เจธเจพเจกเฉ€ เจ…เจฐเจœเจผเฉ€ เจคเจฟเจ†เจฐ เจนเฉˆ เจ…เจคเฉ‡ เจคเฉˆเจจเจพเจค เจนเฉˆ!

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจนเจฎเฉ‡เจธเจผเจพ เจ‡เจน เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

qbec diff default

เจ‡เจน เจตเฉ‡เจ–เจฃ เจฒเจˆ เจ•เจฟ เจ‡เจน เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจชเฉเจฐเจญเจพเจตเจค เจ•เจฐเจจเจ—เฉ€เจ†เจ‚

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

cd ../..
git add deploy/website
git commit -m "Add deploy for website"

5. เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ-เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเจฐ เจจเจพเจฒ เจ—เจฟเจŸเจฒเฉˆเจฌ-เจฐเจจเจฐ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจเจพ

เจนเจพเจฒ เจนเฉ€ เจคเฉฑเจ• เจฎเฉˆเจ‚ เจธเจฟเจฐเจซ เจจเจฟเจฏเจฎเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฐเจคเจฟเจ† gitlab-เจฆเฉŒเฉœเจพเจ• เจธเจผเฉˆเฉฑเจฒ เจœเจพเจ‚ เจกเฉŒเจ•เจฐ-เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเจฐ เจจเจพเจฒ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจคเจฟเจ†เจฐ เจฎเจธเจผเฉ€เจจ (LXC เจ•เฉฐเจŸเฉ‡เจจเจฐ) 'เจคเฉ‡เฅค เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš, เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจพเจกเฉ€ เจ—เจฟเจŸเจฒเฉˆเจฌ เจตเจฟเฉฑเจš เจตเจฟเจธเจผเจต เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจˆ เจ…เจœเจฟเจนเฉ‡ เจฆเฉŒเฉœเจพเจ• เจธเจจเฅค เจ‰เจนเจจเจพเจ‚ เจจเฉ‡ เจธเจพเจฐเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉ€เจคเฉ‡.

เจชเจฐ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจญเจฟเจ†เจธ เจจเฉ‡ เจฆเจฟเจ–เจพเจ‡เจ† เจนเฉˆ, เจ‡เจน เจตเจฟเจ•เจฒเจช เจธเจญ เจคเฉ‹เจ‚ เจ†เจฆเจฐเจธเจผ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจตเจฟเจนเจพเจฐเจ•เจคเจพ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ‹เจตเจพเจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš. เจนเจฐเฉ‡เจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฒเจˆ, เจœเจพเจ‚ เจ‡เฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ เจนเจฐเฉ‡เจ• เจตเจพเจคเจพเจตเจฐเจฃ เจฒเจˆ เจตเฉฑเจ–เจฐเฉ‡ เจฆเฉŒเฉœเจพเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจพ เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจ…เจคเฉ‡ เจตเจฟเจšเจพเจฐเจงเจพเจฐเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจธเจนเฉ€ เจนเฉˆเฅค

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

เจ—เจฟเจŸเจฒเฉˆเจฌ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเฉ‚เฉฐ เจ—เจฟเจŸเจฒเฉˆเจฌ-เจฐเจจเจฐ เจจเฉ‚เฉฐ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ-เจฌเจฃเจพเจ‡เจ† เจนเฉˆเจฒเจฎ เจšเจพเจฐเจŸ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจญ เจ•เฉเจ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจฐเจœเจฟเจธเจŸเจฐเฉ‡เจธเจผเจจ เจŸเฉ‹เจ•เจจ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฒเจˆ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ -> CI / CD -> เจฆเฉŒเฉœเจพเจ• เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจนเฉˆเจฒเจฎ เจจเฉ‚เฉฐ เจญเฉ‡เจœเฉ‹:

helm repo add gitlab https://charts.gitlab.io

helm install gitlab-runner 
  --set gitlabUrl=https://gitlab.com 
  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc 
  --set rbac.create=true 
  gitlab/gitlab-runner

เจ•เจฟเฉฑเจฅเฉ‡:

  • https://gitlab.com - เจคเฉเจนเจพเจกเฉ‡ เจ—เจฟเจŸเจฒเจฌ เจธเจฐเจตเจฐ เจฆเจพ เจชเจคเจพเฅค
  • yga8y-jdCusVDn_t4Wxc - เจคเฉเจนเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฒเจˆ เจฐเจœเจฟเจธเจŸเฉเจฐเฉ‡เจธเจผเจจ เจŸเฉ‹เจ•เจจเฅค
  • rbac.create=true โ€” เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ-เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจพเจกเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจชเฉŒเจก เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃ เจฒเจˆ เจฆเฉŒเฉœเจพเจ• เจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

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

เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจ—เจ เจฆเฉŒเฉœเจพเจ• เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจ•เฉ€ เจ‡เจน เจธเจงเจพเจฐเจจ เจนเฉˆ? - เจนเจพเจ‚, เจ‡เจน เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉˆ! เจฆเฉŒเฉœเจพเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจฎเฉเจธเจผเจ•เจฒ เจจเจนเฉ€เจ‚, เจนเฉเจฃ เจคเฉ‹เจ‚ เจฆเฉŒเฉœเจพเจ• เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจฌเจฃเจพเจ เจ…เจคเฉ‡ เจจเจธเจผเจŸ เจนเฉ‹ เจœเจพเจฃเจ—เฉ‡เฅค

6. QBEC เจจเจพเจฒ เจนเฉˆเจฒเจฎ เจšเจพเจฐเจŸ เจฒเจ—เจพเจ“

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจตเจฟเจšเจพเจฐ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ gitlab-เจฆเฉŒเฉœเจพเจ• เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจนเฉˆ, เจ‡เจน เจธเจพเจกเฉ€ Git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เจธเจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆ.

เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจœเฉ‹เจ‚ เจตเจฐเจฃเจจ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจตเฉˆเจฌเจธเจพเจˆเจŸ, เจชเจฐ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจตเฉฑเจ–-เจตเฉฑเจ– เจ•เจพเจชเฉ€เจ†เจ‚ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ เจฌเจฃเจพ เจฐเจนเฉ‡ เจนเจพเจ‚ เจตเฉˆเจฌเจธเจพเจˆเจŸ เจฌเจนเฉเจค เจ…เจ•เจธเจฐ, เจ‰เจฒเจŸ gitlab-เจฆเฉŒเฉœเจพเจ•, เจœเฉ‹ เจ•เจฟ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจชเฉเจฐเจคเฉ€ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจตเจพเจฐ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจคเจพเจ‚ เจ†เจ“ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

เจ‡เจธ เจตเจพเจฐ เจ…เจธเฉ€เจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‡เจ•เจพเจˆเจ†เจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจนเฉฑเจฅเฉ€เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจชเจฐ เจ‡เฉฑเจ• เจคเจฟเจ†เจฐ เจนเฉˆเจฒเจฎ เจšเจพเจฐเจŸ เจฒเจตเจพเจ‚เจ—เฉ‡เฅค Qbec เจฆเฉ‡ เจซเจพเจ‡เจฆเจฟเจ†เจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉˆเจฒเจฎ เจšเจพเจฐเจŸ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ‡ เจ‡เฉฑเจ• Git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจฐเฉˆเจ‚เจกเจฐ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจนเฉˆเฅค

เจ†เจ‰ เจ‡เจธเจจเฉ‚เฉฐ git เจธเจฌเจฎเฉ‹เจกเจฟเจŠเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเฉ€เจ:

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner

เจนเฉเจฃ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเจ•เจฐเฉ‡เจคเจพ/เจ—เจฟเจŸเจฒเฉˆเจฌ-เจฐเจจเจฐ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ gitlab-เจฐเจจเจฐ เจฒเจˆ เจ‡เฉฑเจ• เจšเจพเจฐเจŸ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจนเฉˆเฅค

เจ‡เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚, เจคเฉเจธเฉ€เจ‚ เจนเฉ‹เจฐ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ…เจงเจฟเจ•เจพเจฐเจค เจšเจพเจฐเจŸ เจจเจพเจฒ เจชเฉ‚เจฐเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ https://github.com/helm/charts

เจ†เจ‰ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเฉ€เจ components/gitlab-runner.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;

std.native('expandHelmTemplate')(
  '../vendor/gitlab-runner',
  params.values,
  {
    nameTemplate: params.name,
    namespace: env.namespace,
    thisFile: std.thisFile,
    verbose: true,
  }
)

เจจเฉ‚เฉฐ เจชเจนเจฟเจฒเฉ€ เจฆเจฒเฉ€เจฒ expandHelmTemplate เจ…เจธเฉ€เจ‚ เจšเจพเจฐเจŸ เจฆเจพ เจฎเจพเจฐเจ— เจชเจพเจธ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจซเจฟเจฐ params.values, เจœเจฟเจธ เจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจตเจพเจคเจพเจตเจฐเจฃ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚, เจซเจฟเจฐ เจ†เจฌเจœเฉˆเจ•เจŸ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆ

  • เจจเจพเจฎ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ - เจฐเจฟเจฒเฉ€เจœเจผ เจฆเจพ เจธเจฟเจฐเจฒเฉ‡เจ–
  • เจจเจพเจฎ เจœเจ—เฉเจนเจพ โ€” เจจเฉ‡เจฎเจธเจชเฉ‡เจธ เจจเฉ‚เฉฐ เจนเฉˆเจฒเจฎ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ†
  • เจ‡เจน เจซเจพเจˆเจฒ โ€” เจ‡เฉฑเจ• เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจœเฉ‹ เจฎเฉŒเจœเฉ‚เจฆเจพ เจซเจพเจˆเจฒ เจฆเจพ เจฎเจพเจฐเจ— เจชเจพเจธ เจ•เจฐเจฆเจพ เจนเฉˆ
  • เจตเจฐเจฌเฉ‹เจœ - เจนเฉเจ•เจฎ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจนเฉˆเจฒเจฎ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจšเจพเจฐเจŸ เจจเฉ‚เฉฐ เจชเฉ‡เจธเจผ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจฆเจฒเฉ€เจฒเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ

เจ†เจ‰ เจนเฉเจฃ เจธเจพเจกเฉ‡ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจฒเจˆ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเฉ€เจ เจตเจพเจคเจพเจตเจฐเจฃ/base.libsonnet:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
      },
    },
  },
}

เจงเจฟเจ†เจจ เจฆเฉ‡เจตเฉ‹ runnerRegistrationToken เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฌเจพเจนเจฐเฉ€ เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚ secrets/base.libsonnet, เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจฌเจฃเจพเจˆเจ:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

เจšเจฒเฉ‹ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ เจ•เจฟ เจ•เฉ€ เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ:

qbec show default

เจœเฉ‡เจ•เจฐ เจธเจญ เจ•เฉเจ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจนเฉˆ, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจนเฉ‡เจฒเจฎ เจฆเฉเจ†เจฐเจพ เจธเจพเจกเฉ€ เจชเจฟเจ›เจฒเฉ€ เจคเฉˆเจจเจพเจค เจฐเฉ€เจฒเฉ€เจœเจผ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

helm uninstall gitlab-runner

เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ‰เจธเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจฒเจพเจ—เฉ‚ เจ•เจฐเฉ‹, เจชเจฐ qbec เจฆเฉเจ†เจฐเจพ:

qbec apply default

7. เจ—เจฟเฉฑเจŸ-เจ•เฉเจฐเจฟเจชเจŸ เจจเจพเจฒ เจœเจพเจฃ-เจชเจ›เจพเจฃ

เจ—เจฟเจŸ-เจ•เฉเจฐเจฟเจชเจŸ เจ‡เฉฑเจ• เจŸเฉ‚เจฒ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจคเฉเจนเจพเจกเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฒเจˆ เจชเจพเจฐเจฆเจฐเจธเจผเฉ€ เจเจจเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจธเฉˆเจŸ เจ…เจช เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจธเจฎเฉ‡เจ‚, gitlab-runner เจฒเจˆ เจธเจพเจกเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฌเจฃเจคเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ:

.
โ”œโ”€โ”€ components
โ”‚   โ”œโ”€โ”€ gitlab-runner.jsonnet
โ”œโ”€โ”€ environments
โ”‚   โ”œโ”€โ”€ base.libsonnet
โ”‚   โ””โ”€โ”€ default.libsonnet
โ”œโ”€โ”€ params.libsonnet
โ”œโ”€โ”€ qbec.yaml
โ”œโ”€โ”€ secrets
โ”‚   โ””โ”€โ”€ base.libsonnet
โ””โ”€โ”€ vendor
    โ””โ”€โ”€ gitlab-runner (submodule)

เจชเจฐ Git เจตเจฟเฉฑเจš เจญเฉ‡เจฆ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจเจพ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ•เฉ€ เจ‡เจน เจนเฉˆ? เจ‡เจธ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจเจจเจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เฉฑเจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉ€ เจ–เจผเจพเจคเจฐ, เจ‡เจน เจนเจฎเฉ‡เจธเจผเจพ เจ…เจฐเจฅ เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเจพเฅค เจจเฉ‚เฉฐ เจญเฉ‡เจฆ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ qbec เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ‡ CI เจธเจฟเจธเจŸเจฎ เจฆเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉเจ†เจฐเจพเฅค
เจชเจฐ เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจฅเฉ‡ เจนเฉ‹เจฐ เจตเฉ€ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจนเจจ เจœเจฟเจนเจจเจพเจ‚ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจญเฉ‡เจฆ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ; เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเฉ‡ เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจธเฉฐเจฆ เจฌเจพเจฐเฉ‡ เจฆเฉฑเจธเจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเจพเจ‚เจ—เจพ git-เจ•เฉเจฐเจฟเจชเจŸ.

git-เจ•เฉเจฐเจฟเจชเจŸ เจ‡เจน เจ‡เจธ เจตเจฟเฉฑเจš เจตเฉ€ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉˆ เจ•เจฟ เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจญเฉ‡เจฆ เจฆเฉ‡ เจชเฉ‚เจฐเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจ•เจฐเจจ, เจฎเจฟเจฒเจพเจ‰เจฃ เจ…เจคเฉ‡ เจตเจฟเจตเจพเจฆเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ—เจฟเฉฑเจŸ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจฆเฉ‡ เจฌเจพเจ…เจฆ เจชเจนเจฟเจฒเฉ€ เจšเฉ€เจœเจผ git-เจ•เฉเจฐเจฟเจชเจŸ เจธเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฒเจˆ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

git crypt init

เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• PGP เจ•เฉเฉฐเจœเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจคเฉเจฐเฉฐเจค เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจ‡เจธ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฒเจˆ เจ‡เฉฑเจ• เจธเจนเจฟเจฏเฉ‹เจ—เฉ€ เจตเจœเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

git-crypt add-gpg-user [email protected]

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจนเจฎเฉ‡เจธเจผเจพ เจ†เจชเจฃเฉ€ เจจเจฟเฉฑเจœเฉ€ เจ•เฉเฉฐเจœเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจธ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจกเฉ€เจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ PGP เจ•เฉเฉฐเจœเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‚เจœเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ•เฉเฉฐเจœเฉ€ เจจเฉ‚เฉฐ เจจเจฟเจฐเจฏเจพเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

git crypt export-key /path/to/keyfile

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจœเจฟเจธ เจ•เจฟเจธเฉ‡ เจจเฉ‡ เจตเฉ€ เจฌเจฐเจพเจฎเจฆ เจ•เฉ€เจคเจพ เจนเฉˆ keyfile เจคเฉเจนเจพเจกเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจกเฉ€เจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจ‡เจน เจธเจพเจกเจพ เจชเจนเจฟเจฒเจพ เจฐเจพเจœเจผ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆ.
เจฎเฉˆเจจเฉ‚เฉฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจฃ เจฆเจฟเจ“ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ…เจœเฉ‡ เจตเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจนเจพเจ‚ deploy/gitlab-runner/, เจœเจฟเฉฑเจฅเฉ‡ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจนเฉˆ เจญเฉ‡เจฆ/, เจ†เจ“ เจ‡เจธ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจเจจเจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเฉ€เจ, เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ เจญเฉ‡เจฆ/.gitattributes เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจฎเฉฑเจ—เจฐเฉ€ เจคเฉ‹เจ‚ เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจพเจธเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ * เจฆเฉเจ†เจฐเจพ เจšเจฒเจพเจ‡เจ† เจœเจพเจตเฉ‡เจ—เจพ git-เจ•เฉเจฐเจฟเจชเจŸ, เจธเจญ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ .gitattributes

เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจšเจฒเจพ เจ•เฉ‡ เจœเจพเจ‚เจš เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

git crypt status -e

เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจœเจฟเจจเฉเจนเจพเจ‚ เจฒเจˆ เจเจจเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจธเจฎเจฐเฉฑเจฅ เจนเฉˆ

เจฌเจธ, เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจ†เจชเจฃเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"

เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจฌเจฒเฉŒเจ• เจ•เจฐเจจ เจฒเจˆ, เจฌเฉฑเจธ เจšเจฒเจพเจ“:

git crypt lock

เจ…เจคเฉ‡ เจคเฉเจฐเฉฐเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจเจจเจ•เฉเจฐเจฟเจชเจŸเจก เจซเจพเจˆเจฒเจพเจ‚ เจฌเจพเจˆเจจเจฐเฉ€ เจšเฉ€เจœเจผ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจœเจพเจฃเจ—เฉ€เจ†เจ‚, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจเจพ เจ…เจธเฉฐเจญเจต เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ.
เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจกเฉ€เจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเจจ เจฒเจˆ, เจšเจฒเจพเจ“:

git crypt unlock

8. เจ‡เฉฑเจ• เจŸเฉ‚เจฒเจฌเจพเจ•เจธ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ“

เจ‡เฉฑเจ• เจŸเฉ‚เจฒเจฌเจพเจ•เจธ เจšเจฟเฉฑเจคเจฐ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ‡เจน Gitlab เจฆเฉŒเฉœเจพเจ• เจฆเฉเจ†เจฐเจพ เจ†เจฎ เจคเฉˆเจจเจพเจคเฉ€ เจ•เจพเจฐเจœเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจตเฉ‡เจ—เจพเฅค

เจ‡เฉฑเจฅเฉ‡ เจธเจญ เจ•เฉเจ เจธเจงเจพเจฐเจจ เจนเฉˆ, เจ†เจ“ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจฌเจฃเจพเจ“ dockerfiles/เจŸเฉ‚เจฒเจฌเจพเจ•เจธ/Dockerfile เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ:

FROM alpine:3.11

RUN apk add --no-cache git git-crypt

RUN QBEC_VER=0.10.3 
 && wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz 
     | tar -C /tmp -xzf - 
 && mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/

RUN KUBECTL_VER=1.17.0 
 && wget -O /usr/local/bin/kubectl 
      https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl 
 && chmod +x /usr/local/bin/kubectl

RUN HELM_VER=3.0.2 
 && wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz 
     | tar -C /tmp -zxf - 
 && mv /tmp/linux-amd64/helm /usr/local/bin/helm

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เจธ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเฉ€เจ†เจ‚ เจธเจจเฅค เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจฅเฉ‡ เจ‡เจธเจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• kubectl, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจธเฉˆเจŸเจ…เจช เจชเฉœเจพเจ… เจฆเฉŒเจฐเจพเจจ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจ–เฉ‡เจกเจฃเจพ เจšเจพเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

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

เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ†เจ“ gitlab-runner เจจเจพเจฒ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ 'เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ:

cd deploy/gitlab-runner

เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจญเจพเจ— เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ components/rbac.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;

[
  {
    apiVersion: 'v1',
    kind: 'ServiceAccount',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'Role',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    rules: [
      {
        apiGroups: [
          '*',
        ],
        resources: [
          '*',
        ],
        verbs: [
          '*',
        ],
      },
    ],
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'RoleBinding',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    roleRef: {
      apiGroup: 'rbac.authorization.k8s.io',
      kind: 'Role',
      name: params.name,
    },
    subjects: [
      {
        kind: 'ServiceAccount',
        name: params.name,
        namespace: env.namespace,
      },
    ],
  },
]

เจ…เจธเฉ€เจ‚ เจตเจฟเฉฑเจš เจจเจตเฉ‡เจ‚ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจตเฉ€ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ/base.libsonnet, เจœเฉ‹ เจนเฉเจฃ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
        runners: {
          serviceAccountName: $.components.rbac.name,
          image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
        },
      },
    },
    rbac: {
      name: 'gitlab-runner-deploy',
    },
  },
}

เจงเจฟเจ†เจจ เจฆเฉ‡เจตเฉ‹ $.components.rbac.name เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจจเจพเจฎ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจฒเจˆ rbac

เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจ•เฉ€ เจฌเจฆเจฒเจฟเจ† เจนเฉˆ:

qbec diff default

เจ…เจคเฉ‡ เจธเจพเจกเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ 'เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเฉ‹:

qbec apply default

เจจเจพเจฒ เจนเฉ€, เจธเจพเจกเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ—เจฟเฉฑเจŸ เจตเจฟเฉฑเจš เจ•เจฐเจจเจพ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"

9. เจธเจพเจกเฉ€ เจชเจนเจฟเจฒเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจ…เจคเฉ‡ เจŸเฉˆเจ— เจฆเฉเจ†เจฐเจพ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจœเฉœเฉเจน 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ .gitlab-ci.yml เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ:

.build_docker_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug-v0.15.0
    entrypoint: [""]
  before_script:
    - echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json

build_toolbox:
  extends: .build_docker_image
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
  only:
    refs:
      - tags

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
  only:
    refs:
      - tags

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

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .gitlab-ci.yml
git commit -m "Automate docker build"

เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจฐเฉ‚เจช เจจเจพเจฒ เจ‡เฉฑเจ• เจธเฉฐเจธเจ•เจฐเจฃ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ v0.0.1 เจ…เจคเฉ‡ เจŸเฉˆเจ— เจœเฉ‹เฉœเฉ‹:

git tag v0.0.1

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

เจšเจฒเฉ‹ เจ•เจฐเฉ€เจ git push --tags, เจ…เจคเฉ‡ เจ†เจ“ เจธเจพเจกเฉ€ เจชเจนเจฟเจฒเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:

เจชเจนเจฟเจฒเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

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

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

10. เจคเฉˆเจจเจพเจคเฉ€ เจฆเจพ เจธเจตเฉˆเจšเจพเจฒเจจ

Gitlab-เจฐเจจเจฐ เจจเฉ‚เฉฐ เจธเจพเจกเฉ‡ เจฐเจพเจœเจผ เจจเฉ‚เฉฐ เจกเฉ€เจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเจจ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจ•เฉเฉฐเจœเฉ€ เจจเฉ‚เฉฐ เจจเจฟเจฐเจฏเจพเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจธเจพเจกเฉ‡ CI เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€:

git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo

เจ…เจธเฉ€เจ‚ เจจเจคเฉ€เจœเฉ‡ เจตเจพเจฒเฉ€ เจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจ—เจฟเจŸเจฒเฉˆเจฌ เจตเจฟเฉฑเจš เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจพเจ‚เจ—เฉ‡; เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ†เจ“ เจธเจพเจกเฉ€เจ†เจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ 'เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ:
เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ -> CI / CD -> เจตเฉ‡เจฐเฉ€เจเจฌเจฒ

เจ…เจคเฉ‡ เจ†เจ“ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฌเจฃเจพเจˆเจ:

เจฆเฉ€ เจ•เจฟเจธเจฎ
เจ•เฉเฉฐเจœเฉ€
เจฎเฉเฉฑเจฒ
เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค
เจจเจ•เจพเจฌเจชเฉ‹เจธเจผ
เจธเจ•เฉ‹เจช

File
GITCRYPT_KEY
<your string>
true (เจธเจฟเจ–เจฒเจพเจˆ เจฆเฉŒเจฐเจพเจจ เจคเฉเจธเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ false)
true
All environments

เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเฉ€เจ .gitlab-ci.yml เจ‡เจธ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจจเจพ:

.deploy_qbec_app:
  stage: deploy
  only:
    refs:
      - master

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes

deploy_website:
  extends: .deploy_qbec_app
  script:
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ qbec เจฒเจˆ เจ•เจˆ เจจเจตเฉ‡เจ‚ เจตเจฟเจ•เจฒเจช เจฏเฉ‹เจ— เจ•เฉ€เจคเฉ‡ เจนเจจ:

  • --เจฐเฉ‚เจŸ เจ•เฉเจ/เจเจช โ€” เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ–เจพเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ
  • --force:k8s-context __incluster__ - เจ‡เจน เจ‡เฉฑเจ• เจœเจพเจฆเฉ‚เจˆ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจนเฉˆ เจœเฉ‹ เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉˆเจจเจพเจคเฉ€ เจ‰เจธเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจœเจฟเจธ เจตเจฟเฉฑเจš gtilab-runner เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆเฅค เจ‡เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจจเจนเฉ€เจ‚ เจคเจพเจ‚ qbec เจคเฉเจนเจพเจกเฉ€ kubeconfig เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจขเฉเจ•เจตเจพเจ‚ Kubernetes เจธเจฐเจตเจฐ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ‡เจ—เจพเฅค
  • --เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹ โ€” qbec เจจเฉ‚เฉฐ เจ‡เฉฐเจคเจœเจผเจพเจฐ เจ•เจฐเจจ เจฒเจˆ เจฎเจœเจผเจฌเฉ‚เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ‡เจน เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจธเจฐเฉ‹เจค เจคเจฟเจ†เจฐ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ•เฉ‡เจตเจฒ เจคเจฆ เจนเฉ€ เจ‡เฉฑเจ• เจธเจซเจฒ เจเจ—เจœเจผเจฟเจŸ-เจ•เฉ‹เจก เจจเจพเจฒ เจฌเจพเจนเจฐ เจจเจฟเจ•เจฒเจฆเฉ‡ เจนเจจเฅค
  • -เจนเจพเจ‚ - เจธเจฟเจฐเจซเจผ เจ‡เฉฐเจŸเจฐเจเจ•เจŸเจฟเจต เจธเจผเฉˆเฉฑเจฒ เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจฆเจพ เจนเฉˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจตเจฟเจธเจผเจตเจพเจธ เจนเฉˆ? เจœเจฆเฉ‹เจ‚ เจคเจพเจ‡เจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .gitlab-ci.yml
git commit -m "Automate deploy"

เจ…เจคเฉ‡ เจฌเจพเจ…เจฆ git เจงเฉฑเจ•เจพ เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ เจธเจพเจกเฉ€เจ†เจ‚ เจ…เจฐเจœเจผเฉ€เจ†เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจคเจพเจ‡เจจเจพเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ:

เจฆเฉ‚เจœเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

11. เจ•เจฒเจพเจคเจฎเจ• เจšเฉ€เจœเจผเจพเจ‚ เจ…เจคเฉ‡ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจœเจฆเฉ‹เจ‚ เจฎเจพเจธเจŸเจฐ เจตเฉฑเจฒ เจงเฉฑเจ•เจฆเฉ‡ เจนเจจ

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

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

เจ†เจ‰ เจ†เจชเจฃเฉ‡ เจตเจฟเฉฑเจš เจ‡เจนเจจเจพเจ‚ เจฆเฉ‹ เจจเฉŒเจ•เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ€เจ .gitlab-ci.yml:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/
  only:
    refs:
      - master
      - tags

deploy_website:
  extends: .deploy_qbec_app
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจงเจพเจ—เจพ เจœเฉ‹เฉœเจฟเจ† เจนเฉˆ เจฎเจพเจธเจŸเจฐ ะบ เจฐเจฟเจซเจœเจผ เจจเฉŒเจ•เจฐเฉ€เจ†เจ‚ เจฒเจˆ build_website เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚ $CI_COMMIT_REF_NAME เจฆเฉ€ เจฌเจœเจพเจ $CI_COMMIT_TAG, เจฏเจพเจจเฉ€, เจ…เจธเฉ€เจ‚ เจ—เจฟเฉฑเจŸ เจตเจฟเฉฑเจš เจŸเฉˆเจ—เจธ เจคเฉ‹เจ‚ เจฎเฉเจ•เจค เจนเฉ‹ เจ—เจ เจนเจพเจ‚ เจ…เจคเฉ‡ เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจ•เจฎเจฟเจŸ เจฌเฉเจฐเจพเจ‚เจš เจฆเฉ‡ เจจเจพเจฎ เจจเจพเจฒ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจชเฉเจธเจผ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจ‡เจน เจŸเฉˆเจ—เจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจตเฉ€ เจ•เฉฐเจฎ เจ•เจฐเฉ‡เจ—เจพ, เจœเฉ‹ เจธเจพเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ-เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ–เจพเจธ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจพเจฒเฉ€ เจธเจพเจˆเจŸ เจฆเฉ‡ เจธเจจเฉˆเจชเจธเจผเจพเจŸ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค

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

เจตเจฟเจ•เจฒเจช โ€”vm:ext-str digest=โ€$DIGESTโ€ qbec เจฒเจˆ - เจคเฉเจนเจพเจจเฉ‚เฉฐ jsonnet เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฌเจพเจนเจฐเฉ€ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจชเจพเจธ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เจธ เจจเฉ‚เฉฐ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจนเจฐเฉ‡เจ• เจฐเฉ€เจฒเฉ€เจœเจผ เจฆเฉ‡ เจจเจพเจฒ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจฎเฉเฉœ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เฅค เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจŸเฉˆเจ— เจจเจพเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจœเฉ‹ เจนเฉเจฃ เจฌเจฆเจฒเจฟเจ† เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจธเฉฐเจธเจ•เจฐเจฃ เจจเจพเจฒ เจฌเฉฐเจจเฉเจนเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจฌเจฆเจฒเจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจŸเจฐเจฟเฉฑเจ—เจฐ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจฅเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจกเจพเจˆเจœเฉˆเจธเจŸ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจฆเฉ€ เจ•เจพเจจเฉ€เจ•เฉ‹ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจฆเฉเจ†เจฐเจพ เจฎเจฆเจฆ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€ (เจตเจฟเจ•เจฒเจช --digest-file)
เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจคเฉˆเจจเจพเจคเฉ€ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจชเฉœเฉเจนเจพเจ‚เจ—เฉ‡เฅค

เจ†เจ‰ เจธเจพเจกเฉ‡ เจฒเจˆ เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ€เจ deploy/website/environments/base.libsonnet เจœเฉ‹ เจนเฉเจฃ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพ:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

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

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .
git commit -m "Configure dynamic build"

เจ…เจธเฉ€เจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจœเจพเจ‚เจš เจ•เจฐเจพเจ‚เจ—เฉ‡ git เจงเฉฑเจ•เจพ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉเจ เจฆเฉ‡เจ–เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ:

เจฎเจพเจธเจŸเจฐ เจฒเจˆ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจธเจฟเจงเจพเจ‚เจค เจตเจฟเฉฑเจš, เจธเจพเจจเฉ‚เฉฐ เจนเจฐ เจ‡เฉฑเจ• เจชเฉเจธเจผ เจฆเฉ‡ เจจเจพเจฒ เจ—เจฟเจŸเจฒเฉˆเจฌ-เจฐเจจเจฐ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจจเจนเฉ€เจ‚ เจนเฉˆ, เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ•, เจฌเฉ‡เจธเจผเจ•, เจ‡เจธเจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเฉฑเจš เจ•เฉเจ เจตเฉ€ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฟเจ† เจนเฉˆ, เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเฉ€เจ .gitlab-ci.yml:

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
  only:
    changes:
      - deploy/gitlab-runner/**/*

เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจตเฉ‡เจ—เจพ deploy/gitlab-runner/ เจ…เจคเฉ‡ เจธเจพเจกเฉ€ เจจเฉŒเจ•เจฐเฉ€ เจจเฉ‚เฉฐ เจ‰เจฆเฉ‹เจ‚ เจนเฉ€ เจšเจพเจฒเฉ‚ เจ•เจฐเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจนเฉ‹เจตเฉ‡

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"

git เจงเฉฑเจ•เจพ, เจ‰เจน เจŸเฉ€เจ•:

เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เฉ€เจคเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเจพ เจธเจ•เจฐเฉ€เจจเจธเจผเจพเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

12. เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจตเจพเจคเจพเจตเจฐเจฃ

เจ‡เจน เจธเจพเจกเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจตเจพเจคเจพเจตเจฐเจฃ เจจเจพเจฒ เจตเจฟเจญเจฟเฉฐเจจ เจฌเจฃเจพเจ‰เจฃ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆเฅค

เจชเจนเจฟเจฒเจพเจ‚, เจ†เจ“ เจจเฉŒเจ•เจฐเฉ€ เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ€เจ build_website เจธเจพเจกเฉ‡ เจตเจฟเฉฑเจš .gitlab-ci.yml, เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃเจพ เจธเจฟเจฐเจซ, เจœเฉ‹ เจ•เจฟ Gitlab เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจผเจพเจ–เจพ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจตเจšเจจเจฌเฉฑเจงเจคเจพ 'เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจšเจพเจฒเฉ‚ เจ•เจฐเจจ เจฒเจˆ เจฎเจœเจฌเฉ‚เจฐ เจ•เจฐเฉ‡เจ—เจพ:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/

เจซเจฟเจฐ เจจเฉŒเจ•เจฐเฉ€ เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹ deploy_website, เจ‰เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจœเฉ‹เฉœเฉ‹ เจตเจพเจคเจพเจตเจฐเจฃ เจจเฉ‚เฉฐ:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

เจ‡เจน Gitlab เจจเฉ‚เฉฐ เจจเฉŒเจ•เจฐเฉ€ เจจเจพเจฒ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจตเฉ‡เจ—เจพ เจชเฉ‡เจธเจผเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจธเจนเฉ€ เจฒเจฟเฉฐเจ• เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเฉ‹เฅค

เจ†เจ“ เจนเฉเจฃ เจฆเฉ‹ เจนเฉ‹เจฐ เจจเฉŒเจ•เจฐเฉ€เจ†เจ‚ เจœเฉ‹เฉœเฉ€เจ:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

deploy_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
    on_stop: stop_review
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  only:
    refs:
    - branches
  except:
    refs:
      - master

stop_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  stage: deploy
  before_script:
    - git clone "$CI_REPOSITORY_URL" master
    - cd master
  script:
    - qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  variables:
    GIT_STRATEGY: none
  only:
    refs:
    - branches
  except:
    refs:
      - master
  when: manual

เจ‰เจน เจฎเจพเจธเจŸเจฐ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจผเจพเจ–เจพ เจตเจฟเฉฑเจš เจชเฉเจธเจผ เจ•เจฐเจจ 'เจคเฉ‡ เจฒเจพเจ‚เจš เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡ เจ…เจคเฉ‡ เจธเจพเจˆเจŸ เจฆเฉ‡ เจชเฉเจฐเฉ€เจตเจฟเจŠ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจจเจ—เฉ‡เฅค

เจ…เจธเฉ€เจ‚ qbec เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจตเจฟเจ•เจฒเจช เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚: --เจเจช-เจŸเฉˆเจ— โ€” เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจคเฉˆเจจเจพเจค เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจŸเฉˆเจ— เจ•เจฐเจจ เจ…เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจ‡เจธ เจŸเฉˆเจ— เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ; เจœเจฆเฉ‹เจ‚ Kubernetes เจตเจฟเฉฑเจš เจธเจฐเฉ‹เจค เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจจเจธเจผเจŸ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡, qbec เจธเจฟเจฐเจซเจผ เจ‰เจนเจจเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเฉ‡เจ—เจพเฅค
เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ…เจธเฉ€เจ‚ เจนเจฐเฉ‡เจ• เจธเจฎเฉ€เจ–เจฟเจ† เจฒเจˆ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจตเจพเจคเจพเจตเจฐเจฃ เจจเจนเฉ€เจ‚ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจธเจฟเจฐเจซเจผ เจ‰เจธเฉ‡ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

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

เจœเฉ‹เฉœเฉ‹ เจธเจฎเฉ€เจ–เจฟเจ† เจตเจฟเฉฑเจš เจตเจพเจคเจพเจตเจฐเจฃ deploy/website/qbec.yaml

spec:
  environments:
    review:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443

เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจ˜เฉ‹เจธเจผเจฃเจพ เจ•เจฐเจพเจ‚เจ—เฉ‡ deploy/website/params.libsonnet:

local env = std.extVar('qbec.io/env');
local paramsMap = {
  _: import './environments/base.libsonnet',
  default: import './environments/default.libsonnet',
  review: import './environments/review.libsonnet',
};

if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile

เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ•เจธเจŸเจฎ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฒเจฟเจ–เฉ‹ deploy/website/environments/review.libsonnet:

// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');

base {
  components+: {
    website+: {
      name: 'example-docs-' + slug,
      domain: subdomain + '.docs.example.org',
    },
  },
}

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

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .
git commit -m "Enable automatic review"

git เจงเฉฑเจ•เจพ, git checkout -b เจŸเฉˆเจธเจŸ, git เจชเฉเจธเจผ เจฎเฉ‚เจฒ เจŸเฉˆเจธเจŸ, เจšเฉˆเจ•:

เจ—เจฟเจŸเจฒเฉˆเจฌ เจตเจฟเฉฑเจš เจฌเจฃเจพเจ เจตเจพเจคเจพเจตเจฐเจจ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ? - เจฌเจนเฉเจค เจตเจงเฉ€เจ†, เจธเจพเจกเฉ€ เจŸเฉˆเจธเจŸ เจธเจผเจพเจ–เจพ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ“: git เจšเฉˆเจ•เจ†เจ‰เจŸ เจฎเจพเจธเจŸเจฐ, git เจชเฉเจธเจผ เจฎเฉ‚เจฒ: เจŸเฉˆเจธเจŸ, เจ…เจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจตเจพเจคเจพเจตเจฐเจฃ เจฎเจฟเจŸเจพเจ‰เจฃ เจฆเฉ€เจ†เจ‚ เจจเฉŒเจ•เจฐเฉ€เจ†เจ‚ เจจเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจคเจฐเฉเฉฑเจŸเฉ€ เจฆเฉ‡ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ เจนเฉˆเฅค

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

13. เจเจชเจธ เจฆเฉ€ เจธเจฎเฉ€เจ–เจฟเจ† เจ•เจฐเฉ‹

เจเจชเจพเจ‚ เจฆเฉ€ เจธเจฎเฉ€เจ–เจฟเจ† เจ•เจฐเฉ‹ เจ‡เจน เจ‡เฉฑเจ• GitLab เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจนเจฐเฉ‡เจ• เจซเจพเจˆเจฒ เจฒเจˆ เจ‡เฉฑเจ• เจฌเจŸเจจ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจคเฉˆเจจเจพเจค เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจตเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เฉ‡เฅค

เจ‡เจนเจจเจพเจ‚ เจฌเจŸเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ .gitlab/route-map.yml เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ‡ เจฎเจพเจฐเจ— เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเฉ‹; เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เจน เจฌเจนเฉเจค เจธเจฐเจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ:

# Indices
- source: /content/(.+?)_index.(md|html)/ 
  public: '1'

# Pages
- source: /content/(.+?).(md|html)/ 
  public: '1/'

เจธเจพเจกเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจญเฉเฉฑเจฒเฉ‹:

git add .gitlab/
git commit -m "Enable review apps"

git เจงเฉฑเจ•เจพ, เจ…เจคเฉ‡ เจœเจพเจ‚เจš เจ•เจฐเฉ‹:

เจธเจฎเฉ€เจ–เจฟเจ† เจเจช เจฌเจŸเจจ เจฆเจพ เจธเจ•เฉเจฐเฉ€เจจเจธเจผเฉŒเจŸ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจ•เฉฐเจฎ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ!

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจฐเฉ‹เจค:

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

เจธเจฐเฉ‹เจค: www.habr.com

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