Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Ĉio komenciĝis kiam la teamestro de unu el niaj evoluigaj teamoj petis nin testi ilian novan aplikaĵon, kiu estis enhavigita la tagon antaŭe. Mi afiŝis ĝin. Post ĉirkaŭ 20 minutoj oni ricevis peton por ĝisdatigi la aplikaĵon, ĉar tie estis aldonita tre necesa afero. Mi renovigis. Post ankoraŭ kelkaj horoj... nu, vi povas diveni, kio komenciĝis poste okazi...

Mi devas konfesi, mi estas sufiĉe maldiligenta (ĉu mi ne konfesis tion pli frue? Ne?), kaj konsiderante la fakton, ke teamgvidantoj havas aliron al Jenkins, en kiu ni havas ĉiujn CI/KD, mi pensis: lasu lin deploji kiel kiom li volas! Mi rememoris ŝercon: donu al homo fiŝon kaj li manĝos dum unu tago; voku homon Fed kaj li estos Fed dum sia tuta vivo. Kaj iris ludi lertaĵojn en la laboro, kiu povus disfaldi ujon enhavantan la aplikon de iu sukcese konstruita versio en Kuber kaj transdoni ajnajn valorojn al ĝi ENV (mia avo, filologo, angla instruisto en la pasinteco, nun turnis sian fingron al sia tempio kaj rigardus min tre esprimplena post legado de tiu ĉi frazo).

Do, en ĉi tiu noto mi rakontos al vi kiel mi lernis:

  1. Dinamike ĝisdatigi laborpostenojn en Jenkins de la laboro mem aŭ de aliaj laborpostenoj;
  2. Konekti al la nuba konzolo (Nuba ŝelo) de nodo kun la agento Jenkins instalita;
  3. Deploji laborkvanton al Google Kubernetes Engine.


Fakte, mi kompreneble estas iom malsincera. Oni supozas, ke vi havas almenaŭ parton de la infrastrukturo en la Google-nubo, kaj, tial, vi estas ĝia uzanto kaj, kompreneble, vi havas GCP-konton. Sed ne pri tio temas ĉi tiu noto.

Ĉi tiu estas mia sekva trompfolio. Mi volas skribi tiajn notojn nur en unu kazo: mi alfrontis problemon, mi komence ne sciis kiel solvi ĝin, la solvo ne estis guglata preta, do mi guglis ĝin en partoj kaj fine solvis la problemon. Kaj por ke estonte, kiam mi forgesos kiel mi faris ĝin, mi ne devas denove gugli ĉion pecon post peco kaj kompili ĝin, mi skribas al mi tiajn trompfoliojn.

Malgarantio: 1. La noto estis skribita "por mi", por la rolo Plej bona praktiko ne aplikas. Mi ĝojas legi la opciojn "estis pli bone fari ĝin tiel" en la komentoj.
2. Se la aplikata parto de la noto estas konsiderata salo, tiam, kiel ĉiuj miaj antaŭaj notoj, ĉi tiu estas malforta sala solvo.

Dinamike ĝisdatigi laborpostenojn en Jenkins

Mi antaŭvidas vian demandon: kion rilatas al ĝi dinamika labor-ĝisdatigo? Enigu la valoron de la korda parametro permane kaj foriru!

Mi respondas: Mi estas vere maldiligenta, mi ne ŝatas, kiam ili plendas: Miŝa, la deplojo frakasas, ĉio malaperis! Vi komencas serĉi, kaj estas mistajpo en la valoro de iu taska lanĉa parametro. Tial mi preferas fari ĉion kiel eble plej efike. Se eblas malhelpi la uzanton rekte enigi datumojn donante anstataŭe liston de valoroj por elekti, tiam mi organizas la elekton.

La plano estas jena: ni kreas laboron en Jenkins, en kiu, antaŭ ol lanĉi, ni povus elekti version el la listo, specifi valorojn por parametroj transdonitaj al la ujo per ENV, tiam ĝi kolektas la ujon kaj puŝas ĝin en la Ujan Registron. Tiam de tie la ujo estas lanĉita en kuber as laborkvanto kun la parametroj specifitaj en la laboro.

Ni ne konsideros la procezon krei kaj starigi laboron en Jenkins, ĉi tio estas ekstertema. Ni supozos, ke la tasko estas preta. Por efektivigi ĝisdatigitan liston kun versioj, ni bezonas du aferojn: ekzistanta fontlisto kun apriore validaj versinumeroj kaj variablo kiel Elekta parametro en la tasko. En nia ekzemplo, oni nomu la variablon BUILD_VERSION, ni ne detale detalos pri ĝi. Sed ni rigardu pli detale la fontliston.

Ne estas tiom da ebloj. Tuj venis al la menso du aferoj:

  • Uzu la Remote Access API, kiun Jenkins proponas al siaj uzantoj;
  • Petu la enhavon de la dosierujo de fora deponejo (en nia kazo ĉi tio estas JFrog Artifactory, kio ne gravas).

Jenkins Remote Access API

Laŭ la establita bonega tradicio, mi preferus eviti longajn klarigojn.
Mi permesos al mi nur liberan tradukon de peco de la unua alineo unua paĝo de API-dokumentaro:

Jenkins disponigas API por fora maŝinlegebla aliro al ĝia funkcieco. <...> Fora aliro estas ofertita en REST-simila stilo. Ĉi tio signifas, ke ne ekzistas ununura enirejpunkto al ĉiuj funkcioj, sed anstataŭe URL kiel ".../api/", Kie"..." signifas la objekton al kiu la API-kapabloj estas aplikataj.

Alivorte, se la deploja tasko, pri kiu ni nuntempe parolas, estas disponebla ĉe http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, tiam la API-fajfiloj por ĉi tiu tasko estas haveblaj ĉe http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Poste, ni havas elekton en kia formo ricevi la eligon. Ni koncentriĝu pri XML, ĉar la API nur permesas filtri en ĉi tiu kazo.

Ni nur provu akiri liston de ĉiuj laboroj. Ni interesiĝas nur pri la asemblea nomo (displayName) kaj ĝia rezulto (rezulto):

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

Ĉu ĝi funkciis?

Nun ni filtru nur tiujn kurojn, kiuj finiĝas kun la rezulto Kulpo. Ni uzu la argumenton &ekskludi kaj kiel parametron ni transdonos al ĝi la vojon al valoro ne egala al Kulpo. Jes Jes. Duobla negativo estas deklaro. Ni ekskludas ĉion, kio ne interesas nin:

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

Ekrankopio de la listo de sukcesaj
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Nu, nur por amuzo, ni zorgu, ke la filtrilo ne trompis nin (filtriloj neniam mensogas!) kaj montru liston de "malsukcesaj":

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

Ekrankopio de la listo de nesukcesaj
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Listo de versioj de dosierujo sur fora servilo

Estas dua maniero akiri liston de versioj. Mi ŝatas ĝin eĉ pli ol aliri la Jenkins API. Nu, ĉar se la aplikaĵo estis sukcese konstruita, tio signifas, ke ĝi estis pakita kaj metita en la deponejon en la taŭgan dosierujon. Kiel, deponejo estas la defaŭlta stokado de funkciaj versioj de aplikoj. Ŝati. Nu, ni demandu lin, kiaj versioj estas konservitaj. Ni kurblos, grep kaj awk la fora dosierujo. Se iu interesiĝas pri la unulinio, tiam ĝi estas sub la spoiler.

Unulinia komando
Bonvolu noti du aferojn: mi pasas la konektajn detalojn en la kaplinio kaj mi ne bezonas ĉiujn versiojn el la dosierujo, kaj mi elektas nur tiujn, kiuj estis kreitaj ene de unu monato. Redaktu la komandon laŭ viaj realaĵoj kaj bezonoj:

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

Agordo de laborpostenoj kaj agorda dosiero en Jenkins

Ni eltrovis la fonton de la listo de versioj. Ni nun enmetu la rezultan liston en la taskon. Por mi, la evidenta solvo estis aldoni paŝon en la aplikaĵo-konstrua tasko. La paŝo kiu estus efektivigita se la rezulto estus "sukceso".

Malfermu la agordojn de kunigo kaj rulumu ĝis la fundo. Alklaku la butonojn: Aldoni konstrupaŝon -> Kondiĉa paŝo (ununura). En la paŝaj agordoj, elektu la kondiĉon Nuna konstrua stato, starigu la valoron Kulpo, la ago farota se sukcesa Rulu ŝelan komandon.

Kaj nun la amuza parto. Jenkins stokas laborkonfiguraciojn en dosieroj. En XML-formato. Survoje http://путь-до-задания/config.xml Sekve, vi povas elŝuti la agordan dosieron, redakti ĝin laŭbezone kaj remeti ĝin kie vi ricevis ĝin.

Memoru, ni konsentis supre, ke ni kreos parametron por la listo de versioj BUILD_VERSION?

Ni elŝutu la agordan dosieron kaj rigardu en ĝi. Nur por certigi, ke la parametro estas en loko kaj de la dezirata tipo.

Ekrankopio sub spoiler.

Via config.xml fragmento devus aspekti same. Krom ke la enhavo de la elekto-elemento ankoraŭ mankas
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Ĉu vi certas? Jen ĝi, ni skribu skripton, kiu estos ekzekutita se la konstruo sukcesos.
La skripto ricevos liston de versioj, elŝutos la agordan dosieron, skribos la liston de versioj en ĝin en la loko, kiun ni bezonas, kaj poste remetos ĝin. Jes. Tio ĝustas. Skribu liston de versioj en XML en la loko, kie jam estas listo de versioj (estos estonte, post la unua lanĉo de la skripto). Mi scias, ke ankoraŭ estas ferocaj ŝatantoj de regulaj esprimoj en la mondo. Mi ne apartenas al ili. Bonvolu instali xmlstarler al la maŝino kie la agordo estos redaktita. Ŝajnas al mi, ke tio ne estas tiom granda prezo por eviti redaktadon de XML per sed.

Sub la spoiler, mi prezentas la kodon, kiu plenumas la supran sekvencon en sia tutaĵo.

Skribu liston de versioj de dosierujo sur la fora servilo al la agordo

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

Se vi preferas la eblon akiri versiojn de Jenkins kaj vi estas same maldiligenta kiel mi, tiam sub la spoiler estas la sama kodo, sed listo de Jenkins:

Skribu liston de versioj de Jenkins al la agordo
Nur memoru ĉi tion: mia asembleonomo konsistas el sinsekvo kaj versio numero, apartigitaj per dupunkto. Sekve, awk forigas la nenecesan parton. Por vi mem, ŝanĝu ĉi tiun linion laŭ viaj bezonoj.

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

En teorio, se vi testis la kodon skribitan surbaze de la supraj ekzemploj, tiam en la disfalda tasko vi jam havu falliston kun versioj. Ĝi estas kiel en la ekrankopio sub la spoiler.

Ĝuste kompletigita listo de versioj
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Se ĉio funkciis, tiam kopiu-algluu la skripton en Rulu ŝelan komandon kaj konservi ŝanĝojn.

Konektante al Nuba ŝelo

Ni havas kolektantojn en ujoj. Ni uzas Ansible kiel nian aplikaĵan liveran ilon kaj agordan administranton. Sekve, kiam temas pri konstruado de ujoj, tri opcioj venas en menso: instali Docker en Docker, instali Docker sur maŝino, kiu funkcias Ansible, aŭ konstrui ujojn en nuba konzolo. Ni konsentis silenti pri kromaĵoj por Jenkins en ĉi tiu artikolo. Ĉu vi memoras?

Mi decidis: nu, ĉar ujoj "el la skatolo" povas esti kolektitaj en la nuba konzolo, kial do ĝeni? Tenu ĝin pura, ĉu ne? Mi volas kolekti Jenkins-ujojn en la nuba konzolo, kaj poste lanĉi ilin en la kuberon de tie. Plie, Guglo havas tre riĉajn kanalojn ene de sia infrastrukturo, kiuj havos utilan efikon al la rapideco de deplojo.

Por konektiĝi al la nuba konzolo, vi bezonas du aferojn: gcloud kaj alirrajtoj al Google Cloud API por la VM-instanco kun kiu ĉi tiu sama konekto estos farita.

Por tiuj, kiuj planas konektiĝi tute ne de Google-nubo
Guglo permesas la eblecon malŝalti interagan rajtigon en siaj servoj. Ĉi tio permesos vin konekti al la konzolo eĉ de kafmaŝino, se ĝi funkcias *nix kaj havas konzolon mem.

Se necesas, ke mi pritraktu ĉi tiun aferon pli detale kadre de ĉi tiu noto, skribu en la komentoj. Se ni ricevos sufiĉe da voĉoj, mi skribos ĝisdatigon pri ĉi tiu temo.

La plej facila maniero por doni rajtojn estas per la retinterfaco.

  1. Ĉesigu la VM-instancon de kiu vi poste konektos al la nuba konzolo.
  2. Malfermu Kazajn Detalojn kaj alklaku Plibonigu.
  3. Ĉe la plej malsupro de la paĝo, elektu la amplekson de aliro de la ekzistado Plena aliro al ĉiuj Cloud-API-oj.

    Ekrankopio
    Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

  4. Konservu viajn ŝanĝojn kaj lanĉu la petskribon.

Post kiam la VM finŝarĝis, konektu al ĝi per SSH kaj certigu, ke la konekto okazas sen eraro. Uzu la komandon:

gcloud alpha cloud-shell ssh

Sukcesa konekto aspektas kiel ĉi tio
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Deploji al GKE

Ĉar ni strebas ĉiumaniere por tute ŝanĝi al IaC (Infrastrukturo kiel Kodo), niaj docker-dosieroj estas konservitaj en Git. Ĉi tio estas unuflanke. Kaj deplojo en kubernetes estas priskribita per yaml-dosiero, kiu estas uzata nur de ĉi tiu tasko, kiu mem estas ankaŭ kiel kodo. Ĉi tio estas de la alia flanko. Ĝenerale, mi volas diri, la plano estas jena:

  1. Ni prenas la valorojn de la variabloj BUILD_VERSION kaj, laŭvole, la valoroj de la variabloj, kiuj estos trapasitaj ENV.
  2. Elŝutu la dockerfile de Git.
  3. Generu yaml por deplojo.
  4. Ni alŝutas ambaŭ ĉi tiujn dosierojn per scp al la nuba konzolo.
  5. Ni konstruas ujon tie kaj puŝas ĝin en la Container-registron
  6. Ni aplikas la ŝarĝan deplojan dosieron al la kubero.

Ni estu pli specifaj. Unufoje ni komencis paroli pri ENV, tiam supozu, ke ni devas pasi la valorojn de du parametroj: PARAM1 и PARAM2. Ni aldonas ilian taskon por deplojo, tajpu - String Parametro.

Ekrankopio
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Ni generos yaml per simpla alidirekto eĥo arkivi. Oni supozas, kompreneble, ke vi havas en via dockerfile PARAM1 и PARAM2ke la ŝarĝnomo estos awesomeapp, kaj la kunmetita ujo kun la apliko de la specifita versio kuŝas en Registro de ujoj survoje gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONkie $BUILD_VERSION estis ĵus elektita el la fallisto.

Teamlistigo

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 agento post konekto uzante gcloud alfa cloud-shell ssh interaga reĝimo ne haveblas, do ni sendas komandojn al la nuba konzolo uzante la parametron --command.

Ni purigas la hejman dosierujon en la nuba konzolo de la malnova dockerfile:

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

Metu la ĵus elŝutitan dockerfile en la hejman dosierujon de la nuba konzolo uzante scp:

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

Ni kolektas, etikedas kaj puŝas la ujon al la Registro de Ujo:

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"

Ni faras la samon kun la deploja dosiero. Bonvolu noti, ke la subaj komandoj uzas fikciajn nomojn de la areto kie okazas la deplojo (awsm-cluster) kaj nomo de projekto (awesome-projekto), kie la areto situas.

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"

Ni rulas la taskon, malfermas la konzolan eliron kaj esperas vidi la sukcesan muntadon de la ujo.

Ekrankopio
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Kaj tiam la sukcesa deplojo de la kunmetita ujo

Ekrankopio
Ni kreas disfaldan taskon en GKE sen aldonaĵoj, SMS aŭ registriĝo. Ni rigardu sub la jakon de Jenkins

Mi intence ignoris la agordon Ingreso. Pro unu simpla kialo: unufoje vi starigis ĝin laborkvanto kun persona nomo, ĝi restos funkcianta, negrave kiom da deplojoj kun ĉi tiu nomo vi plenumas. Nu, ĝenerale, ĉi tio estas iom preter la amplekso de la historio.

Anstataŭ konkludoj

Ĉiuj ĉi-supraj paŝoj verŝajne ne povus esti faritaj, sed simple instalis iun kromaĵon por Jenkins, ilia muuulion. Sed ial mi ne ŝatas kromaĵojn. Nu, pli precize, mi recurre al ili nur pro malespero.

Kaj mi nur ŝatas preni novan temon por mi. La ĉi-supra teksto ankaŭ estas maniero kunhavigi la trovojn, kiujn mi faris solvante la problemon priskribitan komence. Kunhavigu kun tiuj, kiuj, kiel li, tute ne estas terura lupo en devopoj. Se miaj trovoj helpos almenaŭ iun, mi estos feliĉa.

fonto: www.habr.com

Aldoni komenton