Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅! НапослСдък бяха пуснати ΠΌΠ½ΠΎΠ³ΠΎ страхотни инструмСнти Π·Π° автоматизация ΠΊΠ°ΠΊΡ‚ΠΎ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Docker изобраТСния, Ρ‚Π°ΠΊΠ° ΠΈ Π·Π° внСдряванС Π² Kubernetes. Π’ Ρ‚Π°Π·ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ° Ρ€Π΅ΡˆΠΈΡ… Π΄Π° си поиграя с Gitlab, ΠΊΠ°ΠΊ Π΄Π° ΠΏΡ€ΠΎΡƒΡ‡Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ ΠΌΡƒ ΠΈ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π΄Π° настроя Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄.

Π’ΠΎΠ·ΠΈ сайт Π΅ Π²Π΄ΡŠΡ…Π½ΠΎΠ²Π΅Π½ ΠΎΡ‚ kubernetes.io, ΠΊΠΎΠΉΡ‚ΠΎ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΈ Π·Π° всяка ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½Π° заявка Π·Π° изтСглянС, Ρ€ΠΎΠ±ΠΎΡ‚ΡŠΡ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½Π° вСрсия Π½Π° сайта с Π²Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΈ прСдоставя Π²Ρ€ΡŠΠ·ΠΊΠ° Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄.

ΠžΠΏΠΈΡ‚Π°Ρ… сС Π΄Π° създам ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ процСс ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°, Π½ΠΎ изцяло ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ Π²ΡŠΡ€Ρ…Ρƒ Gitlab CI ΠΈ Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΈ инструмСнти, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… Π·Π° внСдряванС Π½Π° прилоТСния Π² Kubernetes. ДнСс Π½Π°ΠΉ-накрая Ρ‰Π΅ Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° тях.

Бтатията Ρ‰Π΅ ΠΎΠ±Ρ…Π²Π°Π½Π΅ инструмСнти ΠΊΠ°Ρ‚ΠΎ:
Π£Π³ΠΎ, qbec, ΠΊΠ°Π½ΠΈΠΊΠΎ, git-ΠΊΡ€ΠΈΠΏΡ‚Π° ΠΈ GitLab CI със ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Π° срСда.

Π‘ΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅

  1. Π—Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ с Π₯юго
  2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Docker Ρ„Π°ΠΉΠ»Π°
  3. Π—Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ с kaniko
  4. Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² qbec
  5. ΠžΠΏΠΈΡ‚Π²Π°ΠΌ Gitlab-runner с Kubernetes-executor
  6. Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ Π½Π° Helm с qbec
  7. Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² git-crypt
  8. Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° кутия с инструмСнти
  9. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ Π½ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ ΠΈ сглобяванС Π½Π° изобраТСния ΠΏΠΎ Ρ‚Π°Π³ΠΎΠ²Π΅
  10. ВнСдряванС Π½Π° автоматизация
  11. АртСфакти ΠΈ сглобяванС ΠΏΡ€ΠΈ натисканС Π·Π° мастСриранС
  12. Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΈ срСди
  13. ΠŸΡ€Π΅Π³Π»Π΅Π΄ Π½Π° прилоТСнията

1. Π—Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ с Π₯юго

ΠšΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° създадСм сайт Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° докумСнтация, ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ Π²ΡŠΡ€Ρ…Ρƒ Hugo. Hugo Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° статично ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅.

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ със статичнитС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ, Ρ‰Π΅ Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° тях. Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ‚Π΅ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ Π½Π° сайтовС с Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ някакъв Π²ΠΈΠ΄ php, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€ΠΈ поискванС ΠΎΡ‚ потрСбитСля Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚ страници Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, статичнитС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ са ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ. Π’Π΅ Π²ΠΈ позволяват Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ изходния ΠΊΠΎΠ΄, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½Π΅ Π½Π° Markdown ΠΈ шаблони Π·Π° Ρ‚Π΅ΠΌΠΈ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚Π΅ Π² напълно Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½ сайт.

ВоСст Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ структура Π½Π° дирСктория ΠΈ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ html Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π° ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ Π½Π° всСки Π΅Π²Ρ‚ΠΈΠ½ хостинг ΠΈ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ сайт.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инсталиратС Hugo Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡ€ΠΎΠ±Π²Π°Ρ‚Π΅:

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° новия сайт:

hugo new site docs.example.org

И Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ:

cd docs.example.org
git init

ЗасСга Π½Π°ΡˆΠΈΡΡ‚ сайт Π΅ чист ΠΈ Π·Π° Π΄Π° сС появи Π½Π΅Ρ‰ΠΎ Π½Π° Π½Π΅Π³ΠΎ, ΠΏΡŠΡ€Π²ΠΎ трябва Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ Ρ‚Π΅ΠΌΠ°, Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π΅ просто Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ шаблони ΠΈ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΏΠΎ ΠΊΠΎΠΈΡ‚ΠΎ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π½Π°ΡˆΠΈΡΡ‚ сайт.

ΠšΠ°Ρ‚ΠΎ Ρ‚Π΅ΠΌΠ° Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π£Ρ‡Π°, ΠΊΠΎΠΉΡ‚ΠΎ спорСд ΠΌΠ΅Π½ Π΅ Π½Π°ΠΉ-подходящ Π·Π° сайт с докумСнтация.

Π‘ΠΈΡ… искал Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π° спСциално Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, вмСсто Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄Π° Π³ΠΎ ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ с git ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»:

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

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ само Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, пряко ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π² Π½Π°ΡˆΠ΅Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Π° ΡΠ²ΡŠΡ€Π·Π°Π½Π°Ρ‚Π° Ρ‚Π΅ΠΌΠ° Ρ‰Π΅ останС ΠΊΠ°Ρ‚ΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ° към ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ Π² Π½Π΅Π³ΠΎ, тоСст Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ ΠΎΡ‚ оригиналния ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ ΠΈ Π΄Π° Π½Π΅ сС страхува Π½Π° Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ.

Π”Π° ΠΎΠΏΡ€Π°Π²ΠΈΠΌ конфигурацията config.toml:

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

Π’Π΅Ρ‡Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС:

hugo server

И Ρ‚ΠΎ Π½Π° адрСса http://localhost:1313/ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ новосъздадСния Π½ΠΈ сайт, всички Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² дирСкторията Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½Π°Ρ‚Π° страница Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ!

НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° създадСм Π·Π°Π³Π»Π°Π²Π½Π° страница Π² ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° Π½ΠΎΠ²ΠΎΡΡŠΠ·Π΄Π°Π΄Π΅Π½Π°Ρ‚Π° страница

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π—Π° Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ сайт, просто стартирайтС:

hugo

Π‘ΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ Π½Π° дирСктория общСствСна / ΠΈ Ρ‰Π΅ бъдС Π²Π°ΡˆΠΈΡΡ‚ сайт.
Π”Π°, ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π½Π΅ΠΊΠ° Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ .gitignore:

echo /public > .gitignore

НС забравяйтС Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:

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

2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Docker Ρ„Π°ΠΉΠ»Π°

Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ структурата Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. ОбикновСно ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π½Π΅Ρ‰ΠΎ ΠΊΠ°Ρ‚ΠΎ:

.
β”œβ”€β”€ deploy
β”‚   β”œβ”€β”€ app1
β”‚   └── app2
└── dockerfiles
    β”œβ”€β”€ image1
    └── image2

  • dockerfiles/ - ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Dockerfiles ΠΈ всичко Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π΄ΠΎΠΊΠ΅Ρ€ изобраТСния.
  • Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌ/ - ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π·Π° внСдряванС Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ прилоТСния Π² 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 ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΄Π²Π° ОВ, Ρ‚Π°Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ сС Π½Π°Ρ€ΠΈΡ‡Π° ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π²ΠΈ позволява Π΄Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ всичко Π½Π΅Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ€.
Π’Π°ΠΊΠ° ΠΊΡ€Π°ΠΉΠ½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° само darkhttpd (Π»Π΅ΠΊ HTTP ΡΡŠΡ€Π²ΡŠΡ€) ΠΈ общСствСна / - ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° нашия статично Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ сайт.

НС забравяйтС Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:

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

3. Π—Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ с kaniko

ΠšΠ°Ρ‚ΠΎ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π» Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ изобраТСния, Ρ€Π΅ΡˆΠΈΡ… Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΊΠ°Π½ΠΈΠΊΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ изисква Π΄ΠΎΠΊΠ΅Ρ€ Π΄Π΅ΠΌΠΎΠ½, Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π° самото сглобяванС ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ Π½Π° всяка машина ΠΈ Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° кСша Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² систСмния Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€, ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ сС ΠΎΡ‚ΡŠΡ€Π²Π°Π²Π° ΠΎΡ‚ нСобходимостта Π΄Π° ΠΈΠΌΠ° ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ постоянно Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

Π—Π° Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, просто стартирайтС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с kaniko ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π» ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Π΅Ρ‚Π΅ тСкущия контСкст Π½Π° компилация към Π½Π΅Π³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ, Ρ‡Ρ€Π΅Π· Π΄ΠΎΠΊΠ΅Ρ€:

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

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ registry.gitlab.com/kvaps/docs.example.org/website - ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° вашия Π΄ΠΎΠΊΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·, слСд ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Ρ‰Π΅ сС стартира Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π² Π΄ΠΎΠΊΠ΅Ρ€ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ --кСш Π²ΠΈ позволява Π΄Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Ρ‚Π΅ слоСвС Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ΠΈΡ‚Π΅, Π·Π° дадСния ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ Π² registry.gitlab.com/kvaps/docs.example.org/website/cache, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° посочитС Π΄Ρ€ΡƒΠ³ ΠΏΡŠΡ‚ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° --cache-repo.

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

4. Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² qbec

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 - Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΎΠ±Ρ‰ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° всички срСди
  • срСди/default.libsonnet - ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΏΡ€Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π·Π° срСдата ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅

Π½Π΅ΠΊΠ° ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ срСди/base.libsonnet ΠΈ Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° нашия ΠΏΡŠΡ€Π²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚Π°ΠΌ:

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

НСка създадСм ΠΈ нашия ΠΏΡŠΡ€Π²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ/website.jsonnet:

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

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

Π’ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» Π½ΠΈΠ΅ описахмС Ρ‚Ρ€ΠΈ Kubernetes ΠΎΠ±Π΅ΠΊΡ‚Π° навСднъТ, Ρ‚ΠΎΠ²Π° са: внСдряванС, обслуТванС ΠΈ Π’Π»ΠΈΠ·Π°Π½Π΅. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π±ΠΈΡ…ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° Π³ΠΈ размСстим Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, Π½ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ Π΅Π΄ΠΈΠ½ Π½ΠΈ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½.

синтаксис 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-executor

Π”ΠΎ скоро ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… само ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ gitlab-Π±Π΅Π³Π°Ρ‡ Π½Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½Π° машина (LXC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€) с shell- ΠΈΠ»ΠΈ docker-executor. ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ ΠΈΠΌΠ°Ρ…ΠΌΠ΅ няколко ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ Π±Π΅Π³Π°Ρ‡ΠΈ, Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ Π² Π½Π°ΡˆΠ°Ρ‚Π° gitlab. Π’Π΅ ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…Π° Π΄ΠΎΠΊΠ΅Ρ€ изобраТСния Π·Π° всички ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ.

Но ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Ρ‚Π°, Ρ‚Π°Π·ΠΈ опция Π½Π΅ Π΅ Π½Π°ΠΉ-ΠΈΠ΄Π΅Π°Π»Π½Π°Ρ‚Π°, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° практичност, Ρ‚Π°ΠΊΠ° ΠΈ ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° сигурност. Много ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ ΠΈ идСологичСски ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Π±Π΅Π³Π°Ρ‡ΠΈ, Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π·Π° всСки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π΄ΠΎΡ€ΠΈ Π·Π° всяка срСда.

Π—Π° щастиС Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ сСга Ρ‰Π΅ сС Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ gitlab-Π±Π΅Π³Π°Ρ‡ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΊΠ°Ρ‚ΠΎ част ΠΎΡ‚ нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Π² Kubernetes.

Gitlab прСдоставя Π³ΠΎΡ‚ΠΎΠ²Π° Ρ…Π΅Π»ΠΌ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° Π·Π° внСдряванС Π½Π° gitlab-runner Π² Kubernetes. Π’Π°ΠΊΠ° Ρ‡Π΅ всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Π·Π½Π°Π΅Ρ‚Π΅ Π΅ рСгистрационСн Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Настройки -> 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-Π±Π΅Π³Π°Ρ‡ част ΠΎΡ‚ нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° Π³ΠΎ опишСм Π² Π½Π°ΡˆΠ΅Ρ‚ΠΎ Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

МоТСм Π΄Π° Π³ΠΎ опишСм ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ уСбсайт, Π½ΠΎ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌΠ΅ Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ копия уСбсайт ΠΌΠ½ΠΎΠ³ΠΎ чСсто, Π·Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ gitlab-Π±Π΅Π³Π°Ρ‡, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ бъдС Π²Π½Π΅Π΄Ρ€Π΅Π½ само вСднъТ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ Π½Π° 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.

Π”Ρ€ΡƒΠ³ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ цялото Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ https://github.com/helm/charts

НСка опишСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ/gitlab-runner.jsonnet:

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

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

ΠŸΡŠΡ€Π²ΠΈΡΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π° expandHelmTemplate слСд Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡŠΡ‚Ρ към Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π° params.values, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π·Π΅ΠΌΠ°ΠΌΠ΅ ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° срСдата, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ΄Π²Π° ΠΎΠ±Π΅ΠΊΡ‚ΡŠΡ‚ с

  • nameTemplate - ΠΈΠΌΠ΅ Π½Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Ρ‚ΠΎ
  • пространство ΠΎΡ‚ ΠΈΠΌΠ΅Π½Π° - пространство ΠΎΡ‚ ΠΈΠΌΠ΅Π½Π°, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΎ Π½Π° helm
  • Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» - Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅Π΄Π°Π²Π° ΠΏΡŠΡ‚Ρ към тСкущия Ρ„Π°ΠΉΠ»
  • многословСн - ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° шаблон Π·Π° ΠΊΠΎΡ€ΠΌΠΈΠ»ΠΎ с всички Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΏΡ€ΠΈ Ρ€Π΅Π½Π΄ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° опишСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π·Π° нашия ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² срСди/base.libsonnet:

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

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

Моля, ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ runnerRegistrationToken ΠΈΠ·Π²Π»ΠΈΡ‡Π°ΠΌΠ΅ ΠΎΡ‚ външСн Ρ„Π°ΠΉΠ» secrets/base.libsonnet, Π½Π΅ΠΊΠ° Π³ΠΎ създадСм:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

НСка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΄Π°Π»ΠΈ всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ:

qbec show default

Π°ΠΊΠΎ всичко Π΅ Π½Π°Ρ€Π΅Π΄, Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅ΠΌ Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΠΎ-Ρ€Π°Π½ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½Π° Ρ‡Ρ€Π΅Π· Helm вСрсия:

helm uninstall gitlab-runner

ΠΈ Π³ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚Π΅, Π½ΠΎ Ρ‡Ρ€Π΅Π· qbec:

qbec apply default

7. Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² git-crypt

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-ΠΊΡ€ΠΈΠΏΡ‚Π°.

git-ΠΊΡ€ΠΈΠΏΡ‚Π° Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ с Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π²ΠΈ позволява Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π°Ρ‚Π΅ цялата история Π½Π° Ρ‚Π°ΠΉΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° сравняватС, обСдиняватС ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½, ΠΊΠ°ΠΊΡ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²Π΅Ρ…ΠΌΠ΅ Π² случая с Git.

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ слСд инсталацията git-ΠΊΡ€ΠΈΠΏΡ‚Π° трябва Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ Π·Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅:

git crypt init

Ако ΠΈΠΌΠ°Ρ‚Π΅ PGP ΠΊΠ»ΡŽΡ‡, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΊΠ°Ρ‚ΠΎ ΡΡŠΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊ Π·Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

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

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Ρ‚Π΅ Ρ‚ΠΎΠ²Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ личния си ΠΊΠ»ΡŽΡ‡.

Ако няматС PGP ΠΊΠ»ΡŽΡ‡ ΠΈ Π½Π΅ сС ΠΎΡ‡Π°ΠΊΠ²Π°, Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ ΠΈ Π΄Π° СкспортиратС ΠΊΠ»ΡŽΡ‡Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

git crypt export-key /path/to/keyfile

Π’Π°ΠΊΠ° всСки, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΈΡ‚Π΅ΠΆΠ°Π²Π° изнСсСн ΠΊΠ»ΡŽΡ‡ΠΎΠ² Ρ„Π°ΠΉΠ» Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° създадСм Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡŠΡ€Π²Π° Ρ‚Π°ΠΉΠ½Π°.
НСка Π²ΠΈ напомня, Ρ‡Π΅ всС ΠΎΡ‰Π΅ смС Π² указатСля внСдряванС/gitlab-runner/ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ дирСктория Ρ‚Π°ΠΉΠ½ΠΈ/, Π½Π΅ΠΊΠ° ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°ΠΌΠ΅ всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² Π½Π΅Π³ΠΎ, Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ създадСм Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΉΠ½ΠΈ/.gitattributes със ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π°:

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

ΠšΠ°ΠΊΡ‚ΠΎ сС Π²ΠΈΠΆΠ΄Π° ΠΎΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ, всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ маска * Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ ΠΏΡ€Π΅Π· git-ΠΊΡ€ΠΈΠΏΡ‚Π°, с ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° .gitattributes

МоТСм Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ изпълним:

git crypt status -e

На ΠΈΠ·Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ списък с всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΎ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅

Π’ΠΎΠ²Π° Π΅ всичко, сСга ΠΌΠΎΠΆΠ΅ΠΌ бСзопасно Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΠΌ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:

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

Π—Π° Π΄Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅:

git crypt lock

ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ всички ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Ρ‰Π΅ сС ΠΏΡ€Π΅Π²ΡŠΡ€Π½Π°Ρ‚ Π² Π½Π΅Ρ‰ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎ, Ρ‰Π΅ бъдС нСвъзмоТно Π΄Π° сС ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π°Ρ‚.
Π—Π° Π΄Π° Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Ρ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅:

git crypt unlock

8. Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° кутия с инструмСнти

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° кутия с инструмСнти Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с всички инструмСнти, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° внСдряванС Π½Π° нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π’ΠΎΠΉ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ gitlab runner Π·Π° изпълнСниС Π½Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° внСдряванС.

Π’ΡƒΠΊ всичко Π΅ просто, създавамС Π½ΠΎΠ²ΠΎ dockerfiles/кутия с инструмСнти/Dockerfile със ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π°:

FROM alpine:3.11

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

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

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

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

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ инсталирамС всички ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ Π·Π° внСдряванС Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. НямамС Π½ΡƒΠΆΠ΄Π° Ρ‚ΡƒΠΊ, освСн Π°ΠΊΠΎ kubectl, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° искатС Π΄Π° си ΠΏΠΎΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅ с Π½Π΅Π³ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ настройватС Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠΈΡ€Π°ΠΌΠ΅ с Kubernetes ΠΈ Π΄Π° Π³ΠΎ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, трябва Π΄Π° настроим роля Π·Π° ΠΏΠΎΠ΄ΠΎΠ²Π΅Ρ‚Π΅, Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ gitlab-runner.

Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π² дирСкторията с gitlab-runner'om:

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 --tagsΠΈ Π²ΠΈΠΆΡ‚Π΅ нашия ΠΏΡŠΡ€Π²ΠΈ Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄:

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΠΈΡ‚Π΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ Π½Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ, са Π΄ΠΎΠ±Ρ€ΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ изобраТСния, Π½ΠΎ Π½Π΅ ΠΈ Π·Π° внСдряванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Kubernetes. Въй ΠΊΠ°Ρ‚ΠΎ Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ‚Π°Π³ΠΎΠ²Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ присвоСни ΠΈ Π½Π° стари Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ, Π² Ρ‚ΠΎΠ·ΠΈ случай ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π·Π° тях Ρ‰Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ внСдряванСто Π½Π° старата вСрсия.

Π—Π° Π΄Π° сС Ρ€Π΅ΡˆΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ изобраТСния ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с Ρ‚Π°Π³ΠΎΠ²Π΅ ΠΈ внСдряванСто Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² ΠΊΠ»ΠΎΠ½Π° майстор, Π² ΠΊΠΎΠΉΡ‚ΠΎ вСрсиитС Π½Π° ΡΡŠΠ±Ρ€Π°Π½ΠΈΡ‚Π΅ изобраТСния са Ρ‚Π²ΡŠΡ€Π΄ΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΈ. Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π°Π·Π°Π΄ с просто Π²Ρ€ΡŠΡ‰Π°Π½Π΅ майстор- ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅.

10. Π’Π½Π΅Π΄Ρ€Π΅Ρ‚Π΅ автоматизация

Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Gitlab-runner Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° Π½Π°ΡˆΠΈΡ‚Π΅ Ρ‚Π°ΠΉΠ½ΠΈ, трябва Π΄Π° СкспортирамС ΠΊΠ»ΡŽΡ‡Π° Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ ΠΈ Π΄Π° Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ към Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° CI срСда:

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

Ρ‰Π΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ получСния Π½ΠΈΠ· Π² Gitlab, Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π² настройкитС Π½Π° нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:
Настройки β€”> CI / CD β€”> ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ

И ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°:

Π’ΠΈΠΏ
ΠΊΠ»ΡŽΡ‡
Бтойност
Π—Π°Ρ‰ΠΈΡ‚Π΅Π½Π°
маскиран
ΠžΠ±Ρ…Π²Π°Ρ‚

File
GITCRYPT_KEY
<your string>
true (ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ false)
true
All environments

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° Π΄ΠΎΠ±Π°Π²Π΅Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ нашия .gitlab-ci.yml добавяйки към Π½Π΅Π³ΠΎ:

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

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

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

Π’ΡƒΠΊ смС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π»ΠΈ някои Π½ΠΎΠ²ΠΈ ΠΎΠΏΡ†ΠΈΠΈ Π·Π° qbec:

  • --root някои/ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ - позволява Π²ΠΈ Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ дирСкторията Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
  • --force:k8s-контСкст __incluster__ - Ρ‚ΠΎΠ²Π° Π΅ магичСска ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, която ΠΊΠ°Π·Π²Π°, Ρ‡Π΅ внСдряванСто Ρ‰Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ Π² ΡΡŠΡ‰ΠΈΡ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€, Π² ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ gtilab-runner. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай qbec Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π° Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈ подходящ Kubernetes ΡΡŠΡ€Π²ΡŠΡ€ във вашия kubeconfig
  • -ΠΈΠ·Ρ‡Π°ΠΊΠ°ΠΉΡ‚Π΅ - ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°Π²Π° qbec Π΄Π° ΠΈΠ·Ρ‡Π°ΠΊΠ°, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ рСсурситС, ΠΊΠΎΠΈΡ‚ΠΎ създава, ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Ρ‚ Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° готовност ΠΈ Π΅Π΄Π²Π° Ρ‚ΠΎΠ³Π°Π²Π° Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ с ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄.
  • -Π΄Π° - просто Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ‚Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π‘ΠΈΠ³ΡƒΡ€Π΅Π½ Π»ΠΈ си? ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ.

НС забравяйтС Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:

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

И слСд git push Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ са Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈ Π½Π°ΡˆΠΈΡ‚Π΅ прилоТСния:

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° втория ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² 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 ΠΈ сСга Ρ‰Π΅ ΠΈΠ·Π±ΡƒΡ‚Π°ΠΌΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ с ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ ΠΊΠ»ΠΎΠ½Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π° вашия ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€. ЗаслуТава Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ с Ρ‚Π°Π³ΠΎΠ²Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½ΠΈ снимки Π½Π° сайта с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° вСрсия Π² докСрския Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€.

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π·Π° Π½ΠΎΠ²Π°Ρ‚Π° вСрсия Π½Π° сайта ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΎ, всС ΠΎΡ‰Π΅ трябва Π΄Π° опишСм ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π·Π° Kubernetes, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай просто няма Π΄Π° ΠΏΡ€Π΅Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΎΡ‚ Π½ΠΎΠ²ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ няма Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² манифСст Π·Π° внСдряванС.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ --vm:ext-str digest="$DIGEST" Π·Π° qbec - позволява Π²ΠΈ Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ външна ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° към jsonnet. ИскамС Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° с всяко ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. Π’Π΅Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ трябва Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° вСрсия Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° задСйствамС внСдряванСто, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ.

Π’ΡƒΠΊ способността Π½Π° Kaniko Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈ дайдТСста Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ във Ρ„Π°ΠΉΠ» Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ (опция --digest-Ρ„Π°ΠΉΠ»)
Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» ΠΈ Ρ‰Π΅ Π³ΠΎ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ΠΌ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° внСдряванСто.

НСка Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π·Π° нашия Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅/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"

ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π³ΠΎ слСд Ρ‚ΠΎΠ²Π° git push трябва Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° Pipeline Π·Π° master

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² 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/**/*

ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Ρ‰Π΅ слСди ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² внСдряванС/gitlab-runner/ ΠΈ Ρ‰Π΅ задСйства Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½ΠΈ само Π°ΠΊΠΎ ΠΈΠΌΠ° Ρ‚Π°ΠΊΠΈΠ²Π°

НС забравяйтС Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:

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

git push, Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅:

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° актуализирания ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² 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 ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ - Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΡŠΡ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° опишСм Ρ€Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅ Π·Π° Π½Π°ΡˆΠΈΡ‚Π΅ срСди (ΠΏΡ€Π΅Π³Π»Π΅Π΄ ΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅):

Π”ΠΎΠ±Π°Π²ΠΈ РСцСнзия срСда Π² Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅/website/qbec.yaml

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

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π³ΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ Π² Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅/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

И Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ пСрсонализирани ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° Π½Π΅Π³ΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅/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 push, git checkout -b тСст, git push ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ тСст, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅:

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° създадСни срСди Π² Gitlab

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ Π»ΠΈ? - страхотно, ΠΈΠ·Ρ‚Ρ€ΠΈΠΉΡ‚Π΅ нашия тСстов ΠΊΠ»ΠΎΠ½: Π½Π°Ρ‡Π°Π»ΠΎ Π½Π° ΠΏΠΎΡ€ΡŠΡ‡ΠΊΠ°Ρ‚Π°, git push origin :test, провСрявамС Π΄Π°Π»ΠΈ заданията Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° срСдата са Ρ€Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈ Π±Π΅Π· Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π’ΡƒΠΊ Π²Π΅Π΄Π½Π°Π³Π° искам Π΄Π° поясня, Ρ‡Π΅ всСки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° създава ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Ρ‚ΠΎΠΉ ΡΡŠΡ‰ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° промСня .gitlab-ci.yml Ρ„Π°ΠΉΠ» ΠΈ сСкрСтни ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ.
Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ Π΅ силно ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° сС Ρ€Π°Π·Ρ€Π΅ΡˆΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ само Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² майсторили ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° всяка срСда.

13 ΠŸΡ€Π΅Π³Π»Π΅Π΄ Π½Π° прилоТСния

ΠŸΡ€Π΅Π³Π»Π΅Π΄ Π½Π° прилоТСнията Ρ‚ΠΎΠ²Π° Π΅ функция Π½Π° gitlab, която Π²ΠΈ позволява Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Π±ΡƒΡ‚ΠΎΠ½ Π·Π° всСки Ρ„Π°ΠΉΠ» Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, Π·Π° Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π±ΡŠΡ€Π·ΠΎ Π² Ρ€Π°Π·Π³ΡŠΡ€Π½Π°Ρ‚Π°Ρ‚Π° срСда.

Π—Π° Π΄Π° сС появят Ρ‚Π΅Π·ΠΈ Π±ΡƒΡ‚ΠΎΠ½ΠΈ, трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ Ρ„Π°ΠΉΠ» .gitlab/route-map.yml ΠΈ ΠΎΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π² Π½Π΅Π³ΠΎ всички трансформации Π½Π° ΠΏΡŠΡ‚Π΅ΠΊΠΈΡ‚Π΅, Π² нашия случай Ρ‰Π΅ бъдС ΠΌΠ½ΠΎΠ³ΠΎ просто:

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

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

НС забравяйтС Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ:

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

git pushΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅:

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° Π±ΡƒΡ‚ΠΎΠ½Π° Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ ΡΠ²ΡŠΡ€ΡˆΠ΅Π½Π°!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Благодаря Π²ΠΈ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ, надявам сС Π΄Π° Π²ΠΈ Π΅ харСсало Π˜Π·ΠΏΡ€ΠΎΠ±Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° внСдряванС Π² Kubernetes

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€