ДинамичСская сборка ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ² с werf Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сайта вСрсионированной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ

ΠœΡ‹ ΡƒΠΆΠ΅ Π½Π΅ Ρ€Π°Π· рассказывали ΠΏΡ€ΠΎ свой GitOps-инструмСнт werf, Π° Π² этот Ρ€Π°Π· Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ сборки сайта с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ самого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” werf.io (Π΅Π³ΠΎ русскоязычная вСрсия β€” ru.werf.io). Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ статичСский сайт, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅Π³ΠΎ сборка интСрСсна Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ построСна с использованиСм динамичСского количСства Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ².

ДинамичСская сборка ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ² с werf Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сайта вСрсионированной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ

Π’Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Π½ΡŽΠ°Π½ΡΡ‹ структуры сайта: Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΎΠ±Ρ‰Π΅Π³ΠΎ мСню для всСх вСрсий, страницы с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°Ρ… ΠΈ Ρ‚.ΠΏ. β€” Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. ВмСсто этого, сфокусируСмся Π½Π° вопросах ΠΈ особСнностях динамичСской сборки ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π° ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссах CI/CD.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΊΠ°ΠΊ устроСн сайт

НачнСм с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ докумСнтация ΠΏΠΎ werf хранится вмСстС с Π΅Π³ΠΎ ΠΊΠΎΠ΄ΠΎΠΌ. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ трСбования ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Ρ†Π΅Π»ΠΎΠΌ выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ настоящСй ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ:

  • НовыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ werf Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π±Π΅Π· обновлСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ измСнСния Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄ Π½ΠΎΠ²ΠΎΠΉ вСрсии werf;
  • Π£ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° довольно интСнсивная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°: Π½ΠΎΠ²Ρ‹Π΅ вСрсии ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ нСсколько Ρ€Π°Π· Π² дСнь;
  • КакиС-Π»ΠΈΠ±ΠΎ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ дСплою сайта с Π½ΠΎΠ²ΠΎΠΉ вСрсиСй Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹;
  • Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ принят ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ сСмантичСского вСрсионирования, с 5-ю ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π Π΅Π»ΠΈΠ·Π½Ρ‹ΠΉ процСсс ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ вСрсий ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ Π² порядкС ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ: ΠΎΡ‚ alpha Π΄ΠΎ rock-solid;
  • Π£ сайта Π΅ΡΡ‚ΡŒ русскоязычная вСрсия, которая Β«ΠΆΠΈΠ²Ρ‘Ρ‚ ΠΈ развиваСтся» (Ρ‚.Π΅. ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ обновляСтся) ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ с основной (Ρ‚.Π΅. англоязычной) вСрсиСй.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ всю эту Β«Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΊΡƒΡ…Π½ΡŽΒ», ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ² Π΅ΠΌΡƒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ «просто Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Β», ΠΌΡ‹ сдСлали ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт установки ΠΈ обновлСния werf β€” это multiwerf. Достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ Ρ€Π΅Π»ΠΈΠ·Π° ΠΈ ΠΊΠ°Π½Π°Π» ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π° multiwerf ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚, Π΅ΡΡ‚ΡŒ Π»ΠΈ новая вСрсия Π½Π° ΠΊΠ°Π½Π°Π»Π΅, ΠΈ скачаСт Π΅Π΅ ΠΏΡ€ΠΈ нСобходимости.

Π’ мСню Π²Ρ‹Π±ΠΎΡ€Π° вСрсий Π½Π° сайтС доступны послСдниС вСрсии werf Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠΎ адрСсу werf.io/documentation открываСтся вСрсия Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° для послСднСго Ρ€Π΅Π»ΠΈΠ·Π° β€” ΠΎΠ½Π° ΠΆΠ΅ индСксируСтся поисковиками. ДокумСнтация для ΠΊΠ°Π½Π°Π»Π° доступна ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ адрСсам (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, werf.io/v1.0-beta/documentation для beta-Ρ€Π΅Π»ΠΈΠ·Π° 1.0).

Π˜Ρ‚ΠΎΠ³ΠΎ, Ρƒ сайта доступны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вСрсии:

  1. корнСвая (открываСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ),
  2. для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, werf.io/v1.0-beta).

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ вСрсии сайта Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ срСдствами Jekyll, запустив Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /docs рСпозитория werf ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (jekyll build), ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠΈΡΡŒ Π½Π° Git-Ρ‚Π΅Π³ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ вСрсии.

ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ:

  • для сборки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сама ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° (werf);
  • CI/CD-процСссы построСны Π½Π° Π±Π°Π·Π΅ GitLab CI;
  • ΠΈ всС это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Kubernetes.

Π—Π°Π΄Π°Ρ‡ΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сформулируСм Π·Π°Π΄Π°Ρ‡ΠΈ, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ всю ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ спСцифику:

  1. ПослС смСны вСрсии werf Π½Π° любом ΠΊΠ°Π½Π°Π»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ докумСнтация Π½Π° сайтС Π΄ΠΎΠ»ΠΆΠ½Π° автоматичСски ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ.
  2. Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вСрсии сайта.

ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ сайта Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ послС смСны вСрсии Π½Π° любом ΠΊΠ°Π½Π°Π»Π΅ ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Git-Ρ‚Π΅Π³ΠΎΠ², Π½ΠΎ Π² процСссС сборки ΠΎΠ±Ρ€Π°Π·Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ особСнности:

  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ список вСрсий Π½Π° ΠΊΠ°Π½Π°Π»Π°Ρ… мСняСтся, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для ΠΊΠ°Π½Π°Π»ΠΎΠ², Π³Π΄Π΅ измСнилась вСрсия. Π’Π΅Π΄ΡŒ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ всС Π·Π°Π½ΠΎΠ²ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ красиво.
  • Π‘Π°ΠΌ Π½Π°Π±ΠΎΡ€ ΠΊΠ°Π½Π°Π»ΠΎΠ² для Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ вСрсии Π½Π° ΠΊΠ°Π½Π°Π»Π°Ρ… ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π΅Π΅ Ρ€Π΅Π»ΠΈΠ·Π° early-access 1.1, Π½ΠΎ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΠ½ΠΈ появятся β€” Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΆΠ΅ Π² этом случаС сборку Ρ€ΡƒΠΊΠ°ΠΌΠΈ?

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ сборка зависит ΠΎΡ‚ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….

РСализация

Π’Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ pod’ом Π² Kubernetes. Π’Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ большСС количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² кластСрС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ расти с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ количСства ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² werf. А это Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ слоТноС обслуТиваниС: Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ появляСтся свой HTTP-сСрвСр, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ с нСбольшой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π²Π»Π΅Ρ‡Π΅Ρ‚ ΠΈ бОльшиС расходы ΠΏΠΎ рСсурсам.

ΠœΡ‹ ΠΆΠ΅ пошли ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ сборки всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… вСрсий Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·Π΅. Бкомпилированная статика всСх вСрсий сайта находится Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с NGINX, Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Deployment ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· NGINX Ingress. ΠŸΡ€ΠΎΡΡ‚Π°Ρ структура β€” stateless-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β€” позволяСт Π»Π΅Π³ΠΊΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Deployment (Π² зависимости ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ) срСдствами самого Kubernetes.

Если Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ‚ΠΎ ΠΌΡ‹ собираСм Π΄Π²Π° ΠΎΠ±Ρ€Π°Π·Π°: ΠΎΠ΄ΠΈΠ½ β€” для production-ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, для dev-ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ (запускаСтся) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° dev-ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π΅ совмСстно с основным ΠΈ содСрТит Π²Π΅Ρ€ΡΠΈΡŽ сайта ΠΈΠ· review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ingress-рСсурсов.

werf vs git clone ΠΈ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статику сайта для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ вСрсии Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сборку, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠΈΡΡŒ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Π΅Π³ рСпозитория. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΈ ΠΏΡƒΡ‚Π΅ΠΌ клонирования рСпозитория ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ сборкС, выбирая ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Π³ΠΈ ΠΏΠΎ списку. Однако это довольно рСсурсоСмкая опСрация ΠΈ, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ написания Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… инструкций… Π”Ρ€ΡƒΠ³ΠΎΠΉ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΉ минус β€” ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Π½Π΅Ρ‚ возмоТности Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎ врСмя сборки.

Π’ΡƒΡ‚ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ сама ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° werf, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ ΡƒΠΌΠ½ΠΎΠ΅ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. ИспользованиС werf для добавлСния ΠΊΠΎΠ΄Π° ΠΈΠ· рСпозитория Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускорит сборку, Ρ‚.ΠΊ. werf ΠΏΠΎ сути ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория, Π° Π·Π°Ρ‚Π΅ΠΌ выполняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ fetch ΠΏΡ€ΠΈ нСобходимости. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСпозитория ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ (Π² нашСм случаС это ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ docs), Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ снизит объСм добавляСмых Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Jekyll β€” инструмСнт, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для компиляции статики ΠΈ ΠΎΠ½ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·Π΅, Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π² Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π΅ werf, Π° Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ компиляции.

ПишСм werf.yaml

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π΅ werf. Однако ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, сколько этих Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ сборкС, поэтому Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ сборки (строго говоря, всё-Ρ‚Π°ΠΊΠΈ ΠΌΠΎΠΆΠ΅ΠΌ, Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ совсСм эффСктивно).

werf позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Go-ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² своём Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (werf.yaml), Π° это Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» Π² зависимости ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ!). Π’Π½Π΅ΡˆΠ½ΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² нашСм случаС выступаСт информация ΠΎ вСрсиях ΠΈ Ρ€Π΅Π»ΠΈΠ·Π°Ρ…, Π½Π° основании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ собираСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄Π²Π° ΠΎΠ±Ρ€Π°Π·Π°: werf-doc ΠΈ werf-dev для запуска Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°Ρ….

Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния. Π’ΠΎΡ‚ ΠΈΡ… состав:

  • RELEASES β€” строка со списком Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии werf, Π² Π²ΠΈΠ΄Π΅ списка Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ <ΠΠžΠœΠ•Π _Π Π•Π›Π˜Π—Π>%<ΠΠžΠœΠ•Π _Π’Π•Π Π‘Π˜Π˜>. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 1.0%v1.0.4-beta.20
  • CHANNELS β€” строка со списком ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии werf, Π² Π²ΠΈΠ΄Π΅ списка Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ <ΠšΠΠΠΠ›>%<ΠΠžΠœΠ•Π _Π’Π•Π Π‘Π˜Π˜>. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION β€” вСрсия Ρ€Π΅Π»ΠΈΠ·Π° werf для отобраТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° сайтС (Π½Π΅ всСгда Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠ΅ΠΌΡƒ Π½ΠΎΠΌΠ΅Ρ€Ρƒ Ρ€Π΅Π»ΠΈΠ·Π°). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: v1.0.4-beta.20
  • REVIEW_SHA β€” Ρ…ΡΡˆ review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ для тСстового ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°.

Π­Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² pipeline GitLab CI, Π° ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ β€” написано Π½ΠΈΠΆΠ΅.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ, для удобства, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π² werf.yaml ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Go-шаблонов, присвоив ΠΈΠΌ значСния ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния:

{{ $_ := set . "WerfVersions" (cat (env "CHANNELS") (env "RELEASES") | splitList " ") }}
{{ $Root := . }}
{{ $_ := set . "WerfRootVersion" (env "ROOT_VERSION") }}
{{ $_ := set . "WerfReviewCommit" (env "REVIEW_SHA") }}

ОписаниС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° для компиляции статики вСрсии сайта Π² Ρ†Π΅Π»ΠΎΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ для всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π½Π°ΠΌ случаСв (Π² Ρ‚ΠΎΠΌ числС, гСнСрация ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ вСрсии, Π° Ρ‚Π°ΠΊΠΆΠ΅ вСрсии для dev-ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вынСсСм Π΅Π³ΠΎ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ define β€” для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ include. Π¨Π°Π±Π»ΠΎΠ½Ρƒ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹:

  • Version β€” Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Π΅Π³Π°);
  • Channel β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ гСнСрируСтся Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚;
  • Commit β€” Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Ссли Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ гСнСрируСтся для review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°;
  • контСкст.

ОписаниС шаблона Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π°

{{- define "doc_artifact" -}}
{{- $Root := index . "Root" -}}
artifact: doc-{{ .Channel }}
from: jekyll/builder:3
mount:
- from: build_dir
  to: /usr/local/bundle
ansible:
  install:
  - shell: |
      export PATH=/usr/jekyll/bin/:$PATH
  - name: "Install Dependencies"
    shell: bundle install
    args:
      executable: /bin/bash
      chdir: /app/docs
  beforeSetup:
{{- if .Commit }}
  - shell: echo "Review SHA - {{ .Commit }}."
{{- end }}
{{- if eq .Channel "root" }}
  - name: "releases.yml HASH: {{ $Root.Files.Get "releases.yml" | sha256sum }}"
    copy:
      content: |
{{ $Root.Files.Get "releases.yml" | indent 8 }}
      dest:  /app/docs/_data/releases.yml
{{- else }}
  - file:
      path: /app/docs/_data/releases.yml
      state: touch
{{- end }}
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/
    - /app/ru_site/
  - file:
      dest: /app/docs/pages_ru/cli
      state: link
      src: /app/docs/pages/cli
  - shell: |
      echo -e "werfVersion: {{ .Version }}nwerfChannel: {{ .Channel }}" > /tmp/_config_additional.yml
      export PATH=/usr/jekyll/bin/:$PATH
{{- if and (ne .Version "review") (ne .Channel "root") }}
{{- $_ := set . "BaseURL" ( printf "v%s" .Channel ) }}
{{- else if ne .Channel "root" }}
{{- $_ := set . "BaseURL" .Channel }}
{{- end }}
      jekyll build -s /app/docs  -d /app/_main_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/tmp/_config_additional.yml
      jekyll build -s /app/docs  -d /app/_ru_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/app/docs/_config_ru.yml,/tmp/_config_additional.yml
    args:
      executable: /bin/bash
      chdir: /app/docs
git:
- url: https://github.com/flant/werf.git
  to: /app/
  owner: jekyll
  group: jekyll
{{- if .Commit }}
  commit: {{ .Commit }}
{{- else }}
  tag: {{ .Version }}
{{- end }}
  stageDependencies:
    install: ['docs/Gemfile','docs/Gemfile.lock']
    beforeSetup: '**/*'
  includePaths: 'docs'
  excludePaths: '**/*.sh'
{{- end }}

НазваниС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ этого Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ .Channel) Π² качСствС суффикса названия Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π°: artifact: doc-{{ .Channel }}. Но Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ ΠΈΠ· Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°.

ΠŸΡ€ΠΈ описании Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ werf, ΠΊΠ°ΠΊ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠœΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ слуТСбной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ build_dir позволяСт ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ кэш Jekyll ΠΌΠ΅ΠΆΠ΄Ρƒ запусками pipeline, Ρ‡Ρ‚ΠΎ сущСствСнно ускоряСт пСрСсборку.

Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ использованиС Ρ„Π°ΠΉΠ»Π° releases.yml β€” это YAML-Ρ„Π°ΠΉΠ» с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°Ρ…, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ с github.com (Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ pipeline). Он Π½ΡƒΠΆΠ΅Π½ ΠΏΡ€ΠΈ компиляции сайта, Π½ΠΎ Π² контСкстС ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π°ΠΌ ΠΎΠ½ интСрСсСн Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ Π΅Π³ΠΎ состояния зависит пСрСсборка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° β€” Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° сайта ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ вСрсии (Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π°Ρ… ΠΎΠ½ Π½Π΅ Π½ΡƒΠΆΠ΅Π½).

Π­Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if Go-шаблонов ΠΈ конструкции {{ $Root.Files.Get "releases.yml" | sha256sum }} Π² этапС стадии. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: ΠΏΡ€ΠΈ сборкС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° для ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ вСрсии (пСрСмСнная .Channel Ρ€Π°Π²Π½Π° root) Ρ…ΡΡˆ Ρ„Π°ΠΉΠ»Π° releases.yml влияСт Π½Π° сигнатуру всСй стадии, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ являСтся ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΠΈΠΌΠ΅Π½ΠΈ Ansible-задания (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ name). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ содСрТимого Ρ„Π°ΠΉΠ»Π° releases.yml ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ пСрСсобран.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с внСшним Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ. Π’ ΠΎΠ±Ρ€Π°Π· Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° ΠΈΠ· рСпозитория werf, добавляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /docs, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² зависимости ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ сразу Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Ρ‚Π΅Π³Π° ΠΈΠ»ΠΈ review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ описания Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… вСрсий ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ Ρ€Π΅Π»ΠΈΠ·ΠΎΠ², ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ .WerfVersions Π² werf.yaml:

{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}}

Π’.ΠΊ. Ρ†ΠΈΠΊΠ» сгСнСрируСт нСсколько Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² (ΠΌΡ‹ надССмся Π½Π° это), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ --- (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ синтаксисС Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ). Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈΡΡŒ Ρ€Π°Π½Π΅Π΅, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ шаблона Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ вСрсии, URL ΠΈ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ контСкст.

Аналогично, Π½ΠΎ ΡƒΠΆΠ΅ Π±Π΅Π· Ρ†ΠΈΠΊΠ»Π°, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ шаблон Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° для «особых случаСв»: для ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ вСрсии, Π° Ρ‚Π°ΠΊΠΆΠ΅ вСрсии ΠΈΠ· review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°:

{{ dict "Version" .WerfRootVersion "Channel" "root" "Root" $Root  | include "doc_artifact" }}
---
{{- if .WerfReviewCommit }}
{{ dict "Version" "review" "Channel" "review" "Commit" .WerfReviewCommit "Root" $Root  | include "doc_artifact" }}
{{- end }}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ для review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли установлСна пСрСмСнная .WerfReviewCommit.

АртСфакты Π³ΠΎΡ‚ΠΎΠ²Ρ‹ β€” ΠΏΠΎΡ€Π° Π·Π°Π½ΡΡ‚ΡŒΡΡ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ!

ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для запуска Π² Kubernetes, прСдставляСт собой ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ NGINX, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сСрвСра nginx.conf ΠΈ статика ΠΈΠ· Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ вСрсии сайта Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ .WerfVersions для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² вСрсий ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² + ΡΠΎΠ±Π»ΡŽΡΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ имСнования Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ приняли Ρ€Π°Π½Π΅Π΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ вСрсии сайта для Π΄Π²ΡƒΡ… языков, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΡ… Π² мСста, прСдусмотрСнныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ.

ОписаниС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° werf-doc

image: werf-doc
from: nginx:stable-alpine
ansible:
  setup:
  - name: "Setup /etc/nginx/nginx.conf"
    copy:
      content: |
{{ .Files.Get ".werf/nginx.conf" | indent 8 }}
      dest: /etc/nginx/nginx.conf
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/assets
    - /app/ru_site/assets
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_main_site
  to: /app/main_site/v{{ $Channel }}
  before: setup
{{ end -}}
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_ru_site
  to: /app/ru_site/v{{ $Channel }}
  before: setup
{{ end -}}

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вмСстС с основным запускаСтся Π½Π° dev-ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π΅, содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ вСрсии сайта: Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ· review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΈ ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ сайта (Ρ‚Π°ΠΌ ΠΎΠ±Ρ‰ΠΈΠ΅ ассСты ΠΈ, Ссли ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Ρ€Π΅Π»ΠΈΠ·Π°ΠΌ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΎΡ‚ основного Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСкциСй ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° (Π½Ρƒ ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΠΌΠ΅Π½Π΅ΠΌ):

image: werf-dev
...
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{- if .WerfReviewCommit  }}
- artifact: doc-review
  add: /app/_main_site
  to: /app/main_site/review
  before: setup
- artifact: doc-review
  add: /app/_ru_site
  to: /app/ru_site/review
  before: setup
{{- end }}

Как ΡƒΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅, Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ для review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ запускС установлСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния REVIEW_SHA. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· werf-dev, Ссли Π½Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния REVIEW_SHA, Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ очистка ΠΏΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌ Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² werf Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° для ΠΎΠ±Ρ€Π°Π·Π° werf-dev, ΠΌΡ‹ оставим Π΅Π³ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠΌ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ вСрсии (всС Ρ€Π°Π²Π½ΠΎ ΠΎΠ½ ΡƒΠΆΠ΅ собран), для упрощСния структуры pipeline.

Π‘Π±ΠΎΡ€ΠΊΠ° Π³ΠΎΡ‚ΠΎΠ²Π°! ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ CI/CD ΠΈ Π²Π°ΠΆΠ½Ρ‹ΠΌ нюансам.

Пайплайн Π² GitLab CI ΠΈ особСнности динамичСской сборки

ΠŸΡ€ΠΈ запускС сборки Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² werf.yaml. Π­Ρ‚ΠΎ Π½Π΅ касаСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ REVIEW_SHA, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ pipeline ΠΎΡ‚ Ρ…ΡƒΠΊΠ° GitHub.

Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… вынСсСм Π² Bash-скрипт generate_artifacts, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° pipeline GitLab:

  • Ρ„Π°ΠΉΠ» releases.yml с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°Ρ…,
  • Ρ„Π°ΠΉΠ» common_envs.sh, содСрТащий ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния для экспорта.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° generate_artifacts Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² нашСм Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ. Π‘Π°ΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ являСтся ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π° Π²ΠΎΡ‚ Ρ„Π°ΠΉΠ» common_envs.sh Π½Π°ΠΌ Π²Π°ΠΆΠ΅Π½, Ρ‚.ΠΊ. ΠΎΡ‚ Π½Π΅Π³ΠΎ зависит Ρ€Π°Π±ΠΎΡ‚Π° werf. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΅Π³ΠΎ содСрТимого:

export RELEASES='1.0%v1.0.6-4'
export CHANNELS='1.0-alpha%v1.0.7-1 1.0-beta%v1.0.7-1 1.0-ea%v1.0.6-4 1.0-stable%v1.0.6-4 1.0-rock-solid%v1.0.6-4'
export ROOT_VERSION='v1.0.6-4'

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠ³ΠΎ скрипта ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Bash-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ source.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ самоС интСрСсноС. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈ сборка, ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ прилоТСния Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ werf.yaml Π±Ρ‹Π» ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ pipeline. Если это условиС Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, Ρ‚ΠΎ сигнатуры стадий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рассчитываСт werf ΠΏΡ€ΠΈ сборкС ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΏΠ»ΠΎΠ΅, Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС дСплоя, Ρ‚.ΠΊ. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для дСплоя ΠΎΠ±Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли Π²ΠΎ врСмя сборки ΠΎΠ±Ρ€Π°Π·Π° сайта информация ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°Ρ… ΠΈ вСрсиях Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½Π°, Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ дСплоя Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ новая вСрсия ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния, Ρ‚ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ с ошибкой: вСдь Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π½ΠΎΠ²ΠΎΠΉ вСрсии Π΅Ρ‰Π΅ Π½Π΅ собран.

Если гСнСрация werf.yaml зависит ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, списка Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… вСрсий, ΠΊΠ°ΠΊ Π² нашСм случаС), Ρ‚ΠΎ состав ΠΈ значСния Ρ‚Π°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… pipeline. Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ, Ссли внСшниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ довольно часто.

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ стадии ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π² GitLab (Prebuild) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π΄Π°Π»Π΅Π΅ Π² Π²ΠΈΠ΄Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° GitLab CI. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ задания pipelinС’а (сборка, Π΄Π΅ΠΏΠ»ΠΎΠΉ, очистка) с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Π² werf.yaml.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ стадии Prebuild Ρ„Π°ΠΉΠ»Π° .gitlab-ci.yml:

Prebuild:
  stage: prebuild
  script:
    - bash ./generate_artifacts 1> common_envs.sh
    - cat ./common_envs.sh
  artifacts:
    paths:
      - releases.yml
      - common_envs.sh
    expire_in: 2 week

Зафиксировав внСшниС Π΄Π°Π½Π½Ρ‹Π΅ Π² Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сборку ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартныС стадии ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° GitLab CI: Build ΠΈ Deploy. Π‘Π°ΠΌ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΌΡ‹ запускаСм ΠΏΠΎ Ρ…ΡƒΠΊΠ°ΠΌ ΠΈΠ· GitHub-рСпозитория werf ( Ρ‚.Π΅. ΠΏΡ€ΠΈ измСнСниях Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° GitHub). Π”Π°Π½Π½Ρ‹Π΅ для Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Π² свойствах ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GitLab Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ CI / CD Settings -> Pipeline triggers, Π° Π·Π°Ρ‚Π΅ΠΌ создадим Π² GitHub ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Webhook (Settings -> Webhooks).

Бтадия сборки Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Build:
  stage: build
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf build-and-publish --stages-storage :local
  except:
    refs:
      - schedules
  dependencies:
    - Prebuild

GitLab Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² ΡΡ‚Π°Π΄ΠΈΡŽ сборки Π΄Π²Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° ΠΈΠ· стадии Prebuild, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ экспортируСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции source common_envs.sh. ЗапускаСм ΡΡ‚Π°Π΄ΠΈΡŽ сборки Π²ΠΎ всСх случаях, ΠΊΡ€ΠΎΠΌΠ΅ запуска ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° ΠΏΠΎ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ. По Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ для очистки β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сборку Π² этом случаС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

На стадии дСплоя опишСм Π΄Π²Π° задания β€” ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для дСплоя Π½Π° production- ΠΈ dev-ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹, с использованиСм YAML-шаблона:

.base_deploy: &base_deploy
  stage: deploy
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf deploy --stages-storage :local
  dependencies:
    - Prebuild
  except:
    refs:
      - schedules

Deploy to Production:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: prod
  environment:
    name: production
    url: werf.io
  only:
    refs:
      - master
  except:
    variables:
      - $REVIEW_SHA
    refs:
      - schedules

Deploy to Test:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: dev
  environment:
    name: test
    url: werf.test.flant.com
  except:
    refs:
      - schedules
  only:
    variables:
      - $REVIEW_SHA

Задания ΠΏΠΎ сути ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ контСкста кластСра, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ werf Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Π΅ΠΏΠ»ΠΎΠΉ (WERF_KUBE_CONTEXT), ΠΈ установкой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° (environment.name ΠΈ environment.url), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π·Π°Ρ‚Π΅ΠΌ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Helm-Ρ‡Π°Ρ€Ρ‚Π°. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ шаблонов ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, Ρ‚.ΠΊ. Ρ‚Π°ΠΌ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ интСрСсного для рассматриваСмой Ρ‚Π΅ΠΌΡ‹, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡ… Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡˆΡ‚Ρ€ΠΈΡ…

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вСрсии werf выходят довольно часто, часто Π±ΡƒΠ΄ΡƒΡ‚ ΠΈ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ‹, Π° Docker Registry β€” постоянно расти. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ очистку ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌ. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΎΡ‡Π΅Π½ΡŒ просто.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ потрСбуСтся:

  • Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΡ‚Π°Π΄ΠΈΡŽ очистки Π² .gitlab-ci.yml;
  • Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ пСриодичСскоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ задания очистки;
  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния с Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ доступа Π½Π° запись.

ДобавляСм ΡΡ‚Π°Π΄ΠΈΡŽ очистки Π² .gitlab-ci.yml:

Cleanup:
  stage: cleanup
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - docker login -u nobody -p ${WERF_IMAGES_CLEANUP_PASSWORD} ${WERF_IMAGES_REPO}
    - werf cleanup --stages-storage :local
  only:
    refs:
      - schedules

ΠŸΠΎΡ‡Ρ‚ΠΈ всё ΠΌΡ‹ это ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ‡ΡƒΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для очистки Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Docker Registry с Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π°Π²Π° Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² Docker Registry (Ρƒ Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ автоматичСски Ρ‚ΠΎΠΊΠ΅Π½Π° задания GitLab CI Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π°Π²). Π’ΠΎΠΊΠ΅Π½ Π½ΡƒΠΆΠ½ΠΎ завСсти Π² GitLab Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния WERF_IMAGES_CLEANUP_PASSWORD ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (CI/CD Settings -> Variables).

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ задания очистки с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ расписаниСм производится Π² CI/CD ->
Schedules
.

Всё: ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Docker Registry большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ постоянно расти ΠΎΡ‚ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ².

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ практичСской части напомню, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½Ρ‹Π΅ листинги ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ доступны Π² Git:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

  1. ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ структуру сборки: ΠΎΠ΄ΠΈΠ½ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€ΡΠΈΡŽ.
  2. Π‘Π±ΠΎΡ€ΠΊΠ° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π° ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€ΡƒΡ‡Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π½ΠΎΠ²Ρ‹Ρ… вСрсий werf: докумСнтация Π½Π° сайтС автоматичСски обновляСтся.
  3. БобираСтся Π΄Π²Π° ΠΎΠ±Ρ€Π°Π·Π° для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ².
  4. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстро, Ρ‚.ΠΊ. максимально ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π½ΠΎΠ²ΠΎΠΉ вСрсии werf ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ GitHub-Ρ…ΡƒΠΊΠ° для review-ΠΊΠΎΠΌΠΌΠΈΡ‚Π° β€” осущСствляСтся пСрСсборка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° с ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠΉ вСрсиСй.
  5. НС Π½ΡƒΠΆΠ½ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΠ± ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ²: очистка ΠΏΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌ werf Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ порядок Π² Docker Registry.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

  • ИспользованиС werf позволяСт сборкС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстро благодаря ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠ°ΠΊ самой сборки, Ρ‚Π°ΠΊ ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с внСшними рСпозиториями.
  • Π Π°Π±ΠΎΡ‚Π° с внСшними Git-рСпозиториями избавляСт ΠΎΡ‚ нСобходимости ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСд с Ρ…ΠΈΡ‚Ρ€ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. werf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ кэш ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π° Π΄Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ fetch ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ нСобходимости.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Go-шаблонов Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки werf.yaml позволяСт ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ сборку, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ зависит ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….
  • ИспользованиС монтирования Π² werf Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряСт сбору Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² β€” Π·Π° счСт кэша, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΎΠ±Ρ‰ΠΈΠΌ для всСх pipeline.
  • werf позволяСт Π»Π΅Π³ΠΊΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ очистку, Ρ‡Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈ динамичСской сборкС.

P.S.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

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