Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Viskas prasidėjo, kai vienos iš mūsų kūrimo komandų komandos vadovas paprašė mūsų išbandyti jų naują programą, kuri buvo sudėta prieš dieną. Aš jį paskelbiau. Po kokių 20 minučių buvo gautas prašymas atnaujinti aplikaciją, nes ten buvo pridėtas labai reikalingas dalykas. atnaujinau. Dar po poros valandų... na, galite spėti, kas prasidėjo toliau...

Turiu pripažinti, kad esu gana tingus (ar neprisipažinau tai anksčiau? Ne?), ir atsižvelgiant į tai, kad komandos vadovai turi prieigą prie Jenkins, kuriame turime visą CI / CD, pagalvojau: tegul jis dislokuoja kaip kiek jis nori! Prisiminiau pokštą: duok žmogui žuvį ir jis valgys dieną; paskambink žmogui Fed ir jis bus maitinamas visą gyvenimą. Ir nuėjo gudrauti darbe, kuris galėtų įdiegti talpyklą su bet kurios sėkmingai sukurtos versijos programa į Kuber ir perkelti į jį visas reikšmes ENV (mano senelis, filologas, anglų kalbos mokytojas, dabar perskaitęs šį sakinį sukiodavo pirštu į smilkinį ir labai išraiškingai žiūrėdavo į mane).

Taigi, šioje pastaboje papasakosiu, kaip išmokau:

  1. Dinamiškai atnaujinkite Jenkins darbus iš paties darbo ar kitų darbų;
  2. Prisijunkite prie debesies konsolės (debesies apvalkalo) iš mazgo, kuriame įdiegtas Jenkins agentas;
  3. Įdiekite darbo krūvį „Google Kubernetes Engine“.


Tiesą sakant, aš, žinoma, esu šiek tiek nesąžiningas. Daroma prielaida, kad turite bent dalį infrastruktūros „Google“ debesyje, todėl esate jos vartotojas ir, žinoma, turite GCP paskyrą. Tačiau ši pastaba ne apie tai.

Tai yra kitas mano apgaudinėjimo lapas. Tokius užrašus noriu parašyti tik vienu atveju: susidūriau su problema, iš pradžių nežinojau, kaip ją išspręsti, sprendimas nebuvo google paruoštas, todėl google ieškojau dalimis ir galiausiai problemą išsprendžiau. Ir kad ateityje, kai pamiršiu, kaip tai padariau, nereikėtų vėl visko po gabalėlį ieškoti googlėje ir rinkti kartu, rašau sau tokius cheat lapus.

Dėmesio: 1. Užrašas buvo parašytas „sau“, vaidmeniui geriausia praktika netaikoma. Džiaugiuosi, kad komentaruose perskaičiau variantus "geriau būtų buvę taip padaryti".
2. Jei užtepta natos dalis laikoma druska, tai, kaip ir visi ankstesni mano užrašai, šis yra silpnas druskos tirpalas.

Dinamiškai atnaujinami Jenkins užduočių nustatymai

Numatau jūsų klausimą: ką su tuo turi dinaminis darbo atnaujinimas? Įveskite eilutės parametro vertę rankiniu būdu ir pirmyn!

Atsakau: aš tikrai tinginys, man nepatinka, kai jie skundžiasi: Miša, dislokacija stringa, viskas dingo! Pradedate ieškoti ir yra rašybos klaida kokio nors užduoties paleidimo parametro vertėje. Todėl man labiau patinka viską daryti kuo efektyviau. Jei galima neleisti vartotojui tiesiogiai įvesti duomenų, vietoj to pateikiant reikšmių sąrašą, iš kurių galima pasirinkti, tada aš organizuoju pasirinkimą.

Planas toks: Jenkins sukuriame darbą, kuriame prieš paleisdami galėtume pasirinkti versiją iš sąrašo, nurodyti parametrų reikšmes, perduodamas į konteinerį per ENV, tada jis surenka konteinerį ir įstumia jį į konteinerių registrą. Tada iš ten konteineris paleidžiamas kubeliu kaip darbo krūvis su darbe nurodytais parametrais.

Mes nenagrinėsime darbo Jenkins kūrimo ir įkūrimo proceso, tai ne į temą. Mes manysime, kad užduotis yra paruošta. Norėdami įdiegti atnaujintą sąrašą su versijomis, mums reikia dviejų dalykų: esamo šaltinių sąrašo su a priori galiojančiais versijų numeriais ir kintamuoju, pvz. Pasirinkimo parametras užduotyje. Mūsų pavyzdyje kintamasis turi būti pavadintas BUILD_VERSION, mes apie tai nekalbėsime išsamiai. Tačiau pažvelkime į šaltinių sąrašą atidžiau.

Pasirinkimų nėra tiek daug. Iš karto į galvą atėjo du dalykai:

  • Naudokite nuotolinės prieigos API, kurią Jenkins siūlo savo vartotojams;
  • Paprašykite nuotolinės saugyklos aplanko turinio (mūsų atveju tai yra „JFrog Artifactory“, o tai nėra svarbu).

Jenkins Remote Access API

Pagal nusistovėjusią puikią tradiciją norėčiau vengti ilgų aiškinimų.
Leisiu sau tik nemokamą pirmosios pastraipos dalies vertimą pirmasis API dokumentacijos puslapis:

„Jenkins“ teikia API nuotolinei mašininiu būdu nuskaitomai prieigai prie savo funkcijų. <…> Nuotolinė prieiga siūloma REST stiliaus. Tai reiškia, kad nėra vieno įvesties taško į visas funkcijas, o vietoj to yra URL, pvz..../api/", kur"...“ reiškia objektą, kuriam taikomos API galimybės.

Kitaip tariant, jei diegimo užduotis, apie kurią šiuo metu kalbame, pasiekiama adresu http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, tada šios užduoties API švilpukai pasiekiami adresu http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Toliau turime pasirinkti, kokia forma gauti išvestį. Sutelkime dėmesį į XML, nes šiuo atveju API leidžia tik filtruoti.

Pabandykime sudaryti visų atliktų darbų sąrašą. Mus domina tik surinkimo pavadinimas (rodomas pavadinimas) ir jo rezultatas (rezultatas):

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

Pasirodė

Dabar filtruokime tik tuos paleidimus, kurie baigiasi rezultatu SĖKMĖ. Pasinaudokime argumentu &Neįtraukti ir kaip parametrą perduosime jam kelią į reikšmę, kuri nėra lygi SĖKMĖ. Taip taip. Dvigubas neigiamas yra teiginys. Mes neįtraukiame visko, kas mūsų nedomina:

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

Sėkmingųjų sąrašo ekrano kopija
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Na, šiaip sau, įsitikinkime, kad filtras mūsų neapgavo (filtrai niekada nemeluoja!) ir parodykime „nesėkmingųjų“ sąrašą:

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

Nesėkmingų sąrašo ekrano kopija
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Versijų iš nuotolinio serverio aplanko sąrašas

Yra antras būdas gauti versijų sąrašą. Man tai patinka net labiau nei prieiga prie Jenkins API. Na, nes jei programa buvo sėkmingai sukurta, tai reiškia, kad ji buvo supakuota ir patalpinta į saugyklą atitinkamame aplanke. Taip pat saugykla yra numatytoji veikiančių programų versijų saugykla. Kaip. Na, paklauskime jo, kokios versijos yra saugomos. Mes suvyniosime, grep ir awk nuotolinį aplanką. Jei kam įdomu oneliner, tai jis yra po spoileriu.

Vienos eilutės komanda
Atkreipkite dėmesį į du dalykus: perduodu ryšio informaciją antraštėje ir man nereikia visų versijų iš aplanko, o renkuosi tik tas, kurios buvo sukurtos per mėnesį. Redaguokite komandą, kad ji atitiktų jūsų realijas ir poreikius:

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[^/]+' )

Užduočių ir užduočių konfigūracijos failo nustatymas Jenkins

Mes išsiaiškinome versijų sąrašo šaltinį. Dabar įtraukime gautą sąrašą į užduotį. Man akivaizdus sprendimas buvo pridėti programos kūrimo užduotį. Žingsnis, kuris būtų atliktas, jei rezultatas būtų „sėkmė“.

Atidarykite surinkimo užduoties nustatymus ir slinkite į patį apačią. Spustelėkite mygtukus: Pridėti kūrimo žingsnį -> sąlyginis veiksmas (vienas). Veiksmo nustatymuose pasirinkite sąlygą Dabartinė kūrimo būsena, nustatykite vertę SĖKMĖ, veiksmas, kurį reikia atlikti, jei pavyks Vykdykite apvalkalo komandą.

O dabar linksmoji dalis. Jenkins saugo darbų konfigūracijas failuose. XML formatu. Pakeliui http://путь-до-задания/config.xml Atitinkamai galite atsisiųsti konfigūracijos failą, prireikus jį redaguoti ir grąžinti ten, kur gavote.

Atminkite, kad aukščiau susitarėme, kad sukursime parametrą versijų sąrašui BUILD_VERSION?

Atsisiųskite konfigūracijos failą ir pažvelkime į jį. Tiesiog įsitikinkite, kad parametras yra vietoje ir norimo tipo.

Ekrano kopija po spoileriu.

Jūsų config.xml fragmentas turėtų atrodyti taip pat. Išskyrus tai, kad pasirinkimų elemento turinio dar nėra
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Ar tu tuo tikras? Tai viskas, parašykime scenarijų, kuris bus vykdomas, jei statyba bus sėkminga.
Scenarijus gaus versijų sąrašą, atsisiųs konfigūracijos failą, surašys versijų sąrašą į jį mums reikalingoje vietoje ir įdės atgal. Taip. Teisingai. Parašykite versijų sąrašą XML toje vietoje, kur jau yra versijų sąrašas (bus ateityje, po pirmo scenarijaus paleidimo). Žinau, kad pasaulyje vis dar yra nuožmių taisyklingųjų posakių gerbėjų. Aš jiems nepriklausau. Prašome įdiegti xmlstarler į mašiną, kurioje bus redaguojama konfigūracija. Man atrodo, kad tai nėra tokia didelė kaina, kurią reikia mokėti, kad būtų išvengta XML redagavimo naudojant sed.

Po spoileriu pateikiu kodą, kuris atlieka visą aukščiau nurodytą seką.

Parašykite versijų sąrašą iš nuotolinio serverio aplanko į konfigūraciją

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

Jei jums labiau patinka galimybė gauti versijas iš Jenkins ir esate toks pat tingus kaip aš, tada po spoileriu yra tas pats kodas, bet sąrašas iš Jenkins:

Parašykite versijų sąrašą nuo Jenkins iki konfigūracijos
Tiesiog turėkite tai omenyje: mano surinkimo pavadinimą sudaro eilės numeris ir versijos numeris, atskirti dvitaškiu. Atitinkamai awk nupjauna nereikalingą dalį. Patys pakeiskite šią eilutę pagal savo poreikius.

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

Teoriškai, jei išbandėte kodą, parašytą remiantis aukščiau pateiktais pavyzdžiais, tada diegimo užduotyje jau turėtumėte turėti išskleidžiamąjį sąrašą su versijomis. Tai kaip ekrano kopijoje po spoileriu.

Teisingai užpildytas versijų sąrašas
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Jei viskas pavyko, nukopijuokite ir įklijuokite scenarijų Vykdykite apvalkalo komandą ir išsaugokite pakeitimus.

Prisijungimas prie debesies apvalkalo

Turime surinkėjus konteineriuose. Mes naudojame Ansible kaip programų pristatymo įrankį ir konfigūracijos tvarkyklę. Atitinkamai, kai kalbama apie konteinerių kūrimą, į galvą ateina trys variantai: įdiegti „Docker“ programoje „Docker“, įdiegti „Docker“ įrenginyje, kuriame veikia „Ansible“, arba kurti konteinerius debesies konsolėje. Šiame straipsnyje sutikome nutylėti apie Jenkins įskiepius. Prisiminti?

Nusprendžiau: na, o konteinerius „iš dėžės“ galima surinkti debesies konsolėje, tai kam vargti? Laikykite jį švarų, tiesa? Noriu surinkti Jenkins konteinerius debesies konsolėje ir iš ten paleisti juos į kuberį. Be to, „Google“ savo infrastruktūroje turi labai daug kanalų, o tai turės teigiamos įtakos diegimo greičiui.

Norėdami prisijungti prie debesies konsolės, jums reikia dviejų dalykų: gdebesis ir prieigos teises prie "Google Cloud API VM egzemplioriui, su kuriuo bus užmegztas tas pats ryšys.

Planuojantiems jungtis visai ne iš Google debesies
„Google“ suteikia galimybę savo paslaugose išjungti interaktyvųjį įgaliojimą. Tai leis prie konsolės prisijungti net iš kavos aparato, jei jis veikia *nix ir turi pačią konsolę.

Jei man reikia išsamiau aptarti šią problemą šioje pastaboje, parašykite komentaruose. Jei sulauksime pakankamai balsų, parašysiu atnaujinimą šia tema.

Lengviausias būdas suteikti teises yra naudojant žiniatinklio sąsają.

  1. Sustabdykite VM egzempliorių, iš kurio vėliau prisijungsite prie debesies konsolės.
  2. Atidarykite išsamią egzemplioriaus informaciją ir spustelėkite iš dalies pakeisti.
  3. Pačiame puslapio apačioje pasirinkite egzemplioriaus prieigos apimtį Visiška prieiga prie visų debesies API.

    Ekrano kopija
    Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

  4. Išsaugokite pakeitimus ir paleiskite egzempliorių.

Kai VM baigsis įkelti, prisijunkite prie jos per SSH ir įsitikinkite, kad prisijungimas vyksta be klaidų. Naudokite komandą:

gcloud alpha cloud-shell ssh

Sėkmingas ryšys atrodo maždaug taip
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Įdiegti į GKE

Kadangi visais įmanomais būdais siekiame visiškai pereiti prie IaC (Infrastruktūra kaip kodas), mūsų docker failai saugomi Git. Tai viena vertus. O diegimą kubernetes aprašo yaml failas, kurį naudoja tik ši užduotis, kuri pati taip pat yra kaip kodas. Tai iš kitos pusės. Apskritai planas yra toks:

  1. Mes paimame kintamųjų reikšmes BUILD_VERSION ir, pasirinktinai, kintamųjų, kurie bus perduodami, reikšmės ENV.
  2. Atsisiųskite docker failą iš Git.
  3. Sugeneruokite yaml diegimui.
  4. Abu šiuos failus per scp įkeliame į debesies konsolę.
  5. Ten pastatome konteinerį ir įstumiame jį į konteinerių registrą
  6. Mes pritaikome įkrovos diegimo failą kuberiui.

Būkime konkretesni. Kartą pradėjome kalbėti apie ENV, tada tarkime, kad turime perduoti dviejų parametrų reikšmes: PARAM1 и PARAM2. Pridedame jų užduotį diegti, tipą - Eilutės parametras.

Ekrano kopija
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Sugeneruosime yaml naudodami paprastą peradresavimą praleisti į failą. Žinoma, daroma prielaida, kad ją turite savo dockerfaile PARAM1 и PARAM2kad krovinio pavadinimas bus nuostabi programa, o surinktas konteineris su nurodytos versijos programa yra Konteinerių registras pakeliui gcr.io/awesomeapp/wesomeapp-$BUILD_VERSIONKur $BUILD_VERSION buvo ką tik pasirinktas iš išskleidžiamojo sąrašo.

Komandos sąrašas

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 agentas po prijungimo naudojant gcloud alfa cloud-shell ssh interaktyvus režimas nepasiekiamas, todėl komandas siunčiame į debesies konsolę naudodami parametrą -- komandą.

Išvalome namų aplanką debesies konsolėje iš senojo docker failo:

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

Įdėkite ką tik atsisiųstą dockerfailą į debesies konsolės pagrindinį aplanką naudodami scp:

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

Surenkame, pažymime ir nusiunčiame konteinerį į konteinerių registrą:

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"

Tą patį darome su diegimo failu. Atkreipkite dėmesį, kad toliau pateiktose komandose naudojami išgalvoti klasterio, kuriame įvyksta diegimas, pavadinimai (awsm-klasteris) ir projekto pavadinimą (nuostabus projektas), kur yra klasteris.

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"

Vykdome užduotį, atidarome konsolės išvestį ir tikimės, kad konteineris bus sėkmingai surinktas.

Ekrano kopija
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Ir tada sėkmingas surinkto konteinerio dislokavimas

Ekrano kopija
Sukuriame diegimo užduotį GKE be papildinių, SMS ar registracijos. Pažvelkime po Jenkinso švarku

Sąmoningai ignoravau nustatymą Įėjimas. Dėl vienos paprastos priežasties: kai tik jį nustatysite darbo krūvis su nurodytu pavadinimu, jis veiks, nesvarbu, kiek diegimų šiuo pavadinimu atliksite. Na, apskritai, tai šiek tiek už istorijos ribų.

Vietoj išvadų

Visų pirmiau minėtų veiksmų tikriausiai nebuvo galima atlikti, o tiesiog įdiegti tam tikrą Jenkins įskiepį, jų muuulioną. Bet kažkodėl nemėgstu įskiepių. Na, tiksliau, aš jų griebiausi tik iš nevilties.

Ir aš tiesiog mėgstu pakelti man naują temą. Aukščiau pateiktas tekstas taip pat yra būdas pasidalinti išvadomis, kurias padariau spręsdamas pačioje pradžioje aprašytą problemą. Pasidalinkite su tais, kurie, kaip ir jis, visai nėra baisus vilkas devopuose. Jei mano radiniai bent kažkam padės, būsiu laimingas.

Šaltinis: www.habr.com

Добавить комментарий