ΠΡΠΈΡΠΊΠΎ Π·Π°ΠΏΠΎΡΠ½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ Π΅ΠΊΠΈΠΏΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΡΡ Π½ΠΎΡΠΎ Π½ΠΎΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π±Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ Π΄Π΅Π½. ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ Π³ΠΎ. Π‘Π»Π΅Π΄ ΠΎΠΊΠΎΠ»ΠΎ 20 ΠΌΠΈΠ½ΡΡΠΈ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ Π·Π°ΡΠ²ΠΊΠ° Π·Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°ΠΌ Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π½Π΅ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. ΠΏΠΎΠ΄Π½ΠΎΠ²ΠΈΡ . Π‘Π»Π΅Π΄ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ°... Π΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π°...
Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΈΠ·Π½Π°Ρ, ΡΠ΅ ΡΡΠΌ Π΄ΠΎΡΡΠ° ΠΌΡΡΠ·Π΅Π»ΠΈΠ² (Π½Π΅ Π³ΠΎ Π»ΠΈ ΠΏΡΠΈΠ·Π½Π°Ρ ΠΏΠΎ-ΡΠ°Π½ΠΎ? ΠΠ΅?) ΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π΅ΠΊΠΈΠΏΠΈ ΠΈΠΌΠ°Ρ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Jenkins, Π² ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ CI/CD, ΡΠΈ ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡ : Π½Π΅ΠΊΠ° Π³ΠΎ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈΡΠΊΠ°! Π‘ΠΏΠΎΠΌΠ½ΠΈΡ ΡΠΈ Π΅Π΄ΠΈΠ½ Π²ΠΈΡ: Π΄Π°ΠΉ Π½Π° ΡΠΎΠ²Π΅ΠΊ ΡΠΈΠ±Π° ΠΈ ΡΠΎΠΉ ΡΠ΅ ΡΠ΄Π΅ Π·Π° Π΅Π΄ΠΈΠ½ Π΄Π΅Π½; Π½Π°ΡΠ΅ΡΠ΅ΡΠ΅ ΡΠΎΠ²Π΅ΠΊ Fed ΠΈ ΡΠΎΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ Fed ΠΏΡΠ΅Π· ΡΠ΅Π»ΠΈΡ ΡΠΈ ΠΆΠΈΠ²ΠΎΡ. Π ΠΎΡΠΈΠ΄Π΅ ΠΈΠ³ΡΠ°ΠΉΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°, ΠΊΠΎΠΉΡΠΎ Π±ΠΈ ΠΌΠΎΠ³ΡΠ» Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΡΠΊΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½Π° Π²Π΅ΡΡΠΈΡ Π² Kuber ΠΈ Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ ENV (Π΄ΡΠ΄ΠΎ ΠΌΠΈ, ΡΠΈΠ»ΠΎΠ»ΠΎΠ³, ΡΡΠΈΡΠ΅Π» ΠΏΠΎ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈ Π² ΠΌΠΈΠ½Π°Π»ΠΎΡΠΎ, ΡΠ΅Π³Π° ΡΠ΅ΡΠ΅ Π΄Π° Π²ΡΡΡΠΈ ΠΏΡΡΡΡ Π½Π° ΡΠ»Π΅ΠΏΠΎΠΎΡΠΈΠ΅ΡΠΎ ΡΠΈ ΠΈ Π΄Π° ΠΌΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅Π»Π½ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ ΡΠΎΠ²Π° ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅).
Π ΡΠ°ΠΊΠ°, Π² ΡΠ°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π½Π°ΡΡΠΈΡ :
- ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π΄Π°Π½ΠΈΡ Π² Jenkins ΠΎΡ ΡΠ°ΠΌΠΎΡΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈ Π·Π°Π΄Π°Π½ΠΈΡ;
- Π‘Π²ΡΡΠΆΠ΅ΡΠ΅ ΡΠ΅ Ρ ΠΎΠ±Π»Π°ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π° (Cloud shell) ΠΎΡ Π²ΡΠ·Π΅Π» Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π°Π³Π΅Π½Ρ Jenkins;
- Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π² Google Kubernetes Engine.
ΠΡΡΡΠ½ΠΎΡΡ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΡΡΠΌ ΠΌΠ°Π»ΠΊΠΎ Π½Π΅ΠΈΡΠΊΡΠ΅Π½. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ½Π΅ ΡΠ°ΡΡ ΠΎΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π² ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Google ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΡΠ΅ Π½Π΅Π³ΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΠΈ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ°ΡΠ΅ GCP Π°ΠΊΠ°ΡΠ½Ρ. ΠΠΎ ΡΠ°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° Π½Π΅ Π΅ Π·Π° ΡΠΎΠ²Π°.
Π’ΠΎΠ²Π° Π΅ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΡ ΠΌΠΈ ΠΈΠ·ΠΌΠ°ΠΌΠ½ΠΈΠΊ. ΠΡΠΊΠ°ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΡΠ°ΠΊΠΈΠ²Π° Π±Π΅Π»Π΅ΠΆΠΊΠΈ ΡΠ°ΠΌΠΎ Π² Π΅Π΄ΠΈΠ½ ΡΠ»ΡΡΠ°ΠΉ: Π±ΡΡ ΠΈΠ·ΠΏΡΠ°Π²Π΅Π½ ΠΏΡΠ΅Π΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ ΡΠ΅ΡΠ°, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅ Π±Π΅ΡΠ΅ Π³ΡΠ³ΡΠ» Π³ΠΎΡΠΎΠ²ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ Π³ΠΎ Π³ΡΠ³ΡΠ» Π½Π° ΡΠ°ΡΡΠΈ ΠΈ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π ΡΠ°ΠΊΠ°, ΡΠ΅ Π² Π±ΡΠ΄Π΅ΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ Π·Π°Π±ΡΠ°Π²Ρ ΠΊΠ°ΠΊ ΡΡΠΌ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ», Π½Π΅ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΡΡΡΡ Π²ΡΠΈΡΠΊΠΎ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ°ΡΡ ΠΏΠΎ ΡΠ°ΡΡ ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌ Π·Π°Π΅Π΄Π½ΠΎ, Π°Π· ΡΠΈ ΠΏΠΈΡΠ° ΡΠ°ΠΊΠΈΠ²Π° ΠΈΠ·ΠΌΠ°ΠΌΠ½ΠΈ Π»ΠΈΡΡΠΎΠ²Π΅.
ΠΠΏΡΠΎΠ²Π΅ΡΠΆΠ΅Π½ΠΈΠ΅: 1. ΠΠ΅Π»Π΅ΠΆΠΊΠ°ΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° βΠ·Π° ΡΠ΅Π±Π΅ ΡΠΈβ, Π·Π° ΡΠΎΠ»ΡΡΠ° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π½Π΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°. Π©Π°ΡΡΠ»ΠΈΠ² ΡΡΠΌ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ° ΠΎΠΏΡΠΈΠΈΡΠ΅ βΠ±ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Ρ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½β Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
2. ΠΠΊΠΎ Π½Π°Π½Π΅ΡΠ΅Π½Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ Π½ΠΎΡΠΊΠ°ΡΠ° ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΡΠΎΠ», ΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΠΌΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ Π½ΠΎΡΠΊΠΈ, ΡΠ°Π·ΠΈ Π΅ ΡΠ»Π°Π± ΡΠΎΠ»Π΅Π½ ΡΠ°Π·ΡΠ²ΠΎΡ.
ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π² Jenkins
ΠΡΠ΅Π΄Π²ΠΈΠΆΠ΄Π°ΠΌ Π²ΡΠΏΡΠΎΡΠ° Π²ΠΈ: ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ±ΡΠΎ ΠΈΠΌΠ° Ρ ΡΠΎΠ²Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎΡΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ°? ΠΡΠ²Π΅Π΄Π΅ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π½ΠΈΠ·ΠΎΠ²ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΡΠ½ΠΎ ΠΈ ΡΡΡΠ³Π²Π°ΠΉΡΠ΅!
ΠΡΠ³ΠΎΠ²Π°ΡΡΠΌ: Π½Π°ΠΈΡΡΠΈΠ½Π° ΡΡΠΌ ΠΌΡΡΠ·Π΅Π»ΠΈΠ², Π½Π΅ ΠΌΠΈ Ρ Π°ΡΠ΅ΡΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΎΠΏΠ»Π°ΠΊΠ²Π°Ρ: ΠΠΈΡΠ°, Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΡΡΠΈΠ²Π°, Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΈΠ·ΡΠ΅Π·Π½Π°Π»ΠΎ! ΠΠ°ΠΏΠΎΡΠ²Π°ΡΠ΅ Π΄Π° ΡΡΡΡΠΈΡΠ΅ ΠΈ ΠΈΠΌΠ° ΠΏΡΠ°Π²ΠΎΠΏΠΈΡΠ½Π° Π³ΡΠ΅ΡΠΊΠ° Π² ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π½ΡΠΊΠ°ΠΊΡΠ² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠ°. ΠΠ°ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΌ Π΄Π° ΠΏΡΠ°Π²Ρ Π²ΡΠΈΡΠΊΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΠΊΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΏΡΠ΅ΡΠΈ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄Π° Π²ΡΠ²Π΅ΠΆΠ΄Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, ΠΊΠ°ΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ Π΄Π°Π΄Π΅ ΡΠΏΠΈΡΡΠΊ ΡΡΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΎΡ ΠΊΠΎΠΈΡΠΎ Π΄Π° ΠΈΠ·Π±ΠΈΡΠ°ΡΠ΅, ΡΠΎΠ³Π°Π²Π° Π°Π· ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌ ΠΈΠ·Π±ΠΎΡΠ°.
ΠΠ»Π°Π½ΡΡ Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΡ: ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ° Π² Jenkins, Π² ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡ ΠΎΡ ΡΠΏΠΈΡΡΠΊΠ°, Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΡΠ΅Π· ENV, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΡΠ±ΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ Π³ΠΎ ΠΈΠ·Π±ΡΡΠ²Π° Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΎΡΡΠ°ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΠ΅ ΠΏΡΡΠΊΠ° Π² cuber as Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΎΡΡΡΠ° Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π² Π·Π°Π΄Π°Π½ΠΈΠ΅ΡΠΎ.
ΠΡΠΌΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π² Jenkins, ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΠΎ ΡΠ΅ΠΌΠ°ΡΠ°. Π©Π΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ Π·Π°Π΄Π°ΡΠ°ΡΠ° Π΅ Π³ΠΎΡΠΎΠ²Π°. ΠΠ° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Π΄Π²Π΅ Π½Π΅ΡΠ°: ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Ρ Π°ΠΏΡΠΈΠΎΡΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΈ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅ ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΊΠ°ΡΠΎ ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π° ΠΈΠ·Π±ΠΎΡ Π² Π·Π°Π΄Π°ΡΠ°ΡΠ°. Π Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π΅ ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π° BUILD_VERSION, Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° Π½Π΅Π³ΠΎ. ΠΠΎ Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡΠ±Π»ΠΈΠ·ΠΎ ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ.
ΠΡΠΌΠ° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡΠΈΠΈ. ΠΠ΅Π΄Π½Π°Π³Π° ΠΌΠΈ Ρ ΡΡΠΌΠ½Π°Ρ Π° Π΄Π²Π΅ Π½Π΅ΡΠ°:
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ API Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ, ΠΊΠΎΠΉΡΠΎ Jenkins ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π½Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ;
- ΠΠΎΠΈΡΠΊΠ°ΠΉΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ JFrog Artifactory, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ).
API Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π½Π° Jenkins
Π‘ΠΏΠΎΡΠ΅Π΄ ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½Π°ΡΠ° ΠΎΡΠ»ΠΈΡΠ½Π° ΡΡΠ°Π΄ΠΈΡΠΈΡ Π±ΠΈΡ
ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅Π» Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π° Π΄ΡΠ»Π³ΠΈΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅Π½ΠΈΡ.
Π©Π΅ ΡΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»Ρ ΡΠ°ΠΌΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ ΠΏΡΠ΅Π²ΠΎΠ΄ Π½Π° ΡΠ°ΡΡ ΠΎΡ ΠΏΡΡΠ²ΠΈΡ ΠΏΠ°ΡΠ°Π³ΡΠ°Ρ
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']
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΡΠΏΠ΅ΡΠ½ΠΈ
Π, ΠΏΡΠΎΡΡΠΎ Π·Π° Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅, Π½Π΅ΠΊΠ° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ ΡΠΈΠ»ΡΡΡΡΡ Π½Π΅ Π½ΠΈ Π΅ ΠΈΠ·ΠΌΠ°ΠΌΠΈΠ» (ΡΠΈΠ»ΡΡΠΈΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π»ΡΠΆΠ°Ρ!) ΠΈ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΡΠΏΠΈΡΡΠΊ Ρ βΠ½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈβ:
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈ
Π‘ΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ ΠΎΡ ΠΏΠ°ΠΏΠΊΠ° Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ
ΠΠΌΠ° ΠΈ Π²ΡΠΎΡΠΈ Π½Π°ΡΠΈΠ½ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ. Π₯Π°ΡΠ΅ΡΠ²Π° ΠΌΠΈ Π΄ΠΎΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΄ΠΎΡΡΡΠΏΠ° Π΄ΠΎ 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 ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½. Π‘ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° Π·Π° ΠΈΠ·Π±ΠΎΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π»ΠΈΠΏΡΠ²Π°
Π‘ΠΈΠ³ΡΡΠ΅Π½ Π»ΠΈ ΡΠΈ? Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ, Π½Π΅ΠΊΠ° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ, Π°ΠΊΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ.
Π‘ΠΊΡΠΈΠΏΡΡΡ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ, ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ», ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ ΡΠΏΠΈΡΡΠΊΠ° Ρ Π²Π΅ΡΡΠΈΠΈ Π² Π½Π΅Π³ΠΎ Π½Π° ΠΌΡΡΡΠΎΡΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ, ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π³ΠΎ Π²ΡΡΠ½Π΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. Π΄Π° Π’ΠΎΠ²Π° Π΅ Π²ΡΡΠ½ΠΎ. ΠΠ°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ Π² XML Π½Π° ΠΌΡΡΡΠΎΡΠΎ, ΠΊΡΠ΄Π΅ΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ (ΡΠ΅ Π±ΡΠ΄Π΅ Π² Π±ΡΠ΄Π΅ΡΠ΅, ΡΠ»Π΅Π΄ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°). ΠΠ½Π°ΠΌ, ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΈΠΌΠ° ΡΡΠΎΡΡΠ½ΠΈ ΡΠ΅Π½ΠΎΠ²Π΅ Π½Π° ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΈΡΠ΅ ΠΈΠ·ΡΠ°Π·ΠΈ ΠΏΠΎ ΡΠ²Π΅ΡΠ°. ΠΠ· Π½Π΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ° ΠΊΡΠΌ ΡΡΡ
. ΠΠΎΠ»Ρ, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅
ΠΠΎΠ΄ ΡΠΏΠΎΠΉΠ»Π΅ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π³ΠΎΡΠ½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ Π² Π½Π΅ΠΉΠ½Π°ΡΠ° ΡΡΠ»ΠΎΡΡ.
ΠΠ°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ ΠΎΡ ΠΏΠ°ΠΏΠΊΠ° Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠ²ΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°
#!/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
ΠΠ° ΡΠ΅ΠΎΡΠΈΡ, Π°ΠΊΠΎ ΡΡΠ΅ ΡΠ΅ΡΡΠ²Π°Π»ΠΈ ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΠΈΡΠ°Π½ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠΎΠ³Π°Π²Π° Π² Π·Π°Π΄Π°ΡΠ°ΡΠ° Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π²Π΅ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΠ°Π΄Π°Ρ ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ. Π’ΠΎΠ²Π° Π΅ ΠΊΠ°ΡΠΎ Π½Π° Π΅ΠΊΡΠ°Π½Π½Π°ΡΠ° ΡΠ½ΠΈΠΌΠΊΠ° ΠΏΠΎΠ΄ ΡΠΏΠΎΠΉΠ»Π΅ΡΠ°.
ΠΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΏΠΎΠΏΡΠ»Π½Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ, ΠΊΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ ΠΈ ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠ° Π² ΠΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ° ΠΈ Π·Π°ΠΏΠ°Π·Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅.
Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ ΠΊΡΠΌ Cloud shell
Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ Ρ ΠΊΠΎΠ»Π΅ΠΊΡΠΎΡΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. ΠΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ansible ΠΊΠ°ΡΠΎ Π½Π°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ. Π‘ΡΠΎΡΠ²Π΅ΡΠ½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΡΡΠΈ ΠΎΠΏΡΠΈΠΈ ΠΈΠ΄Π²Π°Ρ Π½Π° ΡΠΌ: ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Docker Π² Docker, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Docker Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠ°Π±ΠΎΡΠ΅ΡΠ° Ρ Ansible, ΠΈΠ»ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² ΠΎΠ±Π»Π°ΡΠ½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°. Π‘ΡΠ³Π»Π°ΡΠΈΡ ΠΌΠ΅ ΡΠ΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΌΡΠ»ΡΠ°Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈΡΠ΅ Π·Π° Jenkins Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ. ΠΠΎΠΌΠ½Ρ?
Π Π΅ΡΠΈΡ : Π΄ΠΎΠ±ΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ βΠΈΠ·Π²ΡΠ½ ΠΊΡΡΠΈΡΡΠ°β ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΡΠ±ΠΈΡΠ°Ρ Π² ΠΎΠ±Π»Π°ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΡΠΎΠ³Π°Π²Π° Π·Π°ΡΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅? ΠΠ°Π·Π΅ΡΠ΅ Π³ΠΎ ΡΠΈΡΡΠΎ, Π½Π°Π»ΠΈ? ΠΡΠΊΠ°ΠΌ Π΄Π° ΡΡΠ±Π΅ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π½Π° ΠΠΆΠ΅Π½ΠΊΠΈΠ½Ρ Π² ΠΎΠ±Π»Π°ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° Π³ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌ Π² ΠΊΡΠ±Π° ΠΎΡ ΡΠ°ΠΌ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Google ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ³Π°ΡΠΈ ΠΊΠ°Π½Π°Π»ΠΈ Π² ΡΠ²ΠΎΡΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° Π±Π»Π°Π³ΠΎΠΏΡΠΈΡΡΠ΅Π½ Π΅ΡΠ΅ΠΊΡ Π²ΡΡΡ Ρ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
ΠΠ° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΠΎΠ±Π»Π°ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Π΄Π²Π΅ Π½Π΅ΡΠ°: gcloud ΠΈ ΠΏΡΠ°Π²Π° Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Google Cloud API Π·Π° VM Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΡΡΡΠ°ΡΠ° Π²ΡΡΠ·ΠΊΠ°.
ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°Ρ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΠΎΡ ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Google
Google Π΄ΠΎΠΏΡΡΠΊΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΡΠΎ ΠΎΡΠΎΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π² ΡΠ²ΠΎΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ. Π’ΠΎΠ²Π° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π΄ΠΎΡΠΈ ΠΎΡ ΠΊΠ°ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Π°, Π°ΠΊΠΎ ΡΡ ΡΠ°Π±ΠΎΡΠΈ Ρ *nix ΠΈ ΠΈΠΌΠ° ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.
ΠΠΊΠΎ ΠΈΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ ΡΠΎΠ·ΠΈ Π²ΡΠΏΡΠΎΡ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ°, ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅. ΠΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π³Π»Π°ΡΠΎΠ²Π΅, ΡΠ΅ Π½Π°ΠΏΠΈΡΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ°.
ΠΠ°ΠΉ-Π»Π΅ΡΠ½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΏΡΠ°Π²Π° Π΅ ΡΡΠ΅Π· ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
- Π‘ΠΏΡΠ΅ΡΠ΅ VM Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΠΎΠ±Π»Π°ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.
- ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΈ ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ.
- Π Π½Π°ΠΉ-Π΄ΠΎΠ»Π½Π°ΡΠ° ΡΠ°ΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΎΠ±Ρ
Π²Π°ΡΠ° Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΡΠ»Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±Π»Π°ΡΠ½ΠΈ API.
ΡΠ½ΠΈΠΌΠΊΠΈ
- ΠΠ°ΠΏΠ°Π·Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠΈ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ VM ΠΏΡΠΈΠΊΠ»ΡΡΠΈ ΡΡΡ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ, ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΡΠ΅ Ρ Π½Π΅Π³ΠΎ ΡΡΠ΅Π· SSH ΠΈ ΡΠ΅ ΡΠ²Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π±Π΅Π· Π³ΡΠ΅ΡΠΊΠ°. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
gcloud alpha cloud-shell ssh
Π£ΡΠΏΠ΅ΡΠ½Π°ΡΠ° Π²ΡΡΠ·ΠΊΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½
Π Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅ΡΠ΅ Π² GKE
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΡΡΡΠ΅ΠΌΠΈΠΌ ΠΏΠΎ Π²ΡΡΠΊΠ°ΠΊΡΠ² Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΈΠ·ΡΡΠ»ΠΎ ΠΊΡΠΌ IaC (ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄), Π½Π°ΡΠΈΡΠ΅ Π΄ΠΎΠΊΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² Git. Π’ΠΎΠ²Π° Π΅ ΠΎΡ Π΅Π΄Π½Π° ΡΡΡΠ°Π½Π°. Π Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π² kubernetes ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° ΠΎΡ yaml ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΌΠΎ ΠΎΡ ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ ΡΠ°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ ΡΡΡΠΎ Π΅ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ ΠΎΡ Π΄ΡΡΠ³Π°ΡΠ° ΡΡΡΠ°Π½Π°. ΠΠ±ΡΠΎ Π²Π·Π΅ΡΠΎ ΠΏΠ»Π°Π½ΡΡ Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΡ:
- ΠΠ·ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ BUILD_VERSION ΠΈ, ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ, ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ ENV.
- ΠΠ·ΡΠ΅Π³Π»Π΅ΡΠ΅ docker ΡΠ°ΠΉΠ»Π° ΠΎΡ Git.
- ΠΠ΅Π½Π΅ΡΠΈΡΠ°ΠΉΡΠ΅ yaml Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
- ΠΠΈΠ΅ ΠΊΠ°ΡΠ²Π°ΠΌΠ΅ ΠΈ Π΄Π²Π°ΡΠ° ΡΠ°ΠΉΠ»Π° ΡΡΠ΅Π· scp Π² ΠΎΠ±Π»Π°ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π°.
- Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ°ΠΌ ΠΈ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅
- ΠΡΠΈΠ»Π°Π³Π°ΠΌΠ΅ ΡΠ°ΠΉΠ»Π° Π·Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΊΡΠΌ cuber.
ΠΠ΅ΠΊΠ° Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎ-ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΠΌΠ΅ Π΄Π° Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ENV, ΡΠΎΠ³Π°Π²Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ°: ΠΠΠ ΠΠΠΠ’Π 1 ΠΈ ΠΠΠ ΠΠΠΠ’Π 2. ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΡΡ Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, ΡΠΈΠΏ - ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π° Π½ΠΈΠ·.
ΡΠ½ΠΈΠΌΠΊΠΈ
Π©Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ 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"
ΠΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ Π·Π°Π΄Π°ΡΠ°ΡΠ°, ΠΎΡΠ²Π°ΡΡΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΠΈ ΡΠ΅ Π½Π°Π΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΡΠ½ΠΈΠΌΠΊΠΈ
Π ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΡΠ³Π»ΠΎΠ±Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
ΡΠ½ΠΈΠΌΠΊΠΈ
ΠΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠ΅Π½Π΅Π±ΡΠ΅Π³Π½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° ΠΠ»ΠΈΠ·Π°Π½Π΅. ΠΠΎΡΠ°Π΄ΠΈ Π΅Π΄Π½Π° ΠΏΡΠΎΡΡΠ° ΠΏΡΠΈΡΠΈΠ½Π°: ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ Π³ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΎΡΡΡΠ° Ρ Π΄Π°Π΄Π΅Π½ΠΎ ΠΈΠΌΠ΅, ΡΠΎΠΉ ΡΠ΅ ΠΎΡΡΠ°Π½Π΅ ΡΠ°Π±ΠΎΡΠ΅Ρ, Π±Π΅Π· Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΊΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡ Ρ ΡΠΎΠ²Π° ΠΈΠΌΠ΅ ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅. Π, ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠΎΠ²Π° Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΈΠ·Π²ΡΠ½ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΈΡΡΠΎΡΠΈΡΡΠ°.
ΠΠΌΠ΅ΡΡΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ΠΡΠΈΡΠΊΠΈ Π³ΠΎΡΠ½ΠΈ ΡΡΡΠΏΠΊΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π½Π΅ Π±ΠΈΡ Π° ΠΌΠΎΠ³Π»ΠΈ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ, Π° ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½ΡΠΊΠ°ΠΊΡΠ² ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Jenkins, ΡΠ΅Ρ Π½ΠΈΡ muuulion. ΠΠΎ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° Π½Π΅ Ρ Π°ΡΠ΅ΡΠ²Π°ΠΌ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ. ΠΠΌΠΈ ΠΏΠΎ-ΡΠΎΡΠ½ΠΎ ΠΏΡΠΈΠ±ΡΠ³Π²Π°ΠΌ Π΄ΠΎ ΡΡΡ ΡΠ°ΠΌΠΎ ΠΎΡ ΠΎΡΡΠ°ΡΠ½ΠΈΠ΅.
Π ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΠΈΡΠ°ΠΌ Π΄Π° ΠΏΠΎΠ΄Ρ
Π²Π°Π½Π° Π½ΡΠΊΠΎΡ Π½ΠΎΠ²Π° ΡΠ΅ΠΌΠ° Π·Π° ΠΌΠ΅Π½. Π’Π΅ΠΊΡΡΡΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ Π΅ ΠΈ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΊΠΎΠ½ΡΡΠ°ΡΠ°ΡΠΈΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ
ΠΏΡΠΈ ΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΎΠΏΠΈΡΠ°Π½ Π² ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ. Π‘ΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅ Ρ ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΊΠ°ΡΠΎ Π½Π΅Π³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΡΠ° ΡΡΡΠ°ΡΠ΅Π½ Π²ΡΠ»ΠΊ Π² devops. ΠΠΊΠΎ ΠΌΠΎΠΈΡΠ΅ ΠΎΡΠΊΡΠΈΡΠΈΡ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ ΠΏΠΎΠ½Π΅ Π½Π° Π½ΡΠΊΠΎΠ³ΠΎ, ΡΠ΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com