Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

It begon allegear doe't de teamlieder fan ien fan ús ûntwikkelingsteams ús frege om har nije applikaasje te testen, dy't de dei derfoar kontenerearre wie. Ik haw it pleatst. Nei sa'n 20 minuten kaam der in fersyk om de applikaasje te aktualisearjen, om't dêr in heul needsaaklik ding by kaam wie. Ik fernijde. Nei noch in pear oeren... no, jim kinne riede wat dernei begûn te barren...

Ik moat tajaan, ik bin frij lui (hie ik dit net earder tajûn? Nee?), en sjoen it feit dat teamlieders tagong hawwe ta Jenkins, wêryn wy allegear CI/CD hawwe, tocht ik: lit him ynsette as safolle as hy wol! Ik tocht oan in grapke: jou in man in fisk en hy sil in dei ite; neam in persoan Fed en hy sil syn hiele libben Fed wurde. En gie boartsje trúkjes op 'e baan, dy't in kontener soe kinne ynsette mei de tapassing fan elke mei súkses boude ferzje yn Kuber en alle wearden dernei oerdrage ENV (myn pake, in filolooch, in learaar Ingelsk yn it ferline, soe no syn finger nei syn timpel draaie en my tige ekspressyf oansjen nei it lêzen fan dizze sin).

Dat, yn dizze notysje sil ik jo fertelle hoe't ik learde:

  1. Dynamysk update banen yn Jenkins út de baan sels of fan oare banen;
  2. Ferbine mei de wolk konsole (Cloud shell) fan in knooppunt mei de Jenkins agint ynstallearre;
  3. Ynsette wurkdruk nei Google Kubernetes Engine.


Eins bin ik fansels wat ûngeunstich. Der wurdt oannommen dat jo op syn minst in diel fan 'e ynfrastruktuer hawwe yn' e Google-wolk, en dêrom binne jo syn brûker en, fansels, jo hawwe in GCP-akkount. Mar dêr giet dizze notysje net oer.

Dit is myn folgjende cheat sheet. Soksoarte notysjes wol ik mar yn ien gefal skriuwe: ik stie foar in probleem, ik wist ynearsten net hoe’t ik it oplosse moast, de oplossing waard net ready-made googled, dat ik googele it yn dielen en lost it probleem úteinlik op. En sadat ik yn 'e takomst, as ik ferjit hoe't ik it dien haw, net alles nochris stik foar stik hoech te googlejen en tegearre te kompilearjen, skriuw ik mysels sokke cheat sheets.

Disclaimer: 1. De notysje waard skreaun "foar mysels", foar de rol bêste praktyk net fan tapassing. Ik bin bliid om de opsjes "it soe better west hawwe om it op dizze manier te dwaan" yn 'e opmerkings te lêzen.
2. As it tapaste diel fan 'e notysje as sâlt beskôge wurdt, dan is dit, lykas al myn foarige notysjes, in swak sâltoplossing.

Dynamysk bywurkjen fan baanynstellingen yn Jenkins

Ik foarsjoch jo fraach: wat hat dynamyske baanfernijing dêrmei te krijen? Fier de wearde fan 'e tekenrige parameter manuell yn en gean fuort!

Ik antwurdzje: ik bin echt lui, ik hâld der net fan as se kleie: Misha, de ynset falt, alles is fuort! Jo begjinne te sykjen, en d'r is in typflater yn 'e wearde fan guon taakstartparameter. Dêrom doch ik leaver alles sa effisjint mooglik te dwaan. As it mooglik is om te foarkommen dat de brûker gegevens direkt ynfiere troch ynstee in list mei wearden te jaan om út te kiezen, dan organisearje ik de seleksje.

It plan is dit: wy meitsje in baan yn Jenkins, wêryn wy foar it lansearjen in ferzje út 'e list kinne selektearje, wearden oantsjutte foar parameters dy't trochjûn binne oan 'e kontener fia ENV, dan sammelet it de kontener en triuwt it yn it Container Registry. Dan fan dêrút de kontener wurdt lansearre yn cuber as wurkdruk mei de parameters oantsjutte yn 'e baan.

Wy sille it proses fan it meitsjen en opsetten fan in baan yn Jenkins net beskôgje, dit is off-topic. Wy sille oannimme dat de taak klear is. Om in bywurke list mei ferzjes út te fieren, hawwe wy twa dingen nedich: in besteande boarnelist mei a priori jildige ferzjenûmers en in fariabele lykas Keuze parameter yn 'e taak. Lit yn ús foarbyld de fariabele wurde neamd BUILD_VERSJON, wy sille der net yn detail op dwaen. Mar lit ús de boarnelist fan tichterby besjen.

D'r binne net safolle opsjes. Twa dingen kamen fuort yn 't sin:

  • Brûk de Remote Access API dy't Jenkins oan har brûkers biedt;
  • Freegje de ynhâld fan 'e map op ôfstân repository (yn ús gefal is dit JFrog Artifactory, wat net wichtich is).

Jenkins Remote tagong API

Neffens de fêststelde treflike tradysje wol ik leaver langere útlis mije.
Ik sil my mar in frije oersetting tastean fan in stik fan de earste alinea earste side fan API dokumintaasje:

Jenkins leveret in API foar tagong op ôfstân fan masine-lêsbere tagong ta syn funksjonaliteit. <…> Tagong op ôfstân wurdt oanbean yn in REST-like styl. Dit betsjut dat d'r gjin inkeld yngongspunt is foar alle funksjes, mar ynstee in URL lykas ".../api/", Wêr"..." betsjut it objekt wêrop de API-mooglikheden wurde tapast.

Mei oare wurden, as de ynsetstaak wêr't wy op it stuit oer prate is beskikber by http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, dan binne de API-fluiten foar dizze taak beskikber by http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Dêrnei hawwe wy in kar yn hokker foarm de útfier te ûntfangen. Litte wy rjochtsje op XML, om't de API allinich filterjen yn dit gefal lit.

Litte wy gewoan besykje in list te krijen fan alle wurksumheden. Wy binne allinnich ynteressearre yn de namme fan de gearkomste (displayName) en it resultaat (resultaat):

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

It kaam út?

Litte wy no allinich de runen filterje dy't einigje mei it resultaat SUKSES. Lit ús it argumint brûke &útslute en as parameter sille wy it paad trochjaan nei in wearde net gelyk oan SUKSES. Ja Ja. In dûbele negatyf is in ferklearring. Wy slúte alles út dat ús net ynteressearret:

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

Skermprint fan 'e list fan suksesfolle
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

No, gewoan foar de wille, litte wy derfoar soargje dat it filter ús net ferrifele (filters lizze noait!)

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

Skermprint fan 'e list mei net-suksesfolle
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

List mei ferzjes fan in map op in tsjinner op ôfstân

D'r is in twadde manier om in list mei ferzjes te krijen. Ik fyn it noch mear as tagong ta de Jenkins API. No, om't as de applikaasje mei sukses boud is, betsjuttet it dat it yn 'e repository yn' e passende map is ynpakt en pleatst. Lykas, in repository is de standert opslach fan wurkferzjes fan applikaasjes. Lykas. No, lit ús him freegje hokker ferzjes yn opslach binne. Wy sille curl, grep en awk de remote map. As immen ynteressearre is yn 'e oneliner, dan is it ûnder de spoiler.

Ien rigel kommando
Tink derom twa dingen: ik pass de ferbiningsdetails yn 'e koptekst en ik haw net alle ferzjes fan' e map nedich, en ik selektearje allinich dejingen dy't binnen in moanne binne makke. Bewurkje it kommando om oan jo realiteiten en behoeften te passen:

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

It opsetten fan banen en baankonfiguraasjetriem yn Jenkins

Wy hawwe de boarne fan 'e list mei ferzjes útfûn. Litte wy no de resultearjende list opnimme yn 'e taak. Foar my wie de foar de hân lizzende oplossing om in stap ta te foegjen yn 'e taak foar it bouwen fan applikaasjes. De stap dy't soe wurde útfierd as it resultaat "súkses" wie.

Iepenje de ynstellings foar montagetaak en rôlje nei ûnderen. Klikje op de knoppen: Bouwstap taheakje -> Betingststap (ienkel). Yn de stap ynstellings, selektearje de betingst Aktuele bouwstatus, set de wearde yn SUKSES, de aksje dy't útfierd wurde moat as suksesfol Run shell kommando.

En no it leuke diel. Jenkins bewarret baankonfiguraasjes yn bestannen. Yn XML-formaat. Geandewei http://путь-до-задания/config.xml Dêrtroch kinne jo it konfiguraasjebestân downloade, it as nedich bewurkje en it werom sette wêr't jo it krigen hawwe.

Unthâld, wy hawwe hjirboppe ôfpraat dat wy in parameter sille meitsje foar de list mei ferzjes BUILD_VERSJON?

Litte wy it konfiguraasjebestân downloade en deryn sjen. Krekt om der wis fan dat de parameter is yn plak en fan it winske type.

Skermprint ûnder spoiler.

Jo config.xml-fragmint moat der itselde útsjen. Utsein dat de ynhâld fan it karren elemint noch ûntbrekt
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

Bisto wis? Dat is it, litte wy in skript skriuwe dat sil wurde útfierd as de bou suksesfol is.
It skript sil in list mei ferzjes ûntfange, it konfiguraasjetriem downloade, de list mei ferzjes deryn skriuwe op it plak dat wy nedich binne, en set it dan werom. Ja. Dat kloppet. Skriuw in list mei ferzjes yn XML op it plak dêr't al in list mei ferzjes is (sil yn 'e takomst wêze, nei de earste lansearring fan it skript). Ik wit dat d'r noch fûle fans binne fan reguliere útdrukkingen yn 'e wrâld. Ik hear net by harren. Ynstallearje asjebleaft xmlstarler nei de masine wêr't de konfiguraasje sil wurde bewurke. It liket my dat dit net sa'n grutte priis is om te beteljen om foar te kommen dat XML bewurkje mei sed.

Under de spoiler presintearje ik de koade dy't de boppesteande folchoarder yn syn gehiel útfiert.

Skriuw in list mei ferzjes fan in map op de tsjinner op ôfstân nei de konfiguraasje

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

As jo ​​​​de opsje leaver hawwe om ferzjes fan Jenkins te krijen en jo binne sa lui as my, dan is ûnder de spoiler deselde koade, mar in list fan Jenkins:

Skriuw in list mei ferzjes fan Jenkins nei de konfiguraasje
Hâld dit mar yn gedachten: myn gearkomstenamme bestiet út in folchoardernûmer en in ferzjenûmer, skieden troch in kolon. Dêrtroch snijt awk it ûnnedige diel ôf. Feroarje foar josels dizze line om oan jo behoeften te passen.

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

Yn teory, as jo de koade skreaun hawwe hifke op basis fan 'e boppesteande foarbylden, dan moatte jo yn' e ynsettaak al in dellûklist hawwe mei ferzjes. It is lykas yn 'e skermprint ûnder de spoiler.

Korrekt foltôge list mei ferzjes
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

As alles wurke, kopiearje dan it skript yn Run shell kommando en bewarje feroarings.

Ferbine mei Cloud shell

Wy hawwe samlers yn konteners. Wy brûke Ansible as ús ark foar levering fan applikaasjes en konfiguraasjebehearder. As it giet om it bouwen fan konteners, komme dan trije opsjes yn 't sin: Docker ynstallearje yn Docker, Docker ynstallearje op in masine dy't Ansible draait, of konteners bouwe yn in wolkkonsole. Wy hawwe ôfpraat om stil te bliuwen oer plugins foar Jenkins yn dit artikel. Unthâld?

Ik besleat: goed, om't konteners "út 'e doaze" kinne wurde sammele yn 'e wolkkonsole, wêrom dan lestich falle? Hâld it skjin, krekt? Ik wol Jenkins-konteners sammelje yn 'e wolkkonsole, en dan lansearje se dêrwei yn' e kuber. Boppedat hat Google heul rike kanalen binnen har ynfrastruktuer, dy't in foardielich effekt hawwe op 'e snelheid fan ynset.

Om te ferbinen mei de wolkkonsole, hawwe jo twa dingen nedich: gcloud en tagongsrjochten ta Google Cloud API foar de VM-eksimplaar wêrmei deselde ferbining makke wurde sil.

Foar dyjingen dy't fan plan binne te ferbinen hielendal net fan Google Cloud
Google lit de mooglikheid om ynteraktive autorisaasje út te skeakeljen yn har tsjinsten. Dit sil tastean jo te ferbinen mei de konsole sels út in kofje masine, as it rint * nix en hat in konsole sels.

As d'r ferlet is foar my om dit probleem yn mear detail te dekken yn it ramt fan dizze notysje, skriuw dan yn 'e kommentaren. As wy genôch stimmen krije, skriuw ik in update oer dit ûnderwerp.

De maklikste manier om rjochten te jaan is fia de webynterface.

  1. Stopje de VM-eksimplaar wêrfan jo dêrnei ferbine mei de wolkkonsole.
  2. Iepenje Instance Details en klikje amend.
  3. Selektearje oan 'e ûnderkant fan' e side it berik fan 'e eksimplaar tagong Folsleine tagong ta alle Cloud API's.

    Skermprint
    Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

  4. Bewarje jo wizigingen en start it eksimplaar.

Sadree't de VM is foltôge mei laden, ferbine mei har fia SSH en soargje derfoar dat de ferbining foarkomt sûnder in flater. Brûk it kommando:

gcloud alpha cloud-shell ssh

In suksesfolle ferbining sjocht der sa út
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

Ynsette nei GKE

Om't wy op alle mooglike manieren stribje om folslein oer te skeakeljen nei IaC (ynfrastruktuer as koade), wurde ús dockerfiles opslein yn Git. Dit is oan 'e iene kant. En ynset yn kubernetes wurdt beskreaun troch in yaml-bestân, dy't allinich brûkt wurdt troch dizze taak, dy't sels ek as koade is. Dit is fan 'e oare kant. Yn 't algemien bedoel ik, it plan is dit:

  1. Wy nimme de wearden fan 'e fariabelen BUILD_VERSJON en, opsjoneel, de wearden fan 'e fariabelen dy't sille wurde trochjûn ENV.
  2. Download de dockerfile fan Git.
  3. Generearje yaml foar ynset.
  4. Wy uploade dizze beide bestannen fia scp nei de wolkkonsole.
  5. Wy bouwe dêr in kontener en triuwe it yn it kontenerregister
  6. Wy tapasse it load-ynsetbestân oan 'e cuber.

Litte wy mear spesifyk wêze. Sadree't wy begûn te praten oer ENV, stel dan dat wy de wearden fan twa parameters moatte trochjaan: PARAM1 и PARAM2. Wy foegje har taak ta foar ynset, type - String parameter.

Skermprint
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

Wy sille yaml generearje mei in ienfâldige omlieding echo opslaan. Der wurdt fansels oannommen dat jo yn jo dockerfile hawwe PARAM1 и PARAM2dat de lading namme sil wêze awesomeapp, en de gearstalde kontener mei de tapassing fan 'e oantsjutte ferzje leit yn Container registraasje ûnderweis gcr.io/awesomeapp/awesomeapp-$BUILD_VERSJONwêr $BUILD_VERSJON waard krekt selektearre út de dellûk list.

Teamlisting

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 agent nei ferbining mei help gcloud alpha cloud-shell ssh ynteraktive modus is net beskikber, dus stjoere wy kommando's nei de wolkkonsole mei de parameter --befel.

Wy skjinmeitsje de thúsmap yn 'e wolkkonsole fan it âlde dockerfile:

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

Pleats it nij ynladen dockerfile yn 'e thúsmap fan' e wolkkonsole mei scp:

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

Wy sammelje, taggje en triuwe de kontener nei it kontenerregister:

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"

Wy dogge itselde mei it ynsetbestân. Tink derom dat de kommando's hjirûnder fiktive nammen brûke fan it kluster wêr't de ynset foarkomt (awsm-kluster) en projektnamme (geweldich projekt), wêr't it kluster leit.

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"

Wy rinne de taak, iepenje de konsole-útfier en hoopje de suksesfolle gearstalling fan 'e kontener te sjen.

Skermprint
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

En dan de suksesfolle ynset fan 'e gearstalde kontener

Skermprint
Wy meitsje in ynset taak yn GKE sûnder plugins, SMS of registraasje. Litte wy efkes ûnder de jas fan Jenkins sjen

Ik negearre bewust de ynstelling Ingress. Om ien ienfâldige reden: as jo it ienris ynsteld hawwe wurkdruk mei in opjûne namme, it sil bliuwe operasjoneel, gjin saak hoefolle ynset mei dizze namme jo útfiere. No, yn 't algemien is dit in bytsje bûten it berik fan' e skiednis.

Yn plak fan konklúzjes

Alle boppesteande stappen koenen wierskynlik net dien wurde, mar gewoan wat plugin ynstalleare foar Jenkins, har muuulion. Mar om ien of oare reden hâld ik net fan plugins. No, mear krekter, ik ta harren allinne út wanhoop ta.

En ik wol gewoan wat nij ûnderwerp foar my ophelje. De boppesteande tekst is ek in manier om de befinings te dielen dy't ik makke by it oplossen fan it probleem beskreaun oan it begjin. Diele mei dejingen dy't, lykas hy, hielendal net in skriklike wolf binne yn devops. As myn befiningen op syn minst ien helpe, sil ik bliid wêze.

Boarne: www.habr.com

Add a comment