Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Yote ilianza wakati kiongozi wa timu ya mojawapo ya timu zetu za maendeleo alipotuomba tujaribu ombi lao jipya, ambalo lilikuwa limehifadhiwa siku iliyopita. Niliichapisha. Baada ya kama dakika 20, ombi lilipokelewa la kusasisha ombi, kwa sababu jambo la lazima sana lilikuwa limeongezwa hapo. Nilifanya upya. Baada ya saa kadhaa... vizuri, unaweza kukisia ni nini kilianza kutokea baadaye...

Lazima nikubali, mimi ni mvivu sana (sikukubali hii mapema? Hapana?), na kwa kuzingatia ukweli kwamba viongozi wa timu wanaweza kupata Jenkins, ambayo tunayo CI / CD zote, nilifikiria: wacha apeleke kama kiasi anachotaka! Nilikumbuka utani: mpe mtu samaki na atakula kwa siku; mpigie mtu Fed na atalishwa maisha yake yote. Na akaenda cheza hila kwenye kazi, ambayo itaweza kupeleka kontena iliyo na utumiaji wa toleo lolote lililojengwa kwa mafanikio kwenye Kuber na kuhamisha maadili yoyote kwake. ENV (babu yangu, mwanafilojia, mwalimu wa Kiingereza katika siku za nyuma, sasa angezungusha kidole chake kwenye hekalu lake na kunitazama kwa uwazi sana baada ya kusoma sentensi hii).

Kwa hivyo, katika maandishi haya nitakuambia jinsi nilivyojifunza:

  1. Sasisha kazi kwa nguvu katika Jenkins kutoka kwa kazi yenyewe au kutoka kwa kazi zingine;
  2. Unganisha kwenye koni ya wingu (ganda la wingu) kutoka kwa nodi iliyo na wakala wa Jenkins;
  3. Sambaza mzigo wa kazi kwa Injini ya Google Kubernetes.


Kwa kweli, mimi, bila shaka, kwa kiasi fulani ni mdanganyifu. Inachukuliwa kuwa una angalau sehemu ya miundombinu katika wingu la Google, na, kwa hiyo, wewe ni mtumiaji wake na, bila shaka, una akaunti ya GCP. Lakini hiyo sio kile barua hii inahusu.

Hii ni karatasi yangu inayofuata ya kudanganya. Ninataka tu kuandika maelezo kama haya katika kesi moja: nilikabiliwa na shida, mwanzoni sikujua jinsi ya kuisuluhisha, suluhisho halikuwekwa tayari kwa google, kwa hivyo niliitafuta kwa sehemu na mwishowe kutatua shida. Na ili katika siku zijazo, ninaposahau jinsi nilivyofanya, sihitaji google kila kitu tena kipande kwa kipande na kukusanya pamoja, ninaandika karatasi za kudanganya vile.

disclaimer: 1. Ujumbe uliandikwa "kwa ajili yangu", kwa ajili ya jukumu bora mazoezi haitumiki. Ninafurahi kusoma chaguzi "ingekuwa bora kuifanya kwa njia hii" kwenye maoni.
2. Ikiwa sehemu iliyotumiwa ya noti inachukuliwa kuwa chumvi, basi, kama maelezo yangu yote ya awali, hii ni suluhisho dhaifu la chumvi.

Inasasisha mipangilio ya kazi kwa nguvu katika Jenkins

Ninaona swali lako: kusasisha kazi kwa nguvu kunahusiana nini nayo? Ingiza thamani ya kigezo cha kamba wewe mwenyewe na uondoke!

Ninajibu: Mimi ni mvivu sana, siipendi wakati wanalalamika: Misha, kupelekwa kunaanguka, kila kitu kimekwenda! Unaanza kuangalia, na kuna typo katika thamani ya parameta ya uzinduzi wa kazi. Kwa hiyo, napendelea kufanya kila kitu kwa ufanisi iwezekanavyo. Ikiwezekana kumzuia mtumiaji kuingiza data moja kwa moja kwa kutoa badala yake orodha ya maadili ya kuchagua, basi ninapanga uteuzi.

Mpango ni huu: tunaunda kazi katika Jenkins, ambayo, kabla ya kuzindua, tunaweza kuchagua toleo kutoka kwenye orodha, taja maadili ya vigezo vilivyopitishwa kwenye chombo kupitia ENV, kisha hukusanya chombo na kukisukuma kwenye Usajili wa Kontena. Kisha kutoka hapo chombo kinazinduliwa katika cuber kama mzigo wa kazi na vigezo vilivyoainishwa kwenye kazi.

Hatutazingatia mchakato wa kuunda na kuanzisha kazi huko Jenkins, hii sio mada. Tutafikiri kwamba kazi iko tayari. Ili kutekeleza orodha iliyosasishwa iliyo na matoleo, tunahitaji vitu viwili: orodha iliyopo ya chanzo iliyo na nambari za toleo halali na kigezo kama hicho. Chaguo parameter katika kazi. Katika mfano wetu, acha variable itajwe BUILD_VERSION, hatutakaa juu yake kwa undani. Lakini hebu tuangalie kwa karibu orodha ya chanzo.

Hakuna chaguzi nyingi. Mambo mawili yalikuja akilini mara moja:

  • Tumia API ya ufikiaji wa Mbali ambayo Jenkins hutoa kwa watumiaji wake;
  • Omba yaliyomo kwenye folda ya kumbukumbu ya mbali (kwa upande wetu hii ni JFrog Artifactory, ambayo sio muhimu).

API ya ufikiaji wa Mbali ya Jenkins

Kulingana na mila bora iliyoanzishwa, ningependelea kuzuia maelezo marefu.
Nitajiruhusu tu tafsiri ya bure ya kipande cha aya ya kwanza ukurasa wa kwanza wa nyaraka za API:

Jenkins hutoa API kwa ufikiaji unaoweza kusomeka kwa mashine kwa utendakazi wake. <…> Ufikiaji wa mbali unatolewa kwa mtindo kama wa REST. Hii inamaanisha kuwa hakuna sehemu moja ya kuingia kwa huduma zote, lakini badala yake URL kama ".../api/", wapi"..." inamaanisha kitu ambacho uwezo wa API unatumika.

Kwa maneno mengine, ikiwa kazi ya kupeleka tunayozungumzia sasa inapatikana http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, kisha filimbi za API za kazi hii zinapatikana http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Ifuatayo, tunayo chaguo katika fomu gani ya kupokea pato. Wacha tuzingatie XML, kwani API inaruhusu kuchuja tu katika kesi hii.

Wacha tujaribu kupata orodha ya kazi zote. Tunavutiwa tu na jina la mkutano (displayName) na matokeo yake (kusababisha):

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

Imetokea?

Sasa hebu tuchuje zile runs ambazo huishia na matokeo SUCCESS. Hebu tumia hoja &ondoa na kama parameta tutaipitisha njia ya thamani isiyo sawa na SUCCESS. Ndiyo ndiyo. Hasi mbili ni kauli. Tunatenga kila kitu ambacho hakituvutii:

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

Picha ya skrini ya orodha ya waliofanikiwa
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Naam, kwa ajili ya kujifurahisha tu, hebu tuhakikishe kwamba kichujio hakikutudanganya (vichujio havidanganyi kamwe!) na onyesha orodha ya "zisizofanikiwa":

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

Picha ya skrini ya orodha ya wasiofanikiwa
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Orodha ya matoleo kutoka kwa folda kwenye seva ya mbali

Kuna njia ya pili ya kupata orodha ya matoleo. Ninaipenda hata zaidi ya kupata API ya Jenkins. Kweli, kwa sababu ikiwa programu ilijengwa kwa mafanikio, inamaanisha kuwa iliwekwa na kuwekwa kwenye ghala kwenye folda inayofaa. Kama, hazina ni uhifadhi chaguo-msingi wa matoleo ya kufanya kazi ya programu. Kama. Naam, hebu tumuulize ni matoleo gani yaliyo kwenye hifadhi. Tutakunja, grep na awk folda ya mbali. Ikiwa mtu yeyote ana nia ya oneliner, basi ni chini ya spoiler.

Amri ya mstari mmoja
Tafadhali kumbuka mambo mawili: Ninapitisha maelezo ya uunganisho kwenye kichwa na sihitaji matoleo yote kutoka kwenye folda, na ninachagua tu ambayo yaliundwa ndani ya mwezi. Hariri amri ili kuendana na hali halisi na mahitaji yako:

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

Kuweka kazi na faili ya usanidi wa kazi katika Jenkins

Tuligundua chanzo cha orodha ya matoleo. Hebu sasa tujumuishe orodha inayotokana na kazi. Kwangu, suluhisho dhahiri lilikuwa kuongeza hatua katika kazi ya ujenzi wa programu. Hatua ambayo ingetekelezwa ikiwa matokeo yalikuwa "mafanikio".

Fungua mipangilio ya kazi ya kusanyiko na usogeze hadi chini kabisa. Bofya kwenye vifungo: Ongeza hatua ya ujenzi -> Hatua ya Masharti (moja). Katika mipangilio ya hatua, chagua hali Hali ya sasa ya ujenzi, weka thamani SUCCESS, hatua ya kufanywa ikiwa imefanikiwa Endesha amri ya ganda.

Na sasa sehemu ya kufurahisha. Jenkins huhifadhi usanidi wa kazi katika faili. Katika muundo wa XML. Njiani http://ΠΏΡƒΡ‚ΡŒ-Π΄ΠΎ-задания/config.xml Ipasavyo, unaweza kupakua faili ya usanidi, kuihariri kama inavyohitajika na kuiweka mahali ulipoipata.

Kumbuka, tulikubaliana hapo juu kwamba tutaunda parameter kwa orodha ya matoleo BUILD_VERSION?

Wacha tupakue faili ya usanidi na tuangalie ndani yake. Ili tu kuhakikisha kuwa parameta iko mahali na ya aina inayotaka.

Picha ya skrini chini ya spoiler.

Kipande chako cha config.xml kinapaswa kuonekana sawa. Isipokuwa kwamba maudhui ya kipengele cha chaguo bado hayapo
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Una uhakika? Hiyo ndiyo yote, wacha tuandike hati ambayo itatekelezwa ikiwa ujenzi utafanikiwa.
Hati itapokea orodha ya matoleo, pakua faili ya usanidi, andika orodha ya matoleo ndani yake mahali tunapohitaji, na kisha uirudishe. Ndiyo. Hiyo ni sawa. Andika orodha ya matoleo katika XML mahali ambapo tayari kuna orodha ya matoleo (itakuwa katika siku zijazo, baada ya uzinduzi wa kwanza wa hati). Najua bado kuna mashabiki wakali wa maneno ya kawaida duniani. mimi si mali yao. Tafadhali sakinisha xmlstarler kwa mashine ambayo usanidi utahaririwa. Inaonekana kwangu kuwa hii sio bei kubwa kulipa ili kuzuia kuhariri XML kwa kutumia sed.

Chini ya mharibifu, ninawasilisha nambari ambayo hufanya mlolongo wa hapo juu kwa ukamilifu.

Andika orodha ya matoleo kutoka kwa folda kwenye seva ya mbali hadi usanidi

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

Ikiwa unapendelea chaguo la kupata matoleo kutoka kwa Jenkins na wewe ni mvivu kama mimi, basi chini ya mharibifu kuna nambari sawa, lakini orodha kutoka kwa Jenkins:

Andika orodha ya matoleo kutoka kwa Jenkins hadi usanidi
Kumbuka hili tu: jina langu la kusanyiko lina nambari ya mlolongo na nambari ya toleo, ikitenganishwa na koloni. Ipasavyo, awk hukata sehemu isiyo ya lazima. Kwa ajili yako mwenyewe, badilisha mstari huu ili kukidhi mahitaji yako.

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

Kwa nadharia, ikiwa umejaribu msimbo ulioandikwa kulingana na mifano hapo juu, basi katika kazi ya kupeleka unapaswa kuwa na orodha ya kushuka na matoleo. Ni kama kwenye picha ya skrini chini ya kiharibu.

Orodha iliyokamilishwa kwa usahihi ya matoleo
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Ikiwa kila kitu kilifanya kazi, basi nakala na ubandike hati ndani Endesha amri ya ganda na uhifadhi mabadiliko.

Inaunganisha kwenye shell ya Wingu

Tuna watoza kwenye vyombo. Tunatumia Ansible kama zana yetu ya uwasilishaji wa programu na msimamizi wa usanidi. Ipasavyo, linapokuja suala la vyombo vya ujenzi, chaguzi tatu huja akilini: kusakinisha Docker kwenye Docker, kusakinisha Docker kwenye mashine inayoendesha Ansible, au jenga vyombo kwenye koni ya wingu. Tulikubali kukaa kimya juu ya programu-jalizi za Jenkins katika nakala hii. Unakumbuka?

Niliamua: vizuri, kwa kuwa vyombo "nje ya boksi" vinaweza kukusanywa kwenye koni ya wingu, basi kwa nini ujisumbue? Weka safi, sawa? Ninataka kukusanya vyombo vya Jenkins kwenye koni ya wingu, na kisha kuzizindua kwenye mchemraba kutoka hapo. Zaidi ya hayo, Google ina njia tajiri sana ndani ya miundombinu yake, ambayo itakuwa na athari ya manufaa kwa kasi ya kupelekwa.

Ili kuunganisha kwenye koni ya wingu, unahitaji vitu viwili: gcloud na haki za kupata API ya Wingu la Google kwa mfano wa VM ambao unganisho hili hili litafanywa.

Kwa wale wanaopanga kuunganishwa sio kutoka kwa Google cloud hata kidogo
Google inaruhusu uwezekano wa kuzima idhini shirikishi katika huduma zake. Hii itawawezesha kuunganisha kwenye console hata kutoka kwa mashine ya kahawa, ikiwa inaendesha * nix na ina console yenyewe.

Ikiwa kuna haja ya mimi kufunika suala hili kwa undani zaidi ndani ya mfumo wa maelezo haya, andika kwenye maoni. Ikiwa tutapata kura za kutosha, nitaandika sasisho juu ya mada hii.

Njia rahisi zaidi ya kutoa haki ni kupitia kiolesura cha wavuti.

  1. Acha mfano wa VM ambao utaunganisha baadaye kwenye koni ya wingu.
  2. Fungua Maelezo ya Mfano na ubofye kurekebisha.
  3. Katika sehemu ya chini kabisa ya ukurasa, chagua upeo wa ufikiaji wa mfano Idhini kamili ya API zote za Wingu.

    Picha ya skrini
    Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

  4. Hifadhi mabadiliko yako na uanzishe mfano.

Mara tu VM imemaliza kupakia, unganisha nayo kupitia SSH na uhakikishe kuwa muunganisho unatokea bila hitilafu. Tumia amri:

gcloud alpha cloud-shell ssh

Muunganisho uliofanikiwa unaonekana kama hii
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Sambaza kwa GKE

Kwa kuwa tunajitahidi kwa kila njia iwezekanayo kubadili kabisa hadi IaC (Miundombinu kama Kanuni), faili zetu za docker zimehifadhiwa katika Git. Hii ni kwa upande mmoja. Na uwekaji katika kubernetes unaelezewa na faili ya yaml, ambayo hutumiwa tu na kazi hii, ambayo yenyewe pia ni kama msimbo. Hii ni kutoka upande wa pili. Kwa ujumla, ninamaanisha, mpango ni huu:

  1. Tunachukua maadili ya vigezo BUILD_VERSION na, kwa hiari, maadili ya vigezo ambavyo vitapitishwa ENV.
  2. Pakua faili ya docker kutoka Git.
  3. Tengeneza yaml kwa kupelekwa.
  4. Tunapakia faili hizi zote mbili kupitia scp kwenye kiweko cha wingu.
  5. Tunajenga chombo huko na kuisukuma kwenye Usajili wa Chombo
  6. Tunatumia faili ya kupeleka mzigo kwenye cuber.

Hebu tufafanue zaidi. Mara moja tulianza kuzungumza juu ENV, basi tuseme tunahitaji kupitisha maadili ya vigezo viwili: PARAM1 ΠΈ PARAM2. Tunaongeza kazi yao kwa kupelekwa, aina - Kigezo cha kamba.

Picha ya skrini
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Tutazalisha yaml kwa uelekezaji upya rahisi miss ya faili. Inachukuliwa, kwa kweli, unayo kwenye faili yako ya docker PARAM1 ΠΈ PARAM2kwamba jina la mzigo litakuwa programu nzuri, na kontena iliyokusanywa yenye matumizi ya toleo maalum iko ndani Usajili wa chombo njiani gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONAmbapo $BUILD_VERSION imechaguliwa hivi punde kutoka kwenye orodha kunjuzi.

Orodha ya timu

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 wakala baada ya kuunganisha kutumia gcloud alpha cloud-shell ssh hali ya maingiliano haipatikani, kwa hiyo tunatuma amri kwa console ya wingu kwa kutumia parameter --amri.

Tunasafisha folda ya nyumbani kwenye koni ya wingu kutoka kwa faili ya zamani ya docker:

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

Weka faili ya docker iliyopakuliwa hivi karibuni kwenye folda ya nyumbani ya koni ya wingu kwa kutumia scp:

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

Tunakusanya, kuweka lebo na kusukuma kontena kwenye sajili ya Kontena:

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"

Tunafanya vivyo hivyo na faili ya kupeleka. Tafadhali kumbuka kuwa amri zilizo hapa chini hutumia majina ya uwongo ya nguzo ambapo upelekaji hutokea (nguzo ya awsm) na jina la mradi (kushangaza-mradi), ambapo nguzo iko.

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"

Tunaendesha kazi, fungua pato la console na tunatarajia kuona mkusanyiko wa mafanikio wa chombo.

Picha ya skrini
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Na kisha kupelekwa kwa mafanikio ya chombo kilichokusanyika

Picha ya skrini
Tunaunda kazi ya kupeleka katika GKE bila programu-jalizi, SMS au usajili. Wacha tuangalie chini ya koti la Jenkins

Nilipuuza mpangilio huo kwa makusudi Ingress. Kwa sababu moja rahisi: mara tu unapoiweka mzigo wa kazi ikiwa na jina fulani, itasalia kufanya kazi, haijalishi ni idadi ngapi ya matumizi ukitumia jina hili. Kweli, kwa ujumla, hii ni zaidi ya upeo wa historia.

Badala ya hitimisho

Hatua zote hapo juu labda hazingeweza kufanywa, lakini ilisakinisha programu-jalizi fulani kwa Jenkins, muuulion yao. Lakini kwa sababu fulani sipendi programu-jalizi. Kweli, kwa usahihi zaidi, ninakimbilia kwao tu kwa kukata tamaa.

Na ninapenda tu kuchukua mada mpya kwa ajili yangu. Maandishi hapo juu pia ni njia ya kushiriki matokeo ambayo nilifanya wakati nikitatua shida iliyoelezewa mwanzoni. Shiriki na wale ambao, kama yeye, sio mbwa mwitu wa kutisha katika devops. Ikiwa matokeo yangu yatasaidia angalau mtu, nitafurahi.

Chanzo: mapenzi.com

Kuongeza maoni