Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เดนเดพเดฏเต! เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเดพเดฏเดฟ เดจเดฟเดฐเดตเดงเดฟ เดฎเดฟเด•เดšเตเดš เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด…เดŸเตเดคเตเดคเดฟเดŸเต† เดชเตเดฑเดคเตเดคเดฟเดฑเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เด…เดคเดฟเดจเดพเตฝ, เดžเดพเตป GitLab-เดฎเดพเดฏเดฟ เด•เดณเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเตเด•เตพ เดธเดฎเด—เตเดฐเดฎเดพเดฏเดฟ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เด’เดฐเต เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเตป เดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเดจเตเด‚ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต.

เดˆ เด•เตƒเดคเดฟเดฏเตเดŸเต† เดชเตเดฐเดšเต‹เดฆเดจเด‚ เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต เด†เดฏเดฟเดฐเตเดจเตเดจเต kubernetes.io เด†เดชเตเดชเต, เด‡เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดธเต‹เดดเตเดธเต เด•เต‹เดกเตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต, เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจ เด“เดฐเต‹ เดชเตเตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเด•เตเด•เตเด‚, เดฑเต‹เดฌเต‹เดŸเตเดŸเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต‹เดŸเตŠเดชเตเดชเด‚ เดธเตˆเดฑเตเดฑเดฟเดจเตเดฑเต† เด’เดฐเต เดชเตเดฐเดฟเดตเตเดฏเต‚ เดชเดคเดฟเดชเตเดชเต เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด•เดพเดฃเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดฒเดฟเด™เตเด•เต เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏ เดžเดพเตป เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเดšเตเดšเต, เดชเด•เตเดทเต‡ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ Gitlab CI เดฏเดฟเดฒเตเด‚ Kubernetes-เดฒเต‡เด•เตเด•เต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เดžเดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเดฟเดฒเตเด‚ เด…เดงเดฟเดทเตเด เดฟเดคเดฎเดพเดฏเดพเดฃเต เด‡เดคเต เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด‡เดจเตเดจเต, เด…เดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚.

เดฒเต‡เด–เดจเด‚ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดคเตเดชเต‹เดฒเตเดณเตเดณ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเด‚:
เดนเตเดฏเต‚เด—เต‹, qbec, เด•เดพเดฃเดฟเด•เตเด•เต‹, git-crypt ะธ เดœเดฟเดฑเตเดฑเตโ€Œเดฒเดพเดฌเต เดธเดฟ.เด เดšเดฒเดจเดพเดคเตเดฎเด•เดฎเดพเดฏ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเตเดŸเต† เดธเตƒเดทเตเดŸเดฟเดฏเต‹เดŸเต†.

เด‰เดณเตเดณเดŸเด•เตเด•เด‚

  1. เดนเตเดฏเต‚เด—เต‹เดฏเต† เด…เดฑเดฟเดฏเตเดจเตเดจเต
  2. เดกเต‹เด•เตเด•เตผ เดซเดฏเตฝ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเดจเตเดจเต
  3. เด•เดฃเดฟเด•เดฏเต† เด…เดฑเดฟเดฏเตฝ
  4. เด•เตเดฏเตเดฌเดฟเด‡เดธเดฟเดฏเต† เด…เดฑเดฟเดฏเตเด•
  5. เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเต-เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฑเตเดฎเดพเดฏเดฟ เดšเต‡เตผเดจเตเดจเต Gitlab-เดฑเดฃเตเดฃเดฑเต† เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต
  6. qbec เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเต
  7. Git-Crypt เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต
  8. เด’เดฐเต เดŸเต‚เตพเดฌเต‹เด•เตเดธเต เดšเดฟเดคเตเดฐเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
  9. เดŸเดพเด—เตเด•เตพ เดชเตเดฐเด•เดพเดฐเด‚ เดžเด™เตเด™เดณเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเตเด‚ เด‡เดฎเต‡เดœเต เด…เดธเด‚เดฌเตเดฒเดฟเดฏเตเด‚
  10. เดตเดฟเดจเตเดฏเดพเดธ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป
  11. เดชเตเดฐเดพเดตเต€เดฃเตเดฏเด‚ เดจเต‡เดŸเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เดณเตเด‚ เด…เดธเด‚เดฌเตเดฒเดฟเดฏเตเด‚
  12. เดšเดฒเดจเดพเดคเตเดฎเด• เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพ
  13. เด†เดชเตเดชเตเด•เตพ เด…เดตเดฒเต‹เด•เดจเด‚ เดšเต†เดฏเตเดฏเตเด•

1. เดนเตเดฏเต‚เด—เต‹เดฏเต† เด…เดฑเดฟเดฏเตเด•

เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ, เดนเตเดฏเต‚เด—เต‹เดฏเดฟเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดš เด’เดฐเต เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดชเดฌเตเดฒเดฟเดทเดฟเด‚เด—เต เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต เดžเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚. เดนเตเดฏเต‚เด—เต‹ เด’เดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด•เดฃเตเดŸเดจเตเดฑเต เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดพเดฃเต.

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

เด‡เดคเดฟเดจเตผเดคเตเดฅเด‚ เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเต เด’เดฐเต เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟ เด˜เดŸเดจเดฏเตเด‚ เดœเดจเดฑเต‡เดฑเตเดฑเตเดšเต†เดฏเตโ€Œเดค HTML เดซเดฏเดฒเตเด•เดณเตเดŸเต† เด’เดฐเต เด•เต‚เดŸเตเดŸเดตเตเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เด…เดคเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดฒเด•เตเดฑเดžเตเดž เด’เดฐเต เดนเต‹เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดธเต‡เดตเดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตโ€Œเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดนเตเดฏเต‚เด—เต‹ เดฒเต‹เด•เตเด•เดฒเดพเดฏเดฟ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดšเตเดจเต‹เด•เตเด•เดพเด‚:

เด’เดฐเต เดชเตเดคเดฟเดฏ เดธเตˆเดฑเตเดฑเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต:

hugo new site docs.example.org

เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดœเดฟเดฑเตเดฑเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเตเด‚:

cd docs.example.org
git init

เด‡เดชเตเดชเต‹เตพ, เดžเด™เตเด™เดณเตเดŸเต† เดธเตˆเดฑเตเดฑเต เดชเตเดฐเดพเด•เตƒเดคเดฎเดพเดฃเต, เด…เดคเดฟเตฝ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฆเตƒเดถเตเดฏเดฎเดพเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เด†เดฆเตเดฏเด‚ เด’เดฐเต เดคเต€เด‚ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด’เดฐเต เดคเต€เด‚ เดŽเดจเตเดจเดคเต เดžเด™เตเด™เดณเตเดŸเต† เดธเตˆเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดจเดฟเดฏเดฎเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เด•เต‚เดŸเตเดŸเดฎเดพเดฃเต.

เด’เดฐเต เดตเดฟเดทเดฏเดฎเดพเดฏเดฟ เดจเดฎเตเดฎเตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚ เด…เดฑเดฟเดฏเตเด•, เดŽเดจเตเดฑเต† เด…เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เด’เดฐเต เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดธเตˆเดฑเตเดฑเดฟเดจเต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏเดคเต.

เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดคเต€เด‚ เดซเดฏเดฒเตเด•เตพ เดธเต‡เดตเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ เดŽเดจเตเดจ เดตเดธเตเดคเตเดคเดฏเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เตพ เดชเตเดฐเดคเตเดฏเต‡เด• เดถเตเดฐเดฆเตเดง เดšเต†เดฒเตเดคเตเดคเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เดฐเด‚ เดจเดฎเตเด•เตเด•เต เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ เดœเดฟเดฑเตเดฑเต เดธเดฌเตเดฎเตŠเดกเตเดฏเต‚เตพ:

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

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

เดจเดฎเตเด•เตเด•เต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดถเดฐเดฟเดฏเดพเด•เตเด•เดพเด‚ เด•เต‹เตบเดซเดฟเด—เต.เดŸเต‹เด‚เตฝ:

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

เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เดคเดจเตเดจเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚:

hugo server

เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต http://localhost:1313/ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดคเตเดคเดพเดฏเดฟ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•; เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเตฝ เดตเดฐเตเดคเตเดคเดฟเดฏ เดŽเดฒเตเดฒเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเด‚ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดคเตเดฑเดจเตเดจ เดชเต‡เดœเต เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด‚. เดตเดณเดฐเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเด‚!

เด’เดฐเต เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต เดชเต‡เดœเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚ เด‰เดณเตเดณเดŸเด•เตเด•เด‚/_เด‡เตปเดกเต†เด•เตเดธเต.เดŽเด‚เดกเดฟ:

# My docs site

## Welcome to the docs!

You will be very smart :-)

เดชเตเดคเตเดคเดพเดฏเดฟ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดชเต‡เดœเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เด’เดฐเต เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป, เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•:

hugo

เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เด‰เดณเตเดณเดŸเด•เตเด•เด™เตเด™เตพ เดชเตŠเดคเต/ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.
เด…เดคเต†, เดตเดดเดฟเดฏเดฟเตฝ, เดจเดฎเตเด•เตเด•เต เด…เดคเต เด‰เดŸเตป เดšเต‡เตผเด•เตเด•เดพเด‚. .เดœเดฟเดฑเตเดฑเดฟเด—เตเดจเต‹เตผ:

echo /public > .gitignore

เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต:

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

2. เดกเต‹เด•เตเด•เตผ เดซเดฏเตฝ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเดจเตเดจเต

เดจเดฎเตเดฎเตเดŸเต† เดธเด‚เดญเดฐเดฃเดฟเดฏเตเดŸเต† เด˜เดŸเดจ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เต‡เดฃเตเดŸ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต. เดžเดพเตป เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‡เดคเตเดชเต‹เดฒเตŠเดจเตเดจเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฑเตเดฃเตเดŸเต:

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

  • เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เตพ/ โ€” เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เตพ เด‰เดณเตเดณ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เดณเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพเด‚ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต.
  • เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•/ โ€” เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดกเต‹เด•เตเด•เตผ เดซเดฏเตฝ เดชเดพเดคเดฏเดฟเดฒเต‚เดŸเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚. เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เตพ/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต/เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ

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" ]

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเดฟเตฝ เดฐเดฃเตเดŸเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต FROM, เดˆ เด…เดตเดธเดฐเดคเตเดคเต† เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เด˜เดŸเตเดŸเด™เตเด™เดณเตเดณเตเดณ เดจเดฟเตผเดฎเตเดฎเดพเดฃเด‚ เด•เต‚เดŸเดพเดคเต† เด…เดจเตเดคเดฟเดฎ เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดจเดพเดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพเด‚ เด’เดดเดฟเดตเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.
เด…เด™เตเด™เดจเต†, เดจเดฎเตเดฎเตเดŸเต† เด…เดจเตเดคเดฟเดฎ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เต‚ เด‡เดฐเตเดฃเตเดŸhttpd (เดญเดพเดฐเด‚ เด•เตเดฑเดžเตเดž HTTP เดธเต†เตผเดตเตผ) เด•เต‚เดŸเดพเดคเต† เดชเตŠเดคเต/ โ€” เดžเด™เตเด™เดณเตเดŸเต† เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เตเด•เต เด†เดฏเดฟ เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดค เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเดฟเดจเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚.

เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต:

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

3. เด•เดฃเดฟเด•เตเด•เต‹เดฏเต† เด…เดฑเดฟเดฏเตเด•

เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เดฌเดฟเตฝเดกเตผ เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เดžเดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต เด•เดพเดฃเดฟเด•เตเด•เต‹, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด’เดฐเต เดกเต‹เด•เตเด•เตผ เดกเต†เดฎเตบ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† เดฌเดฟเตฝเดกเต เดคเดจเตเดจเต† เดเดคเต เดฎเต†เดทเต€เดจเดฟเดฒเตเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดจเตเด‚ เด•เดพเดทเต† เดจเต‡เดฐเดฟเดŸเตเดŸเต เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เดธเต‚เด•เตเดทเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚, เด…เดคเตเดตเดดเดฟ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด’เดฐเต เดธเตเดฅเดฟเดฐเดฎเดพเดฏ เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดค เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เด‡เดฎเต‡เดœเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป, เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดšเตเดšเดพเตฝ เดฎเดคเดฟเดฏเดพเด•เตเด‚ เด•เดฃเดฟเด•เตเด•เต‹ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเตผ เดจเดฟเดฒเดตเดฟเดฒเต† เดฌเดฟเตฝเดกเต เดธเดจเตเดฆเตผเดญเด‚ เด…เดคเดฟเดจเต เด•เตˆเดฎเดพเดฑเตเด•; เด‡เดคเต เดกเต‹เด•เตเด•เตผ เดตเดดเดฟ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚:

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/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต โ€” เดจเดฟเด™เตเด™เดณเตเดŸเต† เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเดฟเดจเตเดฑเต† เดชเต‡เดฐเต; เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เด…เดคเต เดกเต‹เด•เตเด•เตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เดฒเต‹เดžเตเดšเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚.

เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ โ€”เด•เดพเดทเต† เดกเต‹เด•เตเด•เตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เดฒเต†เดฏเดฑเตเด•เตพ เด•เดพเดทเต† เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เด…เดต เดธเด‚เดญเดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚ registry.gitlab.com/kvaps/docs.example.org/website/cache, เดชเด•เตเดทเต‡ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเตŠเดฐเต เดชเดพเดค เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ โ€”เด•เดพเดทเต†-เดฑเดฟเดชเตเดชเต‹.

เดกเต‹เด•เตเด•เตผ-เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเตเดŸเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

4. เด•เตเดฏเตเดฌเดฟเด‡เดธเดฟเดฏเต† เด…เดฑเดฟเดฏเตเด•

เด•เตเดฏเตเดฌเต†เด•เต เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เดณเต† เดกเดฟเด•เตเดฒเดฑเต‡เดฑเตเดฑเต€เดตเต เด†เดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดตเดฟเดจเตเดฏเดพเดธ เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต. เดชเตเดฐเดพเดฅเดฎเดฟเด• เดตเดพเด•เตเดฏเด˜เดŸเดจเดฏเดพเดฏเดฟ Jsonnet เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเดฟเดฒเตเดŸเดจเต€เดณเดฎเตเดณเตเดณ เดตเตเดฏเดคเตเดฏเดพเดธเด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เด•เต‹เดกเต เด†เดตเตผเดคเตเดคเดจเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเตเดณเตเดณ เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เต‡เดฃเตเดŸเดฟเดตเดฐเตเดฎเตเดชเต‹เตพ, เด…เดตเดฏเต† Git-เตฝ เดชเตเดฐเด–เตเดฏเดพเดชเดจเดชเดฐเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเดฟเตฝ เด‡เดคเต เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดจเตฝเด•เดฟเด•เตเด•เตŠเดฃเตเดŸเต เด…เดต เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเดพเดจเตเด‚, เดคเตเดŸเตผเดจเตเดจเต เด…เดตเดฏเดฟเตฝ เดตเดฟเดตเดฟเดง เดฎเตเดฏเต‚เดŸเตเดŸเต‡เดทเดจเตเด•เตพ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด‰เตพเดชเตเดชเต†เดŸเต†, เดชเดคเดฟเดตเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเต‹เดฒเต† เด…เดตเดฏเต† เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ Qbec เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดšเดพเตผเดŸเตเดŸเต เดฎเตเดฏเต‚เดธเดฟเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดค เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต. เด…เดคเดพเดฏเดคเต, เดšเดพเตผเดŸเตเดŸเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจ Git-เตฝ เดจเดฟเดจเตเดจเต เดจเต‡เดฐเดฟเดŸเตเดŸเต เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดฏเตเด‚.

เดžเดพเตป เดฎเตเดฎเตเดชเต เดชเดฑเดžเตเดžเดคเตเดชเต‹เดฒเต†, เดžเด™เตเด™เตพ เดŽเดฒเตเดฒเดพ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เดณเตเด‚ เด’เดฐเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเตฝ เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเด‚. เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•/:

mkdir deploy
cd deploy

เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เดจเดฟเดทเตเดฏเดฒเตˆเดธเต เดšเต†เดฏเตเดฏเดพเด‚:

qbec init website
cd website

เดจเดฟเดฒเดตเดฟเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด˜เดŸเดจ เด‡เดคเตเดชเต‹เดฒเต†เดฏเดพเดฃเต เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต:

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

เดจเดฎเตเด•เตเด•เต เดซเดฏเตฝ เดจเต‹เด•เตเด•เดพเด‚. เด•เตเดฏเตเดฌเต†เด•เต.เดฏเดพเดฎเตฝ:

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

เด‡เดตเดฟเดŸเต† เดจเดฎเตเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเต เดชเตเดฐเดพเดฅเดฎเดฟเด•เดฎเดพเดฏเดฟ เดธเตเดชเต†เด•เต.เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟเด•เตพ, qbec เดจเดฎเตเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดกเดฟเดซเต‹เตพเดŸเตเดŸเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต เด•เดดเดฟเดžเตเดžเต, เด•เต‚เดŸเดพเดคเต† เดจเดฎเตเดฎเตเดŸเต† เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ kubeconfig-เตฝ เดจเดฟเดจเตเดจเต เดธเต†เตผเดตเตผ เดตเดฟเดฒเดพเดธเดตเตเด‚ เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเตเด‚ เดŽเดŸเตเดคเตเดคเต.
เด‡เดชเตเดชเต‹เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ environment-เตฝ, qbec เดŽเดฒเตเดฒเดพเดฏเตโ€Œเดชเตเดชเต‹เดดเตเด‚ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ Kubernetes เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เตเด‚ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเดฒเต‡เด•เตเด•เตเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เต‚, เด…เดคเดพเดฏเดคเต เด’เดฐเต เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดŸเดคเตเดคเดพเตป เดจเดฟเด™เตเด™เตพ เด‡เดจเดฟ เด•เต‹เตบเดŸเต†เด•เตโ€Œเดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เตเด‚ เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเตเด•เตพเด•เตเด•เตเด‚ เด‡เดŸเดฏเดฟเตฝ เดฎเดพเดฑเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ.
เด†เดตเดถเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดซเดฏเดฒเดฟเดฒเต† เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŽเดฒเตเดฒเดพ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเตเด‚ เด‡เดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เด•เตเดฏเตเดฌเต†เด•เต.เดฏเดพเดฎเตฝ, เดซเดฏเดฒเดฟเดฒเตเด‚ params.libsonnet - เด•เตเดฒเต—เดกเดฟเตฝ เด“เตบเดฒเตˆเดจเดฟเตฝ, เด…เดตเดฏเตเด•เตเด•เตเดณเตเดณ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดŽเดตเดฟเดŸเต† เดจเดฟเดจเตเดจเต เดฒเดญเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เด…เดคเดฟเตฝ เดชเดฑเดฏเตเดจเตเดจเต.

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ เดจเดฎเตเดฎเตพ เดฐเดฃเตเดŸเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เตพ เด•เดพเดฃเตเดจเตเดจเต:

  • เด˜เดŸเด•เด™เตเด™เตพ/ โ€” เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดพเดฏเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เดณเตเด‚ เด‡เดตเดฟเดŸเต† เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเด‚; เด…เดต jsonnet เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเดพเดงเดพเดฐเดฃ yaml เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเด‚.
  • เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ/ โ€” เด‡เดตเดฟเดŸเต† เดจเดฎเตเดฎเตเดŸเต† เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพเด•เตเด•เดพเดฏเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตเด‚ (เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ) เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด‚.

เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เดฐเดฃเตเดŸเต เดซเดฏเดฒเตเด•เตพ เด‰เดฃเตเดŸเต:

  • เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเตเด•เตพ/base.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',
    },
  },
}

เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เด˜เดŸเด•เด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚. เด˜เดŸเด•เด™เตเด™เตพ/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต.เดœเต†เดธเต‹เดฃเต†เดฑเตเดฑเต:

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,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

เดˆ เดซเดฏเดฒเดฟเตฝ, เดžเด™เตเด™เตพ เด’เดฐเต‡เดธเดฎเดฏเด‚ เดฎเต‚เดจเตเดจเต เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเตเดธเต เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดตเดฟเดตเดฐเดฟเดšเตเดšเต: เดตเดฟเดจเตเดฏเดพเดธ, เดธเต‡เดตเดจเด‚ ะธ เดคเตเดŸเดฐเตเด•เดจเดฎเตเด•เตเด•เต เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ เด…เดตเดฏเต† เดตเตเดฏเดคเตเดฏเดธเตเดค เด˜เดŸเด•เด™เตเด™เดณเดพเดฏเดฟ เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เดพเด‚, เดŽเดจเตเดจเดพเตฝ เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เด’เดจเตเดจเต เดฎเดคเดฟเดฏเดพเด•เตเด‚.

เดตเดพเด•เตเดฏเด˜เดŸเดจ เดœเต†เดธเต‹เดฃเต†เดฑเตเดฑเต เด‡เดคเต เดธเดพเดงเดพเดฐเดฃ JSON-เดจเต‹เดŸเต เดตเดณเดฐเต† เดธเดพเดฎเตเดฏเดฎเตเดณเตเดณเดคเดพเดฃเต, เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดธเดพเดงเดพเดฐเดฃ JSON เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เดธเดพเดงเตเดตเดพเดฏ เด’เดฐเต JSONnet เด†เดฃเต, เด…เดคเดฟเดจเดพเตฝ เด†เดฆเตเดฏเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด“เตบเดฒเตˆเตป เดธเต‡เดตเดจเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดณเตเดชเตเดชเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, yaml2json (เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต) เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเดพเดงเดพเดฐเดฃ YAML-เดจเต† JSON-เดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด˜เดŸเด•เด™เตเด™เดณเดฟเตฝ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตŠเดจเตเดจเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด…เดตเดฏเต† เดธเดพเดงเดพเดฐเดฃ YAML เดŽเดจเตเดจเต เดตเดฟเดถเต‡เดทเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚.

เด•เต‚เดŸเต† เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดœเต†เดธเต‹เดฃเต†เดฑเตเดฑเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŽเดกเดฟเดฑเตเดฑเดฑเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดชเตเดฒเด—เดฟเตป เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เดถเด•เตเดคเดฎเดพเดฏเดฟ เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, vim-เดจเต เด’เดฐเต เดชเตเดฒเด—เดฟเตป เด‰เดฃเตเดŸเต. เดตเดฟเด‚-เดœเต‹เดฃเดฑเตเดฑเต, เด‡เดคเต เดตเดพเด•เตเดฏเด˜เดŸเดจ เดนเตˆเดฒเตˆเดฑเตเดฑเดฟเด‚เด—เต เดชเตเดฐเดพเดชเตเดคเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เดœเต†เดธเต‹เดฃเต†เดฑเตเดฑเต เดŽเดซเตเดŽเด‚เดŸเดฟ เด“เดฐเต‹ เดธเต‡เดตเดฟเดฒเตเด‚ (jsonnet เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต).

เดŽเดฒเตเดฒเดพเด‚ เดคเดฏเตเดฏเดพเดฑเดพเดฃเต, เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดพเด‚:

เดจเดฎเตเดฎเตเดŸเต† เด•เตˆเดตเดถเด‚ เดŽเดจเตเดคเตเดฃเตเดŸเต†เดจเตเดจเต เด•เดพเดฃเดพเตป, เดจเดฎเตเด•เตเด•เต เด“เดŸเดพเด‚:

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. เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฑเดฟเดจเตŠเดชเตเดชเด‚ เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต เดฑเดฃเตเดฃเตผ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เด…เดŸเตเดคเตเดค เด•เดพเดฒเด‚ เดตเดฐเต† เดžเดพเตป เดฑเต†เด—เตเดฒเตผ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเตเดจเตเดจเตเดณเตเดณเต‚ เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เดทเต†เตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดกเต‹เด•เตเด•เตผ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเตผ เด‰เดณเตเดณ เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เดฟเดฏ เดฎเต†เดทเต€เดจเดฟเตฝ (เด’เดฐเต LXC เด•เดฃเตเดŸเต†เดฏเตเดจเตผ). เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ, เดžเด™เตเด™เดณเตเดŸเต† GitLab-เตฝ เด†เด—เต‹เดณเดคเดฒเดคเตเดคเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸ เด…เดคเตเดคเดฐเด‚ เดจเดฟเดฐเดตเดงเดฟ เดฑเดฃเตเดฃเดฑเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดŽเดฒเตเดฒเดพ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เตเดฎเดพเดฏเดฟ เด…เดตเตผ เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเต.

เดŽเดจเตเดจเดพเตฝ เดชเตเดฐเดพเด•เตเดŸเต€เดธเต เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเต‹เดฒเต†, เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดคเดฏเตเดŸเต†เดฏเตเด‚ เดธเตเดฐเด•เตเดทเดฏเตเดŸเต†เดฏเตเด‚ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดˆ เด“เดชเตเดทเตป เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดฒเตเดฒ. เด“เดฐเต‹ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเด‚, เด“เดฐเต‹ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟเด•เตเด•เตเด‚ เดชเต‹เดฒเตเด‚, เดตเต†เดตเตเดตเต‡เดฑเต† เดฑเดฃเตเดฃเต‡เดดเตเดธเดฟเดจเต† เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดณเดฐเต† เดฎเดฟเด•เดšเตเดšเดคเตเด‚ เด†เดถเดฏเดชเดฐเดฎเดพเดฏเดฟ เด•เต‚เดŸเตเดคเตฝ เดถเดฐเดฟเดฏเตเดฎเดพเดฃเต.

เดญเดพเด—เตเดฏเดตเดถเดพเตฝ เด‡เดคเต เด’เดฐเต เดชเตเดฐเดถเตเดจเดฎเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดจเดฎเตเดฎเตพ เด‡เดชเตเดชเต‹เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เดชเต‹เด•เตเดจเตเดจเต เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ เดจเต‡เดฐเดฟเดŸเตเดŸเต.

เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเต 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 โ€” เดจเดฟเด™เตเด™เดณเตเดŸเต† Gitlab เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดตเดฟเดฒเดพเดธเด‚.
  • yga8y-jdCusVDn_t4Wxc โ€” เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเตเดณเตเดณ เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดŸเต‹เด•เตเด•เตบ.
  • rbac.create=เดธเดคเตเดฏเด‚ โ€” kubernetes-executor เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเดฎเตเดŸเต† เดœเต‹เดฒเดฟเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเต‹เดกเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เดฑเดฃเตเดฃเตผเด•เตเด•เต เดจเตฝเด•เตเดจเตเดจเต.

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

เดšเต‡เตผเดคเตเดค เดฑเดฃเตเดฃเดฑเตเดŸเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เด…เดคเตเดฐ เดฒเดณเดฟเดคเดฎเดพเดฃเต‹? เด…เดคเต†, เด…เดคเตเดฐ เดฒเดณเดฟเดคเดฎเดพเดฃเต! เดฑเดฃเตเดฃเต‡เดดเตเดธเดฟเดจเต† เดธเตเดตเดฎเต‡เดงเดฏเดพ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ เด‡เดจเดฟ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ; เด‡เดจเดฟ เดฎเตเดคเตฝ, เดฑเดฃเตเดฃเต‡เดดเตเดธเต เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด•เดฏเตเด‚ เดจเดถเดฟเดชเตเดชเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

6. QBEC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตฝ

เดžเด™เตเด™เตพ เดŽเดฃเตเดฃเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเดคเดฟเดจเดพเตฝ เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดคเดฟเดจเดพเตฝ, เด…เดคเต เดžเด™เตเด™เดณเตเดŸเต† Git เดถเต‡เด–เดฐเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸ เดธเดฎเดฏเดฎเดพเดฏเดฟ.

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

cd deploy
qbec init gitlab-runner
cd gitlab-runner

เด‡เดคเตเดคเดตเดฃ, เดจเดฎเตเดฎเตพ Kubernetes เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเด•เดณเต† เดฎเดพเดจเตเดตเดฒเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เดฟเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เด’เดฐเต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚. qbec เดฏเตเดŸเต† เด’เดฐเต เด—เตเดฃเด‚ เด’เดฐเต Git เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเต‡เดฐเดฟเดŸเตเดŸเต เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพ เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเดพเดฃเต.

เดœเดฟเดฑเตเดฑเต เดธเดฌเตเดฎเต‹เดกเตเดฏเต‚เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เด‡เดคเต เดชเตเดฐเดพเดชเตเดคเดฎเดพเด•เตเด•เดพเด‚:

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

เด‡เดชเตเดชเต‹เตพ เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เดตเต†เดฃเตเดŸเตผ/เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ gitlab-runner-เดจเตเดณเตเดณ เด’เดฐเต เดšเดพเตผเดŸเตเดŸเต เด‰เดณเตเดณ เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เดณเต†เดฏเตเด‚ เดธเดฎเดพเดจเดฎเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เดฎเตเดดเตเดตเตป เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเตเด‚ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดšเดพเตผเดŸเตเดŸเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚. https://github.com/helm/charts

เดจเดฎเตเด•เตเด•เต เด˜เดŸเด•เด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเด‚ เด˜เดŸเด•เด™เตเด™เตพ/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,
  }
)

เด†เดฆเตเดฏ เดตเดพเดฆเด‚ เดนเต†เตฝเด‚เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเด• เดจเดฎเตเดฎเตพ เดšเดพเตผเดŸเตเดŸเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเดพเดคเดฏเดฟเดฒเต‚เดŸเต† เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจเต, เดคเตเดŸเตผเดจเตเดจเต เดชเดพเดฐเดพเดฎเตเด•เตพ.เดฎเต‚เดฒเตเดฏเด™เตเด™เตพเดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฎเตเดฎเตพ เดŽเดŸเตเด•เตเด•เตเดจเตเดจ , เดคเตเดŸเตผเดจเตเดจเต เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เดตเดฐเตเดจเตเดจเดคเต

  • เดชเต‡เดฐเตเดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต โ€” เดฑเดฟเดฒเต€เดธเต เดถเต€เตผเดทเด•เด‚
  • เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเต โ€” เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเต เดนเต†เตฝเดฎเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเดฟ
  • เดˆ เดซเดฏเตฝ โ€” เดจเดฟเดฒเดตเดฟเดฒเต† เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเดพเดค เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจ เด’เดฐเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ
  • เดตเต†เตผเดฌเต‹เดธเต - เด•เดฎเดพเตปเดกเต เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต เดนเต†เตฝเด‚ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดšเดพเตผเดŸเตเดŸเต เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดŽเดฒเตเดฒเดพ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต

เด‡เดจเดฟ เดจเดฎเตเดฎเตเดŸเต† เด˜เดŸเด•เดคเตเดคเดฟเดจเตเดฑเต† เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเด‚ เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเตเด•เตพ/base.libsonnet:

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

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

เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด• เดฑเดฃเตเดฃเตผเดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดŸเต‹เด•เตเด•เตบ เดจเดฎเตเดฎเตพ เด’เดฐเต เดฌเดพเดนเตเดฏ เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต. เดฐเดนเดธเตเดฏเด™เตเด™เตพ/base.libsonnet, เดจเดฎเตเด•เตเด•เต เด…เดคเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

qbec show default

เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฎเตเด•เตเด•เต เดฎเตเดฎเตเดชเต เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดš เดฑเดฟเดฒเต€เดธเต Helm เดตเดดเดฟ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเด‚:

helm uninstall gitlab-runner

เดตเต€เดฃเตเดŸเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•, เดชเด•เตเดทเต‡ qbec เดตเดดเดฟ:

qbec apply default

7. git-crypt-เดจเตเดฑเต† เด†เดฎเตเด–เด‚

เดœเดฟเดฑเตเดฑเต-เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต โ€” เดŽเดจเตเดจเดคเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเต‡เด–เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดธเตเดคเดพเดฐเตเดฏเดฎเดพเดฏ เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต.

เด‡เดชเตเดชเต‹เตพ, 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-crypt.

git-crypt เด‡เดคเต เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดฐเดนเดธเตเดฏเด™เตเด™เดณเตเดŸเต† เดฎเตเดดเตเดตเตป เดšเดฐเดฟเดคเตเดฐเดตเตเด‚ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเดจเตเด‚, Git-เตฝ เดจเดฎเตเดฎเตพ เดชเดคเดฟเดตเตเดณเตเดณเดคเตเดชเต‹เดฒเต† เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเด‚, เดฒเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚, เดธเด‚เด˜เตผเดทเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเดจเต เดถเต‡เดทเด‚ เด†เดฆเตเดฏเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต git-crypt เดจเดฎเตเดฎเตเดŸเต† เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตเด•เต เดตเต‡เดฃเตเดŸเดฟ เดจเดฎเตเด•เตเด•เต เด•เต€เด•เตพ เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

git crypt init

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต PGP เด•เต€ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดˆ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดŸเตป เดคเดจเตเดจเต† เดจเดฟเด™เตเด™เดณเต† เดธเดนเด•เดพเดฐเดฟเดฏเดพเดฏเดฟ เดšเต‡เตผเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต:

git-crypt add-gpg-user kvapss@gmail.com

เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดˆ เดถเต‡เด–เดฐเด‚ เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เตˆเดตเดถเด‚ เด’เดฐเต PGP เด•เต€ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เด’เดฐเต เดธเดฎเต€เดชเดจเด‚ เดธเตเดตเต€เด•เดฐเดฟเดšเตเดšเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เต€ เด•เดฏเดฑเตเดฑเตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚:

git crypt export-key /path/to/keyfile

เด…เด™เตเด™เดจเต†, เด•เดฏเดฑเตเดฑเตเดฎเดคเดฟ เดšเต†เดฏเตเดค เดเดคเตŠเดฐเดพเตพเด•เตเด•เตเด‚ เด•เต€เดซเดฏเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดฐเดนเดธเตเดฏเด‚ เดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเตป เดธเดฎเดฏเดฎเดพเดฏเดฟ.
เดจเดฎเตเดฎเตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเดฒเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เดจเดฟเด™เตเด™เดณเต† เด“เตผเดฎเตเดฎเดฟเดชเตเดชเดฟเด•เตเด•เดŸเตเดŸเต†. เดกเดฟเดชเตเดฒเต‹เดฏเต/เดœเดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ/, เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เด‰เดณเตเดณเดฟเดŸเดคเตเดคเต เดฐเดนเดธเตเดฏเด™เตเด™เตพ/, เด‡เดคเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เดซเดฏเดฒเตเด•เดณเตเด‚ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเด‚, เด‡เดคเดฟเดจเดพเดฏเดฟ เดจเดฎเตเดฎเตพ เด’เดฐเต เดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚. เดฐเดนเดธเตเดฏเด™เตเด™เตพ/.gitattributes เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเต‹เดŸเต†:

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดŽเดฒเตเดฒเดพ เดซเดฏเดฒเตเด•เดณเตเด‚ เดฎเดพเดธเตเด•เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต. * เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเด‚ git-crypt, เด’เดฐเต‡เดฏเตŠเดฐเต เด•เดพเดฐเตเดฏเด‚ เด’เดดเดฟเด•เต† .gitatributes

เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต เดจเดฎเตเด•เตเด•เต เด‡เดคเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

git crypt status -e

เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเดฒเต† เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดชเตเดฐเดพเดชเตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดซเดฏเดฒเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เด…เดคเตเดฐเดฏเต‡เดฏเตเดณเตเดณเต‚, เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเด‚:

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

เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดฌเตเดฒเต‹เด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป, เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•:

git crypt lock

เด‰เดŸเดจเต† เดŽเดฒเตเดฒเดพ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดค เดซเดฏเดฒเตเด•เดณเตเด‚ เดฌเตˆเดจเดฑเดฟ เดซเดฏเดฒเตเด•เดณเดพเดฏเดฟ เดฎเดพเดฑเตเด‚, เด…เดต เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.
เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•:

git crypt unlock

8. เด’เดฐเต เดŸเต‚เตพเดฌเต‹เด•เตเดธเต เด‡เดฎเต‡เดœเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•

เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏ เด’เดฐเต เดšเดฟเดคเตเดฐเดฎเดพเดฃเต เดŸเต‚เตพเดฌเต‹เด•เตเดธเต เด‡เดฎเต‡เดœเต. เดธเดพเดงเดพเดฐเดฃ เดตเดฟเดจเตเดฏเดพเดธ เดœเต‹เดฒเดฟเด•เตพ เดšเต†เดฏเตเดฏเดพเตป GitLabRunner เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

เด‡เดตเดฟเดŸเต† เดŽเดฒเตเดฒเดพเด‚ เดฒเดณเดฟเดคเดฎเดพเดฃเต, เดจเดฎเตเด•เตเด•เต เดชเตเดคเดฟเดฏเตŠเดฐเต†เดฃเตเดฃเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚. เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเตเด•เตพ/เดŸเต‚เตพเดฌเต‹เด•เตเดธเต/เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเต‹เดŸเต†:

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

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดˆ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดŽเดฒเตเดฒเดพ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเด‚ เดžเด™เตเด™เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด‡เดตเดฟเดŸเต† เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ: เด•เตเดฌเต†เด•เตเดฒเดฟ, เดชเด•เตเดทเต‡ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเตป เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เดณเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚.

เด•เต‚เดŸเดพเดคเต†, เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเตเดฎเดพเดฏเดฟ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดจเดŸเดคเตเดคเดพเดจเตเด‚ เด…เดคเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเดฃเดฎเต†เด™เตเด•เดฟเตฝ, เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เดชเต‹เดกเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดฑเต‹เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, gitlab-runner เด‰เดณเตเดณ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด•:

cd deploy/gitlab-runner

เด’เดฐเต เดชเตเดคเดฟเดฏ เด˜เดŸเด•เด‚ เดšเต‡เตผเด•เตเด•เตเด• เด˜เดŸเด•เด™เตเด™เตพ/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 เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต เดชเต‡เดฐเต เด˜เดŸเด•เดคเตเดคเดฟเดจเต เด†เตผเดฌเดฟเดŽเดธเดฟ

เดŽเดจเตเดคเดพเดฃเต เดฎเดพเดฑเดฟเดฏเดคเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

qbec diff default

เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเตฝ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเด•:

qbec apply default

เด•เต‚เดŸเดพเดคเต†, git-เตฝ เดจเดฎเตเดฎเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต:

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 เดŸเดพเด—เตเด•เดณเตเดฎเดพเดฏเดฟ เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚. เดชเตเดคเดฟเดฏ เดŸเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเตเดณเตเดณ เด“เดฐเต‹ เดชเตเดทเตเด‚ เด† เดŸเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเตเดณเตเดณ เด‡เดฎเต‡เดœเตเด•เดณเตเดŸเต† เด’เดฐเต เดฌเดฟเตฝเดกเดฟเดจเต เดคเตเดŸเด•เตเด•เดฎเดฟเดŸเตเด‚.

เดจเดฎเตเดฎเดณเดคเต เดšเต†เดฏเตเดฏเตเด‚. เดœเดฟเดฑเตเดฑเต เดชเตเดทเต --เดŸเดพเด—เตเด•เตพ, เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเตป เดจเต‹เด•เตเด•เดพเด‚:

เด†เดฆเตเดฏเดคเตเดคเต† เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

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

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

10. เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเตเดฑเต† เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป

Gitlab-runner เดจเดฎเตเดฎเตเดŸเต† เดฐเดนเดธเตเดฏเด™เตเด™เตพ เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฎเตเดฎเตพ repository เด•เต€ เดŽเด•เตเดธเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดคเต เดจเดฎเตเดฎเตเดŸเต† CI เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

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

เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดจเดฎเตเดฎเตพ Gitlab-เตฝ เดธเต‡เดตเต เดšเต†เดฏเตเดฏเตเด‚. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด•:
เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> CI / CD -> เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดชเตเดคเดฟเดฏ เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚:

เดŸเตˆเดชเตเดชเต เดšเต†เดฏเตเดฏเตเด•
เด•เต€
เดตเดฟเดฒ
เดธเด‚เดฐเด•เตเดทเดฟเดค
เดฎเดพเดธเตเดกเต
เดธเตเด•เต‡เดพเดชเตเดชเต

File
GITCRYPT_KEY
<your string>
true (เดชเดฐเดฟเดถเต€เดฒเดจ เด•เดพเดฒเดฏเดณเดตเดฟเตฝ เด‡เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฃเต เด•เต‚เดŸเดพเดคเต† false)
true
All environments

เดšเต‡เตผเดคเตเดค เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต†เดคเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเด‚ .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-เดจเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดชเตเดคเดฟเดฏ เด“เดชเตเดทเดจเตเด•เตพ เดชเตเดฐเดพเดชเตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต:

  • โ€”เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚/เด†เดชเตเดชเต เดฑเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด• โ€” เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.
  • --เดซเต‹เดดเตโ€Œเดธเต:k8s-เดธเดจเตเดฆเตผเดญเด‚ __เด‡เตปเด•เตเดฒเดธเตเดฑเตเดฑเตผ__ โ€” gtilab-runner เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด…เดคเต‡ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดŸเด•เตเด•เตเดฎเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฎเดพเดœเดฟเด•เต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดพเดฃเดฟเดคเต. เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ qbec เดจเดฟเด™เตเด™เดณเตเดŸเต† kubeconfig-เตฝ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เด’เดฐเต Kubernetes เดธเต†เตผเดตเตผ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚.
  • โ€”เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด• โ€” เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดฑเต†เดกเดฟ เด…เดตเดธเตเดฅเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเตเดตเดฐเต† เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเตป qbec-เดจเต† เดจเดฟเตผเดฌเดจเตเดงเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เด’เดฐเต เดŽเด•เตเดธเดฟเดฑเตเดฑเต เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เต‚.
  • โ€”เด…เดคเต† - เดธเด‚เดตเต‡เดฆเดจเดพเดคเตเดฎเด• เดทเต†เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดจเดฟเด™เตเด™เดณเตเด•เตเด•เต เด‰เดฑเดชเตเดชเดพเดฃเต‡เดพ? เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ.

เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต:

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

เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ git push เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดจเต‹เด•เตเด•เดพเด‚:

เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

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"

เดฆเดฏเดตเดพเดฏเดฟ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•, เดžเด™เตเด™เตพ เด’เดฐเต เดถเดพเด– เดšเต‡เตผเดคเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดฏเดœเดฎเดพเดจเดจเต ะบ เดฑเดซเดฑเตปเดธเตเด•เตพ เดœเต‹เดฒเดฟเด•เตเด•เต เดตเต‡เดฃเตเดŸเดฟ เดฌเดฟเตฝเดกเต_เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต เดจเดฎเตเดฎเตพ เด‡เดชเตเดชเต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต $CI_COMMIT_REF_NAME เดชเด•เดฐเด‚ $CI_COMMIT_TAG, เด…เดคเดพเดฏเดคเต เดจเดฎเตเดฎเตพ Git เดŸเดพเด—เตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต‡เตผเดชเดฟเดฐเดฟเดฏเตเด•เดฏเดพเดฃเต, เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเตป เด‡เดจเต€เดทเตเดฏเดฒเตˆเดธเต เดšเต†เดฏเตเดค เด•เดฎเตเดฎเดฟเดฑเตเดฑเดฟเดจเตเดฑเต† เดฌเตเดฐเดพเดžเตเดšเต เดจเดพเดฎเดฎเตเดณเตเดณ เด’เดฐเต เด‡เดฎเต‡เดœเต เด‡เดชเตเดชเต‹เตพ เดชเตเดทเต เดšเต†เดฏเตเดฏเตเด‚. เด‡เดคเต เดŸเดพเด—เตเด•เดณเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต, เด‡เดคเต เดกเต‹เด•เตเด•เตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเดคเดฟเดชเตเดชเตเดณเตเดณ เดธเตˆเดฑเตเดฑเต เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเตเด•เตพ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

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

เด“เดชเตเดทเตป โ€”vm:ext-str เดกเตˆเดœเดธเตเดฑเตเดฑเต=โ€$DIGESTโ€ qbec-เดจเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, jsonnet-เดฒเต‡เด•เตเด•เต เด’เดฐเต เดฌเดพเดนเตเดฏ เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เด•เตˆเดฎเดพเดฑเดพเตป เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด“เดฐเต‹ เดฑเดฟเดฒเต€เดธเดฟเดฒเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเตเดŸเดจเต€เดณเด‚ เดตเต€เดฃเตเดŸเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด‡เดฎเต‡เดœเต เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด…เดคเต เดฎเดพเดฑเตเดฎเตเดชเต‹เตพ เด’เดฐเต เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŸเตเดฐเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดจเดพเตฝ, เด‡เดชเตเดชเต‹เตพ เดฎเดพเดฑเตเดฑเดพเตป เด•เดดเดฟเดฏเดพเดคเตเดค เดŸเดพเด—เต เดจเดพเดฎเด‚ เด‡เดตเดฟเดŸเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

เด‡เดตเดฟเดŸเต†, เด’เดฐเต เดกเตˆเดœเดธเตเดฑเตเดฑเต เด‡เดฎเต‡เดœเต เด’เดฐเต เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เดธเต‡เดตเต เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดฃเดฟเด•เตเด•เต‹เดฏเตเดŸเต† เด•เดดเดฟเดตเต เดจเดฎเตเดฎเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚ (เด“เดชเตเดทเตป โ€”เดกเตˆเดœเดธเตเดฑเตเดฑเต-เดซเดฏเตฝ)
เดคเตเดŸเตผเดจเตเดจเต เดจเดฎเตเดฎเตพ เดˆ เดซเดฏเตฝ เดŸเตเดฐเดพเตปเดธเตเดซเตผ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดตเดฟเดจเตเดฏเดพเดธ เดธเดฎเดฏเดคเตเดคเต เด…เดคเต เดตเดพเดฏเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดจเดฎเตเดฎเตเดŸเต† เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเด‚ เดกเดฟเดชเตเดฒเต‹เดฏเต/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต/เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเตโ€Œเดธเต/เดฌเต‡เดธเต.เดฒเดฟเดฌเตโ€Œเดธเดฃเต†เดฑเตเดฑเต เด…เดคเต เด‡เดชเตเดชเต‹เตพ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเด‚:

{
  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 push เดจเดฎเตเดฎเตพ เด‡เดคเตเดชเต‹เดฒเตเดณเตเดณ เด’เดจเตเดจเต เด•เดพเดฃเดฃเด‚:

เดฎเดพเดธเตเดฑเตเดฑเตผ เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเดจเตเดฑเต† เด’เดฐเต เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เดคเดคเตเดตเดคเตเดคเดฟเตฝ, เด“เดฐเต‹ เดชเตเดทเดฟเดฒเตเด‚ เดจเดฎเตเด•เตเด•เต gitlab-runner เดตเต€เดฃเตเดŸเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ, เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด…เดคเดฟเดจเตเดฑเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเดฟเตฝ เด’เดจเตเดจเตเด‚ เดฎเดพเดฑเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฎเตเด•เตเด•เต เด‡เดคเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเด‚ .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/**/*

เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด‚ เดกเดฟเดชเตเดฒเต‹เดฏเต/เดœเดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ/ เด…เด™เตเด™เดจเต†เดฏเตเดณเตเดณเดต เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดžเด™เตเด™เดณเตเดŸเต† เดœเต‹เดฒเดฟ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเดณเตเดณเต‚

เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต:

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

git push, เด…เดคเดพเดฃเต เดจเดฒเตเดฒเดคเต:

เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดค เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

12. เดšเดฒเดจเดพเดคเตเดฎเด• เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพ

เดจเดฎเตเดฎเตเดŸเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเดจเต† เดšเดฒเดจเดพเดคเตเดฎเด•เดฎเดพเดฏ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเดฟเดฒเต‚เดŸเต† เดตเตˆเดตเดฟเดงเตเดฏเดตเตฝเด•เตเด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต.

เด†เดฆเตเดฏเด‚, เดจเดฎเตเด•เตเด•เต เดœเต‹เดฒเดฟ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเด‚. เดฌเดฟเตฝเดกเต_เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต เดจเดฎเตเดฎเตเดŸเต† .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:
  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-เดจเต เด’เดฐเต เดชเตเดคเดฟเดฏ เด“เดชเตเดทเตป เดจเดฎเตเดฎเตพ เด•เดพเดฃเตเดจเตเดจเต: โ€”เด†เดชเตเดชเต-เดŸเดพเด—เต โ€” เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดš เดชเดคเดฟเดชเตเดชเตเด•เตพ เดŸเดพเด—เต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดˆ เดŸเดพเด—เดฟเดจเตเดณเตเดณเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเด‚ เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต; เด•เตเดฌเต‡เตผเดจเต†เดฑเตเดฑเดธเดฟเตฝ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดจเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, qbec เด…เดตเดฏเตเดฎเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเต‡ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เต‚.
เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ, เด“เดฐเต‹ เด…เดตเดฒเต‹เด•เดจเดคเตเดคเดฟเดจเตเด‚ เดจเดฎเตเดฎเตพ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด…เดจเตเดคเดฐเต€เด•เตเดทเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เด…เดคเต‡เดคเต เดตเต€เดฃเตเดŸเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.

เด‡เดตเดฟเดŸเต†เดฏเตเด‚ เดจเดฎเตเดฎเตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต qbec เด…เดตเดฒเต‹เด•เดจเด‚ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเด•, เด‡เดคเดฟเดจเตเดชเด•เดฐเดฎเดพเดฏเดฟ qbec เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเด• โ€” เดจเดฎเตเดฎเตเดŸเต† เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดตเตเดฏเดคเตเดฏเดพเดธเด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจ เดจเดฟเดฎเดฟเดทเด‚ เด‡เดคเดพเดฃเต (เด…เดตเดฒเต‹เด•เดจเดตเตเด‚ เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเตเด‚):

เดšเต‡เตผเด•เตเด•เดพเด‚ เด…เดตเดฒเต‡เดพเด•เดจเด‚ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดกเดฟเดชเตเดฒเต‹เดฏเต/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต/qbec.yaml

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

เดชเดฟเดจเตเดจเต† เดžเด™เตเด™เตพ เด…เดคเต เดชเตเดฐเด–เตเดฏเดพเดชเดฟเด•เตเด•เตเด‚ เดกเดฟเดชเตเดฒเต‹เดฏเต/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต/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

เด…เดคเดฟเดจเดพเดฏเดฟ เดจเดฎเตเดฎเตพ เด‡เดทเตเดŸเดพเดจเตเดธเตƒเดค เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดŽเดดเตเดคเตเด‚ เดกเดฟเดชเตเดฒเต‹เดฏเต/เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต/เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเตโ€Œเดธเต/เดฑเดฟเดตเตเดฏเต‚.เดฒเดฟเดฌเตโ€Œเดธเดฃเต†เดฑเตเดฑเต:

// 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',
    },
  },
}

เดจเดฎเตเด•เตเด•เต เดœเต‹เดฒเดฟเดฏเต† เด…เดŸเตเดคเตเดคเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚ เดธเตเดฑเตเดฑเต‹เดชเตเดชเต_เดฑเดฟเดตเตเดฏเต‚, เดฌเตเดฐเดพเดžเตเดšเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด‚, เด…เดคเดฟเดจเดพเตฝ gitlab เด…เดคเต เดšเต†เด•เตเด•เตเด”เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดฟเดฒเตเดฒ, เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. GIT_STRATEGY: เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เดชเดฟเดจเตเดจเต€เดŸเต เดจเดฎเตเดฎเตพ เด•เตเดฒเต‹เตบ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เดฏเดœเดฎเดพเดจเดจเต-เด…เดคเดฟเดฒเต‚เดŸเต† เด…เดตเดฒเต‹เด•เดจเด‚ เดถเดพเด–เดพเดชเดฐเดฎเดพเดฏเดฟ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•.
เด‡เดคเต เด…เตฝเดชเตเดชเด‚ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฃเต, เดชเด•เตเดทเต‡ เด‡เดคเดฟเดฒเตเด‚ เดฎเดจเต‹เดนเดฐเดฎเดพเดฏ เด’เดฐเต เดฎเดพเตผเด—เด‚ เดžเดพเตป เด‡เดคเตเดตเดฐเต† เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.
เด’เดฐเต เดฌเดฆเตฝ เด“เดชเตเดทเตป, เด“เดฐเต‹ เด…เดตเดฒเต‹เด•เดจเดตเตเด‚ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต, เด…เดคเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดจเต€เด•เตเด•เด‚เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต.

เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต:

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

git push, git เดšเต†เด•เตเด•เตเด”เดŸเตเดŸเต -b เดŸเต†เดธเตเดฑเตเดฑเต, เดœเดฟเดฑเตเดฑเต เดชเตเดทเต เด’เดฑเดฟเดœเดฟเตป เดŸเต†เดธเตเดฑเตเดฑเต, เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต:

Gitlab-เตฝ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเตเดŸเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต.

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹? เด•เตŠเดณเตเดณเดพเด‚, เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เดŸเต†เดธเตเดฑเตเดฑเต เดฌเตเดฐเดพเดžเตเดšเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเด‚: เดœเดฟเดฑเตเดฑเต เดšเต†เด•เตเด•เตเด”เดŸเตเดŸเต เดฎเดพเดธเตเดฑเตเดฑเตผ, เดœเดฟเดฑเตเดฑเต เดชเตเดทเต เด‰เดคเตเดญเดตเด‚: เดŸเต†เดธเตเดฑเตเดฑเต, เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดœเต‹เดฒเดฟเด•เตพ เดชเดฟเดถเด•เตเด•เดณเดฟเดฒเตเดฒเดพเดคเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเตเดตเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดฒเต† เดเดคเตŠเดฐเต เดกเดตเดฒเดชเตเดชเตผเด•เตเด•เตเด‚ เดถเดพเด–เด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเต เดžเดพเตป เด‡เดตเดฟเดŸเต† เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดฏเดพเตพเด•เตเด•เต เดฎเดพเดฑเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. .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 push, เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต:

เด…เดตเดฒเต‹เด•เดจ เด†เดชเตเดชเต เดฌเดŸเตเดŸเดฃเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

เดœเต‹เดฒเดฟ เด•เดดเดฟเดžเตเดžเต!

เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ:

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเตเด•เตเด•เต เดจเดจเตเดฆเดฟ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดŸเตเดตเต†เดจเตเดจเต เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต. Kubernetes-เตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดคเดฟเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต

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

DDoS เดชเดฐเดฟเดฐเด•เตเดทเดฏเตเดณเตเดณ เดธเตˆเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดนเต‹เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดตเดพเด™เตเด™เตเด•, VPS VDS เดธเต†เตผเดตเดฑเตเด•เตพ ๐Ÿ”ฅ DDoS เดชเดฐเดฟเดฐเด•เตเดท, VPS VDS เดธเต†เตผเดตเดฑเตเด•เตพ เด‰เดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต เดนเต‹เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดตเดพเด™เตเด™เต‚ | ProHoster