เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เบชเบฐเบšเบฒเบเบ”เบต! เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบตเปˆเป€เบขเบฑเบ™เบซเบผเบฒเบเป„เบ”เป‰เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒเบ—เบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš Docker เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš Kubernetes. เปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบซเบฅเบดเป‰เบ™เบเบฑเบš GitLab, เบชเบถเบเบชเบฒเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบกเบฑเบ™เบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เปเบฅเบฐ, เปเบ™เปˆเบ™เบญเบ™, เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ—เปเปˆ.

เบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ”เบปเบ™เปƒเบˆเบˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒ kubernetes.io, เป€เบŠเบดเปˆเบ‡เปเบกเปˆเบ™เบœเบฐเบฅเบดเบ”เบˆเบฒเบ เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบชเบฐเบ™เบธเบเป€เบเบตเบ—เบตเปˆเบชเบปเปˆเบ‡, เบซเบธเปˆเบ™เบเบปเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเป‰เบฒเบ‡เบชเบฐเบšเบฑเบšเบชเบฐเปเบ”เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบšเบดเปˆเบ‡.

เบ‚เป‰เบญเบเบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบ•เปˆเบเปเปˆเบชเป‰เบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ Gitlab CI เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŸเบฃเบตเบ—เบตเปˆเบ‚เป‰เบญเบเป€เบ„เบตเบเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบเบฑเบš Kubernetes. เบกเบทเป‰เบ™เบตเป‰เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เป‰เบญเบเบˆเบฐเบšเบญเบเป€เบˆเบปเป‰เบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™.

เบšเบปเบ”เบ„เบงเบฒเบกเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบŠเบฑเปˆเบ™:
Hugo, qbec, เบ„เบฒเบ™เบดเป‚เบ, git-crypt ะธ GitLab CI เบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

เป€เบ™เบทเป‰เบญเปƒเบ™

  1. เบžเบปเบšเบเบฑเบš Hugo
  2. เบเบณเบฅเบฑเบ‡เบเบฐเบเบฝเบก Dockerfile
  3. เบฎเบนเป‰เบˆเบฑเบเบเบฑเบš kaniko
  4. เบฎเบนเป‰เบˆเบฑเบเบเบฑเบš qbec
  5. เบžเบฐเบเบฒเบเบฒเบก Gitlab-runner เบเบฑเบš Kubernetes-executor
  6. เบ™เบณเปƒเบŠเป‰เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Helm เบเบฑเบš qbec
  7. เปเบ™เบฐเบ™เบณ git-crypt
  8. เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบเปˆเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบท
  9. เบ—เปเปˆเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบเบญเบšเบฎเบนเบšเบžเบฒเบšเป‚เบ”เบ tags
  10. เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”
  11. เบ›เบญเบกเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบเบญเบšเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบŠเบธเบเบเบนเป‰เปƒเบซเป‰เปเบกเปˆเบšเบปเบ”
  12. เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง
  13. เบเบงเบ”เป€เบšเบดเปˆเบ‡เปเบญเบฑเบš

1. เบฎเบนเป‰เบˆเบฑเบเบเบฑเบš Hugo

เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเป€เบœเบตเบเปเบœเปˆเป€เบญเบเบฐเบชเบฒเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ Hugo. Hugo เปเบกเปˆเบ™เบœเบนเป‰เบชเป‰เบฒเบ‡เป€เบ™เบทเป‰เบญเบซเบฒเบ„เบปเบ‡เบ—เบตเปˆ.

เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบšเปเปˆเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เป„เบŸเบŸเป‰เบฒเบชเบฐเบ–เบดเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบ•เบทเปˆเบกเบญเบตเบเป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™. เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เปเบฒเบกเบฐเบ”เบฒเบ—เบตเปˆเบกเบตเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบšเบฒเบ‡ PHP, เป€เบŠเบดเปˆเบ‡, เป€เบกเบทเปˆเบญเบ–เบทเบเบฎเป‰เบญเบ‡เบ‚เปเป‚เบ”เบเบœเบนเป‰เปƒเบŠเป‰, เบเบฒเบ™เบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเป€เบงเบฑเบšเบ•เปˆเบฒเบ‡เป†, เป€เบ„เบทเปˆเบญเบ‡เบชเป‰เบฒเบ‡เปเบšเบšเบ„เบปเบ‡เบ—เบตเปˆเป„เบ”เป‰เบ–เบทเบเบญเบญเบเปเบšเบšเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบญเบปเบฒเปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™, เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบŠเบธเบ”เบ‚เบญเบ‡เป„เบŸเบฅเปŒเปƒเบ™ Markdown markup เปเบฅเบฐเบฎเบนเบšเปเบšเบšเบซเบปเบงเบ‚เปเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบฅเบงเบšเบฅเบงเบกเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเปเบฒเป€เบฅเบฑเบ”เบชเบปเบกเบšเบนเบ™.

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเปเบฅเบฐเบŠเบธเบ”เบ‚เบญเบ‡เป„เบŸเบฅเปŒ HTML เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เป€เบŠเบดเปˆเบ‡เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบญเบฑเบšเป‚เบซเบฅเบ”เป„เบ›เบเบฑเบ‡เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเบกเบตเบฅเบฒเบ„เบฒเบ–เบทเบเปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Hugo เบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เปเบฅเบฐเบฅเบญเบ‡เบกเบฑเบ™เบญเบญเบ:

เบเบณเบฅเบฑเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบงเบฑเบšเป„เบŠเปƒเปเปˆ:

hugo new site docs.example.org

เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ git repository:

cd docs.example.org
git init

เบกเบฒเบฎเบญเบ”เบ›เบฐเบˆเบธ, เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™ pristine เปเบฅเบฐเป€เบžเบทเปˆเบญเปƒเบซเป‰เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบกเบฑเบ™, เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบซเบปเบงเบ‚เปเป‰เปƒเบ”เบซเบ™เบถเปˆเบ‡; เบซเบปเบงเบ‚เปเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบŠเบธเบ”เบ‚เบญเบ‡เปเบกเปˆเปเบšเบšเปเบฅเบฐเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™.

เบชเปเบฒเบฅเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰ เบฎเบฝเบ™เบฎเบนเป‰, เป€เบŠเบดเปˆเบ‡, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเป€เบญเบเบฐเบชเบฒเบ™.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเป€เบ›เบฑเบ™เบžเบดเป€เบชเบ”เบ•เปเปˆเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบšเบฑเบ™เบ—เบถเบเป„เบŸเบฅเปŒเบซเบปเบงเบ‚เปเป‰เปƒเบ™ repository เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ; เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰. git เป‚เบกเบ”เบนเบ™เบเปˆเบญเบ:

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

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, repository เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบกเบตเบžเบฝเบ‡เปเบ•เปˆเป„เบŸเบฅเปŒเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เป‚เบ”เบเบเบปเบ‡เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เปเบฅเบฐเบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš repository เบชเบฐเป€เบžเบฒเบฐเปเบฅเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปƒเบ™เบกเบฑเบ™, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบฑเบ™เบชเบฐเป€เบซเบกเบตเบชเบฒเบกเบฒเบ”เบ”เบถเบ‡เบˆเบฒเบเปเบซเบผเปˆเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเปเบฅเบฐเบšเปเปˆเบ•เป‰เบญเบ‡เบขเป‰เบฒเบ™. เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰.

เปƒเบซเป‰เปเบเป‰เป„เบ‚เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ 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

เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ/ เปเบฅเบฐเบˆเบฐเป€เบ›เบฑเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.
เปเบกเปˆเบ™เปเบฅเป‰เบง, เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เปƒเบซเป‰เป€เบžเบตเปˆเบกเบกเบฑเบ™เบ—เบฑเบ™เบ—เบต .gitignore:

echo /public > .gitignore

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

2. เบเบฒเบ™เบเบฐเบเบฝเบก Dockerfile

เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡ repository เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบ‚เป‰เบญเบเบกเบฑเบเบˆเบฐเปƒเบŠเป‰เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™:

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

  • dockerfiles/ โ€” เบกเบตเบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบกเบต Dockerfiles เปเบฅเบฐเบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบณเป€เบ›เบฑเบ™เบชเบณเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš Docker เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.
  • เบ™เบณเปƒเบŠเป‰/ โ€” เบ›เบฐโ€‹เบเบญเบšโ€‹เบ”เป‰เบงเบโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบเบฑเบš Kubernetesโ€‹

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡ Dockerfile เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ dockerfiles/เป€เบงเบฑเบšเป„เบŠเบ—เปŒ/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" ]

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, Dockerfile เบกเบตเบชเบญเบ‡เบญเบฑเบ™ เบˆเบฒเบ, เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™ เปเบฅเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบˆเบฒเบเบฎเบนเบšเบžเบฒเบš docker เบชเบธเบ”เบ—เป‰เบฒเบ.
เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบฎเบนเบšเบžเบฒเบšเบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบกเบตเบžเบฝเบ‡เปเบ•เปˆ darkhttpd (เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP เบ™เป‰เปเบฒเบซเบ™เบฑเบเป€เบšเบปเบฒ) เปเบฅเบฐ เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ/ โ€” เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบชเบฐเบ–เบดเบ•เบดเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

3. เบฎเบนเป‰เบˆเบฑเบเบเบฑเบš kaniko

เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เบœเบนเป‰เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš docker, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเปƒเบŠเป‰ เบ„เบฒเบ™เบดเป‚เบ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบต docker daemon, เปเบฅเบฐเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป„เบ”เป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบกเปเบฅเบฐ cache เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เป‚เบ”เบเบเบปเบ‡เปƒเบ™เบฅเบตเบˆเบดเบ”เบŠเบต, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบเปเบฒเบˆเบฑเบ”เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบกเบตเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ„เบปเบ‡เบ—เบตเปˆเป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบš.

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš, เบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฑเบ™เบˆเบธเบเบฑเบš kaniko เบ›เบฐเบ•เบดเบšเบฑเบ” เปเบฅเบฐเบœเปˆเบฒเบ™เบกเบฑเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™; เบ™เบตเป‰เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™, เบœเปˆเบฒเบ™ docker:

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 โ€” เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เบฎเบนเบš docker เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹; เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡โ€‹, เบกเบฑเบ™โ€‹เบˆเบฐโ€‹เบ–เบทเบโ€‹เป€เบ›เบตเบ”โ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ”โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบˆเบปเบ”โ€‹เบ—เบฐโ€‹เบšเบฝเบ™ dockerโ€‹.

Parameter --cache เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” cache เบŠเบฑเป‰เบ™เปƒเบ™ docker registry; เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบˆเบฐเบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™ registry.gitlab.com/kvaps/docs.example.org/website/cache, เปเบ•เปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบฐเบšเบธเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบญเบทเปˆเบ™เป‚เบ”เบเปƒเบŠเป‰เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต --cache-repo.

เบžเบฒเบšเบซเบ™เป‰เบฒเบˆเปเบ‚เบญเบ‡ docker-registry

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

4. เบฎเบนเป‰เบˆเบฑเบ qbec

Qbec เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เบเปˆเบฝเบงเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™ manifests เปเบฅเบฐเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบเบฑเบš Kubernetes. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Jsonnet เป€เบ›เบฑเบ™ syntax เบ•เบปเป‰เบ™เบ•เปเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เปƒเบ™เบซเบผเบฒเบเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เปเบฅเบฐเบเบฑเบ‡เป€เบเบทเบญเบšเบซเบกเบปเบ”เบเบฒเบ™เบฅเบปเบšเบฅเป‰เบฒเบ‡เบเบฒเบ™เบŠเป‰เปเบฒเบเบฑเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”.

เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบซเป‰เบเบฑเบšเบซเบผเบฒเบเป†เบเบธเปˆเบกเบ—เบตเปˆเบกเบตเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เปƒเบ™ Git.

Qbec เบเบฑเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Helm เป‚เบ”เบเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบเบฑเบš manifests เบ›เบปเบเบเบฐเบ•เบด, เบฅเบงเบกเบ—เบฑเบ‡เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฐเบซเบกเบฑเบเบ‚เปเป€เบญเบปเบฒเบเบฒเบ™เบเบฒเบเบžเบฑเบ™เบ•เปˆเบฒเบ‡เป†เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เปเบฅเบฐเบ™เบตเป‰, เปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบˆเบฑเบ”เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™. เปƒเบŠเป‰ ChartMuseum. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบฅเบฐเบชเบฐเปเบ”เบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบ git, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเป€เบ›เบฑเบ™.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบงเป‰เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต เบ™เบณเปƒเบŠเป‰/:

mkdir deploy
cd deploy

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

qbec init website
cd website

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

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

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ qbec.yaml:

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

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ•เบปเป‰เบ™เบ•เป spec. เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก, qbec เป„เบ”เป‰เบชเป‰เบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเปเบฅเป‰เบงเปเบฅเบฐเป€เบญเบปเบฒเบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš namespace เบˆเบฒเบ kubeconfig เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.
เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ deploy เบเบฑเบš Default เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก, qbec เบชเบฐเป€เบซเบกเบตเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเบเบฑเบšเบเบธเปˆเบก Kubernetes เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปเบฅเบฐเบเบฑเบš namespace เบ—เบตเปˆเบฅเบฐเบšเบธ, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบšเปเบฅเบดเบšเบปเบ”เปเบฅเบฐ namespaces เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰.
เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเบฑเบšเป€เบ”เบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เป„เบŸเบฅเปŒเบ™เบตเป‰เป„เบ”เป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒ.

เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบฑเบ‡เปเบปเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™ qbec.yaml, เปเบฅเบฐเปƒเบ™เป„เบŸเบฅเปŒ params.libsonnet, เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบšเบญเบเบงเปˆเบฒเบšเปˆเบญเบ™เปƒเบ”เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ.

เบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบชเบญเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต:

  • เบญเบปเบ‡เบ›เบฐเบเบญเบš/ โ€” manifests เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เป„เบงเป‰โ€‹เบขเบนเปˆโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹; เบžเบงเบโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบ—เบฑเบ‡โ€‹เปƒเบ™โ€‹เป„เบŸเบฅโ€‹เปŒ jsonnet เปเบฅเบฐ yaml เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบด
  • เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก/ โ€” เปƒเบ™โ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบ•เบปเบงโ€‹เปเบ›โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ” (เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹) เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบชเบฐโ€‹เบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบกโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹.

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบญเบ‡เป„เบŸเบฅเปŒ:

  • เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก/base.libsonnet - เบกเบฑเบ™เบˆเบฐเบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบฑเบ‡เบซเบกเบปเบ”
  • เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก/default.libsonnet โ€” เบ›เบฐโ€‹เบเบญเบšโ€‹เบ”เป‰เบงเบโ€‹เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™ overridden เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบชเบดเปˆเบ‡โ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบกโ€‹ Default

เป€เบ›เบตเบ”เปƒเบซเป‰ เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก/base.libsonnet เปเบฅเบฐเป€เบžเบตเปˆเบกเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบชเปเบฒเบฅเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™:

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

เปƒเบซเป‰เบชเป‰เบฒเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ components/website.jsonnet:

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

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

เปƒเบ™เป„เบŸเบฅเปŒเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบชเบฒเบกเบซเบ™เปˆเบงเบ Kubernetes เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™: เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ ะธ Ingress. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบžเบงเบเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบ•เปˆเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เบซเบ™เบถเปˆเบ‡เบˆเบฐเบžเบฝเบ‡เบžเปเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ.

syntax jsonnet เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš json เบ›เบปเบเบเบฐเบ•เบด, เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, json เบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™ jsonnet เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเป‰เบง, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™เบญเบญเบ™เป„เบฅเบ™เปŒเป€เบŠเบฑเปˆเบ™: yaml2json เป€เบžเบทเปˆเบญเบ›เปˆเบฝเบ™ yaml เบ›เบปเบเบเบฐเบ•เบดเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบ›เบฑเบ™ json, เบซเบผเบท, เบ–เป‰เบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบšเปเปˆเบกเบตเบ•เบปเบงเปเบ›เปƒเบ”เป†, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡ yaml เบ›เบปเบเบเบฐเบ•เบด.

เป€เบกเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš jsonnet เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡ plugin เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบ™เบฒเบ—เบดเบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบต plugin เบชเปเบฒเบฅเบฑเบš vim vim-jsonnet, เป€เบŠเบดเปˆเบ‡เป€เบ›เบตเบ”เบเบฒเบ™เป€เบ™เบฑเป‰เบ™เป„เบงเบเบฐเบเบญเบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” jsonnet fmt เบ—เบธเบเป†เบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบšเบฑเบ™เบ—เบถเบ (เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡ jsonnet).

เบ—เบธเบเบขเปˆเบฒเบ‡เบžเป‰เบญเบกเปเบฅเป‰เบง, เบ”เบฝเบงเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ™เบณเปƒเบŠเป‰เป„เบ”เป‰:

เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš, เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™:

qbec show default

เบขเบนเปˆเบ—เบตเปˆเบœเบปเบ™เบœเบฐเบฅเบดเบ”, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™ yaml manifests เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบœเบปเบ™เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบเบธเปˆเบกเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เบ”เบตเบซเบผเบฒเบ, เบ”เบฝเบงเบ™เบตเป‰เบ™เบณเปƒเบŠเป‰:

qbec apply default

เบขเบนเปˆเบ—เบตเปˆเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™เบเบธเปˆเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, qbec เบˆเบฐเบ‚เปเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ•เบปเบเบฅเบปเบ‡เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ”เบเบเบฒเบ™เบžเบดเบก. y เบ—เปˆเบฒเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เบขเบทเบ™เบขเบฑเบ™เบ„เบงเบฒเบกเบ•เบฑเป‰เบ‡เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบกเปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰!

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒ:

qbec diff default

เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเปเบ™เบงเปƒเบ”เบ•เปเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

5. เบฅเบญเบ‡เปƒเบŠเป‰ Gitlab-runner เบเบฑเบš Kubernetes-executor

เบˆเบปเบ™เบเปˆเบงเบฒเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเปƒเบŠเป‰เบ›เบปเบเบเบฐเบ•เบด gitlab-runner เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเบเบฝเบกเป„เบงเป‰เบเปˆเบญเบ™ (LXC container) เบ—เบตเปˆเบกเบต shell เบซเบผเบท docker-executor. เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ™เบฑเบเปเบฅเปˆเบ™เบ›เบฐเป€เบžเบ”เบ™เบตเป‰เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เปƒเบ™เบ—เบปเปˆเบงเป‚เบฅเบเบขเบนเปˆเปƒเบ™ gitlab เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบเบฑเบšเบเปเบฒเบฎเบนเบšเบžเบฒเบš docker เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”.

เปเบ•เปˆเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™, เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบ—เบตเปˆเบชเบธเบ”, เบ—เบฑเบ‡เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž. เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบเบงเปˆเบฒเปเบฅเบฐเบกเบตเบญเบธเบ”เบปเบกเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบกเบตเบ™เบฑเบเปเบฅเปˆเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™, เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก.

เป‚เบŠเบเบ”เบต, เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ gitlab-runner เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป‚เบ”เบเบเบปเบ‡เปƒเบ™ Kubernetes.

Gitlab เบชเบฐเบซเบ™เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบšเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ gitlab-runner เบเบฑเบš Kubernetes. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบกเปˆเบ™เบŠเบญเบเบซเบฒ token เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™ เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ -> CI / CD -> Runners เปเบฅเบฐโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบœเบนเป‰โ€‹เบ›เบปเบโ€‹เบ„เบญเบ‡โ€‹:

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.

เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ–เบทเบเป€เบฎเบฑเบ”เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เบ—เปˆเบฒเบ™เบ„เบงเบ™เป€เบซเบฑเบ™เบ™เบฑเบเปเบฅเปˆเบ™เบ—เบตเปˆเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบขเบนเปˆเปƒเบ™เบžเบฒเบ Runners, เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบžเบฒเบšเปœเป‰เบฒเบˆเปเบ‚เบญเบ‡เบ™เบฑเบเปเบฅเปˆเบ™เบ—เบตเปˆเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเบกเบฒ

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เบกเบฑเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบšเป? - เปเบกเปˆเบ™โ€‹เปเบฅเป‰เบงโ€‹, เบกเบฑเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹เบ—เบตเปˆโ€‹! เบšเปเปˆเบซเบเบธเป‰เบ‡เบเบฒเบเบเบฑเบšเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ™เบฑเบเปเบฅเปˆเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เบˆเบฒเบเบ™เบตเป‰เป„เบ›เบ™เบฑเบเปเบฅเปˆเบ™เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡ เปเบฅเบฐเบ—เปเบฒเบฅเบฒเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

6. เบ™เบณเปƒเบŠเป‰เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Helm เบเบฑเบš QBEC

เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ gitlab-runner เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ Git เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบญเบฐเบ—เบดเบšเบฒเบเบกเบฑเบ™เป€เบ›เบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ เป€เบงเบฑเบšเป„เบŠเบ—เปŒ, เปเบ•เปˆเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบžเบงเบเป€เบฎเบปเบฒเบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเป€เบ™เบปเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ เป€เบงเบฑเบšเป„เบŠเบ—เปŒ เบกเบฑเบเบซเบผเบฒเบ, เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบš gitlab-runner, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบ™เบณเปƒเบŠเป‰เบžเบฝเบ‡เบ„เบฑเป‰เบ‡เบ”เบฝเบงเบ•เปเปˆเบเบธเปˆเบก Kubernetes. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

เป€เบงเบฅเบฒเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเป€เบ–เบดเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™ Kubernetes เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เปเบ•เปˆเบˆเบฐเป€เบญเบปเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Helm เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบก. เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบšเบ‚เบญเบ‡ qbec เปเบกเปˆเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Helm เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ Git.

เปƒเบซเป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ git submodule:

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

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต เบœเบนเป‰เบ‚เบฒเบ/gitlab-runner เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบตเปˆเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเปเบฒเบฅเบฑเบš gitlab-runner.

เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ repositories เบญเบทเปˆเบ™เป†, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, repository เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™. https://github.com/helm/charts

เปƒเบซเป‰เบญเบฐเบ—เบดเบšเบฒเบเบญเบปเบ‡เบ›เบฐเบเบญเบš components/gitlab-runner.jsonnet:

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

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

เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบเบฑเบš เบ‚เบฐเบซเบเบฒเบHelmTemplate เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบชเบนเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ params.values, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฒเบเบฑเบšเบงเบฑเบ”เบ–เบธ

  • เบŠเบทเปˆเปเบกเปˆเปเบšเบš - เบŠเบทเปˆโ€‹เบ›เปˆเบญเบโ€‹
  • namespace โ€” 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,
      },
    },
  },
}

เบˆเปˆเบฒเบเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ runnerRegistrationToken เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบˆเบฒเบเป„เบŸเบฅเปŒเบžเบฒเบเบ™เบญเบ เบ„เบงเบฒเบกเบฅเบฑเบš/base.libsonnet, เปƒเบซเป‰โ€‹เป€เบฎเบปเบฒโ€‹เบชเป‰เบฒเบ‡โ€‹เบกเบฑเบ™โ€‹:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ:

qbec show default

เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบฅเปเบฒเบ”เบฑเบš, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบฅเบถเบšเบเบฒเบ™เบ›เปˆเบญเบเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบœเปˆเบฒเบ™เบกเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™ Helm:

helm uninstall gitlab-runner

เปเบฅเบฐ เบ™เบณ เปƒเบŠเป‰เบกเบฑเบ™เบ”เป‰เบงเบเบงเบดเบ—เบตเบ”เบฝเบงเบเบฑเบ™, เปเบ•เปˆเบœเปˆเบฒเบ™ qbec:

qbec apply default

7. เบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเบเปˆเบฝเบงเบเบฑเบš git-crypt

Git-crypt เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป‚เบ›เปˆเบ‡เปƒเบชเบชเปเบฒเบฅเบฑเบš repository เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบš 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 เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบš repository เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

git crypt init

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบเบฐเปเบˆ PGP, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™เบœเบนเป‰เบฎเปˆเบงเบกเบกเบทเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰:

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

เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰เบเบฐเปเบˆเบชเปˆเบงเบ™เบ•เบปเบงเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒ.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบกเบตเบเบฐเปเบˆ PGP เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ„เบฒเบ”เบซเบงเบฑเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ›เบ—เบฒเบ‡เบญเบทเปˆเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบญเบญเบเบเบฐเปเบˆเป‚เบ„เบ‡เบเบฒเบ™:

git crypt export-key /path/to/keyfile

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบœเบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบกเบตเบเบฒเบ™เบชเบปเปˆเบ‡เบญเบญเบ เป„เบŸเบฅเปŒเบ„เบต เบˆเบฐเบชเบฒเบกเบฒเบ”เบ–เบญเบ”เบฅเบฐเบซเบฑเบ” repository เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰.

เบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบ•เบฑเป‰เบ‡เบ„เบงเบฒเบกเบฅเบฑเบšเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.
เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเป€เบ•เบทเบญเบ™เบ—เปˆเบฒเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบเบฒเบ™ deploy/gitlab-runner/, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบตเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต เบ„เบงเบฒเบกเบฅเบฑเบš/, เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบกเบฑเบ™, เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ เบ„เบงเบฒเบกเบฅเบฑเบš/.gitattributes เป‚เบ”เบโ€‹เบกเบตโ€‹เป€เบ™เบทเป‰เบญโ€‹เปƒเบ™โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

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

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเป€เบ™เบทเป‰เบญเบซเบฒ, เป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบเบฒเบ * เบˆเบฐเบ–เบทเบเบ‚เบฑเบšเบœเปˆเบฒเบ™ git-crypt, เบเบปเบเป€เบงเบฑเป‰เบ™เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ” .gitattributes

เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เปเบฅเปˆเบ™:

git crypt status -e

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ repository เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ—เบฑเบ‡เปเบปเบ”, เบ”เบฝเบงเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบž:

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

เป€เบžเบทเปˆเบญเบšเบฅเบฑเบญเบเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™, เบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™:

git crypt lock

เปเบฅเบฐเบ—เบฑเบ™เบ—เบตเบ—เบธเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบˆเบฐเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบชเบญเบ‡เบญเบฑเบ™, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™เบžเบงเบเบกเบฑเบ™.
เป€เบžเบทเปˆเบญเบ–เบญเบ”เบฅเบฐเบซเบฑเบ” repository, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™:

git crypt unlock

8. เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบเปˆเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบท

เบฎเบนเบšเบเปˆเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปเบกเปˆเบ™เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ™เบณเปƒเบŠเป‰เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบกเบฑเบ™เบˆเบฐเบ–เบทเบเปƒเบŠเป‰เป‚เบ”เบเบ™เบฑเบเปเบฅเปˆเบ™ Gitlab เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เปเบšเบšเบ›เบปเบเบเบฐเบ•เบด.

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบญเบฑเบ™เปƒเบซเบกเปˆ dockerfiles/toolbox/Dockerfile เป‚เบ”เบโ€‹เบกเบตโ€‹เป€เบ™เบทเป‰เบญโ€‹เปƒเบ™โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

FROM alpine:3.11

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

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

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

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

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เปƒเบ™เบฎเบนเบšเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบญเบธเบ›เบฐเบเบญเบ™เบ•เปˆเบฒเบ‡เป†เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบกเบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆ kubectl, เปเบ•เปˆเบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบผเบดเป‰เบ™เบเบฑเบšเบกเบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป„เบฅเบเบฐเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เปเปˆ.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เบชเบทเปˆเบชเบฒเบ™เบเบฑเบš Kubernetes เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบšเบปเบ”เบšเบฒเบ”เบชเปเบฒเบฅเบฑเบš pods เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบ gitlab-runner.

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เปƒเบซเป‰เป„เบ›เบ—เบตเปˆเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบเบฑเบš gitlab-runner:

cd deploy/gitlab-runner

เปเบฅเบฐเป€เบžเบตเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆ components/rbac.jsonnet:

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

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

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปƒเบซเบกเปˆเปƒเบ™ เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก/base.libsonnet, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

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

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

เบˆเปˆเบฒเบเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ $.components.rbac.name เบซเบกเบฒเบเป€เบ–เบดเบ‡ เบŠเบทเปˆ เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบญเบปเบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹ rbac

เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡:

qbec diff default

เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบš Kubernetes:

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. เบ—เปเปˆเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเบ›เบฐเบเบญเบšเบฎเบนเบšเบžเบฒเบšเป‚เบ”เบ tags

เบขเบนเปˆเบฎเบฒเบเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡ .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: เบ›เบปเบเบเบฐเบ•เบด เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ submodules เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”.

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบชเบฐเบšเบฑเบšเบ™เบตเป‰เบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบž v0.0.1 เปเบฅเบฐเป€เบžเบตเปˆเบกเปเบ—เบฑเบ:

git tag v0.0.1

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเปเบ—เบฑเบเบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบญเบเป€เบงเบตเบŠเบฑเบ™เปƒเปเปˆ. เปเบ—เบฑเบเปƒเบ™เบฎเบนเบšเบžเบฒเบš Docker เบˆเบฐเบ–เบทเบเบœเบนเบเบกเบฑเบ”เบเบฑเบšเปเบ—เบฑเบ Git. เปเบ•เปˆเบฅเบฐเบเบฒเบ™เบŠเบธเบเบเบนเป‰เบ—เบตเปˆเบกเบตเปเบ—เบฑเบเปƒเบซเบกเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเปเบ—เบฑเบเบ™เบตเป‰.

เปƒเบซเป‰เป€เบฎเบฑเบ”เบกเบฑเบ™ git push --tags, เปเบฅเบฐเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ—เปเปˆเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เบžเบฒเบšเบซเบ™เป‰เบฒเบˆเปเบ‚เบญเบ‡เบ—เปเปˆเบ—เปเบฒเบญเบดเบ”

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบ”เบถเบ‡เบ”เบนเบ”เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ•เปเปˆเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบเบญเบšเป‚เบ”เบ tags เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš docker, เปเบ•เปˆเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฑเบš Kubernetes. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเปเบ—เปเบเปƒเบซเบกเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบเบฑเบšเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเป€เบเบปเปˆเบฒ, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เปเปˆเบชเปเบฒเบฅเบฑเบšเบžเบงเบเบกเบฑเบ™เบˆเบฐเบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฐเบšเบฑเบšเป€เบเบปเปˆเบฒ.

เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš docker เปเบกเปˆเบ™เบœเบนเบเบกเบฑเบ”เบเบฑเบš tags, เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฑเบšเบชเบฒเบ‚เบฒ. เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เปƒเบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเป€เบเบฑเบšเบเปเบฒเปเบกเปˆเบ™ hardcoded. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบ”เป‰เบงเบเบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบ เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš- เบชเบฒเบ‚เบฒ.

10. เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”

เป€เบžเบทเปˆเบญเปƒเบซเป‰ Gitlab-runner เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบชเบปเปˆเบ‡เบญเบญเบเบฅเบฐเบซเบฑเบ” repository เปเบฅเบฐเป€เบžเบตเปˆเบกเบกเบฑเบ™เปƒเบชเปˆเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก CI เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเบฑเบ™เบ—เบถเบเป€เบชเบฑเป‰เบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™ Gitlab; เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เปƒเบซเป‰เป„เบ›เบ—เบตเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:
เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ -> CI / CD -> เบ•เบปเบงเปเบ›

เปเบฅเบฐเบ‚เปเปƒเบซเป‰เบชเป‰เบฒเบ‡เบ•เบปเบงเปเบ›เปƒเบซเบกเปˆ:

เบ›เบฐเป€เบžเบ”
เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™
เบกเบนเบ™เบ„เปˆเบฒ
เบ›เบปเบเบ›เป‰เบญเบ‡
Masked
เบ‚เบญเบšเป€เบ‚เบ”

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:

  • -- root เบšเบฒเบ‡ / app โ€” เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบชเบฐโ€‹เป€เบžเบฒเบฐโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹
  • --force:k8s-context __incluster__ - เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเปเบ› magic เบ—เบตเปˆเบšเบญเบเบงเปˆเบฒ deployment เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ cluster เบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆ gtilab-runner เปเบฅเปˆเบ™เบขเบนเปˆ. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ qbec เบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบŠเบญเบเบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ Kubernetes เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปƒเบ™ kubeconfig เบ‚เบญเบ‡เบ—เปˆเบฒเบ™
  • --เบฅเปเบ–เป‰เบฒ โ€” เบšเบฑเบ‡เบ„เบฑเบš qbec เปƒเบซเป‰เบฅเปเบ–เป‰เบฒเบˆเบปเบ™เบเปˆเบงเบฒเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบชเป‰เบฒเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐ Ready เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบญเบญเบเบ”เป‰เบงเบ exit-code เบชเปเบฒเป€เบฅเบฑเบ”.
  • โ€” เปเบกเปˆเบ™โ€‹เปเบฅเป‰เบง - เบžเบฝเบ‡เปเบ•เปˆเบ›เบดเบ”เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡เปเบเบฐเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš เป€เบˆเบปเป‰เบฒโ€‹เปเบ™เปˆโ€‹เปƒเบˆโ€‹เบšเปเปˆ? เป€เบกเบทเปˆเบญเบ–เบทเบเบ™เบณเปƒเบŠเป‰.

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบ git เบŠเบธเบเบเบนเป‰ เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เป€เบซเบฑเบ™โ€‹เบงเปˆเบฒโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹:

เบžเบฒเบšเบซเบ™เป‰เบฒเบˆเปเบ‚เบญเบ‡เบ—เปเปˆเบ—เบตเบชเบญเบ‡

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

11. เบ›เบญเบกเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบเบญเบšเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบŠเบธเบเบเบนเป‰เปƒเบซเป‰เปเบกเปˆเบšเบปเบ”

เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบฅเบฐเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบˆเบธเบ™เบฅเบฐเบžเบฒเบเป€เบเบทเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเปเบ—เบฑเบเบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบซเบผเบฒเบเบเบงเปˆเบฒเป€เบเบปเปˆเบฒเปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเปˆเบญเบเบชเบฐเบซเบผเบฒเบเปƒเบ™เบชเบฒเบ‚เบฒเปเบกเปˆเบšเบปเบ”.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ: เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบฎเบนเบšเบžเบฒเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ เป€เบงเบฑเบšเป„เบŠเบ—เปŒ เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบ„เบทเบ™โ€‹เปƒเบซเบกเปˆโ€‹เบ—เบธเบโ€‹เบ„เบฑเป‰เบ‡โ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบŠเบธเบโ€‹เบเบนเป‰โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹ เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เปเบฅเบฐเบˆเบฒเบเบ™เบฑเป‰เบ™ เบ™เบณเปƒเบŠเป‰เบเบฑเบš Kubernetes เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เบ‚เปเปƒเบซเป‰เบญเบฑเบšเป€เบ”เบ”เบชเบญเบ‡เบงเบฝเบเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ .gitlab-ci.yml:

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

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

เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบซเบปเบงเบ‚เปเป‰ เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš ะบ เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡ เบชเปเบฒเบฅเบฑเบšเบงเบฝเบ build_website เปเบฅเบฐเบ•เบญเบ™เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ $CI_COMMIT_REF_NAME เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ $CI_COMMIT_TAG, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเบ–เบทเบ untied เบˆเบฒเบ tags เปƒเบ™ Git เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบนเป‰เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ‚เบญเบ‡เบชเบฒเบ‚เบฒเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบ—เบตเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เปเปˆ. เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ™เบตเป‰เบเบฑเบ‡เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš tags, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบ—เบถเบเบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบชเบฐเบšเบฑเบšเบชเบฐเป€เบžเบฒเบฐเปƒเบ™ docker-registry.

เป€เบกเบทเปˆเบญเบŠเบทเปˆเบ‚เบญเบ‡เปเบ—เปเบ docker เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบฎเบธเปˆเบ™เปƒเบซเบกเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡ Kubernetes, เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ„เบทเบ™เปƒเบซเบกเปˆเบˆเบฒเบเบฎเบนเบšเบžเบฒเบšเปƒเบซเบกเปˆ, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป†เปƒเบ™ manifest เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบ โ€”vm:ext-str digest=โ€$DIGESTโ€ เบชเปเบฒเบฅเบฑเบš qbec - เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบœเปˆเบฒเบ™เบ•เบปเบงเปเบ›เบžเบฒเบเบ™เบญเบเป„เบ›เบซเบฒ jsonnet. เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเบกเบฒเปƒเบŠเป‰เบ„เบทเบ™เปƒเบ™เบเบธเปˆเบกเบเบฑเบšเปเบ•เปˆเบฅเบฐเบเบฒเบ™เบ›เปˆเบญเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบŠเบทเปˆเปเบ—เบฑเบเป„เบ”เป‰เบญเบตเบเบ•เปเปˆเป„เบ›, เป€เบŠเบดเปˆเบ‡เบ•เบญเบ™เบ™เบตเป‰เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบœเบนเบเบกเบฑเบ”เบเบฑเบšเบฎเบนเบšเบžเบฒเบšเบชเบฐเบšเบฑเบšเบชเบฐเป€เบžเบฒเบฐ เปเบฅเบฐ เบเบฐเบ•เบธเป‰เบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เป€เบกเบทเปˆเบญเบกเบฑเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบŠเปˆเบงเบเป‚เบ”เบเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ Kaniko เป€เบžเบทเปˆเบญเบšเบฑเบ™เบ—เบถเบเบฎเบนเบšเบžเบฒเบšเบเปˆเบญเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒ (เบ—เบฒเบ‡เป€เบฅเบทเบญเบ --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',
    },
  },
}

เบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง, เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบ„เบณเปเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปƒเบ”เป†เบเปเบ•เบฒเบก เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš docker เบชเปเบฒเบฅเบฑเบš เป€เบงเบฑเบšเป„เบŠเบ—เปŒ, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบเบฑเบš Kubernetes.

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบงเบ”เบชเบญเบšเบžเบฒเบเบซเบผเบฑเบ‡ git เบŠเบธเบเบเบนเป‰ เบžเบงเบเป€เบฎเบปเบฒเบ„เบงเบ™เบˆเบฐเป€เบซเบฑเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

เบžเบฒเบšเบซเบ™เป‰เบฒเบˆเปเบ‚เบญเบ‡เบ—เปเปˆเบชเปเบฒเบฅเบฑเบšเปเบกเปˆเบšเบปเบ”

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ 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/**/*

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™ deploy/gitlab-runner/ เปเบฅเบฐโ€‹เบˆเบฐโ€‹เบชเบปเปˆเบ‡โ€‹เบœเบปเบ™โ€‹เบเบฐโ€‹เบ—เบปเบšโ€‹เบงเบฝเบโ€‹เป€เบฎเบฑเบ”โ€‹เบ‡เบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบตโ€‹

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

git เบŠเบธเบเบเบนเป‰, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒ:

เบžเบฒเบšเปœเป‰เบฒเบˆเปเบ‚เบญเบ‡เบ—เปเปˆเบ—เบตเปˆเบญเบฑเบšเป€เบ”เบ”เปเบฅเป‰เบง

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

12. เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง

เบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเปเบฅเป‰เบงเบ—เบตเปˆเบˆเบฐเบซเบผเบฒเบเบซเบผเบฒเบเบ—เปเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

เบเปˆเบญเบ™เบญเบทเปˆเบ™, เปƒเบซเป‰เบญเบฑเบšเป€เบ”เบ”เบงเบฝเบ build_website เปƒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ .gitlab-ci.yml, เบ–เบญเบ™เบ•เบฑเบ™เบญเบญเบเบˆเบฒเบเบกเบฑเบ™ เบžเบฝเบ‡เปเบ•เปˆ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰ Gitlab เบเบฐเบ•เบธเป‰เบ™เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบเบฑเบšเบชเบฒเบ‚เบฒเปƒเบ”เบเปเปˆเบ•เบฒเบก:

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

เบˆเบฒเบเบ™เบฑเป‰เบ™เบญเบฑเบšเป€เบ”เบ”เบงเบฝเบ deploy_website, เป€เบžเบตเปˆเบกเบ•เบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก:

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

เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰ Gitlab เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบงเบฝเบเบเบฑเบš เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบฅเบฐเบชเบฐเปเบ”เบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบเบฑเบšเบกเบฑเบ™.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบญเบตเบเบชเบญเบ‡เบงเบฝเบ:

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

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

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

เบžเบงเบเบกเบฑเบ™เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเป€เบกเบทเปˆเบญเบกเบตเบเบฒเบ™เบŠเบธเบเบเบนเป‰เปƒเบซเป‰เบชเบฒเบ‚เบฒเปƒเบ”เบ™เบถเปˆเบ‡ เบเบปเบเป€เบงเบฑเป‰เบ™เปเบกเปˆเบšเบปเบ” เปเบฅเบฐเบˆเบฐเบ™เบณเปƒเบŠเป‰เป€เบงเบตเบŠเบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠ.

เบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบš qbec: --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: เบšเปเปˆเบกเบต, เบ•เปเปˆเบกเบฒเบžเบงเบเป€เบฎเบปเบฒ clone เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš- เบชเบฒเบ‚เบฒเปเบฅเบฐเบฅเบปเบšเบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบกเบฑเบ™.
เบกเบฑเบ™เบชเบฑเบšเบชเบปเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบงเบดเบ—เบตเบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเบเบงเปˆเบฒเบ™เบตเป‰.
เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เบญเบทเปˆเบ™โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ™เบณโ€‹เปƒเบŠเป‰โ€‹เบเบฒเบ™โ€‹เบ—เบปเบšโ€‹เบ—เบงเบ™โ€‹เบ„เบทเบ™โ€‹เปเบ•เปˆโ€‹เบฅเบฐโ€‹เบญเบฑเบ™โ€‹เป„เบ›โ€‹เบซเบฒโ€‹เบšเปˆเบญเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เป‚เบฎเบ‡โ€‹เปเบฎเบก, เป€เบŠเบดเปˆเบ‡โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ–เบทเบโ€‹เบฅเบปเบšโ€‹เบฅเป‰เบฒเบ‡โ€‹เบ—เบฑเบ‡โ€‹เปเบปเบ”.

เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

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

git เบŠเบธเบเบเบนเป‰, git checkout -b เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, git push เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ•เบปเป‰เบ™เบเปเบฒเป€เบ™เบตเบ”, เบเบงเบ”เป€เบšเบดเปˆเบ‡:

เบžเบฒเบšเปœเป‰เบฒเบˆเปเบ‚เบญเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ Gitlab

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบšเป? - เบ”เบตเบซเบผเบฒเบ, เบฅเบถเบšเบชเบฒเบ‚เบฒเบ—เบปเบ”เบชเบญเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ: git checkout เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, git push เบ•เบปเป‰เบ™เบเปเบฒเป€เบ™เบตเบ”: เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบงเบฝเบเบเบฒเบ™เบฅเบถเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”.

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเปƒเบซเป‰เบ„เบงเบฒเบกเบเบฐเบˆเปˆเบฒเบ‡เปเบˆเป‰เบ‡เบ—เบฑเบ™เบ—เบตเบงเปˆเบฒเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ”เป†เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบชเบฒเบ‚เบฒ, เบฅเบฒเบงเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰ .gitlab-ci.yml เป„เบŸเบฅเปŒเปเบฅเบฐเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ•เบปเบงเปเบ›เบฅเบฑเบš.
เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เปเบกเปˆเบ™เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบขเปˆเบฒเบ‡เปเบ‚เบ‡เปเบฎเบ‡เบ—เบตเปˆเบˆเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เปเบฒเปƒเบŠเป‰เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบชเบฒเบ‚เบฒเบ›เป‰เบญเบ‡เบเบฑเบ™, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™ เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เบซเบผเบทเบชเป‰เบฒเบ‡เบŠเบธเบ”เบ•เบปเบงเปเบ›เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก.

13. เบเบงเบ”เป€เบšเบดเปˆเบ‡เปเบญเบฑเบš

เบเบงเบ”เป€เบšเบดเปˆเบ‡เปเบญเบฑเบš เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” GitLab เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ›เบธเปˆเบกเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป„เบŸเบฅเปŒเปƒเบ™ repository เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบกเบฑเบ™เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ›เบธเปˆเบกเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ›เบฒเบเบปเบ”, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ .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 เบŠเบธเบเบเบนเป‰, เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡:

เบžเบฒเบšเปœเป‰เบฒเบˆเปเบ‚เบญเบ‡เบ›เบธเปˆเบกเบ—เบปเบšเบ—เบงเบ™เปเบญเบฑเบš

เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เบงเบฝเบเบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง!

เปเบซเบผเปˆเบ‡เป‚เบ„เบ‡เบเบฒเบ™:

เบ‚เบญเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เบ‚เป‰เบญเบเบซเบงเบฑเบ‡เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบˆเบฐเบกเบฑเบเบกเบฑเบ™ เบเบณเบฅเบฑเบ‡เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเปเปˆเบชเบณเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Kubernetes

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™