ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins’Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

ВсС Π½Π°Ρ‡Π°Π»ΠΎΡΡŒ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΌΠ»ΠΈΠ΄ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² попросил Π² тСстовом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π°Ρ€ΡƒΠΆΡƒ ΠΈΡ… Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π°ΠΊΠ°Π½ΡƒΠ½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π½ΡƒΡ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π― выставил. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· 20 ΠΌΠΈΠ½ΡƒΡ‚ поступила ΠΏΡ€ΠΎΡΡŒΠ±Π° ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π΄ΠΎΠΏΠΈΠ»ΠΈΠ»ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΡˆΡ‚ΡƒΠΊΡƒ. Π― ΠΎΠ±Π½ΠΎΠ²ΠΈΠ». Π•Ρ‰Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ часов… Π½Ρƒ, Π²Ρ‹ ΠΈ Ρ‚Π°ΠΊ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ стало ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π°Π»ΡŒΡˆΠ΅β€¦

Π―, ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒΡΡ, довольно Π»Π΅Π½ΠΈΠ² (я ΠΆΠ΅ Ρ€Π°Π½Π΅Π΅ Π² этом признавался? Π½Π΅Ρ‚?), ΠΈ, учитывая Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΌΠ»ΠΈΠ΄Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ доступ Π² Jenkins, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρƒ нас вСсь CI/CD, ΠΏΠΎΠ΄ΡƒΠΌΠ°Π»: Π΄Π° ΠΏΡƒΡΡ‚ΡŒ ΠΎΠ½ сам Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚, сколько заблагорассудится! Вспомнил Π°Π½Π΅ΠΊΠ΄ΠΎΡ‚: Π΄Π°ΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ Ρ€Ρ‹Π±Ρƒ ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ сыт дСнь; Π½Π°Π·ΠΎΠ²ΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Π‘Ρ‹Ρ‚ ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π‘Ρ‹Ρ‚ всю Тизнь. И пошСл ΠΌΠ°ΡΡ‚Ρ€ΡΡ‡ΠΈΡ‚ΡŒ Π΄ΠΆΠΎΠ±Ρƒ, которая Π±Ρ‹ ΡƒΠΌΠ΅Π»Π° Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ Π² ΠΊΡƒΠ±Π΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ любой ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ собранной вСрсии ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π»ΡŽΠ±Ρ‹Π΅ значСния ENV (ΠΌΠΎΠΉ Π΄Π΅Π΄ΡƒΡˆΠΊΠ°, β€” Ρ„ΠΈΠ»ΠΎΠ»ΠΎΠ³, ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΡŒ английского Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, β€” сСйчас Π±Ρ‹ ΠΏΠΎΠΊΡ€ΡƒΡ‚ΠΈΠ» ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ Ρƒ виска ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ посмотрСл Π±Ρ‹ Π½Π° мСня, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² это ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅).

Π˜Ρ‚Π°ΠΊ, Π² Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ я расскаТу ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ я научился:

  1. ДинамичСски ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ задания Π² Jenkins’Π΅ ΠΈΠ· самого задания ΠΈΠ»ΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Π½ΠΈΠΉ;
  2. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли (Cloud shell) с Π½ΠΎΠ΄Ρ‹ с установлСнным Π°Π³Π΅Π½Ρ‚ΠΎΠΌ Jenkins’Π°;
  3. Π”Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ (workload) Π² Google Kubernetes Engine.


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

Π­Ρ‚ΠΎ очСрСдная моя ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°. Π’Π°ΠΊΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΌΠ½Π΅ хочСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ лишь Π² ΠΎΠ΄Π½ΠΎΠΌ случаС: ΠΏΠ΅Ρ€Π΅Π΄ΠΎ ΠΌΠ½ΠΎΠΉ стояла Π·Π°Π΄Π°Ρ‡Π°, я ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ Π·Π½Π°Π», ΠΊΠ°ΠΊ Π΅Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°Π³ΡƒΠ³Π»ΠΈΠ»ΠΎΡΡŒ Π² Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅, поэтому я Π΅Π³ΠΎ Π³ΡƒΠ³Π»ΠΈΠ» ΠΏΠΎ частям ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π΅ΡˆΠΈΠ». И для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° я Π·Π°Π±ΡƒΠ΄Ρƒ, ΠΊΠ°ΠΊ я это сдСлал, ΠΌΠ½Π΅ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ вновь всС Π³ΡƒΠ³Π»ΠΈΡ‚ΡŒ ΠΏΠΎ кускам ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ, я ΠΏΠΈΡˆΡƒ сСбС Ρ‚Π°ΠΊΠΈΠ΅ ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠΈ.

Disclaimer: 1. Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ° писалась «для сСбя», Π½Π° Ρ€ΠΎΠ»ΡŒ best practice Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚. Π‘ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Β«Π° Π»ΡƒΡ‡ΡˆΠ΅ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΒ» Π² коммСнтариях.
2. Если ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ солью, Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ всС ΠΌΠΎΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ, эта β€” слабосолСвой раствор.

ДинамичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ настроСк Π·Π°Π΄Π°Π½ΠΈΠΉ Π² Jenkins

ΠŸΡ€Π΅Π΄Π²ΠΈΠΆΡƒ ваш вопрос: Π° ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ Ρ‚ΡƒΡ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ динамичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΆΠΎΠ±Ρ‹? Вписал Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строкового ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π²ΠΏΠ΅Ρ€Π΅Π΄!

ΠžΡ‚Π²Π΅Ρ‡Π°ΡŽ: я ΠΏΡ€Π°Π²Π΄Π° Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ, Π½Π΅ люблю, ΠΊΠΎΠ³Π΄Π° ΠΆΠ°Π»ΡƒΡŽΡ‚ΡΡ: Миша, Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΊΡ€Π°ΡˆΠΈΡ‚ΡΡ, всС ΠΏΡ€ΠΎΠΏΠ°Π»ΠΎ! ΠΠ°Ρ‡ΠΈΠ½Π°Π΅ΡˆΡŒ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π° Ρ‚Π°ΠΌ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запуска задания. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ всС Π΄Π΅Π»Π°Ρ‚ΡŒ максимально Ρ„ΡƒΠ»ΠΏΡ€ΡƒΡ„Π½ΠΎ. Если Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»ΠΈΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ возмоТности Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π΄Π°Π² вмСсто этого список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для Π²Ρ‹Π±ΠΎΡ€Π°, Ρ‚ΠΎ я ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°ΡŽ Π²Ρ‹Π±ΠΎΡ€.

План Ρ‚Π°ΠΊΠΎΠ²: создаСм Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² Jenkins, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠ· списка Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ значСния для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Ρ‡Π΅Ρ€Π΅Π· ENV, Π΄Π°Π»Π΅Π΅ ΠΎΠ½ΠΎ собираСт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ ΠΏΡƒΡˆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π² Container Registry. Π”Π°Π»Π΅Π΅ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ запускаСтся Π² ΠΊΡƒΠ±Π΅Ρ€Π΅ ΠΊΠ°ΠΊ workload с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π΄ΠΆΠΎΠ±Π΅.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ создания ΠΈ настройки задания Π² Jenkins’Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, это ΠΎΡ„Ρ„Ρ‚ΠΎΠΏΠΈΠΊ. Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ обновляСмого списка с вСрсиями, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ: ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ список-источник с Π°ΠΏΡ€ΠΈΠΎΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌΠΈ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ вСрсий ΠΈ пСрСмСнная Ρ‚ΠΈΠΏΠ° Choice parameter Π² Π·Π°Π΄Π°Π½ΠΈΠΈ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡƒΡΡ‚ΡŒ пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΎΡΠΈΡ‚ΡŒ имя BUILD_VERSION, Π½Π° Π½Π΅ΠΉ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. А Π²ΠΎΡ‚ Π½Π° спискС-источникС Π΄Π°Π²Π°ΠΉΡ‚Π΅ остановимся ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π΅ Ρ‚Π°ΠΊΠΎΠ΅ ΡƒΠΆ ΠΈ мноТСство. МнС сходу Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΏΡ€ΠΈΡˆΠ»ΠΈ Π΄Π²Π°:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Remote access API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Jenkins своим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ;
  • Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ содСрТимоС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ рСпозитория (Π² нашСм случаС это JFrog Artifactory, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ).

Jenkins Remote access API

По слоТившСйся прСкрасной Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Ρƒ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ пространных объяснСний.
Позволю сСбС лишь Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ куска ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Π±Π·Π°Ρ†Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ страницы Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ API:

Jenkins прСдоставляСт API для ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ машинно-понятного доступа ΠΊ своСму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ. <…> Π£Π΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ доступ прСдлагаСтся Π² REST’ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ стилС. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ отсутствуСт Сдиная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° ΠΊΠΎ всСм возмоТностям, Π° вмСсто Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ URL Π²ΠΈΠ΄Π° "…/api/", Π³Π΄Π΅ "" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ возмоТности API.

Π˜Π½Ρ‹ΠΌΠΈ словами, Ссли Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, доступно ΠΏΠΎ адрСсу http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, Ρ‚ΠΎ API-ΡΠ²ΠΈΡΡ‚ΡƒΠ»ΡŒΠΊΠΈ для этого задания доступны ΠΏΠΎ адрСсу http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Π”Π°Π»Π΅Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° XML, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ API Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² этом случаС позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ просто Ρ‚Π°ΠΊ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх запусков задания. Нас интСрСсуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя сборки (displayName) ΠΈ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (result):

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ запуски, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΈΡ‚ΠΎΠ³Π΅ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ SUCCESS. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ &exclude ΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π΅ΠΌΡƒ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ значСния Π½Π΅ Ρ€Π°Π²Π½ΠΎΠ³ΠΎ SUCCESS. Π”Π°-Π΄Π°. Π”Π²ΠΎΠΉΠ½ΠΎΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ β€” это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅. Π˜ΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ всС Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ нас Π½Π΅ интСрСсуСт:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!='SUCCESS']

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ списка ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ…
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

Ну ΠΈ просто для баловства убСдимся, Ρ‡Ρ‚ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ нас Π½Π΅ ΠΎΠ±ΠΌΠ°Π½ΡƒΠ» (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΆΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ€ΡƒΡ‚!) ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ список Β«Π½Π΅-ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ…Β»:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ списка Π½Π΅-ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ…
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

Бписок вСрсий ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС

Π•ΡΡ‚ΡŒ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список вСрсий. Он ΠΌΠ½Π΅ нравится Π΄Π°ΠΆΠ΅ большС, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ API Jenkins’Π°. Ну, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Π»ΠΎΡΡŒ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π΅Π³ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π»ΠΈ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ. Π’ΠΈΠΏΠ°, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ это ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… вСрсий ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ΠΈΠΏΠ°. Ну Π²ΠΎΡ‚ ΠΈ спросим Ρƒ Π½Π΅Π³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ вСрсии Π½Π° Ρ…Ρ€Π°Π½Π΅Π½Π½ΠΈΠΈ. Π£Π΄Π°Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ Π±ΡƒΠ΄Π΅ΠΌ curl’ΠΈΡ‚ΡŒ, grep’Π°Ρ‚ΡŒ ΠΈ awk’Π°Ρ‚ΡŒ. Если ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ интСрСсСн ΡƒΠ°Π½Π»Π°ΠΉΠ½Π΅Ρ€, Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ΄ спойлСром.

Команда ΠΎΠ΄Π½ΠΎΠΉ строкой
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ: я ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΌΠ½Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ прямо Π²ΠΎΠΎΠ±Ρ‰Π΅ всС вСрсии ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ, ΠΈ я ΠΎΡ‚Π±ΠΈΡ€Π°ΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΈ созданы Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ мСсяца. ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² соотвСтствии с вашими рСалиями ΠΈ потрСбностями:

curl -H "X-JFrog-Art-Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

Настройка Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΈ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ задания Π² Jenkins

Π‘ источником списка вСрсий Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ список Π²ΠΊΡ€ΡƒΡ‚ΠΈΠΌ Π² Π·Π°Π΄Π°Π½ΠΈΠ΅. Для мСня ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ шаг Π² Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΏΠΎ сборкС прилоТСния. Π¨Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ выполнялся Π² случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° «успСх».

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ настройки задания Π½Π° сборку ΠΈ скроллим Π² самый Π½ΠΈΠ·. Π–ΠΌΠ°ΠΊΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΎΡ‡ΠΊΠΈ: Add build step -> Conditional step (single). Π’ настройках шага Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ условиС Current build status, выставляСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SUCCESS, выполняСмоС дСйствиС Π² случаС успСха Run shell command.

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ самоС интСрСсноС. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π°Π΄Π°Π½ΠΈΠΉ Jenkins Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² Ρ„Π°ΠΉΠ»Π°Ρ…. Π’ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ XML. По ΠΏΡƒΡ‚ΠΈ http://ΠΏΡƒΡ‚ΡŒ-Π΄ΠΎ-задания/config.xml БоотвСтствСнно, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ, ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° мСсто, ΠΎΡ‚ΠΊΡƒΠ΄Π° взяли.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ для списка вСрсий создадим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ BUILD_VERSION?

Π”Π°Π²Π°ΠΉΡ‚Π΅ скачаСм Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ заглянСм Π²Π½ΡƒΡ‚Ρ€ΡŒ Π½Π΅Π³ΠΎ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π° мСстС ΠΈ Π² самом Π΄Π΅Π»Π΅ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°.

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ ΠΏΠΎΠ΄ спойлСром.

Π£ вас ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ config.xml Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅. Π—Π° Ρ‚Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ содСрТимоС элСмСнта choices ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ отсутствуСт
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

УбСдились? Ну всС, пишСм скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ сборки.
Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ список вСрсий, ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ Π½Π°ΠΌ мСсто список вСрсий, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΊΠ»Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π”Π°. ВсС Π²Π΅Ρ€Π½ΠΎ. ΠŸΠΈΡΠ°Ρ‚ΡŒ список вСрсий Π² XML’ΠΊΡƒ Π² Ρ‚ΠΎ мСсто, Π³Π΄Π΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ список вСрсий (Π±ΡƒΠ΄Π΅Ρ‚ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска скрипта). Π― знаю, Π² ΠΌΠΈΡ€Π΅ Π΅Ρ‰Π΅ ΠΆΠΈΠ²ΡƒΡ‚ Π»ΡŽΡ‚Ρ‹Π΅ Π»ΡŽΠ±ΠΈΡ‚Π΅Π»ΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π― ΠΊ Π½ΠΈΠΌ Π½Π΅ ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ. УстановитС, поТалуйста, xmlstarler Π½Π° Ρ‚Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³. МнС каТСтся, это Π½Π΅ такая ΡƒΠΆ ΠΈ большая ΠΏΠ»Π°Ρ‚Π° Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ рСдактирования XML с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sed’Π°.

Под спойлСром ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ ΠΊΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

ПишСм Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ список вСрсий ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС

#!/bin/bash
############## Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## УдаляСм ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ создаСм xml-элСмСнт для списка вСрсий
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## Π§ΠΈΡ‚Π°Π΅ΠΌ Π² массив список вСрсий ΠΈΠ· рСпозитория
readarray -t vers < <( curl -H "X-JFrog-Art-Api:Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

############## ПишСм массив элСмСнт Π·Π° элСмСнтом Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## КладСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π²Π·Π°Π΄
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ мСсто Π² порядок
rm -f appConfig.xml

Если Π²Π°ΠΌ большС понравился Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ вСрсий ΠΈΠ· Jenkins’Π° ΠΈ Π²Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ Π»Π΅Π½ΠΈΠ²Ρ‹, ΠΊΠ°ΠΊ я, Ρ‚ΠΎ ΠΏΠΎΠ΄ спойлСром Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΊΠΎΠ΄, Π½ΠΎ список ΠΈΠ· Jenkins’Π°:

ПишСм Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ список вСрсий ΠΈΠ· Jenkins'Π°
Волько ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚: Ρƒ мСня имя сборки состоит ΠΈΠ· порядкового Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ. БоотвСтствСнно, awk ΠΎΡ‚Ρ€Π΅Π·Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ. Для сСбя эту строку ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ ваши Π½ΡƒΠΆΠ΄Ρ‹.

#!/bin/bash
############## Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## УдаляСм ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ создаСм xml-элСмСнт для списка вСрсий
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ПишСм Π² Ρ„Π°ΠΉΠ» список вСрсий ΠΈΠ· Jenkins
curl -g -X GET -u username:apiKey 'http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!=%22SUCCESS%22]&pretty=true' -o builds.xml

############## Π§ΠΈΡ‚Π°Π΅ΠΌ Π² массив список вСрсий ΠΈΠ· XML
readarray vers < <(xmlstarlet sel -t -v "freeStyleProject/allBuild/displayName" builds.xml | awk -F":" '{print $2}')

############## ПишСм массив элСмСнт Π·Π° элСмСнтом Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## КладСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π²Π·Π°Π΄
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ мСсто Π² порядок
rm -f appConfig.xml

По ΠΈΠ΄Π΅Π΅, Ссли Π²Ρ‹ протСстировали ΠΊΠΎΠ΄, написанный Π½Π° основС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹ΡˆΠ΅, Ρ‚ΠΎ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Ρƒ вас ΡƒΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ список с вСрсиями. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ ΠΏΠΎΠ΄ спойлСром.

ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ список вСрсий
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

Если всС ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Ρ‚ΠΎ копипаститС скрипт Π² Run shell command ΠΈ сохраняйтС измСнСния.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Cloud shell

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊΠΈ Ρƒ нас Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…. Π’ качСствС срСдства доставки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ansible. БоотвСтствСнно, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ сборкС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Ρ€ΠΈ: ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Docker Π² Docker’Π΅, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Docker Π½Π° ΠΌΠ°ΡˆΠΈΠ½Ρƒ с Ansible’ΠΎΠΌ, Π»ΠΈΠ±ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π² ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли. ΠŸΡ€ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для Jenkins ΠΌΡ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈΡΡŒ Π² этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ ΠΌΠΎΠ»Ρ‡Π°Ρ‚ΡŒ. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅?

Π― Ρ€Π΅ΡˆΠΈΠ»: Π½Ρƒ, Ρ€Π°Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π² ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли, Ρ‚ΠΎ Π·Π°Ρ‡Π΅ΠΌ Π³ΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ³ΠΎΡ€ΠΎΠ΄? Keep it clean, Π²Π΅Ρ€Π½ΠΎ? Π₯ΠΎΡ‡Ρƒ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Jenkins’ΠΎΠΌ Π² ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΆΠ΅ ΠΏΡƒΠ»ΡΡ‚ΡŒ ΠΈΡ… Π² ΠΊΡƒΠ±Π΅Ρ€. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ инфраструктуры Ρƒ Π³ΡƒΠ³Π»Π° Π½Ρƒ ΠΎΠΎΠΎΡ‡Π΅Π½ΡŒ ΠΆΠΈΡ€Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹, Ρ‡Ρ‚ΠΎ благоприятно скаТСтся Π½Π° скорости дСплоя.

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ: gcloud ΠΈ ΠΏΡ€Π°Π²Π° доступа ΠΊ Google Cloud API для Ρ‚ΠΎΠ³ΠΎ экзСмпляра Π’Πœ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ это самоС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ.

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΠ· Π³ΡƒΠ³Π»ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Π»Π°ΠΊΠ°
Π“ΡƒΠ³Π» допускаСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² своих сСрвисах. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ консоли Ρ…ΠΎΡ‚ΡŒ с ΠΊΠΎΡ„Π΅ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΊΠΎΠ»ΠΈ ΠΎΠ½Π° ΠΏΠΎΠ΄ *nix’Π°ΠΌΠΈ ΠΈ Ρƒ Π½Π΅Π΅ самой Π΅ΡΡ‚ΡŒ консоль.

Если Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ я освСтил этот вопрос ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ β€” ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях. НабСрСтся достаточноС количСство голосов β€” Π½Π°ΠΏΠΈΡˆΡƒ Π°ΠΏΠ΄Π΅ΠΉΡ‚ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²Π° β€” Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±-интСрфСйс.

  1. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ экзСмпляр Π’Πœ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² дальнСйшСм Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли.
  2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ БвСдСния экзСмпляра ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.
  3. Π’ самом Π½ΠΈΠ·Ρƒ страницы Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия доступа экзСмпляра ΠŸΠΎΠ»Π½Ρ‹ΠΉ доступ ΠΊΠΎ всСм Cloud API.

    Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚
    ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

  4. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ измСнСния ΠΈ запуститС экзСмпляр.

По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π’Πœ, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π½Π΅ΠΉ ΠΏΠΎ SSH ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ происходит Π±Π΅Π· ошибки. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

gcloud alpha cloud-shell ssh

УспСшноС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

Π”Π΅ΠΏΠ»ΠΎΠΉ Π² GKE

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ всячСски стрСмимся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° IaC (Infrastucture as a Code), Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ»Ρ‹ Ρƒ нас хранятся Π² Π³ΠΈΡ‚Π΅. Π­Ρ‚ΠΎ с ΠΎΠ΄Π½ΠΎΠΉ стороны. А Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² kubernetes описываСтся yaml-Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам ΠΏΠΎ сСбС Ρ‚ΠΎΠΆΠ΅ ΠΊΠ°ΠΊ Π±Ρ‹ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, я ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π½ Ρ‚Π°ΠΊΠΎΠ²:

  1. Π‘Π΅Ρ€Π΅ΠΌ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… BUILD_VERSION ΠΈ, ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ENV.
  2. ΠšΠ°Ρ‡Π°Π΅ΠΌ ΠΈΠ· Π³ΠΈΡ‚Π° Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ».
  3. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ yaml для дСплоя.
  4. Π—Π°Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±Π° этих Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ scp Π² ΠΎΠ±Π»Π°Ρ‡Π½ΡƒΡŽ консоль.
  5. Π‘ΠΈΠ»Π΄ΠΈΠΌ Ρ‚Π°ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ ΠΏΡƒΡˆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π² Container registry
  6. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Ρ„Π°ΠΉΠ» дСплоя Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² ΠΊΡƒΠ±Π΅Ρ€.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ. Π Π°Π· Π·Π°Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± ENV, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ значСния Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²: PARAM1 ΠΈ PARAM2. ДобавляСм ΠΈΡ… Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ, Ρ‚ΠΈΠΏ β€” String Parameter.

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ yaml Π±ΡƒΠ΄Π΅ΠΌ простым ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ echo Π² Ρ„Π°ΠΉΠ». ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡΡ, разумССтся, Ρ‡Ρ‚ΠΎ Π² Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ»Π΅ Ρƒ вас присутcnΠ²ΡƒΡŽΡ‚ PARAM1 ΠΈ PARAM2, Ρ‡Ρ‚ΠΎ имя Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ awesomeapp, Π° собранный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ вСрсии Π»Π΅ΠΆΠΈΡ‚ Π² Container registry ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION, Π³Π΄Π΅ $BUILD_VERSION ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ ΠΈΠ· Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка.

Листинг ΠΊΠΎΠΌΠ°Π½Π΄

touch deploy.yaml
echo "apiVersion: apps/v1" >> deploy.yaml
echo "kind: Deployment" >> deploy.yaml
echo "metadata:" >> deploy.yaml
echo "  name: awesomeapp" >> deploy.yaml
echo "spec:" >> deploy.yaml
echo "  replicas: 1" >> deploy.yaml
echo "  selector:" >> deploy.yaml
echo "    matchLabels:" >> deploy.yaml
echo "      run: awesomeapp" >> deploy.yaml
echo "  template:" >> deploy.yaml
echo "    metadata:" >> deploy.yaml
echo "      labels:" >> deploy.yaml
echo "        run: awesomeapp" >> deploy.yaml
echo "    spec:" >> deploy.yaml
echo "      containers:" >> deploy.yaml
echo "      - name: awesomeapp" >> deploy.yaml
echo "        image: gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION:latest" >> deploy.yaml
echo "        env:" >> deploy.yaml
echo "        - name: PARAM1" >> deploy.yaml
echo "          value: $PARAM1" >> deploy.yaml
echo "        - name: PARAM2" >> deploy.yaml
echo "          value: $PARAM2" >> deploy.yaml

АгСнту Jenkins’Π° послС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gcloud alpha cloud-shell ssh ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ доступСн, поэтому ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΠΎΠ±Π»Π°Ρ‡Π½ΡƒΡŽ консоль с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° —command.

Чистим домашнюю ΠΏΠ°ΠΏΠΊΡƒ Π² ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли ΠΎΡ‚ старого Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ»Π°:

gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"

КладСм свСТСскачСнный Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ» Π² домашнюю ΠΏΠ°ΠΏΠΊΡƒ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ консоли с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ scp:

gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ, Ρ‚Π΅Π³ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ ΠΏΡƒΡˆΠ°Π΅ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² Container registry:

gcloud alpha cloud-shell ssh --command="docker build -t awesomeapp-$BUILD_VERSION ./ --build-arg BUILD_VERSION=$BUILD_VERSION --no-cache"
gcloud alpha cloud-shell ssh --command="docker tag awesomeapp-$BUILD_VERSION gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
gcloud alpha cloud-shell ssh --command="docker push gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ поступаСм с Ρ„Π°ΠΉΠ»ΠΎΠΌ дСплоя. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ внимания, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… Π½ΠΈΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Ρ‹ΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° кластСра, ΠΊΡƒΠ΄Π° происходит Π΄Π΅ΠΏΠ»ΠΎΠΉ (awsm-cluster) ΠΈ имя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (awesome-project), Π³Π΄Π΅ находСтся кластСр.

gcloud alpha cloud-shell ssh --command="rm -f deploy.yaml"
gcloud alpha cloud-shell scp localhost:./deploy.yaml cloudshell:~
gcloud alpha cloud-shell ssh --command="gcloud container clusters get-credentials awsm-cluster --zone us-central1-c --project awesome-project && 
kubectl apply -f deploy.yaml"

ЗапускаСм Π·Π°Π΄Π°Π½ΠΈΠ΅, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ консоли ΠΈ надССмся ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΡƒΡŽ сборку ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

А Π΄Π°Π»Π΅Π΅ ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ собранного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚
ΠœΠ°ΡΡ‚Π΅Ρ€ΠΈΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GKE Π±Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², смс ΠΈ рСгистрации. Одним Π³Π»Π°Π·ΠΊΠΎΠΌ заглядываСм Jenkins'Ρƒ ΠΏΠΎΠ΄ ΠΏΠΈΠ΄ΠΆΠ°ΠΊ

Π― ΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎ обошСл Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ настройку Ingress. По ΠΎΠ΄Π½ΠΎΠΉ простой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅: ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ настроив Π΅Π³ΠΎ Π½Π° workload с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΎΠ½ останСтся работоспособным, сколько Π΄Π΅ΠΏΠ»ΠΎΠ΅Π² с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ Π½ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈ. Ну ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅, это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π° Ρ€Π°ΠΌΠΊΠ°ΠΌΠΈ истории.

ВмСсто Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²

ВсС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ шаги, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, Π° просто ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ для Jenkins’Π°, ΠΈΡ… ΠΌΡƒΡƒΡƒΠ»ΡŒΠΎΠ½. Но я ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π½Π΅ люблю ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹. Ну, Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΠΏΡ€ΠΈΠ±Π΅Π³Π°ΡŽ ΠΊ Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ бСзысходности.

А Π΅Ρ‰Π΅ ΠΌΠ½Π΅ просто нравится Ρ€Π°ΡΠΊΠΎΠ²Ρ‹Ρ€ΡΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½ΠΎΠ²ΡƒΡŽ для мСня Ρ‚Π΅ΠΌΡƒ. ВСкст Π²Ρ‹ΡˆΠ΅ β€” Π² Ρ‚ΠΎΠΌ числС ΠΈ способ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½Π°Ρ…ΠΎΠ΄ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я сдСлал, Ρ€Π΅ΡˆΠ°Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ. ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌΠΈ, ΠΊΡ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ, вовсС Π½Π΅ Π»ΡŽΡ‚Ρ‹ΠΉ Π²ΠΎΠ»ΠΊ Π² дСвопсС. Если хотя Π±Ρ‹ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΌΠΎΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ β€” Π±ΡƒΠ΄Ρƒ Π΄ΠΎΠ²ΠΎΠ»Π΅Π½.

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

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