ОвладяванС Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈ рСгистрация. Π‘ Π΅Π΄Π½ΠΎ ΠΎΠΊΠΎ Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Всичко Π·Π°ΠΏΠΎΡ‡Π½Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡΡ‚ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅ Π΅ΠΊΠΈΠΏΠΈ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ»ΠΈ Π΄Π° тСствамС тяхното Π½ΠΎΠ²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ бСшС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ Π΄Π΅Π½. ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ… Π³ΠΎ. Π‘Π»Π΅Π΄ ΠΎΠΊΠΎΠ»ΠΎ 20 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ заявка Π·Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π°ΠΌ бСшС Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π½Π΅Ρ‰ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠΏΠΎΠ΄Π½ΠΎΠ²ΠΈΡ…. Π‘Π»Π΅Π΄ ΠΎΡ‰Π΅ няколко часа... Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π° Π΄Π° сС случва слСд Ρ‚ΠΎΠ²Π°...

Врябва Π΄Π° призная, Ρ‡Π΅ съм доста ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ² (Π½Π΅ Π³ΠΎ Π»ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°Ρ… ΠΏΠΎ-Ρ€Π°Π½ΠΎ? НС?) ΠΈ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Π΅ΠΊΠΈΠΏΠΈ ΠΈΠΌΠ°Ρ‚ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Jenkins, Π² ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ всички CI/CD, си помислих: Π½Π΅ΠΊΠ° Π³ΠΎ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ иска! Π‘ΠΏΠΎΠΌΠ½ΠΈΡ… си Π΅Π΄ΠΈΠ½ Π²ΠΈΡ†: Π΄Π°ΠΉ Π½Π° Ρ‡ΠΎΠ²Π΅ΠΊ Ρ€ΠΈΠ±Π° ΠΈ Ρ‚ΠΎΠΉ Ρ‰Π΅ ядС Π·Π° Π΅Π΄ΠΈΠ½ Π΄Π΅Π½; Π½Π°Ρ€Π΅Ρ‡Π΅Ρ‚Π΅ Ρ‡ΠΎΠ²Π΅ΠΊ Fed ΠΈ Ρ‚ΠΎΠΉ Ρ‰Π΅ бъдС Fed ΠΏΡ€Π΅Π· цСлия си ΠΆΠΈΠ²ΠΎΡ‚. И ΠΎΡ‚ΠΈΠ΄Π΅ ΠΈΠ³Ρ€Π°ΠΉΡ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π±ΠΈ могъл Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° всяка ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½Π° вСрсия Π² Kuber ΠΈ Π΄Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈ всякакви стойности към Π½Π΅Π³ΠΎ ENV (дядо ΠΌΠΈ, Ρ„ΠΈΠ»ΠΎΠ»ΠΎΠ³, ΡƒΡ‡ΠΈΡ‚Π΅Π» ΠΏΠΎ английски Π² ΠΌΠΈΠ½Π°Π»ΠΎΡ‚ΠΎ, сСга Ρ‰Π΅ΡˆΠ΅ Π΄Π° Π²ΡŠΡ€Ρ‚ΠΈ ΠΏΡ€ΡŠΡΡ‚ Π½Π° слСпоочиСто си ΠΈ Π΄Π° ΠΌΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅Π»Π½ΠΎ, слСд ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ Ρ‚ΠΎΠ²Π° ΠΈΠ·Ρ€Π΅Ρ‡Π΅Π½ΠΈΠ΅).

И Ρ‚Π°ΠΊΠ°, Π² Ρ‚Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° Ρ‰Π΅ Π²ΠΈ ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π½Π°ΡƒΡ‡ΠΈΡ…:

  1. Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° задания Π² Jenkins ΠΎΡ‚ самото Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ задания;
  2. Π‘Π²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ сС с ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° (Cloud shell) ΠΎΡ‚ възСл с инсталиран Π°Π³Π΅Π½Ρ‚ Jenkins;
  3. Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π½ΠΎΡ‚ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π² Google Kubernetes Engine.


Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, съм ΠΌΠ°Π»ΠΊΠΎ нСискрСн. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° сС, Ρ‡Π΅ ΠΈΠΌΠ°Ρ‚Π΅ ΠΏΠΎΠ½Π΅ част ΠΎΡ‚ инфраструктурата Π² ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Google ΠΈ слСдоватСлно стС Π½Π΅Π³ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, ΠΈΠΌΠ°Ρ‚Π΅ GCP Π°ΠΊΠ°ΡƒΠ½Ρ‚. Но Ρ‚Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° Π½Π΅ Π΅ Π·Π° Ρ‚ΠΎΠ²Π°.

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

ΠžΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΆΠ΅Π½ΠΈΠ΅: 1. Π‘Π΅Π»Π΅ΠΆΠΊΠ°Ρ‚Π° Π΅ написана β€žΠ·Π° сСбС ΡΠΈβ€œ, Π·Π° ролята Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π½Π΅ сС ΠΏΡ€ΠΈΠ»Π°Π³Π°. Щастлив съм Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π° ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅ β€žΠ±ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° Π³ΠΎ направя ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½β€œ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅.
2. Ако нанСсСната част ΠΎΡ‚ Π½ΠΎΡ‚ΠΊΠ°Ρ‚Π° сС счита Π·Π° сол, Ρ‚ΠΎ, ΠΊΠ°ΠΊΡ‚ΠΎ всичкитС ΠΌΠΈ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈ Π½ΠΎΡ‚ΠΊΠΈ, Ρ‚Π°Π·ΠΈ Π΅ слаб солСн Ρ€Π°Π·Ρ‚Π²ΠΎΡ€.

Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° настройкитС Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π² Jenkins

ΠŸΡ€Π΅Π΄Π²ΠΈΠΆΠ΄Π°ΠΌ Π²ΡŠΠΏΡ€ΠΎΡΠ° Π²ΠΈ: ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±Ρ‰ΠΎ ΠΈΠΌΠ° с Ρ‚ΠΎΠ²Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎΡ‚ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π°? Π’ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ стойността Π½Π° низовия ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Ρ€ΡŠΡ‡Π½ΠΎ ΠΈ Ρ‚Ρ€ΡŠΠ³Π²Π°ΠΉΡ‚Π΅!

ΠžΡ‚Π³ΠΎΠ²Π°Ρ€ΡΠΌ: наистина съм ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ², Π½Π΅ ΠΌΠΈ харСсва, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΎΠΏΠ»Π°ΠΊΠ²Π°Ρ‚: Миша, внСдряванСто сС срива, всичко Π΅ ΠΈΠ·Ρ‡Π΅Π·Π½Π°Π»ΠΎ! Π—Π°ΠΏΠΎΡ‡Π²Π°Ρ‚Π΅ Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΡ‚Π΅ ΠΈ ΠΈΠΌΠ° правописна Π³Ρ€Π΅ΡˆΠΊΠ° Π² стойността Π½Π° някакъв ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π·Π° стартиранС Π½Π° Π·Π°Π΄Π°Ρ‡Π°. Π—Π°Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΌ Π΄Π° правя всичко възмоТно Π½Π°ΠΉ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ. Ако Π΅ възмоТно Π΄Π° сС ΠΏΠΎΠΏΡ€Π΅Ρ‡ΠΈ Π½Π° потрСбитСля Π΄Π° въвСТда Π΄Π°Π½Π½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΊΠ°Ρ‚ΠΎ вмСсто Ρ‚ΠΎΠ²Π° сС Π΄Π°Π΄Π΅ списък със стойности, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π° ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅, Ρ‚ΠΎΠ³Π°Π²Π° Π°Π· ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°ΠΌ ΠΈΠ·Π±ΠΎΡ€Π°.

ΠŸΠ»Π°Π½ΡŠΡ‚ Π΅ слСдният: създавамС Ρ€Π°Π±ΠΎΡ‚Π° Π² Jenkins, Π² която ΠΏΡ€Π΅Π΄ΠΈ стартиранС ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ вСрсия ΠΎΡ‚ списъка, Π΄Π° посочим стойности Π·Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ‡Ρ€Π΅Π· ENV, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΡΡŠΠ±ΠΈΡ€Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Π³ΠΎ ΠΈΠ·Π±ΡƒΡ‚Π²Π° Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΎΡ‚Ρ‚Π°ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΡŠΡ‚ сС пуска Π² cuber as натоварСността с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ посочСни Π² Π·Π°Π΄Π°Π½ΠΈΠ΅Ρ‚ΠΎ.

Няма Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ процСса Π½Π° създаванС ΠΈ настройка Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π² Jenkins, Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π°. Π©Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ΠΌ, Ρ‡Π΅ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΅ Π³ΠΎΡ‚ΠΎΠ²Π°. Π—Π° Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ списък с вСрсии, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Π΄Π²Π΅ Π½Π΅Ρ‰Π°: ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ списък с ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ с Π°ΠΏΡ€ΠΈΠΎΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° вСрсиитС ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΊΠ°Ρ‚ΠΎ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π·Π° ΠΈΠ·Π±ΠΎΡ€ Π² Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°. Π’ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π΅ ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π° BUILD_VERSION, няма Π΄Π° сС спирамС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° Π½Π΅Π³ΠΎ. Но Π½Π΅ΠΊΠ° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡ‚Π±Π»ΠΈΠ·ΠΎ списъка с ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ.

Няма Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ†ΠΈΠΈ. Π’Π΅Π΄Π½Π°Π³Π° ΠΌΠΈ Ρ…Ρ€ΡƒΠΌΠ½Π°Ρ…Π° Π΄Π²Π΅ Π½Π΅Ρ‰Π°:

  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ API Π·Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ, ΠΊΠΎΠΉΡ‚ΠΎ Jenkins ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π½Π° своитС ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ;
  • ΠŸΠΎΠΈΡΠΊΠ°ΠΉΡ‚Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ (Π² нашия случай Ρ‚ΠΎΠ²Π° Π΅ JFrog Artifactory, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ).

API Π·Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ Π½Π° Jenkins

Π‘ΠΏΠΎΡ€Π΅Π΄ установСната ΠΎΡ‚Π»ΠΈΡ‡Π½Π° традиция Π±ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π° Π΄ΡŠΠ»Π³ΠΈΡ‚Π΅ обяснСния.
Π©Π΅ си позволя само свободСн ΠΏΡ€Π΅Π²ΠΎΠ΄ Π½Π° част ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ ΠΏΡŠΡ€Π²Π° страница ΠΎΡ‚ докумСнтацията Π½Π° 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 позволява Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ само Π² Ρ‚ΠΎΠ·ΠΈ случай.

НСка просто сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ списък с всички изпълнСния Π½Π° задания. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ²Π°ΠΌΠ΅ сС само ΠΎΡ‚ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° сборката (ΠΏΠΎΠΊΠ°Π·Π²Π°Π½ΠΎ ΠΈΠΌΠ΅) ΠΈ нСговия Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ (Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚):

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

БмятатС Ρ€Π°Π±ΠΎΡ‚ΠΈ?

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΌΠ΅ само Ρ‚Π΅Π·ΠΈ изпълнСния, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ с Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° Π£Π‘ΠŸΠ•Π₯. НСка ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° &ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Ρ‰Π΅ ΠΌΡƒ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ ΠΏΡŠΡ‚Ρ Π΄ΠΎ стойност, Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° ΠΎΡ‚ Π£Π‘ΠŸΠ•Π₯. Π”Π° Π΄Π°. Π”Π²ΠΎΠΉΠ½ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅Π½ΠΈΠ΅. Π˜Π·ΠΊΠ»ΡŽΡ‡Π²Π°ΠΌΠ΅ всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ Π½ΠΈ интСрСсува:

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

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° списъка с ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ
НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Π•, просто Π·Π° Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅, Π½Π΅ΠΊΠ° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ΡŠΡ‚ Π½Π΅ Π½ΠΈ Π΅ ΠΈΠ·ΠΌΠ°ΠΌΠΈΠ» (Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π»ΡŠΠΆΠ°Ρ‚!) ΠΈ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ списък с β€žΠ½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈβ€œ:

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

Π•ΠΊΡ€Π°Π½Π½Π° снимка Π½Π° списъка с Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ
НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Бписък с вСрсии ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠ° Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€

Има ΠΈ Π²Ρ‚ΠΎΡ€ΠΈ Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° списък с вСрсии. Π₯арСсва ΠΌΠΈ Π΄ΠΎΡ€ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ Jenkins API. Π•, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π°ΠΊΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ Π±ΠΈΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΎ, Ρ‚ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Π΅ Π±ΠΈΠ»ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΎ ΠΈ поставСно Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½Π°Ρ‚Π° ΠΏΠ°ΠΏΠΊΠ°. НапримСр, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ вСрсии Π½Π° прилоТСния. ΠšΠ°Ρ‚ΠΎ. Π•, Π½Π΅ΠΊΠ° Π³ΠΎ ΠΏΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ вСрсии ΠΈΠΌΠ° Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ. Π©Π΅ curl, grep ΠΈ awk ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½Π°Ρ‚Π° ΠΏΠ°ΠΏΠΊΠ°. Ако някой сС интСрСсува ΠΎΡ‚ oneliner, Ρ‚ΠΎ Ρ‚ΠΎΠΉ Π΅ ΠΏΠΎΠ΄ спойлСра.

Команда ΠΎΡ‚ Π΅Π΄ΠΈΠ½ Ρ€Π΅Π΄
Моля, ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ Π½Π΅Ρ‰Π°: ΠΏΡ€Π΅Π΄Π°Π²Π°ΠΌ подробноститС Π·Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π° ΠΈ Π½Π΅ сС нуТдая ΠΎΡ‚ всички вСрсии ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° ΠΈ ΠΈΠ·Π±ΠΈΡ€Π°ΠΌ само Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са създадСни Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π΅Π΄ΠΈΠ½ мСсСц. Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°, Π·Π° Π΄Π° отговаря Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ рСалности ΠΈ Π½ΡƒΠΆΠ΄ΠΈ:

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

Π Π°Π·Π±Ρ€Π°Ρ…ΠΌΠ΅ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° списъка с вСрсии. НСка сСга Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ получСния списък Π² Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°. Π—Π° ΠΌΠ΅Π½ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ бСшС Π΄Π° добавя ΡΡ‚ΡŠΠΏΠΊΠ° Π² Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π‘Ρ‚ΡŠΠΏΠΊΠ°Ρ‚Π°, която Ρ‰Π΅ бъдС изпълнСна, Π°ΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ "успСх".

ΠžΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ настройкитС Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° сглобяванС ΠΈ ΠΏΡ€Π΅Π²ΡŠΡ€Ρ‚Π΅Ρ‚Π΅ Π΄ΠΎ самото дъно. ΠšΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ Π±ΡƒΡ‚ΠΎΠ½ΠΈΡ‚Π΅: Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΡΡ‚ΡŠΠΏΠΊΠ° Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ -> Условна ΡΡ‚ΡŠΠΏΠΊΠ° (Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Π°). Π’ настройкитС Π½Π° ΡΡ‚ΡŠΠΏΠΊΠ°Ρ‚Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ условиСто Π’Π΅ΠΊΡƒΡ‰ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° компилация, Π·Π°Π΄Π°ΠΉΡ‚Π΅ стойността Π£Π‘ΠŸΠ•Π₯, дСйствиСто, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ ΠΏΡ€ΠΈ успСх Π˜Π·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π°.

А сСга Π·Π°Π±Π°Π²Π½Π°Ρ‚Π° част. Jenkins ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅ във Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’ XML Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. По ΠΏΡŠΡ‚Ρ http://ΠΏΡƒΡ‚ΡŒ-Π΄ΠΎ-задания/config.xml Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ конфигурационния Ρ„Π°ΠΉΠ», Π΄Π° Π³ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ‚Π΅, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΈ Π΄Π° Π³ΠΎ Π²ΡŠΡ€Π½Π΅Ρ‚Π΅ Ρ‚Π°ΠΌ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ стС Π³ΠΎ Π²Π·Π΅Π»ΠΈ.

НС забравяйтС, Ρ‡Π΅ сС ΡΡŠΠ³Π»Π°ΡΠΈΡ…ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅, Ρ‡Π΅ Ρ‰Π΅ създадСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π·Π° списъка с вСрсии BUILD_VERSION?

НСка ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΠΌ конфигурационния Ρ„Π°ΠΉΠ» ΠΈ Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ Π² Π½Π΅Π³ΠΎ. Π‘Π°ΠΌΠΎ Π·Π° Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΡ‚Π΅, Ρ‡Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ Π΅ Π½Π° място ΠΈ ΠΎΡ‚ ТСлания Ρ‚ΠΈΠΏ.

Π•ΠΊΡ€Π°Π½Π½Π° снимка ΠΏΠΎΠ΄ спойлСр.

Π’Π°ΡˆΠΈΡΡ‚ config.xml Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ трябва Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½. Π‘ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° Π·Π° ΠΈΠ·Π±ΠΎΡ€ всС ΠΎΡ‰Π΅ липсва
НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Π‘ΠΈΠ³ΡƒΡ€Π΅Π½ Π»ΠΈ си? Π’ΠΎΠ²Π° Π΅ всичко, Π½Π΅ΠΊΠ° напишСм скрипт, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС изпълни, Π°ΠΊΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ списък с вСрсии, Ρ‰Π΅ ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ конфигурационния Ρ„Π°ΠΉΠ», Ρ‰Π΅ запишС списъка с вСрсии Π² Π½Π΅Π³ΠΎ Π½Π° мястото, ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ, ΠΈ слСд Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π³ΠΎ Π²ΡŠΡ€Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π΄Π° Π’ΠΎΠ²Π° Π΅ вярно. ΠΠ°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ списък с вСрсии Π² 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:

ΠΠ°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ списък с вСрсии ΠΎΡ‚ ДТСнкинс Π² конфигурацията
ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΠΌΠ°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄: ΠΌΠΎΠ΅Ρ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° сборка сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ ΠΏΠΎΡ€Π΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ Π½Π° вСрсия, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ с Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅. Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ 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 Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Ако всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ, ΠΊΠΎΠΏΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈ поставСтС скрипта Π² Π˜Π·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° ΠΈ Π·Π°ΠΏΠ°Π·Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅.

Π‘Π²ΡŠΡ€Π·Π²Π°Π½Π΅ към Cloud shell

Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ с ΠΊΠΎΠ»Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ. НиС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ansible ΠΊΠ°Ρ‚ΠΎ наш инструмСнт Π·Π° доставка Π½Π° прилоТСния ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€. Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ става Π²ΡŠΠΏΡ€ΠΎΡ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ, Ρ‚Ρ€ΠΈ ΠΎΠΏΡ†ΠΈΠΈ ΠΈΠ΄Π²Π°Ρ‚ Π½Π° ΡƒΠΌ: инсталиранС Π½Π° Docker Π² Docker, инсталиранС Π½Π° Docker Π½Π° машина, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° с Ansible, ΠΈΠ»ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ Π² ΠΎΠ±Π»Π°Ρ‡Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°. Π‘ΡŠΠ³Π»Π°ΡΠΈΡ…ΠΌΠ΅ сС Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΌΡŠΠ»Ρ‡Π°Π½ΠΈΠ΅ относно ΠΏΠ»ΡŠΠ³ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° Jenkins Π² Ρ‚Π°Π·ΠΈ статия. Помня?

Π Π΅ΡˆΠΈΡ…: Π΄ΠΎΠ±Ρ€Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅ β€žΠΈΠ·Π²ΡŠΠ½ ΠΊΡƒΡ‚ΠΈΡΡ‚Π°β€œ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΡΡŠΠ±ΠΈΡ€Π°Ρ‚ Π² ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°, Ρ‚ΠΎΠ³Π°Π²Π° Π·Π°Ρ‰ΠΎ Π΄Π° сС притСсняватС? ΠŸΠ°Π·Π΅Ρ‚Π΅ Π³ΠΎ чисто, Π½Π°Π»ΠΈ? Искам Π΄Π° ΡΡŠΠ±Π΅Ρ€Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ Π½Π° ДТСнкинс Π² ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° Π³ΠΈ стартирам Π² ΠΊΡƒΠ±Π° ΠΎΡ‚ Ρ‚Π°ΠΌ. ОсвСн Ρ‚ΠΎΠ²Π° Google ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ³Π°Ρ‚ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ Π² своята инфраструктура, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΈΠΌΠ° благоприятСн Π΅Ρ„Π΅ΠΊΡ‚ Π²ΡŠΡ€Ρ…Ρƒ скоростта Π½Π° внСдряванС.

Π—Π° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Π΄Π²Π΅ Π½Π΅Ρ‰Π°: gcloud ΠΈ ΠΏΡ€Π°Π²Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Google Cloud API Π·Π° VM СкзСмпляра, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ бъдС Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° ΡΡŠΡ‰Π°Ρ‚Π° Π²Ρ€ΡŠΠ·ΠΊΠ°.

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ‚ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ°Ρ‚ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ ΠΎΡ‚ ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Google
Google допуска Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π² своитС услуги. Π’ΠΎΠ²Π° Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π΄ΠΎΡ€ΠΈ ΠΎΡ‚ ΠΊΠ°Ρ„Π΅ машина, Π°ΠΊΠΎ тя Ρ€Π°Π±ΠΎΡ‚ΠΈ с *nix ΠΈ ΠΈΠΌΠ° самата ΠΊΠΎΠ½Π·ΠΎΠ»Π°.

Ако ΠΈΠΌΠ° Π½ΡƒΠΆΠ΄Π° Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌ Ρ‚ΠΎΠ·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ°, ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅. Ако ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ гласовС, Ρ‰Π΅ напиша актуализация ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ°.

Най-лСсният Π½Π°Ρ‡ΠΈΠ½ Π·Π° прСдоставянС Π½Π° ΠΏΡ€Π°Π²Π° Π΅ Ρ‡Ρ€Π΅Π· ΡƒΠ΅Π± интСрфСйса.

  1. Π‘ΠΏΡ€Π΅Ρ‚Π΅ VM СкзСмпляра, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ впослСдствиС Ρ‰Π΅ сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.
  2. ΠžΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π·Π° СкзСмпляра ΠΈ Ρ‰Ρ€Π°ΠΊΠ½Π΅Ρ‚Π΅ измСнят.
  3. Π’ Π½Π°ΠΉ-Π΄ΠΎΠ»Π½Π°Ρ‚Π° част Π½Π° страницата ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ СкзСмпляра ПълСн Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ всички ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ API.

    снимки
    НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

  4. Π—Π°ΠΏΠ°Π·Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ си ΠΈ стартирайтС СкзСмпляра.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ VM ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ със Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ, ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ сС с Π½Π΅Π³ΠΎ Ρ‡Ρ€Π΅Π· SSH ΠΈ сС ΡƒΠ²Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° Π±Π΅Π· Π³Ρ€Π΅ΡˆΠΊΠ°. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°:

gcloud alpha cloud-shell ssh

Π£ΡΠΏΠ΅ΡˆΠ½Π°Ρ‚Π° Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½
НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Ρ‚Π΅ Π² GKE

Въй ΠΊΠ°Ρ‚ΠΎ сС стрСмим ΠΏΠΎ всякакъв възмоТСн Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ изцяло към IaC (Π˜Π½Ρ„Ρ€Π°ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄), Π½Π°ΡˆΠΈΡ‚Π΅ Π΄ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π² Git. Π’ΠΎΠ²Π° Π΅ ΠΎΡ‚ Π΅Π΄Π½Π° страна. И внСдряванСто Π² kubernetes сС описва ΠΎΡ‚ yaml Ρ„Π°ΠΉΠ», ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° само ΠΎΡ‚ Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π°, която сама ΠΏΠΎ сСбС си ΡΡŠΡ‰ΠΎ Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°Ρ‚Π° страна. ΠžΠ±Ρ‰ΠΎ Π²Π·Π΅Ρ‚ΠΎ ΠΏΠ»Π°Π½ΡŠΡ‚ Π΅ слСдният:

  1. Π’Π·ΠΈΠΌΠ°ΠΌΠ΅ стойноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ BUILD_VERSION ΠΈ, ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ€, стойноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ ENV.
  2. Π˜Π·Ρ‚Π΅Π³Π»Π΅Ρ‚Π΅ docker Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚ Git.
  3. Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΉΡ‚Π΅ yaml Π·Π° внСдряванС.
  4. НиС ΠΊΠ°Ρ‡Π²Π°ΠΌΠ΅ ΠΈ Π΄Π²Π°Ρ‚Π° Ρ„Π°ΠΉΠ»Π° Ρ‡Ρ€Π΅Π· scp Π² ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.
  5. БъздавамС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Ρ‚Π°ΠΌ ΠΈ Π³ΠΎ поставямС Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅
  6. ΠŸΡ€ΠΈΠ»Π°Π³Π°ΠΌΠ΅ Ρ„Π°ΠΉΠ»Π° Π·Π° Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ към cuber.

НСка бъдСм ΠΏΠΎ-ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ…ΠΌΠ΅ Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° ENV, Ρ‚ΠΎΠ³Π°Π²Π° Π΄Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ трябва Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ стойноститС Π½Π° Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π°: ΠŸΠΠ ΠΠœΠ•Π’Π 1 ΠΈ ΠŸΠΠ ΠΠœΠ•Π’Π 2. ДобавямС тяхната Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС, Ρ‚ΠΈΠΏ - ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π½Π° Π½ΠΈΠ·.

снимки
НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Π©Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ yaml с просто прСнасочванС Π΅Ρ…ΠΎ Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° сС, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Ρ‡Π΅ ΠΈΠΌΠ°Ρ‚Π΅ във вашия Π΄ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ» ΠŸΠΠ ΠΠœΠ•Π’Π 1 ΠΈ ΠŸΠΠ ΠΠœΠ•Π’Π 2Ρ‡Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ²Π°Ρ€Π° Ρ‰Π΅ бъдС страхотно ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° сглобСният ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° посочСната вСрсия Π»Π΅ΠΆΠΈ Π²ΡŠΡ‚Ρ€Π΅ Π Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΏΠΎ ΠΏΡŠΡ‚Ρ 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 Π°Π»Ρ„Π° ΠΎΠ±Π»Π°Ρ‡Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° ssh интСрактивният Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ Π΅ Π½Π°Π»ΠΈΡ‡Π΅Π½, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ към ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° -- ΠΊΠΎΠΌΠ°Π½Π΄Π°.

ΠŸΠΎΡ‡ΠΈΡΡ‚Π²Π°ΠΌΠ΅ Π΄ΠΎΠΌΠ°ΡˆΠ½Π°Ρ‚Π° ΠΏΠ°ΠΏΠΊΠ° Π² ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΠΎΡ‚ стария dockerfile:

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

ΠŸΠΎΡΡ‚Π°Π²Π΅Ρ‚Π΅ прясно изтСглСния Π΄ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ» Π² Π΄ΠΎΠΌΠ°ΡˆΠ½Π°Ρ‚Π° ΠΏΠ°ΠΏΠΊΠ° Π½Π° ΠΎΠ±Π»Π°Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° scp:

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

НиС ΡΡŠΠ±ΠΈΡ€Π°ΠΌΠ΅, ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°ΠΌΠ΅ ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° към Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅:

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-ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€) ΠΈ ΠΈΠΌΠ΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (страхотСн ΠΏΡ€ΠΎΠ΅ΠΊΡ‚), ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΡŠΡ‚.

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 Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

И слСд Ρ‚ΠΎΠ²Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡ‚ΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° сглобСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€

снимки
НиС създавамС Π·Π°Π΄Π°Ρ‡Π° Π·Π° внСдряванС Π² GKE Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, SMS ΠΈΠ»ΠΈ рСгистрация. НСка Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎΠ΄ сакото Π½Π° ДТСнкинс

Нарочно ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π½Π°Ρ… настройката Π’Π»ΠΈΠ·Π°Π½Π΅. ΠŸΠΎΡ€Π°Π΄ΠΈ Π΅Π΄Π½Π° проста ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°: слСд ΠΊΠ°Ρ‚ΠΎ Π³ΠΎ настроитС натоварСността с Π΄Π°Π΄Π΅Π½ΠΎ ΠΈΠΌΠ΅, Ρ‚ΠΎΠΉ Ρ‰Π΅ останС Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰, Π±Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΊΠΎ внСдрявания с Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅. Π•, ΠΊΠ°Ρ‚ΠΎ цяло Ρ‚ΠΎΠ²Π° Π΅ ΠΌΠ°Π»ΠΊΠΎ извън Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° историята.

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

Всички Π³ΠΎΡ€Π½ΠΈ ΡΡ‚ΡŠΠΏΠΊΠΈ вСроятно Π½Π΅ Π±ΠΈΡ…Π° ΠΌΠΎΠ³Π»ΠΈ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ, Π° просто Π΄Π° инсталиратС някакъв плъгин Π·Π° Jenkins, тСхния muuulion. Но ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π½Π΅ харСсвам плъгини. Ами ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ прибягвам Π΄ΠΎ тях само ΠΎΡ‚ отчаяниС.

И просто ΠΎΠ±ΠΈΡ‡Π°ΠΌ Π΄Π° ΠΏΠΎΠ΄Ρ…Π²Π°Π½Π° някоя Π½ΠΎΠ²Π° Ρ‚Π΅ΠΌΠ° Π·Π° ΠΌΠ΅Π½. Π’Π΅ΠΊΡΡ‚ΡŠΡ‚ ΠΏΠΎ-Π³ΠΎΡ€Π΅ Π΅ ΠΈ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сподСля констатациитС, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ… ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, описан Π² самото Π½Π°Ρ‡Π°Π»ΠΎ. Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Ρ‚Π΅ с Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΊΠ°Ρ‚ΠΎ Π½Π΅Π³ΠΎ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ са ΡΡ‚Ρ€Π°ΡˆΠ΅Π½ вълк Π² devops. Ако ΠΌΠΎΠΈΡ‚Π΅ открития ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ ΠΏΠΎΠ½Π΅ Π½Π° някого, Ρ‰Π΅ сС Ρ€Π°Π΄Π²Π°ΠΌ.

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

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