Content-based tagging Π² сборщикС werf: Π·Π°Ρ‡Π΅ΠΌ ΠΈ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Content-based tagging Π² сборщикС werf: Π·Π°Ρ‡Π΅ΠΌ ΠΈ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

werf β€” наша GitOps CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ для сборки ΠΈ доставки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Kubernetes. Π’ Ρ€Π΅Π»ΠΈΠ·Π΅ v1.1 Π±Ρ‹Π»Π° прСдставлСна новая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² сборщикС ΠΎΠ±Ρ€Π°Π·ΠΎΠ²: Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΠΎ содСрТимому ΠΈΠ»ΠΈ content-based tagging. Π”ΠΎ сих ΠΏΠΎΡ€ типичная схСма тСгирования Π² werf ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»Π° Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΠΎ Git-Ρ‚Π΅Π³Ρƒ, Git-Π²Π΅Ρ‚ΠΊΠ΅ ΠΈΠ»ΠΈ Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ. Но Ρƒ всСх этих схСм Π΅ΡΡ‚ΡŒ нСдостатки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π½ΠΎΠ²ΠΎΠΉ стратСгиСй тСгирования. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΎ Π½Π΅ΠΉ ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½Π° Ρ‚Π°ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠ° β€” ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ.

Π’Ρ‹ΠΊΠ°Ρ‚ Π½Π°Π±ΠΎΡ€Π° микросСрвисов ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Git-рСпозитория

Часто встрСчаСтся ситуация, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Π±ΠΈΡ‚ΠΎ Π½Π° мноТСство Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ нСзависимых сСрвисов. Π Π΅Π»ΠΈΠ·Ρ‹ этих сСрвисов ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ нСзависимо: Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π»ΠΈΠ·ΠΈΡ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько сСрвисов, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Но с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния хранСния ΠΊΠΎΠ΄Π° ΠΈ управлСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сСрвисы прилоТСния Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π‘Ρ‹Π²Π°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° сСрвисы Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСзависимы ΠΈ Π½Π΅ связаны с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ располоТСны Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈ ΠΈΡ… Ρ€Π΅Π»ΠΈΠ· Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ процСссы CI/CD Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Однако Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° нСсколько микросСрвисов, Π½ΠΎ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ проСкт… β€” явный overkill. ИмСнно ΠΏΡ€ΠΎ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π΄Π°Π»Π΅Π΅ Ρ€Π΅Ρ‡ΡŒ: нСсколько Ρ‚Π°ΠΊΠΈΡ… микросСрвисов Π»Π΅ΠΆΠ°Ρ‚ Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Ρ€Π΅Π»ΠΈΠ·Ρ‹ происходят Ρ‡Π΅Ρ€Π΅Π· Π΅Π΄ΠΈΠ½Ρ‹ΠΉ процСсс Π² CI/CD.

Π’Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Git-Π²Π΅Ρ‚ΠΊΠ΅ ΠΈ Git-Ρ‚Π΅Π³Ρƒ

Допустим, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ самая распространСнная стратСгия тСгирования β€” tag-or-branch. Для Git-Π²Π΅Ρ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π·Ρ‹ Ρ‚Π΅Π³ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π²Π΅Ρ‚ΠΊΠΈ, для ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ этой Π²Π΅Ρ‚ΠΊΠΈ. Для Git-Ρ‚Π΅Π³ΠΎΠ² ΠΎΠ±Ρ€Π°Π·Ρ‹ Ρ‚Π΅Π³ΠΈΡ€ΡƒΡŽΡ‚ΡΡ соотвСтствСнно ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚Π΅Π³Π°.

ΠŸΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ Git-Ρ‚Π΅Π³Π° β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π½ΠΎΠ²ΠΎΠΉ вСрсии β€” для всСх ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Docker Registry Π±ΡƒΠ΄Π΅Ρ‚ создан Π½ΠΎΠ²Ρ‹ΠΉ Docker-Ρ‚Π΅Π³:

  • myregistry.org/myproject/frontend:v1.1.10
  • myregistry.org/myproject/myservice1:v1.1.10
  • myregistry.org/myproject/myservice2:v1.1.10
  • myregistry.org/myproject/myservice3:v1.1.10
  • myregistry.org/myproject/myservice4:v1.1.10
  • myregistry.org/myproject/myservice5:v1.1.10
  • myregistry.org/myproject/database:v1.1.10

Π­Ρ‚ΠΈ Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ‡Π΅Ρ€Π΅Π· Helm-ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Kubernetes. ΠŸΡ€ΠΈ запускС дСплоя ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ werf deploy происходит ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ поля image Π² манифСстах рСсурсов Kubernetes ΠΈ пСрСзапуск ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… рСсурсов ΠΈΠ·-Π·Π° измСнившСгося ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π·Π°.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π² случаС, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹ΠΊΠ°Ρ‚Π° (Git-Ρ‚Π΅Π³Π°) Π½Π΅ измСнилось содСрТимоС ΠΎΠ±Ρ€Π°Π·Π°, Π° лишь Π΅Π³ΠΎ Docker-Ρ‚Π΅Π³, происходит лишний пСрСзапуск этого прилоТСния ΠΈ, соотвСтствСнно, Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ простой. Π₯отя Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ этот пСрСзапуск.

Как слСдствиС, ΠΏΡ€ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ схСмС тСгирования приходится Π³ΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ нСсколько ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² ΠΈ встаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΊΠ°Ρ‚Π° этих Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π². Π’ ΠΎΠ±Ρ‰Π΅ΠΌ ΠΈ Ρ†Π΅Π»ΠΎΠΌ такая схСма получаСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈ слоТной. Π›ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ сСрвисов Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Docker-Ρ‚Π΅Π³ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΠΈΡˆΠ½ΠΈΡ… пСрСзапусков Π½Π΅ Π±Ρ‹Π»ΠΎ.

Π’Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ

Π’ werf Ρ‚Π°ΠΊΠΆΠ΅ присутствуСт стратСгия тСгирования, связанная с Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ.

Git-commit являСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ содСрТимого Git-рСпозитория ΠΈ зависит ΠΎΡ‚ истории ΠΏΡ€Π°Π²ΠΎΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, поэтому каТСтся Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для тСгирования ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² Docker Registry.

Однако Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ нСдостатки, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎ Git-Π²Π΅Ρ‚ΠΊΠ°ΠΌ ΠΈΠ»ΠΈ Git-Ρ‚Π΅Π³Π°ΠΌ:

  • Мог Π±Ρ‹Ρ‚ΡŒ создан пустой ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ мСняСт Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Docker-Ρ‚Π΅Π³ ΠΎΠ±Ρ€Π°Π·Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.
  • Мог Π±Ρ‹Ρ‚ΡŒ создан merge-ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ мСняСт Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Docker-Ρ‚Π΅Π³ ΠΎΠ±Ρ€Π°Π·Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.
  • Мог Π±Ρ‹Ρ‚ΡŒ создан ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСняСт Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Git, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Π·, Π° Docker-Ρ‚Π΅Π³ ΠΎΠ±Ρ€Π°Π·Π° снова Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.

Π’Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Git-Π²Π΅Ρ‚ΠΊΠΈ Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΠ±Ρ€Π°Π·Π°

Π•ΡΡ‚ΡŒ ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная со стратСгиСй тСгирования ΠΏΠΎ Git-Π²Π΅Ρ‚ΠΊΠ°ΠΌ.

Π’Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π²Π΅Ρ‚ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ этой Π²Π΅Ρ‚ΠΊΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² хронологичСском порядкС.

Если Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ схСмС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ запустит пСрСсборку старого ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, связанного с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΎΠΉ, Ρ‚ΠΎ werf ΠΏΠ΅Ρ€Π΅Ρ‚Ρ€Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π· ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Docker-Ρ‚Π΅Π³Ρƒ вновь собранной вСрсиСй ΠΎΠ±Ρ€Π°Π·Π° для старого ΠΊΠΎΠΌΠΌΠΈΡ‚Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ этот Ρ‚Π΅Π³ Deployment’Ρ‹ с этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Ρ€ΠΈΡΠΊΡƒΡŽΡ‚ Π²ΠΎ врСмя пСрСзапуска pod’ΠΎΠ² ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ pull Π΄Ρ€ΡƒΠ³ΠΎΠΉ вСрсии ΠΎΠ±Ρ€Π°Π·Π°, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ потСряСт связь с CI-систСмой, рассинхронизируСтся.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… push’ах Π² ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‚ΠΊΡƒ с ΠΌΠ°Π»Ρ‹ΠΌ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ старый ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΉ: старая вСрсия ΠΎΠ±Ρ€Π°Π·Π° ΠΏΠ΅Ρ€Π΅Ρ‚Ρ€Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎ Ρ‚Π΅Π³Ρƒ Git-Π²Π΅Ρ‚ΠΊΠΈ. Π’Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ CI/CD-систСма (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² GitLab CI для сСрии ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² запускаСтся pipeline послСднСго). Однако это ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ всС систСмы ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ способ прСдотвращСния ΡΡ‚ΠΎΠ»ΡŒ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ content-based tagging?

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ content-based tagging β€” Ρ‚Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΠΎ содСрТимому.

Для создания Docker-Ρ‚Π΅Π³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ Git’Π° (Git-Π²Π΅Ρ‚ΠΊΠ°, Git-тСг…), Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма, связанная с:

  • содСрТимым ΠΎΠ±Ρ€Π°Π·Π°. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€-Ρ‚Π΅Π³ ΠΎΠ±Ρ€Π°Π·Π° ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ содСрТимоС. ΠŸΡ€ΠΈ сборкС Π½ΠΎΠ²ΠΎΠΉ вСрсии этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π΅ помСняСтся, Ссли Π² ΠΎΠ±Ρ€Π°Π·Π΅ Π½Π΅ измСнились Ρ„Π°ΠΉΠ»Ρ‹;
  • историСй создания этого ΠΎΠ±Ρ€Π°Π·Π° Π² Git. ΠžΠ±Ρ€Π°Π·Ρ‹, связанныС с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Git-Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΈ Ρ€Π°Π·Π½ΠΎΠΉ историСй сборки Ρ‡Π΅Ρ€Π΅Π· werf, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.

Π’ качСствС Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚Π΅Π³Π°-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° выступаСт Ρ‚Π°ΠΊ называСмая сигнатура стадий ΠΎΠ±Ρ€Π°Π·Π°.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· состоит ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° стадий: from, before-install, git-archive, install, imports-after-install, before-setup,… git-latest-patch ΠΈ Ρ‚.Π΄. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стадии Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ Π΅Π΅ содСрТимоС, β€” сигнатура стадии (stage signature).

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·, состоящий ΠΈΠ· этих стадий, тСгируСтся Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ сигнатурой Π½Π°Π±ΠΎΡ€Π° этих стадий β€” stages signature, β€” которая являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‰Π΅ΠΉ для всСх стадий ΠΎΠ±Ρ€Π°Π·Π°.

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ werf.yaml Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ своя такая сигнатура ΠΈ, соотвСтствСнно, Docker-Ρ‚Π΅Π³.

Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° стадий Ρ€Π΅ΡˆΠ°Π΅Ρ‚ всС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • Устойчива ΠΊ пустым Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ.
  • Устойчива ΠΊ Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ΠΌΠΈ для ΠΎΠ±Ρ€Π°Π·Π°.
  • НС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ с ΠΏΠ΅Ρ€Π΅Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии ΠΎΠ±Ρ€Π°Π·Π° ΠΏΡ€ΠΈ пСрСзапускС сборок для старых Git-ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π²Π΅Ρ‚ΠΊΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ это рСкомСндуСмая стратСгия тСгирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² werf для всСх CI-систСм.

Как Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² werf

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ опция появилась Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ werf publish: --tag-by-stages-signature=true|false

Π’ CI-систСмС стратСгия тСгирования задаСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ werf ci-env. Π Π°Π½Π΅Π΅ для Π½Π΅Π΅ опрСдСлялся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ werf ci-env --tagging-strategy=tag-or-branch. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ werf ci-env --tagging-strategy=stages-signature ΠΈΠ»ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΎΠΏΡ†ΠΈΡŽ, werf ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ тСгирования stages-signature. Команда werf ci-env автоматичСски выставит Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ werf build-and-publish (ΠΈΠ»ΠΈ werf publish), поэтому Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ для этих ΠΊΠΎΠΌΠ°Π½Π΄ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π°:

werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature

… ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Ρ‹:

  • registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d
  • registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6

Π—Π΄Π΅ΡΡŒ 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d β€” это сигнатура стадий ΠΎΠ±Ρ€Π°Π·Π° backend, Π° f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 β€” сигнатура стадий ΠΎΠ±Ρ€Π°Π·Π° frontend.

ΠŸΡ€ΠΈ использовании ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ werf_container_image ΠΈ werf_container_env Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Helm Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ трСбуСтся: эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² CI-систСмС:

type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ настройкС доступно Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

Π˜Ρ‚ΠΎΠ³ΠΎ

  • Новая опция werf publish --tag-by-stages-signature=true|false.
  • НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ werf ci-env --tagging-strategy=stages-signature|tag-or-branch (Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ stages-signature).
  • Если Π΄ΠΎ этого использовались ΠΎΠΏΡ†ΠΈΠΈ тСгирования ΠΏΠΎ Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ (WERF_TAG_GIT_COMMIT ΠΈΠ»ΠΈ опция werf publish --tag-git-commit COMMIT), Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π° ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ тСгирования stages-signature.
  • НовыС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ сразу ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ схСму тСгирования.
  • Π‘Ρ‚Π°Ρ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ Π½Π° werf 1.1 ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ схСму тСгирования, ΠΎΠ΄Π½Π°ΠΊΠΎ старая tag-or-branch ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ поддСрТиваСтся.

Content-based tagging Ρ€Π΅ΡˆΠ°Π΅Ρ‚ всС освСщСнныС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • Π£ΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ Docker-Ρ‚Π΅Π³Π° ΠΊ пустым Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ.
  • Π£ΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ Docker-Ρ‚Π΅Π³Π° ΠΊ Git-ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ Π½Π΅Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹Π΅ для ΠΎΠ±Ρ€Π°Π·Π° Ρ„Π°ΠΉΠ»Ρ‹.
  • НС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ с ΠΏΠ΅Ρ€Π΅Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии ΠΎΠ±Ρ€Π°Π·Π° ΠΏΡ€ΠΈ пСрСзапускС сборок для старых Git-ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² для Git-Π²Π΅Ρ‚ΠΎΠΊ.

ΠŸΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ! И Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ Π·Π°Π³Π»ΡΠ΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΊ Π½Π°ΠΌ Π½Π° GitHub, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ issue ΠΈΠ»ΠΈ Π½Π°ΠΉΡ‚ΠΈ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ, ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ плюс, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ PR ΠΈΠ»ΠΈ просто ΠΏΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

P.S.

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

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ