Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Bularning barchasi bizning rivojlanish guruhlarimizdan birining jamoasi rahbari bizdan bir kun oldin konteynerga joylashtirilgan yangi ilovasini sinab ko'rishni so'raganida boshlandi. Men uni joylashtirdim. Taxminan 20 daqiqadan so'ng, ilovani yangilash uchun so'rov kelib tushdi, chunki u erda juda zarur narsa qo'shilgan edi. yangiladim. Yana bir-ikki soatdan keyin... keyin nima bo'lganini taxmin qilishingiz mumkin...

Tan olaman, men juda dangasaman (men buni ilgari tan olmadimmi? Yo'q?) Va jamoa etakchilari Jenkins-ga kirish huquqiga ega ekanligini hisobga olib, bizda barcha CI/CD mavjud, men shunday deb o'yladim: uni shunday joylashtirsin. u xohlagancha! Men bir hazilni esladim: odamga baliq bering, u bir kun ovqatlanadi; odamni Fed deb chaqiring va u butun umri davomida oziqlanadi. Va ketdi ishda fokuslar o'ynang, u Kuber-ga har qanday muvaffaqiyatli qurilgan versiyani qo'llashni o'z ichiga olgan konteynerni joylashtirishi va unga har qanday qiymatlarni o'tkazishi mumkin. ENV (Mening bobom, filolog, o'tmishda ingliz tili o'qituvchisi, endi bu jumlani o'qib chiqqandan keyin barmog'ini chakkasiga burab, menga juda ifodali qarardi).

Shunday qilib, ushbu eslatmada men sizga qanday o'rganganimni aytib beraman:

  1. Jenkinsdagi ishlarni ishning o'zidan yoki boshqa ishlardan dinamik ravishda yangilash;
  2. Jenkins agenti o'rnatilgan tugundan bulut konsoliga (Cloud shell) ulaning;
  3. Ish yukini Google Kubernetes Engine-ga joylashtiring.


Darhaqiqat, men biroz beg'arazman. Sizda Google bulutidagi infratuzilmaning hech bo'lmaganda bir qismi bor deb taxmin qilinadi va shuning uchun siz uning foydalanuvchisisiz va, albatta, sizda GCP hisob qaydnomasi mavjud. Ammo bu eslatma bu haqda emas.

Bu mening navbatdagi cheat varaqim. Men faqat bitta holatda shunday eslatmalarni yozmoqchiman: men bir muammoga duch keldim, avvaliga uni qanday hal qilishni bilmasdim, yechim tayyor holda googledan qidirilmagan, shuning uchun men uni qismlarga bo'lib google orqali qidirib, oxir-oqibat muammoni hal qildim. Kelajakda buni qanday qilganimni unutib qo'yganimda, hamma narsani yana parcha-parcha google-da qidirib, birga yig'ishim shart emas, shuning uchun men o'zimga shunday yolg'on varaqlarni yozaman.

Voz kechish: 1. Eslatma "o'zim uchun", rol uchun yozilgan eng yaxshi amaliyot amal qilmaydi. Izohlarda "bunday qilish yaxshiroq bo'lardi" variantlarini o'qiganimdan xursandman.
2. Agar eslatmaning qo'llaniladigan qismi tuz deb hisoblansa, unda mening barcha oldingi eslatmalarim kabi, bu ham zaif tuz eritmasidir.

Jenkins-da ish sozlamalarini dinamik ravishda yangilash

Men sizning savolingizni oldindan bilaman: dinamik ishni yangilash bunga qanday aloqasi bor? String parametrining qiymatini qo'lda kiriting va o'chiring!

Men javob beraman: men juda dangasaman, ular shikoyat qilishlarini yoqtirmayman: Misha, tarqatish buzilmoqda, hamma narsa yo'qoldi! Siz qidirishni boshlaysiz va vazifani ishga tushirish parametrining qiymatida xatolik bor. Shuning uchun men hamma narsani iloji boricha samarali qilishni afzal ko'raman. Agar foydalanuvchining o'rniga tanlash uchun qiymatlar ro'yxatini berish orqali to'g'ridan-to'g'ri ma'lumotlarni kiritishiga yo'l qo'ymaslik mumkin bo'lsa, men tanlovni tashkil qilaman.

Reja shunday: biz Jenkinsda ish yaratamiz, uni ishga tushirishdan oldin biz ro'yxatdan versiyani tanlashimiz, konteynerga uzatilgan parametrlar uchun qiymatlarni belgilashimiz mumkin. ENV, keyin u konteynerni yig'adi va uni Konteynerlar reestriga suradi. Keyin u erdan konteyner kub shaklida ishga tushiriladi ish yuki ishda ko'rsatilgan parametrlar bilan.

Biz Jenkinsda ish yaratish va o'rnatish jarayonini ko'rib chiqmaymiz, bu mavzudan tashqari. Vazifa tayyor deb taxmin qilamiz. Versiyalar bilan yangilangan roΚ»yxatni amalga oshirish uchun bizga ikkita narsa kerak boΚ»ladi: apriori joriy versiya raqamlari bilan mavjud manbalar roΚ»yxati va shunga oΚ»xshash oΚ»zgaruvchi. Tanlov parametri vazifada. Bizning misolimizda o'zgaruvchiga nom berilsin BUILD_VERSION, biz bu haqda batafsil to'xtalmaymiz. Ammo keling, manbalar ro'yxatini batafsil ko'rib chiqaylik.

U qadar ko'p variant yo'q. Darhol ikkita narsa xayolimga keldi:

  • Jenkins o'z foydalanuvchilariga taklif qiladigan masofaviy kirish API-dan foydalaning;
  • Masofaviy ombor papkasining mazmunini so'rang (bizning holatda bu JFrog Artifactory, bu muhim emas).

Jenkins masofaviy kirish API

O'rnatilgan ajoyib an'anaga ko'ra, men uzoq tushuntirishlardan qochishni afzal ko'raman.
Men o'zimga faqat birinchi xatboshining bir qismini bepul tarjima qilishga ruxsat beraman API hujjatlarining birinchi sahifasi:

Jenkins o'z funksiyalariga masofadan turib mashina o'qish uchun API taqdim etadi. <…> Masofaviy kirish REST-ga o'xshash uslubda taqdim etiladi. Bu shuni anglatadiki, barcha funktsiyalarga yagona kirish nuqtasi yo'q, buning o'rniga " kabi URL manzili mavjud..../api/", qayerda"..." API imkoniyatlari qo'llaniladigan ob'ektni anglatadi.

Boshqacha qilib aytadigan bo'lsak, agar biz hozir gaplashayotgan tarqatish vazifasi mavjud bo'lsa http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, keyin ushbu vazifa uchun API hushtaklari mavjud http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Keyinchalik, bizda chiqishni qanday shaklda olishni tanlashimiz bor. Keling, XML ga e'tibor qarataylik, chunki API bu holatda faqat filtrlash imkonini beradi.

Keling, barcha ishlar ro'yxatini olishga harakat qilaylik. Bizni faqat yig'ilish nomi qiziqtiradi (ko'rsatiladigan ism) va uning natijasi (Natijalar):

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

Bo'ldi?

Endi faqat natija bilan tugaydigan yugurishlarni filtrlaymiz SUCCESS. Keling, argumentdan foydalanaylik &chiqarish va parametr sifatida biz unga teng bo'lmagan qiymatga yo'lni o'tkazamiz SUCCESS. Ha ha. Ikki tomonlama salbiy - bu bayonot. Bizni qiziqtirmaydigan hamma narsani istisno qilamiz:

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

Muvaffaqiyatli ro'yxatning skrinshoti
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Xo'sh, shunchaki o'yin-kulgi uchun keling, filtr bizni aldamasligiga ishonch hosil qilaylik (filtrlar hech qachon yolg'on gapirmaydi!) va "muvaffaqiyatsiz" ro'yxatni ko'rsatamiz:

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

Muvaffaqiyatsiz bo'lganlar ro'yxatining skrinshoti
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Masofaviy serverdagi jilddagi versiyalar ro'yxati

Versiyalar ro'yxatini olishning ikkinchi usuli mavjud. Menga Jenkins API-ga kirishdan ham ko'proq yoqadi. Xo'sh, chunki agar dastur muvaffaqiyatli qurilgan bo'lsa, demak u paketlangan va tegishli papkadagi omborga joylashtirilgan. Shunga o'xshab, ombor ilovalarning ishlaydigan versiyalarining standart saqlash joyidir. Kabi. Xo'sh, keling, undan qanday versiyalar saqlanganligini so'raylik. Biz masofaviy papkani burishtiramiz, grep qilamiz va awk qilamiz. Agar kimdir onelinerga qiziqsa, u spoyler ostida.

Bir qatorli buyruq
Iltimos, ikkita narsaga e'tibor bering: men ulanish ma'lumotlarini sarlavhaga o'tkazaman va menga jilddagi barcha versiyalar kerak emas va men faqat bir oy ichida yaratilganlarini tanlayman. Buyruqni haqiqat va ehtiyojlaringizga mos ravishda tahrirlang:

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-da ishlarni va ish konfiguratsiya faylini sozlash

Biz versiyalar ro'yxatining manbasini aniqladik. Keling, olingan ro'yxatni vazifaga kiritaylik. Men uchun aniq yechim dasturni yaratish vazifasiga qadam qo'shish edi. Agar natija "muvaffaqiyatli" bo'lsa, bajariladigan qadam.

Yig'ish vazifasi sozlamalarini oching va eng pastga aylantiring. Tugmalarni bosing: Qurilish bosqichini qo'shish -> Shartli qadam (bitta). Qadam sozlamalarida shartni tanlang Joriy qurilish holati, qiymatni o'rnating SUCCESS, agar muvaffaqiyatli bo'lsa, bajariladigan harakat Shell buyrug'ini ishga tushiring.

Va endi qiziqarli qism. Jenkins ish konfiguratsiyasini fayllarda saqlaydi. XML formatida. Yo'l yoqalab http://ΠΏΡƒΡ‚ΡŒ-Π΄ΠΎ-задания/config.xml Shunga ko'ra, siz konfiguratsiya faylini yuklab olishingiz, kerak bo'lganda tahrirlashingiz va uni olgan joyga qaytarishingiz mumkin.

Esda tutingki, biz versiyalar ro'yxati uchun parametr yaratish haqida yuqorida kelishib oldik BUILD_VERSION?

Keling, konfiguratsiya faylini yuklab olamiz va uning ichiga qaraymiz. Faqat parametr joyida va kerakli turdagi ekanligiga ishonch hosil qilish uchun.

Spoiler ostida skrinshot.

Sizning config.xml fragmentingiz bir xil ko'rinishi kerak. Bundan tashqari, tanlovlar elementining tarkibi hali yo'q
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Ishonchingiz komilmi? Hammasi tugadi, agar qurish muvaffaqiyatli bo'lsa, bajariladigan skript yozamiz.
Skript versiyalar ro'yxatini oladi, konfiguratsiya faylini yuklab oling, versiyalar ro'yxatini kerakli joyga yozing va keyin uni qaytarib qo'ying. Ha. Hammasi to'g'ri. XML-dagi versiyalar ro'yxatini allaqachon versiyalar ro'yxati mavjud bo'lgan joyga yozing (kelajakda skript birinchi marta ishga tushirilgandan keyin bo'ladi). Dunyoda muntazam iboralarning ashaddiy muxlislari borligini bilaman. Men ularga tegishli emasman. Iltimos, oΚ»rnating xmlstarler konfiguratsiya tahrir qilinadigan mashinaga. Menimcha, bu sed yordamida XML-ni tahrirlashdan qochish uchun unchalik katta narx emas.

Spoyler ostida men yuqoridagi ketma-ketlikni to'liq bajaradigan kodni taqdim etaman.

Masofaviy serverdagi papkadan konfiguratsiyaga versiyalar ro'yxatini yozing

#!/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

Agar siz Jenkins-dan versiyalarni olish variantini afzal ko'rsangiz va siz men kabi dangasa bo'lsangiz, spoyler ostida bir xil kod mavjud, ammo Jenkins ro'yxati:

Jenkins-dan konfiguratsiyaga versiyalar ro'yxatini yozing
Shuni yodda tuting: mening yig'ish nomim ketma-ketlik raqami va versiya raqamidan iborat bo'lib, ular ikki nuqta bilan ajratilgan. Shunga ko'ra, awk keraksiz qismini kesib tashlaydi. O'zingiz uchun ushbu qatorni ehtiyojlaringizga mos ravishda o'zgartiring.

#!/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

Nazariy jihatdan, agar siz yuqoridagi misollar asosida yozilgan kodni sinab ko'rgan bo'lsangiz, unda tarqatish vazifasida siz allaqachon versiyalar bilan ochiladigan ro'yxatga ega bo'lishingiz kerak. Bu spoyler ostidagi skrinshotdagi kabi.

To'g'ri to'ldirilgan versiyalar ro'yxati
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Agar hamma narsa ishlagan bo'lsa, skriptni nusxa ko'chiring Shell buyrug'ini ishga tushiring va o'zgarishlarni saqlang.

Bulut qobig'iga ulanish

Bizda konteynerlarda kollektorlar bor. Biz Ansible-dan ilovalarni yetkazib berish vositasi va konfiguratsiya menejeri sifatida foydalanamiz. Shunga ko'ra, konteynerlar qurish haqida gap ketganda, uchta variant aqlga keladi: Docker-ni Docker-ga o'rnatish, Docker-ni Ansible-da ishlaydigan mashinaga o'rnatish yoki bulutli konsolda konteynerlarni qurish. Biz ushbu maqolada Jenkins uchun plaginlar haqida sukut saqlashga kelishib oldik. Esingizdami?

Men qaror qildim: "qutidan tashqari" konteynerlarni bulut konsolida to'plash mumkin bo'lsa, unda nima uchun bezovtalanish kerak? Uni toza tuting, to'g'rimi? Men Jenkins konteynerlarini bulut konsolida yig'ib, keyin ularni kubga uloqtirmoqchiman. Bundan tashqari, Google o'z infratuzilmasida juda boy kanallarga ega, bu esa joylashtirish tezligiga foydali ta'sir ko'rsatadi.

Bulut konsoliga ulanish uchun sizga ikkita narsa kerak bo'ladi: gcloud va kirish huquqlari Google Cloud API xuddi shu ulanish amalga oshiriladigan VM namunasi uchun.

Google bulutidan umuman ulanishni rejalashtirmaganlar uchun
Google o'z xizmatlarida interaktiv avtorizatsiyani o'chirish imkoniyatini beradi. Bu, agar u *nix ishlayotgan bo'lsa va o'zida konsol bo'lsa, hatto qahva mashinasidan ham konsolga ulanish imkonini beradi.

Agar ushbu eslatma doirasida ushbu masalani batafsilroq yoritishim kerak bo'lsa, sharhlarda yozing. Agar biz etarli ovoz olsak, men ushbu mavzu bo'yicha yangilanish yozaman.

Huquqlarni berishning eng oson yo'li veb-interfeysdir.

  1. Keyinchalik bulutli konsolga ulanadigan VM nusxasini to'xtating.
  2. Namuna tafsilotlarini oching va bosing tuzatmoq.
  3. Sahifaning eng pastki qismida namunaga kirish doirasini tanlang Barcha bulutli API-larga to'liq kirish.

    Ekran rasmlari
    Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

  4. O'zgartirishlaringizni saqlang va namunani ishga tushiring.

VM yuklashni tugatgandan so'ng, unga SSH orqali ulaning va ulanish xatosiz sodir bo'lishiga ishonch hosil qiling. Buyruqdan foydalaning:

gcloud alpha cloud-shell ssh

Muvaffaqiyatli ulanish shunday ko'rinadi
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

GKE-ga joylashtirish

Biz IaC (Infratuzilma kod sifatida) ga to'liq o'tish uchun har tomonlama harakat qilayotganimiz sababli, bizning docker fayllarimiz Git-da saqlanadi. Bu bir tomondan. Va kubernetlarda joylashtirish yaml fayli bilan tavsiflanadi, u faqat ushbu vazifa tomonidan qo'llaniladi, bu o'zi ham kodga o'xshaydi. Bu boshqa tomondan. Umuman olganda, reja quyidagicha:

  1. Biz o'zgaruvchilarning qiymatlarini olamiz BUILD_VERSION va ixtiyoriy ravishda, o'tadigan o'zgaruvchilarning qiymatlari ENV.
  2. Git-dan docker-faylni yuklab oling.
  3. Joylashtirish uchun yaml yarating.
  4. Biz ikkala faylni scp orqali bulut konsoliga yuklaymiz.
  5. Biz u erda konteyner quramiz va uni Konteynerlar registriga suramiz
  6. Biz yukni joylashtirish faylini kubga qo'llaymiz.

Keling, aniqroq gapiraylik. Bir marta biz gaplasha boshladik ENV, deylik, biz ikkita parametrning qiymatlarini o'tkazishimiz kerak: PARAM1 ΠΈ PARAM2. Biz ularning vazifalarini joylashtirish uchun qo'shamiz, yozing - String parametri.

Ekran rasmlari
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Biz oddiy qayta yo'naltirish bilan yaml hosil qilamiz Echo faylga. Albatta, sizning docker faylingizda mavjud deb taxmin qilinadi PARAM1 ΠΈ PARAM2yuk nomi shunday bo'ladi ajoyib ilova, va belgilangan versiyani qo'llash bilan yig'ilgan konteyner yotadi Konteynerlar reestri yo'lda gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONqayerda $BUILD_VERSION faqat ochiladigan ro'yxatdan tanlangan.

Jamoa ro'yxati

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

Ulanishdan keyin Jenkins agenti gcloud alfa bulutli qobiq ssh interaktiv rejim mavjud emas, shuning uchun parametr yordamida bulut konsoliga buyruqlar yuboramiz --buyruq.

Biz bulut konsolidagi uy papkasini eski docker faylidan tozalaymiz:

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

Yangi yuklab olingan docker faylini scp yordamida bulut konsolining asosiy papkasiga joylashtiring:

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

Biz konteynerni yig'amiz, belgilaymiz va Konteynerlar reestriga suramiz:

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"

Biz tarqatish fayli bilan ham xuddi shunday qilamiz. Shuni esda tutingki, quyidagi buyruqlar joylashtirish sodir bo'lgan klasterning xayoliy nomlaridan foydalanadi (awsm-klaster) va loyiha nomi (ajoyib loyiha), klaster joylashgan joy.

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"

Biz vazifani bajaramiz, konsol chiqishini ochamiz va konteynerning muvaffaqiyatli yig'ilishini ko'rishga umid qilamiz.

Ekran rasmlari
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Va keyin yig'ilgan konteynerni muvaffaqiyatli joylashtirish

Ekran rasmlari
Biz GKE-da plaginlar, SMS yoki ro'yxatdan o'tmasdan joylashtirish vazifasini yaratamiz. Keling, Jenkinsning ko'ylagi ostiga bir nazar tashlaylik

Men ataylab sozlamani e'tiborsiz qoldirdim Kirish. Bitta oddiy sababga ko'ra: uni o'rnatganingizdan so'ng ish yuki berilgan nom bilan, bu nom bilan qancha joylashtirishingizdan qat'iy nazar, u ishlayveradi. Umuman olganda, bu tarix doirasidan biroz tashqarida.

Xulosalar o'rniga

Yuqoridagi barcha qadamlar, ehtimol, amalga oshirilishi mumkin emas edi, lekin shunchaki Jenkins uchun plaginlarni o'rnatdi, ularning muuulion. Lekin negadir plaginlarni yoqtirmayman. Aniqrog'i, men ularga faqat umidsizlikdan murojaat qilaman.

Va men o'zim uchun yangi mavzu olishni yaxshi ko'raman. Yuqoridagi matn, shuningdek, boshida tasvirlangan muammoni hal qilishda qilgan topilmalarimni baham ko'rishning bir usuli. Unga o'xshab devoplarda qo'rqinchli bo'ri bo'lmaganlar bilan baham ko'ring. Agar mening topilmalarim hech bo'lmaganda kimgadir yordam bersa, men xursand bo'laman.

Manba: www.habr.com

a Izoh qo'shish