werf β€” наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

27 мая Π² Π³Π»Π°Π²Π½ΠΎΠΌ Π·Π°Π»Π΅ ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ DevOpsConf 2019, проходящСй Π² Ρ€Π°ΠΌΠΊΠ°Ρ… фСстиваля РИВ++ 2019, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… сСкции «НСпрСрывная поставка», ΠΏΡ€ΠΎΠ·Π²ΡƒΡ‡Π°Π» Π΄ΠΎΠΊΠ»Π°Π΄ Β«werf β€” наш инструмСнт для CI/CD Π² KubernetesΒ». Π’ Π½Ρ‘ΠΌ рассказываСтся ΠΎ Ρ‚Π΅Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… ΠΈ Π²Ρ‹Π·ΠΎΠ²Π°Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ сталкиваСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅ Π² Kubernetes, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ Π½ΡŽΠ°Π½ΡΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ Π½Π΅ сразу. Разбирая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΠ°ΠΊ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² Open Source-инструмСнтС werf.

Π‘ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° выступлСния наша ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° (Ρ€Π°Π½Π΅Π΅ извСстная ΠΊΠ°ΠΊ dapp) ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π»Π° историчСский Ρ€ΡƒΠ±Π΅ΠΆ Π² 1000 Π·Π²Ρ‘Π·Π΄ Π½Π° GitHub β€” ΠΌΡ‹ надССмся, Ρ‡Ρ‚ΠΎ растущСС сообщСство Π΅Ρ‘ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ упростит Тизнь ΠΌΠ½ΠΎΠ³ΠΈΠΌ DevOps-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌ.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Π˜Ρ‚Π°ΠΊ, прСдставляСм Π²ΠΈΠ΄Π΅ΠΎ с Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠΌ (~47 ΠΌΠΈΠ½ΡƒΡ‚, Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Π΅Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ) ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π²Ρ‹ΠΆΠΈΠΌΠΊΡƒ ΠΈΠ· Π½Π΅Π³ΠΎ Π² тСкстовом Π²ΠΈΠ΄Π΅. ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!

Доставка ΠΊΠΎΠ΄Π° Π² Kubernetes

Π Π΅Ρ‡ΡŒ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ большС Π½Π΅ ΠΏΡ€ΠΎ werf, Π° ΠΏΡ€ΠΎ CI/CD Π² Kubernetes, подразумСвая, Ρ‡Ρ‚ΠΎ наш софт ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½ Π² Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ (ΠΎΠ± этом я рассказывал Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ 2016 Π³ΠΎΠ΄Π°), Π° K8s Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π΅Π³ΠΎ запуска Π² production (ΠΎΠ± этом β€” Π² 2017 Π³ΠΎΠ΄Ρƒ).

Как выглядит доставка Π² Kubernetes?

  • Π•ΡΡ‚ΡŒ Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ инструкциями для Π΅Π³ΠΎ сборки. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ собираСтся Π² Docker-ΠΎΠ±Ρ€Π°Π· ΠΈ публикуСтся Π² Docker Registry.
  • Π’ Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ инструкции ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ. На стадии дСплоя эти инструкции ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Kubernetes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΈΠ· registry ΠΈ запускаСт Π΅Π³ΠΎ.
  • Плюс, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΅ΡΡ‚ΡŒ тСсты. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·Π°. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ (ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ инструкциям) Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ копию прилоТСния (Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½ K8s ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ кластСрС) ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ тСсты Ρ‚Π°ΠΌ.
  • НаконСц, Π½ΡƒΠΆΠ½Π° CI-систСма, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ события ΠΈΠ· Git’Π° (ΠΈΠ»ΠΈ наТатия ΠΊΠ½ΠΎΠΏΠΎΠΊ) ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ стадии: build, publish, deploy, test.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Π—Π΄Π΅ΡΡŒ Π΅ΡΡ‚ΡŒ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ:

  1. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас нСизмСняСмая инфраструктура (immutable infrastructure), ΠΎΠ±Ρ€Π°Π· прилоТСния, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° всСх этапах (staging, production ΠΈ Ρ‚.ΠΏ.), Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом ΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ я рассказывал здСсь.
  2. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ слСдуСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ инфраструктура ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ (IaC), ΠΊΠΎΠ΄ прилоТСния, инструкции для Π΅Π³ΠΎ сборки ΠΈ запуска Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом β€” см. Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Π΅.
  3. Π¦Π΅ΠΏΠΎΡ‡ΠΊΡƒ доставки (delivery) ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊ: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ собрали, протСстировали, Ρ€Π΅Π»ΠΈΠ·Π½ΡƒΠ»ΠΈ (этап release) ΠΈ всё β€” доставка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π°. Но Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΠ»ΠΈ, Π½Π΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ это доставили Π² production, Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ смог Ρ‚ΡƒΠ΄Π° Π·Π°ΠΉΡ‚ΠΈ ΠΈ этот production Ρ€Π°Π±ΠΎΡ‚Π°Π». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° доставки заканчиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° этапС эксплуатации (run), Π° Ссли Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ ΡƒΠ±Ρ€Π°Π»ΠΈ с production (Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π΅Π³ΠΎ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ).

ВСрнёмся ΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ схСмС доставки Π² Kubernetes: Π΅Ρ‘ ΠΈΠ·ΠΎΠ±Ρ€Π΅Π»ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹, Π½ΠΎ ΠΈ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΊΡ‚ΠΎ занимался Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. По сути этот ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ сСйчас Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ GitOps (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π΅ ΠΈ стоящими Π·Π° Π½ΠΈΠΌ идСями ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь). ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° этапы схСмы.

Бтадия сборки (build)

Казалось Π±Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π² 2019 Π³ΠΎΠ΄Ρƒ ΠΏΡ€ΠΎ сборку Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ², ΠΊΠΎΠ³Π΄Π° всС ΡƒΠΌΠ΅ΡŽΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Dockerfile’Ρ‹ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ docker build?.. Π’ΠΎΡ‚ Π½ΡŽΠ°Π½ΡΡ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

  1. ВСс ΠΎΠ±Ρ€Π°Π·Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ multi-stage, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Π·Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния.
  2. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ слоёв Π½Π°Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, объСдиняя Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈΠ· RUN-ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΠΎ смыслу.
  3. Однако это добавляСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ сборки приходится ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ, которая Π²Ρ‹Π·Π²Π°Π»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.
  4. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ сборки Π²Π°ΠΆΠ½Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ быстро Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ измСнСния ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. НапримСр, Π½Π΅ хочСтся ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ зависимости Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… языка ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборкС прилоТСния.
  5. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Git-рСпозитория Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΈΠ· Dockerfile’ΠΎΠ² (ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ стадиями Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅) ΠΈ Bash-скриптом с ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ сборкой.

Π­Ρ‚ΠΎ Π±Ρ‹Π»Π° лишь Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΠ° айсбСрга, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ всС. Но Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π° Π² частности:

  1. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π° стадии сборки Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚ΠΈΠΏΠ° apt’Π° Π² ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡŽΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ).
  2. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ansible вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° shell’Π΅.
  3. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π±Π΅Π· Docker (Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°Π΄ΠΎ всё для этого Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ кластСр Kubernetes, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹?).
  4. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ сборка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ: Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· Dockerfile (Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ multi-stage), нСсколько ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ рСпозитория, нСсколько Dockerfile’ΠΎΠ².
  5. РаспрСдСлённая сборка: ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² pod’Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ «эфСмСрными», Ρ‚.ΠΊ. Ρƒ Π½ΠΈΡ… ΠΏΡ€ΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ кэш, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ β€” Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π³Π΄Π΅-Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.
  6. НаконСц, Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ ΠΆΠ΅Π»Π°Π½ΠΈΠΉ я Π½Π°Π·Π²Π°Π» Π°Π²Ρ‚ΠΎΠΌΠ°Π³ΠΈΠ΅ΠΉ: идСально Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π½Π°Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, собранный с ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π»ΠΈΡ‡Π½ΠΎ я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ всС Π½ΡŽΠ°Π½ΡΡ‹ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

И Π²ΠΎΡ‚ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹:

  • moby/buildkit β€” сборщик ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Docker Inc (ΡƒΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ вСрсии Docker), которая пытаСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹;
  • kaniko β€” сборщик ΠΎΡ‚ Google, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π±Π΅Π· Docker;
  • Buildpacks.io β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° CNCF ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Π³ΠΈΡŽ ΠΈ, Π² частности, интСрСсноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с rebase для слоёв;
  • ΠΈ Π΅Ρ‰Ρ‘ ΠΊΡƒΡ‡Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ buildah, genuinetools/img…

… ΠΈ посмотритС, сколько Ρƒ Π½ΠΈΡ… Π·Π²Ρ‘Π·Π΄ Π½Π° GitHub. Π’ΠΎ Π΅ΡΡ‚ΡŒ, с ΠΎΠ΄Π½ΠΎΠΉ стороны, docker build Π΅ΡΡ‚ΡŒ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ-Ρ‚ΠΎ вопрос Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π½Π΅ Ρ€Π΅ΡˆΡ‘Π½ β€” Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ этому ΠΈ слуТит ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сборщиков, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π‘Π±ΠΎΡ€ΠΊΠ° Π² werf

Π’Π°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΊ werf (Ρ€Π°Π½Π΅Π΅ извСстной ΠΊΠ°ΠΊ dapp) β€” Open Source-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Β«Π€Π»Π°Π½Ρ‚Β», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚. ΠΠ°Ρ‡ΠΈΠ½Π°Π»ΠΎΡΡŒ всё Π»Π΅Ρ‚ 5 Π½Π°Π·Π°Π΄ с Bash-скриптов, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… сборку Dockerfile’ΠΎΠ², Π° послСдниС 3 Π³ΠΎΠ΄Π° вСдётся полноцСнная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° со своим Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ (сначала Π½Π° Ruby, Π° ΠΏΠΎΡ‚ΠΎΠΌ пСрСписали Π½Π° Go, Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ). КакиС вопросы сборки Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π² werf?

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Π—Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹Π΅ синим ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ сборка сдСлана Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ хоста, Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΆΡ‘Π»Ρ‚Ρ‹ΠΌ вопросы ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ Π΄ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ Π»Π΅Ρ‚Π°.

Бтадия ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² registry (publish)

Набрали docker push… β€” Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТного Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π· Π² registry? И Ρ‚ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: «Какой Ρ‚Π΅Π³ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρƒ?Β» Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΎΠ½ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Gitflow (ΠΈΠ»ΠΈ другая стратСгия Git’Π°) ΠΈ Kubernetes, Π° индустрия стрСмится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ происходящСС Π² Kubernetes слСдовало Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ дСлаСтся Π² Git. Π’Π΅Π΄ΡŒ Git β€” наш СдинствСнный источник ΠΏΡ€Π°Π²Π΄Ρ‹.

Π§Ρ‚ΠΎ Π² этом слоТного? Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ: ΠΎΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π² Git, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΉ (immutable), Π΄ΠΎ ΠΎΠ±Ρ€Π°Π·Π° Docker, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅.

Нам Ρ‚Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ происхоТдСниС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π±Ρ‹Π»ΠΎ собрано ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ΅ Π² Kubernetes (Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ смоТСм Π΄Π΅Π»Π°Ρ‚ΡŒ diff’Ρ‹ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ).

Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ тСгирования

ΠŸΠ΅Ρ€Π²Π°Ρ β€” это простой git tag. Π£ нас Π΅ΡΡ‚ΡŒ registry с ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°ΠΊ 1.0. Π’ Kubernetes Π΅ΡΡ‚ΡŒ stage ΠΈ production, ΠΊΡƒΠ΄Π° этот ΠΎΠ±Ρ€Π°Π· Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½. Π’ Git ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ставим Ρ‚Π΅Π³ 2.0. Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎ инструкциям ΠΈΠ· рСпозитория ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² registry с Ρ‚Π΅Π³ΠΎΠΌ 2.0. Π’Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π½Π° stage ΠΈ, Ссли всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΠΎΡ‚ΠΎΠΌ Π½Π° production.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сначала поставили Ρ‚Π΅Π³, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ протСстировали ΠΈ Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΠ»ΠΈ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это просто Π½Π΅Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ: ΠΌΡ‹ Π²Ρ‹Π΄Π°Π΅ΠΌ Π²Π΅Ρ€ΡΠΈΡŽ софту, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π΄Π°ΠΆΠ΅ Π½Π΅ провСряли (Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅, Ρ‚.ΠΊ. для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, трСбуСтся ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π΅Π³). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π½Π΅ сочСтаСтся с Gitflow.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” git commit + tag. Π’ master-Π²Π΅Ρ‚ΠΊΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚Π΅Π³ 1.0; для Π½Π΅Π³ΠΎ Π² registry β€” ΠΎΠ±Ρ€Π°Π·, Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ Π½Π° production. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Kubernetes-кластСрС Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ preview ΠΈ staging. Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ слСдуСм Gitflow: Π² основной Π²Π΅Ρ‚ΠΊΠ΅ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (develop) Π΄Π΅Π»Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ появляСтся ΠΊΠΎΠΌΠΌΠΈΡ‚ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ #c1. ΠœΡ‹ Π΅Π³ΠΎ собираСм ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π² registry, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (#c1). Π‘ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π½Π° preview. Аналогично Π΄Π΅Π»Π°Π΅ΠΌ с ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ #c2 ΠΈ #c3.

Когда поняли, Ρ‡Ρ‚ΠΎ Ρ„ΠΈΡ‡ достаточно, Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ всё ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ Git создаём Π²Π΅Ρ‚ΠΊΡƒ release_1.1 (Π½Π° Π±Π°Π·Π΅ #c3 ΠΈΠ· develop). Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ этот Ρ€Π΅Π»ΠΈΠ· Π½Π΅ потрСбуСтся, Ρ‚.ΠΊ. это Π±Ρ‹Π»ΠΎ сдСлано Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ этапС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ΅ΠΌ просто Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° staging. Π˜ΡΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ Π±Π°Π³ΠΈ Π² #c4 ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π½Π° staging. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΈΠ΄Ρ‘Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² develop, ΠΊΡƒΠ΄Π° пСриодичСски Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ измСнСния ΠΈΠ· release_1.1. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ собранный ΠΈ Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° staging ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹ (#c25).

Π’ΠΎΠ³Π΄Π° ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ merge (с fast-forward’ΠΎΠΌ) Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ (release_1.1) Π² master. Π‘Ρ‚Π°Π²ΠΈΠΌ Π½Π° этот ΠΊΠΎΠΌΠΌΠΈΡ‚ Ρ‚Π΅Π³ с Π½ΠΎΠ²ΠΎΠΉ вСрсиСй (1.1). Но этот ΠΎΠ±Ρ€Π°Π· ΡƒΠΆΠ΅ собран Π² registry, поэтому, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΅Ρ‰Ρ‘ Ρ€Π°Π·, ΠΌΡ‹ просто добавляСм Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π΅Π³ Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π· (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ Π² registry ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅Π³ΠΈ #c25 ΠΈ 1.1). ПослС этого Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° production.

Π•ΡΡ‚ΡŒ нСдостаток, Ρ‡Ρ‚ΠΎ Π½Π° staging Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π· (#c25), Π° Π½Π° production β€” ΠΊΠ°ΠΊ Π±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΉ (1.1), Π½ΠΎ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ «физичСски» это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π· ΠΈΠ· registry.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Настоящий ΠΆΠ΅ минус Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ merge commit’ΠΎΠ², Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ fast-forward.

МоТно ΠΏΠΎΠΉΡ‚ΠΈ дальшС ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Ρ€ΡŽΠΊβ€¦ Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простого Dockerfile:

FROM ruby:2.3 as assets
RUN mkdir -p /app
WORKDIR /app
COPY . ./
RUN gem install bundler && bundle install
RUN bundle exec rake assets:precompile
CMD bundle exec puma -C config/puma.rb

FROM nginx:alpine
COPY --from=assets /app/public /usr/share/nginx/www/public

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ„Π°ΠΉΠ» ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ:

  • SHA256 ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² (ruby:2.3 ΠΈ nginx:alpine), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ суммами ΠΈΡ… содСрТимого;
  • всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (RUN, CMD ΠΈ Ρ‚.ΠΏ.);
  • SHA256 ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ добавлялись.

… ΠΈ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму (снова SHA256) ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ сигнатура всСго, Ρ‡Ρ‚ΠΎ опрСдСляСт содСрТимоС Docker-ΠΎΠ±Ρ€Π°Π·Π°.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

ВСрнёмся ΠΊ схСмС ΠΈ вмСсто ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сигнатуры, Ρ‚.Π΅. Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹ сигнатурами.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° потрСбуСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с’merge’ΠΈΡ‚ΡŒ измСнСния ΠΈΠ· Ρ€Π΅Π»ΠΈΠ·Π° Π² master, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ настоящий merge commit: Ρƒ Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π½ΠΎ Ρ‚Π° ΠΆΠ΅ сигнатура. Π‘ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΠΌ ΠΎΠ±Ρ€Π°Π· ΠΈ Π½Π° production.

НСдостаток Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ получится ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π° ΠΊΠΎΠΌΠΌΠΈΡ‚ Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½ Π½Π° production β€” ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ слоСм с ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ β€” ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ расскаТу дальшС.

Π’Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² werf

Π’ werf ΠΌΡ‹ пошли Π΅Ρ‰Ρ‘ дальшС ΠΈ готовимся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ сборку с кэшСм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ хранится Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Π΅β€¦ Π˜Ρ‚Π°ΠΊ, Ρƒ нас ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ², ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΈΡ… stage ΠΈ image.

Π’ Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ werf хранятся спСцифичныС инструкции для сборки, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹Π΅ этапы сборки (beforeInstall, install, beforeSetup, setup). ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ stage-ΠΎΠ±Ρ€Π°Π· ΠΌΡ‹ собираСм с сигнатурой, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма ΠΏΠ΅Ρ€Π²Ρ‹Ρ… шагов. Π—Π°Ρ‚Π΅ΠΌ добавляСм исходный ΠΊΠΎΠ΄, для Π½ΠΎΠ²ΠΎΠ³ΠΎ stage-ΠΎΠ±Ρ€Π°Π·Π° ΠΌΡ‹ считаСм Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму… Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ для всСх этапов, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½Π°Π±ΠΎΡ€ ΠΈΠ· stage-ΠΎΠ±Ρ€Π°Π·ΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ Π΄Π΅Π»Π°Π΅ΠΌ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ image-ΠΎΠ±Ρ€Π°Π·, содСрТащий Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π΅Π³ΠΎ происхоТдСнии. И ΡƒΠΆΠ΅ этот ΠΎΠ±Ρ€Π°Π· ΠΌΡ‹ Ρ‚Π΅Π³ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами (подробности ΠΏΠΎΠ·ΠΆΠ΅).

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

ΠŸΡƒΡΡ‚ΡŒ послС этого появляСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ прилоТСния. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚? Для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΏΠ°Ρ‚Ρ‡, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ stage-ΠΎΠ±Ρ€Π°Π·. Π•Π³ΠΎ сигнатура Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма старого stage-ΠΎΠ±Ρ€Π°Π·Π° ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°Ρ‚Ρ‡Π°. Из этого ΠΎΠ±Ρ€Π°Π·Π° Π±ΡƒΠ΄Π΅Ρ‚ сформирован ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ image-ΠΎΠ±Ρ€Π°Π·. АналогичноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ измСнСниях Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… этапах.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, stage-ΠΎΠ±Ρ€Π°Π·Ρ‹ β€” кэш, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ распрСдСлСнно, Π° ΡƒΠΆΠ΅ создаваСмыС ΠΈΠ· Π½Π΅Π³ΠΎ image-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² Docker Registry.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° registry

Π Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π΅ ΠΏΡ€ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ слоёв, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ висящими послС ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ‚Π΅Π³ΠΎΠ², β€” это стандартная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ самого Docker Registry. Π Π΅Ρ‡ΡŒ ΠΎ ситуации, ΠΊΠΎΠ³Π΄Π° накапливаСтся мноТСство Docker-Ρ‚Π΅Π³ΠΎΠ² ΠΈ ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ нСкоторая ΠΈΡ… Ρ‡Π°ΡΡ‚ΡŒ Π½Π°ΠΌ большС Π½Π΅ трСбуСтся, Π° мСсто ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ (ΠΈ/ΠΈΠ»ΠΈ ΠΌΡ‹ Π·Π° Π½Π΅Π³ΠΎ ΠΏΠ»Π°Ρ‚ΠΈΠΌ).

КакиС Π΅ΡΡ‚ΡŒ стратСгии очистки?

  1. МоТно просто Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ. Иногда Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° лишнСС пространство, Ρ‡Π΅ΠΌ Ρ€Π°ΡΠΏΡƒΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΊΠ»ΡƒΠ±ΠΎΠΊ ΠΈΠ· Ρ‚Π΅Π³ΠΎΠ². Но это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лишь Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°.
  2. ΠŸΠΎΠ»Π½Ρ‹ΠΉ сброс. Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π² CI-систСмС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Если Π½Π° production пСрСзапустится ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, для Π½Π΅Π³ΠΎ загрузится Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· β€” Ρ‚Π°ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Π½ΠΈΠΊΠ΅ΠΌ Π½Π΅ тСстировался. Π­Ρ‚ΠΎ ΡƒΠ±ΠΈΠ²Π°Π΅Ρ‚ идСю immutable infrastructure.
  3. Blue-green. Один registry Π½Π°Ρ‡Π°Π» ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ β€” Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’Π° ΠΆΠ΅ самая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ способС: Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ registry, Ρ‡Ρ‚ΠΎ Π½Π°Ρ‡Π°Π» ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ?
  4. По Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π£Π΄Π°Π»ΡΡ‚ΡŒ всС ΠΎΠ±Ρ€Π°Π·Ρ‹ ΡΡ‚Π°Ρ€ΡˆΠ΅ 1 мСсяца? Но ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ найдётся сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ обновлялся Ρ†Π΅Π»Ρ‹ΠΉ мСсяц…
  5. Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ.

По-настоящСму ТизнСспособных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π΄Π²Π°: Π½Π΅ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΆΠ΅ комбинация ΠΈΠ· blue-green + Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π’ послСднСм случаС Ρ€Π΅Ρ‡ΡŒ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€Π° ΠΏΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ registry, создаётС Π½ΠΎΠ²Ρ‹ΠΉ ΠΈ добавляСтС всС Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² Π½Π΅Π³ΠΎ Π½Π° протяТСнии, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, мСсяца. А Ρ‡Π΅Ρ€Π΅Π· мСсяц смотритС, ΠΊΠ°ΠΊΠΈΠ΅ pod’Ρ‹ Π² Kubernetes ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ старый registry, ΠΈ пСрСноситС ΠΈΡ… Ρ‚ΠΎΠΆΠ΅ Π² Π½ΠΎΠ²Ρ‹ΠΉ registry.

К Ρ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ Π² werf? ΠœΡ‹ собираСм:

  1. Git head: всС Ρ‚Π΅Π³ΠΈ, всС Π²Π΅Ρ‚ΠΊΠΈ, β€” прСдполагая, Ρ‡Ρ‚ΠΎ всё, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² Git, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈ Π² ΠΎΠ±Ρ€Π°Π·Π°Ρ… (Π° Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π² самом Git’Π΅);
  2. всС pod’Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½Ρ‹ сСйчас Π² Kubernetes;
  3. старыС ReplicaSet’Ρ‹ (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½ΠΎ), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Helm-Ρ€Π΅Π»ΠΈΠ·Ρ‹ ΠΈ ΠΎΡ‚Π±ΠΈΡ€Π°Ρ‚ΡŒ послСдниС ΠΎΠ±Ρ€Π°Π·Ρ‹ Ρ‚Π°ΠΌ.

… ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΠ· этого Π½Π°Π±ΠΎΡ€Π° whitelist β€” список ΠΎΠ±Ρ€Π°Π·ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ. Всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ‡ΠΈΡ‰Π°Π΅ΠΌ, послС Ρ‡Π΅Π³ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ сиротскиС stage-ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΈ удаляСм ΠΈΡ… Ρ‚ΠΎΠΆΠ΅.

Бтадия дСплоя (deploy)

НадёТная Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² Π΄Π΅ΠΏΠ»ΠΎΠ΅, β€” Π²Ρ‹ΠΊΠ°Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ рСсурсов, объявлСнной Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ YAML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с описаниСм Kubernetes-рСсурсов всСгда сильно отличаСтся ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π² кластСрС. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Kubernetes добавляСт Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ:

  1. ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹;
  2. ΡΠ»ΡƒΠΆΠ΅Π±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ;
  3. мноТСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ;
  4. ΡΠ΅ΠΊΡ†ΠΈΡŽ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ статусом;
  5. измСнСния, сдСланныС Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ admission webhook;
  6. Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² (ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°).

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΊΠΎΠ³Π΄Π° появляСтся новая конфигурация рСсурса (new), ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ просто Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Сю Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ, Β«ΠΆΠΈΠ²ΡƒΡŽΒ», ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ (live). Для этого Π½Π°ΠΌ придётся ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ new с ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‘Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ (last-applied) ΠΈ Π½Π°ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Π½Π° live ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‡.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ называСтся 2-way merge. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Helm.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΈ 3-way merge, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отличаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ:

  • сравнивая last-applied ΠΈ new, ΠΌΡ‹ смотрим, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ;
  • сравнивая new ΠΈ live, ΠΌΡ‹ смотрим, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½ΠΎ;
  • суммированный ΠΏΠ°Ρ‚Ρ‡ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Π½Π° live.

ΠœΡ‹ Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ 1000+ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с Helm, поэтому фактичСски ΠΆΠΈΠ²Ρ‘ΠΌ с 2-way merge. Однако Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ряд ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ своими ΠΏΠ°Ρ‚Ρ‡Π°ΠΌΠΈ, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΌΠΈ Helm’Ρƒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ статус Π²Ρ‹ΠΊΠ°Ρ‚Π°

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΌΡƒ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ наша CI-систСма сгСнСрировала Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для Kubernetes, ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΅Ρ‘ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ (apply) Π² кластСр β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Helm ΠΈΠ»ΠΈ kubectl apply. Π”Π°Π»Π΅Π΅ происходит ΡƒΠΆΠ΅ описанный N-way merge, Π½Π° Ρ‡Ρ‚ΠΎ Kubernetes API ΠΎΠ΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ CI-систСмС, Π° Ρ‚Π° β€” своСму ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Однако Π΅ΡΡ‚ΡŒ огромная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: вСдь ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ Π²Ρ‹ΠΊΠ°Ρ‚. Если Kubernetes понял, Ρ‡Ρ‚ΠΎ Π·Π° измСнСния Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ, примСняСт Π΅Π³ΠΎ β€” ΠΌΡ‹ Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ получится Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅. НапримСр, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ рСстарт pod’ΠΎΠ² Π²ΠΎ frontend’Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π° Π² backend’Π΅ β€” Π½Π΅Ρ‚, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² прилоТСния.

Π§Ρ‚ΠΎΠ±Ρ‹ всё Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π² этой схСмС Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π²Π΅Π½ΠΎ β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚ Kubernetes API ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ статусС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Ρ‘ для дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ полоТСния Π²Π΅Ρ‰Π΅ΠΉ. ΠœΡ‹ создали Open Source-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Go β€” kubedog (см. Π΅Ρ‘ анонс здСсь), β€” которая Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈ встроСна Π² werf.

ПовСдСниС этого Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ werf настраиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ставятся Π½Π° Deployments ΠΈΠ»ΠΈ StatefulSets. Главная аннотация β€” fail-mode β€” ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

  • IgnoreAndContinueDeployProcess β€” ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²Ρ‹ΠΊΠ°Ρ‚Π° этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π΄Π΅ΠΏΠ»ΠΎΠΉ;
  • FailWholeDeployProcessImmediately β€” ошибка Π² этом ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ останавливаСт процСсс дСплоя;
  • HopeUntilEndOfDeployProcess β€” надССмся, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ дСплоя.

НапримСр, такая комбинация ΠΈΠ· рСсурсов ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ fail-mode:

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Когда Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·, Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… (MongoDB) Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²Π° β€” Deployment’Ρ‹ ΡƒΠΏΠ°Π΄ΡƒΡ‚. Но ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ, ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ всё ΠΆΠ΅ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Π΄Π²Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ для kubedog Π² werf:

  • failures-allowed-per-replica β€” количСство Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Ρ… ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ;
  • show-logs-until β€” Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ werf ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ (Π² stdout) Π»ΠΎΠ³ΠΈ ΠΈΠ· всСх Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… pod’ΠΎΠ². По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это PodIsReady (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ вряд Π»ΠΈ Π½ΡƒΠΆΠ½Ρ‹, ΠΊΠΎΠ³Π΄Π° Π½Π° pod Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ), ΠΎΠ΄Π½Π°ΠΊΠΎ допустимы Ρ‚Π°ΠΊΠΆΠ΅ значСния ControllerIsReady ΠΈ EndOfDeploy.

Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ дСплоя?

Помимо ΡƒΠΆΠ΅ описанных Π΄Π²ΡƒΡ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹:

  • Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ β€” ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅, Π° Π½Π΅ всС подряд;
  • ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ прогрСсс, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли job Β«ΠΌΠΎΠ»Ρ‡Π°Β» висит нСсколько ΠΌΠΈΠ½ΡƒΡ‚, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит;
  • ΠΈΠΌΠ΅Ρ‚ΡŒ автоматичСский ΠΎΡ‚ΠΊΠ°Ρ‚ Π½Π° случай, Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ (Π° поэтому ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ статус дСплоя). Π’Ρ‹ΠΊΠ°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ: ΠΈΠ»ΠΈ ΠΎΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, ΠΈΠ»ΠΈ всё возвращаСтся ΠΊ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ.

Π˜Ρ‚ΠΎΠ³ΠΈ

Нам ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСх описанных нюансов Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… этапах доставки (build, publish, deploy) достаточно CI-систСмы ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ werf.

ВмСсто Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

werf — наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ werf ΠΌΡ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΠ»ΠΈΡΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ большого числа ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ DevOps-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π΄Ρ‹, Ссли Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ сообщСство хотя Π±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ эту ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π² Π΄Π΅Π»Π΅. Π”ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° вмСстС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅.

Π’ΠΈΠ΄Π΅ΠΎ ΠΈ слайды

Π’ΠΈΠ΄Π΅ΠΎ с выступлСния (~47 ΠΌΠΈΠ½ΡƒΡ‚):

ΠŸΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΡ Π΄ΠΎΠΊΠ»Π°Π΄Π°:

P.S.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ ΠΏΡ€ΠΎ Kubernetes Π² нашСм Π±Π»ΠΎΠ³Π΅:

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