Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Tuttu hà cuminciatu quandu u capu di a squadra di unu di i nostri squadre di sviluppu ci hà dumandatu di pruvà a so nova applicazione, chì era stata cuntainerizzata u ghjornu prima. L'aghju publicatu. Dopu à circa 20 minuti, una dumanda hè stata ricivuta per aghjurnà l'applicazione, perchè una cosa assai necessaria era stata aghjunta quì. Aghju rinnuvatu. Dopu à un paru d'ore ... bè, pudete indovinà ciò chì hà cuminciatu à succede dopu ...

Devu ricunnosce, sò abbastanza pigro (ùn aghju micca ammissu questu prima? No?), è datu u fattu chì i capi di squadra anu accessu à Jenkins, in quale avemu tutti i CI / CD, aghju pensatu: lasciatelo implementà cum'è quant'ellu vole ! Aghju ricurdatu di un scherzu: dà un omu un pesciu è manghjarà per un ghjornu ; chjamate una persona Fed è ellu serà Fed tutta a so vita. È andò ghjucà trucchi nantu à u travagliu, chì puderia implementà un cuntainer chì cuntene l'applicazione di qualsiasi versione custruita cù successu in Kuber è trasferisce qualsiasi valori à ellu. ENV (U mo missiavu, un filologu, un prufessore d'inglese in u passatu, avà girava u so dettu à u so tempiu è mi guardava assai espressivu dopu avè lettu sta frase).

Allora, in questa nota vi dicu cumu aghju amparatu:

  1. Aggiorna dinamicamente i travaglii in Jenkins da u travagliu stessu o da altri travaglii;
  2. Cunnette à a cunsola di nuvola (Cloud shell) da un node cù l'agente Jenkins installatu;
  3. Implementa a carica di travagliu in Google Kubernetes Engine.


In fatti, sò, sicuru, essendu un pocu disingenuous. Hè assumatu chì avete almenu una parte di l'infrastruttura in u nuvulu di Google, è, per quessa, site u so usu è, sicuru, avete un contu GCP. Ma ùn hè micca questu quì sta nota.

Questu hè u mo prossimu cheat sheet. Vogliu solu scrive tali note in un casu: aghju avutu affruntatu un prublema, inizialmente ùn sapia micca cumu per risolve, a suluzione ùn era micca googled ready-made, cusì l'aghju googled in parte è eventualmente risolviu u prublema. È cusì chì in u futuru, quandu mi scurdate di cumu l'aghju fattu, ùn aghju micca bisognu di google di novu pezzu per pezzu è cumpilà inseme, mi scrivu tali cheat sheets.

clausole: 1. A nota hè stata scritta "per mè stessu", per u rolu megliu pratica ùn si applica. Sò cuntentu di leghje l'opzioni "saria megliu per fà cusì" in i cumenti.
2. Se a parte applicata di a nota hè cunsiderata sali, allora, cum'è tutte e mo note previ, questu hè una suluzione debule di salitu.

Aggiornamentu dinamicu di e paràmetri di travagliu in Jenkins

Prevede a vostra dumanda: chì hà da fà l'aghjurnamentu dinamicu di u travagliu? Inserite u valore di u paràmetru di stringa manualmente è viate!

Rispondimi: Sò veramente pigro, ùn mi piace micca quandu si lamentanu: Misha, u dispiegamentu hè crashing, tuttu hè andatu! Cuminciate à circà, è ci hè un typo in u valore di qualchì paràmetru di lanciamentu di u travagliu. Per quessa, aghju preferitu à fà tuttu u più efficacemente pussibule. Se hè pussibule impedisce à l'utilizatore di inserisce dati direttamente dandu invece una lista di valori da sceglie, allora urganizeraghju a selezzione.

U pianu hè questu: creemu un travagliu in Jenkins, in quale, prima di lancià, pudemu selezziunà una versione da a lista, specificà i valori per i paràmetri passati à u cuntinuu via. ENV, poi raccoglie u cuntinuu è u spinge in u Registru di Container. Allora da quì u cuntinuu hè lanciatu in cuber as carica di travagliu cù i paràmetri specificati in u travagliu.

Ùn cunsideremu micca u prucessu di creazione è creazione di un travagliu in Jenkins, questu hè off-topic. Assumiremu chì u compitu hè prontu. Per implementà una lista aghjurnata cù versioni, avemu bisognu di duie cose: una lista di fonti esistenti cù numeri di versione validi a priori è una variabile cum'è Parametru di scelta in u compitu. In u nostru esempiu, chì a variàbbili esse chjamatu BUILD_VERSION, ùn avemu micca aspittà nantu à questu in dettagliu. Ma fighjemu un ochju più vicinu à a lista di fonti.

Ùn ci sò assai opzioni. Dui cose sò subitu in mente:

  • Aduprate l'API d'accessu Remote chì Jenkins offre à i so utilizatori;
  • Richiede u cuntenutu di u cartulare di repository remota (in u nostru casu questu hè JFrog Artifactory, chì ùn hè micca impurtante).

Jenkins Remote Access API

Sicondu a tradizione eccellente stabilita, preferiscu evità spiegazioni longu.
Mi permetteraghju solu una traduzzione libera di un pezzu di u primu paràgrafu prima pagina di documentazione API:

Jenkins furnisce una API per l'accessu remotu leggibile da a macchina à a so funziunalità. <…> L'accessu remotu hè offertu in un stile REST-like. Questu significa chì ùn ci hè micca un puntu d'entrata unicu à tutte e funzioni, ma invece un URL cum'è ".../api/", induve "..." significa l'ughjettu à quale sò applicate e capacità API.

In altri palori, se u compitu di implementazione di quale parlemu attualmente hè dispunibule http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, allura i fischi API per questa attività sò dispunibili à http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

In seguitu, avemu una scelta in quale forma riceve u output. Fighjemu nantu à XML, postu chì l'API permette solu filtru in questu casu.

Pruvemu solu di ottene una lista di tutti i travaglii. Ci interessa solu u nome di l'assemblea (displayName) è u so risultatu (risurtatu):

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

Ha travagliu?

Avà filtrà solu quelli scorri chì finiscinu cù u risultatu U SUCCESS. Utilizemu l'argumentu & escludi è cum'è un paràmetru avemu da passà u percorsu à un valore micca uguali à U SUCCESS. Iè Iè. Un doppiu negativu hè una dichjarazione. Escludemu tuttu ciò chì ùn ci interessa micca:

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

Screenshot di a lista di successu
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Ebbè, solu per divertimentu, assicuremu chì u filtru ùn ci hà micca ingannatu (i filtri ùn mentinu mai!) È affissà una lista di "senza successu":

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

Screenshot di a lista di quelli chì ùn anu micca successu
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Lista di versioni da un cartulare in un servitore remotu

Ci hè una seconda manera di ottene una lista di versioni. Mi piace ancu più di accede à l'API Jenkins. Ebbè, perchè se l'applicazione hè stata custruita cù successu, significa chì hè stata imballata è posta in u repository in u cartulare appropritatu. Cum'è, un repository hè u almacenamentu predeterminatu di versioni di travagliu di l'applicazioni. Cum'è. Ebbè, dumandemu à ellu quali versioni sò in almacenamiento. Curl, grep è awk u cartulare remota. Se qualchissia hè interessatu in u oneliner, allora hè sottu u spoiler.

Una linea di cumanda
Per piacè nutate duie cose: aghju passatu i dettagli di cunnessione in l'intestazione è ùn aghju micca bisognu di tutte e versioni da u cartulare, è selezziunate solu quelli chì sò stati creati in un mesi. Edite u cumandimu per adattà à e vostre realità è bisogni:

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

Configurazione di u travagliu è u schedariu di cunfigurazione di u travagliu in Jenkins

Avemu scupertu a fonte di a lista di versioni. Avà incorporemu a lista resultanti in u compitu. Per mè, a suluzione ovvia era di aghjunghje un passu in u compitu di creazione di l'applicazione. U passu chì saria eseguitu se u risultatu era "successu".

Aprite i paràmetri di l'assemblea è scorri finu à u fondu. Cliccate nant'à i buttoni: Aghjunghjite u passu di creazione -> Passu cundizionale (singulu). In i paràmetri di u passu, selezziunate a cundizione Statu di custruzzione attuale, stabilisce u valore U SUCCESS, l'azzione da esse realizatu se successu Eseguite u cumandamentu di shell.

È avà a parte divertente. Jenkins guarda e cunfigurazioni di u travagliu in i schedari. In u furmatu XML. À a strada http://путь-до-задания/config.xml In cunsiquenza, pudete scaricà u schedariu di cunfigurazione, edità cum'è necessariu è mette torna induve l'avete.

Ricurdativi, avemu accunsentutu sopra chì avemu da creà un paràmetru per a lista di versioni BUILD_VERSION?

Scaricate u schedariu di cunfigurazione è fate un ochju in ellu. Solu per assicurà chì u paràmetru hè in u locu è di u tipu desideratu.

Screenshot sottu spoiler.

U vostru frammentu di config.xml deve vede u listessu. Eccettu chì u cuntenutu di l'elementu di scelte sò mancanti ancu
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Sì sicuru? Hè questu, scrivemu un script chì serà eseguitu se a custruzione hè successu.
U script riceverà una lista di versioni, scaricate u schedariu di cunfigurazione, scrivite a lista di versioni in questu in u locu chì avemu bisognu, è poi rimette. Iè. Hè ghjusta. Scrivite una lista di versioni in XML in u locu induve ci hè digià una lista di versioni (sarà in u futuru, dopu à u primu lanciu di u script). Sò chì ci sò sempre feroci fan di l'espressioni regulare in u mondu. Ùn sò micca per elli. Per piacè stallà xmlstarler à a macchina induve a cunfigurazione serà editata. Mi pare chì questu ùn hè micca un prezzu cusì grande per pagà per evità di edità XML cù sed.

Sottu u spoiler, aghju prisentatu u codice chì eseguisce a sequenza sopra in a so sanu.

Scrivite una lista di versioni da un cartulare in u servitore remotu à a cunfigurazione

#!/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 preferite l'opzione di ottene versioni da Jenkins è site pigra cum'è mè, allora sottu u spoiler hè u listessu codice, ma una lista di Jenkins:

Scrivite una lista di versioni da Jenkins à a cunfigurazione
Basta à tene in mente: u mo nome di l'assemblea hè custituitu da un numeru di sequenza è un numeru di versione, separati da un colon. Dunque, awk taglia a parte innecessaria. Per sè stessu, cambia sta linea per adattà à i vostri bisogni.

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

In teoria, sè vo avete pruvatu u codice scrittu basatu annantu à l'esempii sopra, allora in u compitu di implementazione duvete digià avè una lista drop-down cù versioni. Hè cum'è in a screenshot sottu u spoiler.

Lista currettamente cumpletata di versioni
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Se tuttu hà travagliatu, allora copia-incollà u script in Eseguite u cumandamentu di shell è salvà i cambiamenti.

Cunnessione cù Cloud shell

Avemu cullettori in cuntenituri. Utilizemu Ansible cum'è u nostru strumentu di consegna di l'applicazioni è gestore di cunfigurazione. Dunque, quandu si tratta di custruisce cuntenituri, venenu in mente trè opzioni: installà Docker in Docker, installate Docker in una macchina chì esegue Ansible, o custruisce cuntenituri in una cunsola nuvola. Avemu accunsentutu à stà in silenziu annantu à i plugins per Jenkins in questu articulu. Ricurdativi?

Aghju decisu: bè, postu chì i cuntenituri "fora di a scatula" ponu esse cullati in a cunsola di nuvola, allora perchè disturbà? Mantenela pulita, nò? Vogliu cullà i cuntenituri di Jenkins in a cunsola di nuvola, è poi lancià in u cuberu da quì. Inoltre, Google hà canali assai ricchi in a so infrastruttura, chì avarà un effettu beneficu nantu à a velocità di implementazione.

Per cunnette à a cunsola nuvola, avete bisognu di duie cose: gcloud è diritti di accessu à API Google Cloud per l'istanza VM da quale sarà fatta sta stessa cunnessione.

Per quelli chì pensanu à cunnette micca da Google cloud in tuttu
Google permette a pussibilità di disattivà l'autorizazione interattiva in i so servizii. Questu permetterà di cunnette à a cunsola ancu da una macchina di caffè, s'ellu funziona * nix è hà una cunsola stessa.

S'ellu ci hè bisognu di mè per copre sta questione in più detail in u quadru di sta nota, scrivite in i cumenti. Se avemu abbastanza voti, scriveraghju un aghjurnamentu annantu à questu tema.

U modu più faciule per cuncede diritti hè attraversu l'interfaccia web.

  1. Arresta l'istanza VM da quale vi cunnetta dopu à a cunsola nuvola.
  2. Apertura Instance Details è cliccate calendario.
  3. À u fondu di a pagina, selezziunate u scopu di accessu à l'istanza Accessu cumpletu à tutte l'API Cloud.

    Screenshot
    Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

  4. Salvate i vostri cambiamenti è lanciate l'istanza.

Una volta chì a VM hà finitu di carica, cunnette cù SSH è assicuratevi chì a cunnessione si faci senza errore. Aduprà u cumandimu:

gcloud alpha cloud-shell ssh

Una cunnessione successu s'assumiglia à questu
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Implementa à GKE

Siccomu ci sforzemu in ogni modu pussibule di cambià cumplettamente à IaC (Infrastucture as a Code), i nostri schedarii docker sò almacenati in Git. Questu hè da una banda. E implementazione in kubernetes hè descritta da un schedariu yaml, chì hè utilizatu solu da questu compitu, chì ellu stessu hè ancu cum'è codice. Questu hè da l'altra parte. In generale, vogliu dì, u pianu hè questu:

  1. Pigliemu i valori di e variàbili BUILD_VERSION è, opzione, i valori di e variàbili chì saranu passati ENV.
  2. Scaricate u dockerfile da Git.
  3. Genera yaml per implementazione.
  4. Caricà i dui fugliali via scp à a cunsola di nuvola.
  5. Custruemu un containeru quì è u spingemu in u registru Container
  6. Applicamu u schedariu di implementazione di carica à u cuber.

Semu più specifichi. Una volta avemu cuminciatu à parlà ENV, allora supponi chì avemu bisognu di passà i valori di dui parametri: PARAM1 и PARAM2. Aghjunghjemu u so compitu per a implementazione, tipu - Parametru String.

Screenshot
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Generemu yaml cù una redirezzione simplice eccu à schedariu. Hè assumatu, sicuru, chì avete in u vostru dockerfile PARAM1 и PARAM2chì u nome di carica serà app fantastica, è u cuntinuu assemblatu cù l'applicazione di a versione specificata si trova in Registru di u containeru in strada gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONinduve $BUILD_VERSION hè statu ghjustu sceltu da u listinu drop-down.

Lista di a squadra

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

Agente Jenkins dopu a cunnessione cù l'usu gcloud alpha cloud-shell ssh U modu interattivu ùn hè micca dispunibule, cusì mandemu cumandamenti à a cunsola nuvola utilizendu u paràmetru --cumanda.

Pulitemu u cartulare di casa in a cunsola nuvola da u vechju dockerfile:

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

Pone u dockerfile appena scaricatu in u cartulare di casa di a cunsola nuvola cù scp:

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

Raccogliemu, tagghemu è spingemu u cuntainer à u registru Container:

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"

Facemu u listessu cù u schedariu di implementazione. Per piacè nutate chì i cumandamenti quì sottu utilizanu nomi fittizi di u cluster induve a implementazione si trova (awsm-cluster) è u nome di u prugettu (maravigghiusu prughjettu), induve si trova u cluster.

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"

Eseguimu u compitu, apre l'output di a cunsola è speremu di vede l'assemblea successu di u cuntinuu.

Screenshot
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

È dopu a implementazione successu di u containeru assemblatu

Screenshot
Creemu un compitu di implementazione in GKE senza plugins, SMS o registrazione. Fighjemu un ochju sottu a giacca di Jenkins

Aghju ignoratu deliberatamente u paràmetru Ingress. Per una ragione simplice: una volta chì l'avete stabilitu carica di travagliu cù un nome datu, fermarà operativu, ùn importa quante implementazioni cù stu nome fate. Eppo, in generale, questu hè un pocu fora di u scopu di a storia.

Invece di cunclusioni

Tutti i passi sopra probabilmente ùn anu pussutu esse fattu, ma simpricimenti installatu qualchì plugin per Jenkins, u so muuulion. Ma per una certa ragione ùn mi piace micca i plugins. Eppo, più precisamente, ricurdu à elli solu per disperazione.

È mi piace solu piglià qualchì novu tema per mè. U testu sopra hè ancu un modu per sparte i risultati chì aghju fattu mentre risolviu u prublema descrittu à u principiu. Sparte cù quelli chì, cum'è ellu, ùn sò micca in tuttu un lupu terribili in devops. Se i mo scuperte aiutanu almenu à qualchissia, seraghju cuntentu.

Source: www.habr.com

Add a comment