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

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

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

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

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

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

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

  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/ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดคเตเดคเดพเดฏเดฟ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•, เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเดฏเดฟเตฝ เดตเดฐเตเดคเตเดคเดฟเดฏ เดŽเดฒเตเดฒเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเด‚ เดฌเตเดฐเต—เดธเดฑเดฟเดฒเต† เดคเตเดฑเดจเตเดจ เดชเต‡เดœเต เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•, เดตเดณเดฐเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต!

เด’เดฐเต เด•เดตเตผ เดชเต‡เดœเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚ เด‰เดณเตเดณเดŸเด•เตเด•เด‚/_index.md:

# 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

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

เด…เด™เตเด™เดจเต†, เดชเดพเดคเดฏเดฟเดฒเต‚เดŸเต† เดžเด™เตเด™เตพ เดžเด™เตเด™เดณเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚ 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" ]

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเดฟเตฝ เดฐเดฃเตเดŸเต†เดฃเตเดฃเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต 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/website - เดจเดฟเด™เตเด™เดณเตเดŸเต† เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเดฟเดจเตเดฑเต† เดชเต‡เดฐเต; เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚, เด…เดคเต เดกเต‹เด•เตเด•เตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดธเตเดตเดฏเดฎเต‡เดต เดฒเต‹เดžเตเดšเต เดšเต†เดฏเตเดฏเตเด‚.

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

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

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

4. qbec-เดจเต† เด…เดฑเดฟเดฏเตเด•

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

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

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

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

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

เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏ เด˜เดŸเด•เด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚ เด˜เดŸเด•เด™เตเด™เตพ/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 เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเดพเดงเดพเดฐเดฃ เดฏเดพเดฎเดฟเดจเต† json เด†เด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเดพเตป, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด˜เดŸเด•เด™เตเด™เดณเดฟเตฝ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตŠเดจเตเดจเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด…เดต เดธเดพเดงเดพเดฐเดฃ เดฏเดพเดฎเดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเด‚.

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

เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดตเดฟเดฎเตเดฎเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดชเตเดฒเด—เดฟเตป เด‰เดฃเตเดŸเต vim-jsonnet, เด…เดคเต เดธเดฟเดจเตเดฑเดพเด•เตเดธเต เดนเตˆเดฒเตˆเดฑเตเดฑเดฟเด‚เด—เต เด“เดฃเดพเด•เตเด•เดฟ เดธเตเดตเดฏเดฎเต‡เดต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต jsonnet fmt เดจเดฟเด™เตเด™เตพ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดฎเตเดชเต‹เดดเต†เดฒเตเดฒเดพเด‚ (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 เด’เดฐเต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเต เดจเตฝเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต เดŽเดฒเตเดฒเดพเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดŸเต‹เด•เตเด•เตบ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> 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=true - kubernetes-executor เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เดณเตเดŸเต† เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเต‹เดกเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเตป เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เดฑเดฃเตเดฃเดฑเดฟเดจเต เดจเตฝเด•เตเดจเตเดจเต.

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

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

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

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

6. เด•เตเดฏเตเดฌเดฟเด‡เดธเดฟเดฏเดฟเตฝ เดนเต†เตฝเด‚ เดšเดพเตผเดŸเตเดŸเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•

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

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

cd deploy
qbec init gitlab-runner
cd gitlab-runner

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

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

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/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,
  }
)

เด†เดฆเตเดฏ เดตเดพเดฆเด‚ 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,
      },
    },
  },
}

เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด• เดฑเดฃเตเดฃเตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดŸเต‹เด•เตเด•เตบ เดžเด™เตเด™เตพ เด’เดฐเต เดฌเดพเดนเตเดฏ เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต เดฐเดนเดธเตเดฏเด™เตเด™เตพ/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-crypt.

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

เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเดจเต เดถเต‡เดทเด‚ เด†เดฆเตเดฏ เด•เดพเดฐเตเดฏเด‚ git-crypt เดžเด™เตเด™เดณเตเดŸเต† เดถเต‡เด–เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เต€เด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

git crypt init

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

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

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

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต PGP เด•เต€ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดคเต เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเตŠเดฐเต เดตเดดเดฟเด•เตเด•เต เดชเต‹เดฏเดฟ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เต€ เด•เดฏเดฑเตเดฑเตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเดพเด‚:

git crypt export-key /path/to/keyfile

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

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

* 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. เด’เดฐเต เดŸเต‚เตพเดฌเต‹เด•เตเดธเต เด‡เดฎเต‡เดœเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•

เดŸเต‚เตพเดฌเต‹เด•เตเดธเต เด‡เดฎเต‡เดœเต เดŽเดจเตเดจเดคเต เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เดŸเต‚เดณเตเด•เดณเตเดฎเตเดณเตเดณ เด’เดฐเต เดšเดฟเดคเตเดฐเดฎเดพเดฃเต. เดธเดพเดงเดพเดฐเดฃ เดตเดฟเดจเตเดฏเดพเดธ เดœเต‹เดฒเดฟเด•เตพ เดšเต†เดฏเตเดฏเดพเตป 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

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

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

เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฎเตเด•เตเด•เต 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 เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต เดชเต‡เดฐเต เด˜เดŸเด•เดคเตเดคเดฟเดจเต rbac

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

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 เดŸเดพเด—เตเด•เดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. เด’เดฐเต เดชเตเดคเดฟเดฏ เดŸเดพเด—เตเดณเตเดณ เด“เดฐเต‹ เดชเตเดทเตเด‚ เดˆ เดŸเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดจเดฟเตผเดฎเตเดฎเดพเดฃเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด‚.

เดจเดฎเตเด•เตเด•เต เด‡เดคเตเดšเต†เดฏเตเดฏเดพเด‚ git push --tags, เดจเดฎเตเดฎเตเดŸเต† เด†เดฆเตเดฏ เดชเตˆเดชเตเดชเตเดฒเตˆเตป เดจเต‹เด•เตเด•เดพเด‚:

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

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

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

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

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

Gitlab-runner-เดจเต เดžเด™เตเด™เดณเตเดŸเต† เดฐเดนเดธเตเดฏเด™เตเด™เตพ เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เด•เต€ เด•เดฏเดฑเตเดฑเตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดžเด™เตเด™เดณเตเดŸเต† 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-เดจเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดชเตเดคเดฟเดฏ เด“เดชเตเดทเดจเตเด•เตพ เดžเด™เตเด™เตพ เด‡เดตเดฟเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต:

  • --เดฑเต‚เดŸเตเดŸเต เดšเดฟเดฒเดคเต/เด†เดชเตเดชเต - เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต
  • --force:k8s-context __incluster__ - เดœเดฟเดŸเดฟเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด…เดคเต‡ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดชเดฑเดฏเตเดจเตเดจ เด’เดฐเต เดฎเดพเดœเดฟเด•เต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดพเดฃเดฟเดคเต. เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† kubeconfig-เตฝ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เด’เดฐเต Kubernetes เดธเต†เตผเดตเตผ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป qbec เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚.
  • --เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด• โ€” qbec เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดฑเต†เดกเดฟ เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเดคเตเดตเดฐเต† เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเตป 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"

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

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

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

เดฎเดพเดธเตเดฑเตเดฑเดฑเดฟเดจเดพเดฏเตเดณเตเดณ เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดจเตเดฑเต† เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเต

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

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

เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•/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, เด…เดตเดฟเดŸเต† เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเด• เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ:

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-เดจเตเดณเตเดณ เด’เดฐเต เดชเตเดคเดฟเดฏ เด“เดชเตเดทเตป เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต: --app-tag - เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเดคเดฟเดชเตเดชเตเด•เตพ เดŸเดพเด—เตเดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดˆ เดŸเดพเด—เดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเด‚ เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต; 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, เดฌเตเดฐเดพเดžเตเดšเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด‚, เด…เดคเดฟเดจเดพเตฝ gitlab เด…เดคเต เดšเต†เด•เตเด•เตเด”เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดฟเดฒเตเดฒ. GIT_STRATEGY: เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เดชเดฟเดจเตเดจเต€เดŸเต เดžเด™เตเด™เตพ เด•เตเดฒเต‹เตบ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เดฏเดœเดฎเดพเดจเดจเต- เดฌเตเดฐเดพเดžเตเดšเต เดšเต†เดฏเตเดคเต เด…เดคเดฟเดฒเต‚เดŸเต† เด…เดตเดฒเต‹เด•เดจเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•.
เด‡เดคเต เด…เตฝเดชเตเดชเด‚ เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดฎเตเดฃเตเดŸเดพเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด•เต‚เดŸเตเดคเตฝ เดฎเดจเต‹เดนเดฐเดฎเดพเดฏ เด’เดฐเต เดตเดดเดฟ เดžเดพเตป เด‡เดคเตเดตเดฐเต† เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.
เด’เดฐเต เดนเต‹เดŸเตเดŸเตฝ เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เด“เดฐเต‹ เด…เดตเดฒเต‹เด•เดจเดตเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดฎเดฑเตเดฑเตŠเดฐเต เด“เดชเตเดทเตป, เด…เดคเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดชเตŠเดณเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต.

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

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

git push, git เดšเต†เด•เตเด•เตเด”เดŸเตเดŸเต -b เดŸเต†เดธเตเดฑเตเดฑเต, git เดชเตเดทเต เด’เดฑเดฟเดœเดฟเตป เดŸเต†เดธเตเดฑเตเดฑเต, เดšเต†เด•เตเด•เต:

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

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

เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹? - เด•เตŠเดณเตเดณเดพเด‚, เดžเด™เตเด™เดณเตเดŸเต† เดŸเต†เดธเตเดฑเตเดฑเต เดฌเตเดฐเดพเดžเตเดšเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•: git เดšเต†เด•เตเด•เต out เดŸเตเดŸเต เดฎเดพเดธเตเดฑเตเดฑเตผ, 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 push, เด•เต‚เดŸเดพเดคเต† เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•:

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

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

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

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

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

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

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