แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ! แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒ“แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒ แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช Docker-แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“, แƒแƒกแƒ”แƒ•แƒ” Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ›แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” GitLab-แƒ—แƒแƒœ แƒ—แƒแƒ›แƒแƒจแƒ˜, แƒ›แƒ˜แƒกแƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ˜แƒแƒœแƒแƒ“ แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ แƒ“แƒ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ.

แƒ”แƒก แƒœแƒแƒ›แƒฃแƒจแƒ”แƒ•แƒแƒ แƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜แƒ แƒ•แƒ”แƒ‘แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  kubernetes.io, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒแƒ แƒ›แƒแƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒฌแƒงแƒแƒ แƒ แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒ“แƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒแƒฃแƒ–แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ‘แƒแƒขแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒฅแƒ›แƒœแƒ˜แƒก แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒ•แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ‘แƒ›แƒฃแƒšแƒก แƒกแƒแƒœแƒแƒฎแƒแƒ•แƒแƒ“.

แƒ›แƒ” แƒ•แƒชแƒแƒ“แƒ” แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒœแƒฃแƒšแƒ˜แƒ“แƒแƒœ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ Gitlab CI-แƒ–แƒ” แƒ“แƒ แƒฃแƒคแƒแƒกแƒ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒ›แƒ˜แƒฉแƒ•แƒ”แƒฃแƒšแƒ˜ แƒ•แƒแƒ  Kubernetes-แƒจแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ“. แƒ“แƒฆแƒ”แƒก แƒ‘แƒแƒšแƒแƒก แƒ“แƒ แƒ‘แƒแƒšแƒแƒก แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ— แƒ›แƒแƒ— แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ:
แƒฃแƒ’แƒ, qbec, แƒ™แƒแƒœแƒ˜แƒ™แƒ, git-crypt ะธ GitLab CI แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒ—.

แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜

  1. แƒ’แƒแƒ˜แƒชแƒแƒœแƒ˜แƒ— แƒฐแƒ˜แƒฃแƒ’แƒ
  2. Dockerfile-แƒ˜แƒก แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ
  3. แƒ™แƒแƒœแƒ˜แƒ™แƒแƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ
  4. qbec-แƒ˜แƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ
  5. Gitlab-Runner-แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒ˜แƒก แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“
  6. Helm แƒฉแƒแƒ แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ qbec-แƒ˜แƒ—
  7. แƒฌแƒแƒ แƒ›แƒแƒ’แƒ˜แƒ“แƒ’แƒ”แƒœแƒ— git-crypt
  8. แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ—แƒ แƒงแƒฃแƒ—แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ
  9. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ แƒ“แƒ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—
  10. แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ
  11. แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ แƒแƒกแƒขแƒแƒขแƒแƒ‘แƒ˜แƒกแƒ™แƒ”แƒœ แƒกแƒฌแƒ แƒแƒคแƒ•แƒ˜แƒกแƒแƒก
  12. แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒ
  13. แƒแƒžแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ

1. แƒฐแƒ˜แƒฃแƒ’แƒแƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ

แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒจแƒ”แƒ•แƒ”แƒชแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒฐแƒ˜แƒฃแƒ’แƒแƒ–แƒ” แƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ˜แƒขแƒ˜. Hugo แƒแƒ แƒ˜แƒก แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ˜.

แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก, แƒ•แƒ˜แƒœแƒช แƒแƒ  แƒ˜แƒชแƒœแƒแƒ‘แƒก แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก, แƒชแƒแƒขแƒ แƒ›แƒ”แƒขแƒก แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ— แƒ›แƒแƒ— แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘. แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒซแƒ แƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒแƒฅแƒ•แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒ“แƒ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ PHP, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒฅแƒ›แƒœแƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒก แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ”แƒ—แƒ”แƒ แƒจแƒ˜, แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜แƒ แƒแƒ“แƒœแƒแƒ• แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒแƒ“. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒแƒ˜แƒฆแƒแƒ— แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜ Markdown แƒ›แƒแƒ แƒ™แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ—แƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ”แƒ‘แƒจแƒ˜, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒจแƒ”แƒแƒ“แƒ’แƒ˜แƒœแƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒš แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒแƒ“.

แƒแƒœแƒฃ, แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก แƒ“แƒ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ HTML แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒšแƒ”แƒฅแƒขแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ˜แƒแƒค แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ–แƒ” แƒ“แƒ แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜.

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒแƒ— Hugo แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ“แƒ แƒกแƒชแƒแƒ“แƒแƒ—:

แƒแƒฎแƒแƒšแƒ˜ แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒ:

hugo new site docs.example.org

แƒ“แƒ แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก git แƒกแƒแƒชแƒแƒ•แƒ˜:

cd docs.example.org
git init

แƒฏแƒ”แƒ แƒฏแƒ”แƒ แƒแƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ˜แƒขแƒ˜ แƒฎแƒ”แƒšแƒฃแƒฎแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ“แƒ แƒ˜แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒแƒกแƒ–แƒ” แƒ แƒแƒฆแƒแƒช แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒก, แƒฏแƒ”แƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒ—แƒ”แƒ›แƒ; แƒ—แƒ”แƒ›แƒ แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒแƒ‘แƒšแƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ˜แƒขแƒ˜.

แƒ—แƒ”แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— Learn, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช, แƒฉแƒ”แƒ›แƒ˜ แƒแƒ–แƒ แƒ˜แƒ—, แƒ˜แƒ“แƒ”แƒแƒšแƒฃแƒ แƒแƒ“ แƒจแƒ”แƒ”แƒคแƒ”แƒ แƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒกแƒแƒ˜แƒขแƒก.

แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ แƒ›แƒ˜แƒœแƒ“แƒ แƒ’แƒแƒ•แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒ แƒ˜แƒ› แƒคแƒแƒฅแƒขแƒ–แƒ”, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ—แƒ”แƒ›แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒจแƒ˜; แƒแƒ›แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ“แƒแƒ•แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒ˜แƒ’แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— 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. Dockerfile-แƒ˜แƒก แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ

แƒ“แƒ แƒแƒ แƒ’แƒแƒœแƒ•แƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ. แƒ›แƒ” แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒ แƒแƒฆแƒแƒชแƒแƒก:

.
โ”œโ”€โ”€ 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 แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒแƒ แƒก FROM, แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก แƒ”.แƒฌ แƒ›แƒ แƒแƒ•แƒแƒšแƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ˜แƒแƒœแƒ˜ แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ“แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒ›แƒแƒ แƒ˜แƒชแƒฎแƒแƒ— แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒ แƒแƒกแƒแƒญแƒ˜แƒ แƒ แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒ“แƒแƒœ.
แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ›แƒฃแƒฅแƒ˜httpd (แƒ›แƒกแƒฃแƒ‘แƒฃแƒฅแƒ˜ HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜) แƒ“แƒ แƒแƒฃแƒ“แƒ˜แƒขแƒแƒ แƒ˜แƒ/ โ€” แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒแƒ“ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜.

แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒ:

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

3. แƒ™แƒแƒœแƒ˜แƒ™แƒแƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ

แƒ แƒแƒ’แƒแƒ แƒช แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒšแƒ˜, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ แƒ™แƒแƒœแƒ˜แƒ™แƒ, แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒ›แƒ˜แƒกแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ แƒแƒ  แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒก แƒ“แƒแƒ™แƒ”แƒ  แƒ“แƒ”แƒ›แƒแƒœแƒก แƒ“แƒ แƒ—แƒแƒ•แƒแƒ“ แƒแƒฌแƒงแƒแƒ‘แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ” แƒ“แƒ แƒฅแƒ”แƒจแƒ˜ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒก แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜, แƒ แƒ˜แƒ—แƒแƒช แƒแƒฆแƒ›แƒแƒคแƒฎแƒ•แƒ แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒคแƒแƒกแƒแƒ•แƒแƒœแƒ˜ แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ˜ แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒก.

แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒแƒกแƒแƒ’แƒ”แƒ‘แƒแƒ“, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜ แƒ™แƒแƒœแƒ˜แƒ™แƒแƒก แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ— แƒ›แƒแƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” build แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜; แƒ”แƒก แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—:

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-แƒ˜แƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ

แƒฅแƒ‘แƒ”แƒ™แƒ˜ แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ“แƒ”แƒ™แƒšแƒแƒ แƒแƒชแƒ˜แƒฃแƒšแƒแƒ“ แƒแƒฆแƒฌแƒ”แƒ แƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ Kubernetes-แƒจแƒ˜. Jsonnet-แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒ’แƒแƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ— แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ แƒ›แƒ แƒแƒ•แƒแƒš แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜ แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ’แƒแƒ›แƒแƒ แƒ˜แƒชแƒฎแƒแƒ•แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒแƒก.

แƒ”แƒก แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ”แƒฎแƒ”แƒ‘แƒ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ” แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒ— แƒ“แƒ แƒ’แƒกแƒฃแƒ แƒ— แƒ›แƒแƒ—แƒ˜ แƒ“แƒ”แƒ™แƒšแƒแƒ แƒแƒชแƒ˜แƒฃแƒšแƒแƒ“ แƒแƒฆแƒฌแƒ”แƒ แƒ Git-แƒจแƒ˜.

Qbec แƒแƒกแƒ”แƒ•แƒ” แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒแƒ— Helm แƒกแƒฅแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒ— แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒ— แƒ˜แƒกแƒ”, แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒแƒ—แƒ–แƒ” แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒฃแƒขแƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ”แƒก, แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒ˜แƒชแƒ˜แƒšแƒแƒ— แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ. แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— 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: {}

แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒ’แƒ•แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒก แƒกแƒžแƒ”แƒช.แƒ’แƒแƒ แƒ”แƒ›แƒแƒ”แƒ‘แƒ˜, qbec-แƒ›แƒ แƒฃแƒ™แƒ•แƒ” แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒ แƒ“แƒ แƒแƒ˜แƒฆแƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜, แƒ˜แƒกแƒ”แƒ•แƒ” แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ›แƒŸแƒแƒ›แƒ˜แƒœแƒ“แƒ”แƒšแƒ˜ kubeconfig-แƒ“แƒแƒœ.
แƒแƒฎแƒšแƒ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒžแƒแƒกแƒขแƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜, qbec แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ” แƒ“แƒ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜, แƒแƒœแƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒฆแƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ’แƒแƒ“แƒแƒ แƒ—แƒ•แƒ แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ”แƒ‘แƒกแƒ แƒ“แƒ แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒ”แƒ‘แƒก โ€‹โ€‹แƒจแƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒšแƒแƒ“.
แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒแƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒแƒ› แƒคแƒแƒ˜แƒšแƒจแƒ˜.

แƒงแƒ•แƒ”แƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ qbec.yamlแƒ“แƒ แƒคแƒแƒ˜แƒšแƒจแƒ˜ params.libsonnet, แƒกแƒแƒ“แƒแƒช แƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒ˜แƒ, แƒกแƒแƒ“ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒแƒ  แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒก:

  • แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ / โ€” แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒแƒฅ; แƒ›แƒแƒ—แƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ แƒแƒ’แƒแƒ แƒช jsonnet, แƒแƒกแƒ”แƒ•แƒ” แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• yaml แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜
  • แƒ’แƒแƒ แƒ”แƒ›แƒ/ โ€” แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒแƒ“แƒก (แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒก) แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒแƒกแƒ—แƒ•แƒ˜แƒก.

แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒ แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜:

  • แƒ’แƒแƒ แƒ”แƒ›แƒ/base.libsonnet - แƒ˜แƒก แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒแƒ”แƒ แƒ—แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ’แƒแƒ แƒ”แƒ›แƒแƒกแƒ—แƒ•แƒ˜แƒก
  • แƒ’แƒแƒ แƒ”แƒ›แƒแƒก/แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜.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',
    },
  },
}

แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜/แƒ•แƒ”แƒ‘แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜.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,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

แƒแƒ› แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒ”แƒ— แƒ™แƒฃแƒ‘แƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒกแƒแƒ›แƒ˜ แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ˜ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ”แƒกแƒ”แƒœแƒ˜แƒ: แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ, แƒกแƒแƒ›แƒกแƒแƒฎแƒฃแƒ แƒ˜แƒก ะธ Ingress. แƒ—แƒฃ แƒ’แƒ•แƒ˜แƒœแƒ“แƒแƒ“แƒ, แƒจแƒ”แƒ’แƒ•แƒ”แƒซแƒšแƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒจแƒ˜ แƒฉแƒแƒ•แƒ“แƒแƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ› แƒ”แƒขแƒแƒžแƒ–แƒ” แƒ”แƒ แƒ—แƒ˜ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก.

แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜ jsonnet แƒซแƒแƒšแƒ˜แƒแƒœ แƒฐแƒ’แƒแƒ•แƒก แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• json-แƒก, แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒจแƒ˜, แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ json แƒฃแƒ™แƒ•แƒ” แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก jsonnet, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ’แƒ˜แƒแƒ“แƒ•แƒ˜แƒšแƒ“แƒ”แƒ— แƒแƒœแƒšแƒแƒ˜แƒœ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ yaml2json แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒฉแƒ•แƒ”แƒฃแƒšแƒ˜ yaml json-แƒแƒ“ แƒ’แƒแƒ“แƒแƒฅแƒชแƒ”แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒœ, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ แƒแƒ  แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒ›แƒแƒ—แƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ yaml-แƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—.

แƒ›แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒแƒก jsonnet แƒ›แƒ” แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒแƒ— แƒ›แƒแƒ“แƒฃแƒšแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ แƒ”แƒ“แƒแƒฅแƒขแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒ แƒ˜แƒก แƒ›แƒแƒ“แƒฃแƒšแƒ˜ vim-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก 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. Gitlab-Runner-แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒ˜แƒก แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“

แƒ‘แƒแƒšแƒ แƒ“แƒ แƒแƒ›แƒ“แƒ” แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ“แƒ˜ แƒ’แƒ˜แƒขแƒšแƒแƒ‘-แƒ›แƒ แƒ‘แƒแƒšแƒ˜ แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ” (LXC แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜) แƒญแƒฃแƒ แƒ•แƒ˜แƒ— แƒแƒœ แƒ“แƒแƒ™แƒ”แƒ -แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒšแƒ˜แƒ—. แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“, แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒกแƒ”แƒ—แƒ˜ แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒแƒšแƒ˜ แƒ’แƒ•แƒงแƒแƒ•แƒ“แƒ แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒฉแƒ•แƒ”แƒœแƒก gitlab-แƒจแƒ˜. แƒ›แƒแƒ— แƒจแƒ”แƒแƒ’แƒ แƒแƒ•แƒ”แƒก แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒแƒ› แƒแƒฉแƒ•แƒ”แƒœแƒ, แƒ”แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ˜แƒ“แƒ”แƒแƒšแƒฃแƒ แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒแƒ‘แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—. แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜ แƒ“แƒ แƒ˜แƒ“แƒ”แƒแƒšแƒแƒ’แƒ˜แƒฃแƒ แƒแƒ“ แƒฃแƒคแƒ แƒ แƒกแƒฌแƒแƒ แƒ˜แƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒœ แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒแƒกแƒ—แƒ•แƒ˜แƒก แƒชแƒแƒšแƒ™แƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒแƒšแƒ˜ แƒ˜แƒงแƒแƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜.

แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, แƒ”แƒก แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒ•แƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ— แƒ’แƒ˜แƒขแƒšแƒแƒ‘-แƒ›แƒ แƒ‘แƒแƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ , แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒกแƒฌแƒแƒ แƒ”แƒ“ Kubernetes-แƒจแƒ˜.

Gitlab แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒ›แƒ–แƒ แƒกแƒแƒญแƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒแƒก Kubernetes-แƒจแƒ˜ gitlab-runner-แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ“. แƒแƒกแƒ” แƒ แƒแƒ›, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ แƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒแƒ แƒ˜แƒก แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒ•แƒ แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒœแƒ˜แƒจแƒแƒœแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ -> 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=true โ€” แƒแƒซแƒšแƒ”แƒ•แƒก แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒแƒšแƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒžแƒ แƒ˜แƒ•แƒ˜แƒšแƒ”แƒ’แƒ˜แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ—แƒ แƒจแƒ”แƒซแƒšแƒแƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก pods แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒšแƒแƒ“ kubernetes-executor-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ—แƒฃ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒกแƒฌแƒแƒ แƒแƒ“ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ, แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒฃแƒœแƒ“แƒ แƒœแƒแƒฎแƒแƒ— แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒแƒšแƒ˜ Runners, แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒจแƒ˜.

แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒœแƒจแƒแƒขแƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒแƒกแƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ? - แƒ“แƒ˜แƒแƒฎ, แƒ”แƒก แƒแƒกแƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ! แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒแƒšแƒ—แƒ แƒฎแƒ”แƒšแƒ˜แƒ— แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒแƒชแƒ˜แƒ แƒแƒฆแƒแƒ  แƒจแƒ”แƒ’แƒแƒฌแƒฃแƒฎแƒ”แƒ‘แƒ—, แƒแƒ›แƒ˜แƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ›แƒแƒ แƒ‘แƒ”แƒœแƒแƒšแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒ’แƒแƒœแƒแƒ“แƒ’แƒฃแƒ แƒ“แƒ”แƒ‘แƒ.

6. แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— Helm แƒกแƒฅแƒ”แƒ›แƒ”แƒ‘แƒ˜ QBEC-แƒ˜แƒ—

แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”แƒ— แƒ’แƒแƒ•แƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒแƒ— แƒ’แƒ˜แƒขแƒšแƒแƒ‘-แƒ›แƒ แƒ‘แƒแƒšแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒ, แƒ“แƒ แƒแƒ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒก Git แƒกแƒแƒชแƒแƒ•แƒจแƒ˜.

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ˜แƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒชแƒแƒšแƒ™แƒ”แƒฃแƒšแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜ แƒœแƒแƒฎแƒ•แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ›แƒแƒ›แƒแƒ•แƒšแƒแƒ“ แƒ•แƒ’แƒ”แƒ’แƒ›แƒแƒ•แƒ— แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒแƒกแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒก แƒœแƒแƒฎแƒ•แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒฎแƒจแƒ˜แƒ แƒแƒ“, แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ’แƒ˜แƒขแƒšแƒแƒ‘-แƒ›แƒ แƒ‘แƒแƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒœแƒšแƒแƒ’แƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒฎแƒ”แƒš Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ”. แƒ›แƒแƒจ แƒแƒกแƒ”, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒชแƒแƒšแƒ™แƒ” แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

แƒแƒ›แƒฏแƒ”แƒ แƒแƒ“ แƒฉแƒ•แƒ”แƒœ แƒฎแƒ”แƒšแƒ˜แƒ— แƒแƒ  แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒ— Kubernetes-แƒ˜แƒก แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ”แƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ›แƒ–แƒ Helm แƒกแƒฅแƒ”แƒ›แƒแƒก. qbec-แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ แƒแƒ แƒ˜แƒก Helm แƒกแƒฅแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  Git แƒกแƒแƒชแƒแƒ•แƒ˜แƒ“แƒแƒœ.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒ˜แƒ’แƒ˜ git แƒฅแƒ•แƒ”แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

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

แƒแƒฎแƒšแƒ แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ แƒ’แƒแƒ›แƒงแƒ˜แƒ“แƒ•แƒ”แƒšแƒ˜ / gitlab-runner แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒกแƒแƒชแƒแƒ•แƒ˜ gitlab-runner-แƒ˜แƒก แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒ—.

แƒแƒœแƒแƒšแƒแƒ’แƒ˜แƒฃแƒ แƒแƒ“, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒกแƒฎแƒ•แƒ แƒกแƒแƒชแƒแƒ•แƒ˜, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒ—แƒ”แƒšแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜ แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ—แƒแƒœ https://github.com/helm/charts

แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜/gitlab-runner.jsonnet:

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

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

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ expandHelmTemplate แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒ“แƒ˜แƒ•แƒแƒ แƒ— แƒ’แƒ–แƒแƒก แƒกแƒฅแƒ”แƒ›แƒ˜แƒกแƒ™แƒ”แƒœ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒแƒ แƒแƒ›แƒ”แƒ‘แƒ˜.แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒแƒ“แƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜

  • แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ - แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜
  • แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” - แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒ’แƒแƒ“แƒแƒ”แƒชแƒ แƒกแƒแƒญแƒ”แƒก
  • แƒแƒ› แƒคแƒแƒ˜แƒšแƒก โ€” แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ’แƒ–แƒแƒก
  • แƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒ”แƒ แƒ˜ - แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒแƒก แƒกแƒแƒญแƒ˜แƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒ— แƒกแƒฅแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒ›แƒแƒชแƒ”แƒ›แƒ˜แƒกแƒแƒก

แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒ/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 แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ’แƒแƒ แƒ” แƒคแƒแƒ˜แƒšแƒ˜แƒ“แƒแƒœ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜/แƒ‘แƒแƒ–แƒ.libsonnet, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ—:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ— แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ—แƒฃ แƒแƒ แƒ:

qbec show default

แƒ—แƒฃ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ แƒ˜แƒ’แƒ–แƒ”แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒฌแƒแƒ•แƒจแƒแƒšแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ“แƒ แƒ” แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ Helm-แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—:

helm uninstall gitlab-runner

แƒ“แƒ แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ˜แƒ’แƒ˜ แƒ˜แƒ›แƒแƒ•แƒ” แƒ’แƒ–แƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› qbec-แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—:

qbec apply default

7. แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜ git-crypt

แƒ’แƒ˜แƒข-แƒ™แƒ แƒ˜แƒžแƒขแƒ แƒแƒ แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ“แƒแƒแƒงแƒ”แƒœแƒแƒ— แƒ’แƒแƒ›แƒญแƒ•แƒ˜แƒ แƒ•แƒแƒšแƒ” แƒ“แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒแƒ› แƒ“แƒ แƒแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ gitlab-runner-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

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

แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ Git-แƒจแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒ, แƒแƒ แƒ? แƒแƒ›แƒ˜แƒขแƒแƒ› แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ›แƒแƒ—แƒ˜ แƒกแƒฌแƒแƒ แƒแƒ“ แƒ“แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ.

แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•, แƒ”แƒ แƒ—แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ’แƒฃแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ›แƒแƒก แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒแƒฅแƒ•แƒก แƒแƒ–แƒ แƒ˜. แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ qbec แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ CI แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—.
แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฆแƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜แƒ, แƒ แƒแƒ› แƒแƒกแƒ”แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ‘แƒ”แƒ•แƒ  แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒก; แƒ›แƒแƒ—แƒ˜ แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒซแƒแƒšแƒ˜แƒแƒœ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒ˜แƒช, แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ›แƒ” แƒ•แƒ”แƒ  แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ— แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ›แƒจแƒ•แƒ”แƒœแƒ˜แƒ”แƒ แƒ˜ แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ แƒแƒ’แƒแƒ แƒ˜แƒช git-crypt.

git-crypt แƒ˜แƒก แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒ—แƒแƒช, แƒ แƒแƒ› แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒ— แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒ, แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒแƒ“แƒแƒ แƒแƒ—, แƒจแƒ”แƒแƒ”แƒ แƒ—แƒแƒ— แƒ“แƒ แƒ›แƒแƒแƒ’แƒ•แƒแƒ แƒแƒ— แƒ™แƒแƒœแƒคแƒšแƒ˜แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒ˜แƒกแƒ”, แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒ”แƒฉแƒ•แƒ˜แƒ”แƒ— แƒแƒ›แƒแƒก Git-แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ แƒแƒช แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ git-crypt แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

git crypt init

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— PGP แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ—แƒแƒ•แƒ˜ แƒแƒ› แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ—แƒแƒœแƒแƒ›แƒจแƒ แƒแƒ›แƒšแƒแƒ“:

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

แƒแƒ› แƒ’แƒ–แƒ˜แƒ— แƒ—แƒฅแƒ•แƒ”แƒœ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒ› แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ’แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒžแƒ˜แƒ แƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ—แƒฃ แƒแƒ  แƒ’แƒแƒฅแƒ•แƒ— PGP แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒแƒ  แƒ›แƒแƒ”แƒšแƒ˜แƒ— แƒ›แƒแƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒกแƒฎแƒ•แƒ แƒ’แƒ–แƒ˜แƒ— แƒฌแƒแƒฎแƒ•แƒ˜แƒ“แƒ”แƒ— แƒ“แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜:

git crypt export-key /path/to/keyfile

แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“, แƒ•แƒ˜แƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜ แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ’แƒแƒจแƒ˜แƒคแƒ•แƒ แƒแƒก.

แƒ“แƒ แƒแƒ แƒ“แƒแƒ•แƒแƒ“แƒ’แƒ˜แƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒ.
แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒจแƒ˜ แƒ•แƒแƒ แƒ— deploy/gitlab-runner/, แƒกแƒแƒ“แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜/, แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒจแƒ˜แƒคแƒ แƒแƒ— แƒ›แƒแƒกแƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒ˜, แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒคแƒแƒ˜แƒšแƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜/.แƒ’แƒ˜แƒขแƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜แƒ—:

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

แƒ แƒแƒ’แƒแƒ แƒช แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜แƒ“แƒแƒœ แƒฉแƒแƒœแƒก, แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒ˜ แƒœแƒ˜แƒฆแƒ‘แƒ˜แƒแƒœแƒ˜แƒ * แƒ’แƒแƒ˜แƒ•แƒšแƒ˜แƒแƒœ git-crypt, แƒ’แƒแƒ แƒ“แƒ แƒฃแƒ›แƒ แƒแƒ•แƒšแƒ”แƒกแƒ˜แƒกแƒ .แƒ’แƒ˜แƒขแƒแƒขแƒ แƒ˜แƒขแƒ”แƒ‘แƒ˜

แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ—:

git crypt status -e

แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒกแƒแƒชแƒแƒ•แƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒกแƒ˜แƒ, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ–แƒ”แƒช แƒ“แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜แƒ

แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜แƒ, แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒขแƒแƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

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

แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ“แƒแƒกแƒแƒ‘แƒšแƒแƒ™แƒแƒ“, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ—:

git crypt lock

แƒ“แƒ แƒ›แƒแƒจแƒ˜แƒœแƒ•แƒ” แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ˜ แƒ’แƒแƒ“แƒแƒ˜แƒฅแƒชแƒ”แƒ•แƒ แƒ‘แƒ˜แƒœแƒแƒ แƒฃแƒš แƒ แƒแƒฆแƒแƒชแƒแƒ“, แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒ˜ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ.
แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ’แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ—:

git crypt unlock

8. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ—แƒ แƒงแƒฃแƒ—แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜

แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ—แƒ แƒงแƒฃแƒ—แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ—แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒšแƒแƒ“. แƒ›แƒแƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก Gitlab runner แƒขแƒ˜แƒžแƒ˜แƒฃแƒ แƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒšแƒแƒ“.

แƒแƒฅ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ 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

แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒแƒ› แƒกแƒฃแƒ แƒแƒ—แƒ–แƒ” แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒแƒ›แƒฃแƒœแƒแƒšแƒฃแƒ  แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ“. แƒฉแƒ•แƒ”แƒœ แƒ”แƒก แƒแƒ  แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒแƒฅ, แƒ—แƒฃ แƒ™แƒฃแƒ‘แƒ”แƒฅแƒขแƒšแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ— แƒ›แƒแƒกแƒ—แƒแƒœ แƒ—แƒแƒ›แƒแƒจแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ–แƒแƒจแƒ˜.

แƒแƒกแƒ”แƒ•แƒ”, แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒจแƒ”แƒ’แƒ•แƒ”แƒซแƒšแƒแƒก 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

แƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ 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. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ แƒ“แƒ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒซแƒ˜แƒ แƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— .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

แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒขแƒ”แƒ’แƒ”แƒ‘แƒก, แƒ แƒแƒชแƒ แƒ“แƒแƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ. Docker แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒจแƒ˜ แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ Git แƒขแƒ”แƒ’แƒ”แƒ‘แƒ—แƒแƒœ. แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ‘แƒ˜แƒซแƒ’แƒ˜ แƒแƒฎแƒแƒšแƒ˜ แƒขแƒ”แƒ’แƒ˜แƒ— แƒ›แƒแƒแƒฎแƒ“แƒ”แƒœแƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒแƒก แƒแƒ› แƒขแƒ”แƒ’แƒ˜แƒ—.

แฒ›แƒแƒ“แƒ˜ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒ”แƒก git push -- แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜แƒ“แƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒก:

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒฆแƒ˜แƒ แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฅแƒชแƒ”แƒ•แƒ แƒ˜แƒ› แƒคแƒแƒฅแƒขแƒ–แƒ”, แƒ แƒแƒ› แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜แƒ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ Kubernetes-แƒ–แƒ” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ“. แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› แƒแƒฎแƒแƒšแƒ˜ แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒ˜แƒ”แƒœแƒ˜แƒญแƒแƒก แƒซแƒ•แƒ”แƒš แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒก, แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒซแƒ•แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒก.

แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒญแƒ แƒ”แƒšแƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ แƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒขแƒ”แƒ’แƒ”แƒ‘แƒก, แƒฎแƒแƒšแƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒจแƒ˜. แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒ›แƒงแƒแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒแƒ“แƒแƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ- แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒ˜.

10. แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› Gitlab-runner-แƒ›แƒ แƒ’แƒแƒแƒจแƒ˜แƒคแƒ แƒแƒก แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒก 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 some/app โ€” แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ
  • --force:k8s-context __incluster__ - แƒ”แƒก แƒแƒ แƒ˜แƒก แƒฏแƒแƒ“แƒแƒกแƒœแƒฃแƒ แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒ‘แƒแƒ‘แƒก, แƒ แƒแƒ› แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ แƒ˜แƒ›แƒแƒ•แƒ” แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก gtilab-runner. แƒ”แƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ qbec แƒจแƒ”แƒ”แƒชแƒ“แƒ”แƒ‘แƒ แƒ˜แƒžแƒแƒ•แƒแƒ— แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ Kubernetes แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒก kubeconfig-แƒจแƒ˜
  • --แƒ›แƒแƒ˜แƒชแƒแƒ“แƒ” โ€” แƒแƒ˜แƒซแƒฃแƒšแƒ”แƒ‘แƒก qbec-แƒก แƒ“แƒแƒ”แƒšแƒแƒ“แƒแƒก, แƒกแƒแƒœแƒแƒ› แƒ›แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ“แƒแƒ•แƒ Ready-แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒ“แƒ”แƒก แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒ˜ แƒ™แƒแƒ“แƒ˜แƒ—.
  • -แƒ“แƒ˜แƒแƒฎ - แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ•แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒš แƒ’แƒแƒ แƒกแƒก แฒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฎแƒแƒ ? แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ.

แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒ:

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

แฒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒ˜แƒข แƒ‘แƒ˜แƒซแƒ’แƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ—, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒœแƒšแƒแƒ’แƒ“แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜:

แƒ›แƒ”แƒแƒ แƒ” แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ 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, แƒแƒœแƒฃ, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒฎแƒกแƒœแƒ˜แƒ— แƒขแƒ”แƒ’แƒ”แƒ‘แƒก Git-แƒจแƒ˜ แƒ“แƒ แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒกแƒฃแƒ แƒแƒ—แƒก แƒ˜แƒ› แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ›แƒแƒช แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ›แƒแƒแƒฎแƒ“แƒ˜แƒœแƒ. แƒแƒฆแƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜แƒ, แƒ แƒแƒ› แƒ”แƒก แƒแƒกแƒ”แƒ•แƒ” แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒขแƒ”แƒ’แƒ”แƒ‘แƒ—แƒแƒœ, แƒ แƒแƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ›แƒแƒ’แƒ•แƒชแƒ”แƒ›แƒก แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒฎแƒแƒ— แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒกแƒœแƒ”แƒžแƒจแƒแƒขแƒ”แƒ‘แƒ˜ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒ— แƒ“แƒแƒ™แƒ”แƒ -แƒ แƒ”แƒ’แƒ”แƒกแƒขแƒ แƒจแƒ˜.

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก docker tag-แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฃแƒชแƒ•แƒšแƒ”แƒšแƒ˜ แƒ˜แƒงแƒแƒก, แƒฉแƒ•แƒ”แƒœ แƒ™แƒ•แƒšแƒแƒ• แƒฃแƒœแƒ“แƒ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ Kubernetes-แƒจแƒ˜, แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ˜แƒก แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒ  แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒแƒฎแƒแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒ“แƒแƒœ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒ•แƒ”แƒ  แƒจแƒ”แƒแƒ›แƒฉแƒœแƒ”แƒ•แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜.

แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ โ€”vm:ext-str digest="$DIGEST" qbec-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ— แƒ’แƒแƒ แƒ” แƒชแƒ•แƒšแƒแƒ“แƒ˜ jsonnet-แƒก. แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ, แƒ แƒแƒ› แƒ˜แƒก แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ“แƒ”แƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ—. แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒแƒ  แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒขแƒ”แƒ’แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฎแƒšแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฃแƒชแƒ•แƒšแƒ”แƒšแƒ˜ แƒ˜แƒงแƒแƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ•แƒ˜แƒงแƒแƒ— แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒกแƒ—แƒแƒœ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ˜แƒก แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ.

แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ’แƒ•แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ แƒ™แƒแƒœแƒ˜แƒ™แƒแƒก แƒฃแƒœแƒแƒ แƒ˜ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒก แƒ“แƒแƒ˜แƒฏแƒ”แƒกแƒขแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒคแƒแƒ˜แƒšแƒจแƒ˜ (แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ -- แƒ“แƒแƒ˜แƒฏแƒ”แƒกแƒขแƒ˜-แƒคแƒแƒ˜แƒšแƒ˜)
แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒ— แƒแƒ› แƒคแƒแƒ˜แƒšแƒก แƒ“แƒ แƒฌแƒแƒ•แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ•แƒ— แƒ›แƒแƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒœแƒ•แƒแƒแƒฎแƒšแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ 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',
    },
  },
}

แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒแƒฎแƒšแƒ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒแƒก แƒœแƒแƒฎแƒ•แƒแƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ˜แƒ’แƒ˜ Kubernetes-แƒจแƒ˜.

แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒ:

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

แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ— แƒ’แƒ˜แƒข แƒ‘แƒ˜แƒซแƒ’แƒ˜ แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ•แƒœแƒแƒฎแƒแƒ— แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ แƒแƒ›:

แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒ›แƒแƒกแƒขแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ 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"

แƒ’แƒ˜แƒข แƒ‘แƒ˜แƒซแƒ’แƒ˜แƒฏแƒแƒ‘แƒ˜แƒ:

แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ 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',
    },
  },
}

แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒคแƒ แƒ แƒแƒฎแƒšแƒแƒก แƒ›แƒ˜แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒก แƒ’แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒ_แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ, แƒ˜แƒก แƒ’แƒแƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒฌแƒแƒ˜แƒจแƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› gitlab แƒแƒ  แƒจแƒ”แƒ”แƒชแƒแƒ“แƒแƒก แƒ’แƒแƒ“แƒแƒ แƒ˜แƒชแƒฎแƒ•แƒ, แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ GIT_STRATEGY: แƒแƒ แƒชแƒ”แƒ แƒ—แƒ˜, แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒ™แƒšแƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒแƒก แƒ•แƒแƒฎแƒ“แƒ”แƒœแƒ— แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ- แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒ“แƒ แƒฌแƒแƒจแƒแƒšแƒ” แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—.
แƒชแƒแƒขแƒ แƒ’แƒแƒฃแƒ’แƒ”แƒ‘แƒแƒ แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฃแƒคแƒ แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒ’แƒ–แƒ แƒฏแƒ”แƒ  แƒ•แƒ”แƒ  แƒ•แƒ˜แƒžแƒแƒ•แƒ”.
แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ˜แƒก แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ แƒกแƒแƒกแƒขแƒฃแƒ›แƒ แƒแƒก แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ“แƒแƒ˜แƒœแƒ’แƒ แƒ.

แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒแƒœแƒ:

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

แƒ’แƒ˜แƒข แƒ‘แƒ˜แƒซแƒ’แƒ˜, git checkout -b แƒขแƒ”แƒกแƒขแƒ˜, git push แƒฌแƒแƒ แƒ›แƒแƒจแƒแƒ‘แƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ˜, แƒฉแƒ”แƒ™แƒ˜:

Gitlab-แƒจแƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒกแƒ™แƒ แƒ˜แƒœแƒจแƒแƒขแƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก? - แƒ™แƒแƒ แƒ’แƒ˜, แƒฌแƒแƒจแƒแƒšแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜: git แƒ’แƒแƒ“แƒแƒฎแƒ“แƒ˜แƒก แƒแƒกแƒขแƒแƒขแƒ˜, git push origin :แƒขแƒ”แƒกแƒขแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒฌแƒแƒจแƒšแƒ˜แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ”แƒ‘แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

แƒแƒฅแƒ•แƒ” แƒ›แƒ˜แƒœแƒ“แƒ แƒ’แƒแƒœแƒ•แƒ›แƒแƒ แƒขแƒ, แƒ แƒแƒ› แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒ˜, แƒ›แƒแƒก แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒก .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"

แƒ’แƒ˜แƒข แƒ‘แƒ˜แƒซแƒ’แƒ˜แƒ“แƒ แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ—:

แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒฆแƒ˜แƒšแƒแƒ™แƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜

แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ!

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜:

แƒ’แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ— แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ˜แƒ›แƒ”แƒ“แƒ˜แƒ แƒ›แƒแƒ’แƒ”แƒฌแƒแƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ Kubernetes-แƒจแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ