Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Ամեն ինչ սկսվեց այն ժամանակ, երբ մեր ծրագրավորող թիմերից մեկի թիմի ղեկավարը խնդրեց մեզ փորձարկել իրենց նոր հավելվածը, որը նախօրեին տեղադրվել էր կոնտեյներով: Ես տեղադրել եմ այն: Մոտ 20 րոպե անց դիմումը թարմացնելու հարցում է ստացվել, քանի որ այնտեղ ավելացվել էր մի շատ անհրաժեշտ բան։ ես թարմացրի. Եվս մի երկու ժամ հետո... լավ, կարող եք կռահել, թե ինչ սկսվեց հետո...

Պետք է խոստովանեմ, որ ես բավականին ծույլ եմ (դա ավելի վաղ չէի խոստովանել, ոչ), և հաշվի առնելով այն փաստը, որ թիմի առաջատարները մուտք ունեն Jenkins, որտեղ մենք ունենք բոլոր CI/CD, ես մտածեցի. թող նա տեղակայվի որպես ինչքան ուզում է! Մի անեկդոտ հիշեցի. մարդուն ձուկ տուր, նա մի օր ուտի. մարդուն Ֆեդ անվանեք, և նա ամբողջ կյանքում կսնվի: Ու գնաց հնարքներ խաղալ աշխատանքի ընթացքում, որը կկարողանա տեղակայել ցանկացած հաջողությամբ կառուցված տարբերակի հավելված պարունակող կոնտեյներ Kuber-ում և ցանկացած արժեք փոխանցել դրան։ ENV (Պապս, բանասեր, անցյալում անգլերենի ուսուցիչ, այժմ մատը պտտեցնում էր իր քունքին և շատ արտահայտիչ նայում ինձ այս նախադասությունը կարդալուց հետո):

Այսպիսով, այս գրառման մեջ ես ձեզ կպատմեմ, թե ինչպես եմ ես սովորել.

  1. Jenkins-ում աշխատատեղերը դինամիկ կերպով թարմացրեք հենց աշխատանքից կամ այլ աշխատատեղերից.
  2. Միացեք ամպային կոնսոլին (Cloud shell) հանգույցից, որտեղ տեղադրված է Jenkins գործակալը.
  3. Տեղադրեք ծանրաբեռնվածությունը Google Kubernetes Engine-ում:


Իրականում ես, իհարկե, որոշ չափով անազնիվ եմ։ Ենթադրվում է, որ դուք ունեք Google ամպի ենթակառուցվածքի առնվազն մի մասը, և, հետևաբար, դուք դրա օգտատերն եք և, իհարկե, ունեք GCP հաշիվ: Բայց այս գրառման մասին չէ:

Սա իմ հաջորդ խաբեության թերթիկն է: Միայն մի դեպքում եմ ուզում գրել նման գրառումներ՝ ես բախվեցի խնդրի, ի սկզբանե չգիտեի, թե ինչպես լուծել այն, լուծումը պատրաստ չէր google-ում, ուստի մաս-մաս գուգլեցի և ի վերջո լուծեցի խնդիրը։ Եվ որպեսզի հետագայում, երբ մոռանամ, թե ինչպես եմ դա արել, ստիպված չլինեմ ամեն ինչ նորից գուգլել մաս առ մաս և միասին հավաքել, ես ինքս ինձ գրում եմ նման խաբեության թերթիկներ։

Ազատում պատասխանատվությունից: 1. Գրառումը գրված էր «ինքս ինձ համար», դերի համար լավագույն պրակտիկան չի կիրառվում. Ուրախ եմ կարդալու մեկնաբանություններում «ավելի լավ կլիներ դա անել այսպես» տարբերակները:
2. Եթե նոտայի կիրառական մասը համարվում է աղ, ապա, ինչպես իմ բոլոր նախորդ գրառումները, այս մեկն էլ թույլ աղի լուծույթ է։

Jenkins-ում աշխատանքի կարգավորումների դինամիկ թարմացում

Ես կանխատեսում եմ ձեր հարցը. ի՞նչ կապ ունի աշխատանքի դինամիկ թարմացումը դրա հետ: Ձեռքով մուտքագրեք լարային պարամետրի արժեքը և գնացեք:

Ես պատասխանում եմ. Ես իսկապես ծույլ եմ, չեմ սիրում, երբ նրանք բողոքում են. Միշա, տեղակայումը խափանում է, ամեն ինչ անհետացավ: Դուք սկսում եք փնտրել, և առաջադրանքների մեկնարկի որոշ պարամետրի արժեքի տառասխալ կա: Ուստի ես նախընտրում եմ ամեն ինչ անել հնարավորինս արդյունավետ։ Եթե ​​հնարավոր է կանխել օգտվողին ուղղակիորեն տվյալներ մուտքագրելուց՝ փոխարենը տալով ընտրության արժեքների ցուցակ, ապա ես կազմակերպում եմ ընտրությունը:

Պլանը հետևյալն է. մենք ստեղծում ենք աշխատանք Ջենքինսում, որում, նախքան գործարկումը, մենք կարող ենք ցուցակից ընտրել տարբերակ, նշել արժեքներ կոնտեյների միջոցով փոխանցված պարամետրերի համար: ENV, այնուհետև այն հավաքում է բեռնարկղը և այն մղում կոնտեյների ռեգիստր։ Այնուհետև այնտեղից տարան դուրս է բերվում խորանարդի մեջ աշխատանքային ծանրաբեռնվածություն աշխատանքում նշված պարամետրերով:

Ջենքինսում աշխատանք ստեղծելու և ստեղծելու գործընթացը չենք դիտարկի, սա թեմայից դուրս է։ Կենթադրենք, որ առաջադրանքը պատրաստ է։ Տարբերակներով թարմացված ցուցակն իրականացնելու համար մեզ անհրաժեշտ է երկու բան՝ գոյություն ունեցող սկզբնաղբյուրների ցուցակ՝ a priori վավեր տարբերակների համարներով և փոփոխական, ինչպիսին է. Ընտրության պարամետր առաջադրանքի մեջ։ Մեր օրինակում թող փոփոխականն անվանվի BUILD_VERSION, դրա վրա մանրամասն չենք անդրադառնա։ Բայց եկեք ավելի սերտ նայենք սկզբնաղբյուրների ցանկին:

Այդքան տարբերակներ չկան: Երկու բան անմիջապես մտքիս եկավ.

  • Օգտագործեք Remote Access API-ն, որն առաջարկում է Jenkins-ը իր օգտատերերին.
  • Հարցրեք հեռավոր պահոցի թղթապանակի բովանդակությունը (մեր դեպքում սա JFrog Artifactory-ն է, որը կարևոր չէ):

Jenkins Remote Access API

Ձեւավորված գերազանց ավանդույթի համաձայն՝ կնախընտրեի խուսափել երկարատև բացատրություններից։
Ես ինձ թույլ կտամ միայն առաջին պարբերության մի հատվածի ազատ թարգմանությունը API փաստաթղթերի առաջին էջը:

Jenkins-ը տրամադրում է API՝ մեքենայական ընթեռնելի հեռակա հասանելիության համար իր ֆունկցիոնալությանը: <…> Հեռակա հասանելիությունն առաջարկվում է REST-ի նմանությամբ: Սա նշանակում է, որ բոլոր հատկանիշների համար չկա մեկ մուտքի կետ, այլ URL, ինչպիսին է «.../api/«, որտեղ»...«նշանակում է այն օբյեկտը, որի վրա կիրառվում են API-ի հնարավորությունները:

Այլ կերպ ասած, եթե տեղակայման առաջադրանքը, որի մասին մենք ներկայումս խոսում ենք, հասանելի է http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, ապա այս առաջադրանքի API սուլիչները հասանելի են այստեղ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Հաջորդը, մենք ունենք ընտրություն, թե ինչ ձևով ստանալ արդյունքը: Եկեք կենտրոնանանք XML-ի վրա, քանի որ API-ն թույլ է տալիս զտել միայն այս դեպքում:

Եկեք պարզապես փորձենք ստանալ բոլոր առաջադրանքների ցուցակը: Մեզ հետաքրքրում է միայն ժողովի անվանումը (ցուցադրման անունը) և դրա արդյունքը (արդյունք):

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

Արդյոք այն մշակվել է:

Հիմա եկեք զտենք միայն այն վազքերը, որոնք ավարտվում են արդյունքով Հաջողություն. Եկեք օգտագործենք փաստարկը &բացառել և որպես պարամետր մենք դրան կփոխանցենք ուղին դեպի մի արժեք, որը հավասար չէ Հաջողություն. Այո այո. Կրկնակի բացասականը հայտարարություն է: Մենք բացառում ենք այն ամենը, ինչը մեզ չի հետաքրքրում.

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

Հաջողակների ցանկի սքրինշոթը
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Դե, պարզապես զվարճանալու համար, եկեք համոզվենք, որ ֆիլտրը մեզ չի խաբել (ֆիլտրերը երբեք չեն ստում) և ցուցադրել «անհաջող» ցուցակը.

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

Չհաջողվածների ցանկի սքրինշոթը
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Հեռավոր սերվերի թղթապանակից տարբերակների ցանկ

Գոյություն ունի տարբերակների ցանկը ստանալու երկրորդ միջոց: Ինձ այն ավելի շատ է դուր գալիս, քան Jenkins API-ին մուտք գործելը: Դե, քանի որ եթե հավելվածը հաջողությամբ ստեղծվել է, նշանակում է, որ այն փաթեթավորվել և տեղադրվել է պահեստում՝ համապատասխան թղթապանակում։ Հավանաբար, պահեստը հավելվածների աշխատանքային տարբերակների լռելյայն պահեստն է: Հավանել. Դե, եկեք հարցնենք նրան, թե ինչ տարբերակներ կան պահեստում: Մենք կծկենք, կծկենք և կփակենք հեռակառավարվող թղթապանակը: Եթե ​​ինչ-որ մեկին հետաքրքրում է oneliner-ը, ապա այն գտնվում է սփոյլերի տակ։

Մեկ տող հրաման
Խնդրում ենք նկատի ունենալ երկու բան. ես փոխանցում եմ կապի մանրամասները վերնագրում և ինձ պետք չեն թղթապանակից բոլոր տարբերակները, և ես ընտրում եմ միայն նրանք, որոնք ստեղծվել են մեկ ամսվա ընթացքում: Խմբագրեք հրամանը՝ ձեր իրականությանը և կարիքներին համապատասխան.

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

Ջենկինսում աշխատատեղերի և աշխատանքի կազմաձևման ֆայլի կարգավորում

Մենք պարզեցինք տարբերակների ցանկի աղբյուրը։ Եկեք այժմ ներառենք ստացված ցուցակը առաջադրանքի մեջ: Ինձ համար ակնհայտ լուծումը հավելվածի ստեղծման առաջադրանքում քայլ ավելացնելն էր: Այն քայլը, որը կկատարվեր, եթե արդյունքը լիներ «հաջողություն».

Բացեք հավաքման առաջադրանքի կարգավորումները և ոլորեք դեպի ներքև: Սեղմեք կոճակների վրա. Ավելացնել կառուցման քայլ -> Պայմանական քայլ (մեկ). Քայլի կարգավորումներում ընտրեք պայմանը Ընթացիկ կառուցման կարգավիճակը, սահմանեք արժեքը Հաջողություն, հաջողության դեպքում կատարվող գործողությունը Գործարկել shell հրամանը.

Իսկ հիմա զվարճալի մասը: Jenkins-ը պահում է աշխատանքի կոնֆիգուրացիաները ֆայլերում: XML ձևաչափով։ Ճանապարհին http://путь-до-задания/config.xml Համապատասխանաբար, կարող եք ներբեռնել կազմաձևման ֆայլը, անհրաժեշտության դեպքում խմբագրել այն և նորից տեղադրել այնտեղ, որտեղ այն ստացել եք:

Հիշեք, որ մենք վերևում պայմանավորվեցինք, որ մենք պարամետր կստեղծենք տարբերակների ցանկի համար BUILD_VERSION?

Եկեք ներբեռնենք կազմաձևման ֆայլը և նայենք դրա ներսում: Պարզապես համոզվելու համար, որ պարամետրը տեղում է և ցանկալի տեսակի է:

Սքրինշոթը սփոյլերի տակ։

Ձեր config.xml հատվածը պետք է նույն տեսքը ունենա: Բացառությամբ այն, որ դեռևս բացակայում է ընտրության տարրի բովանդակությունը
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Համոզված ես? Վերջ, եկեք գրենք սցենար, որը կկատարվի, եթե բիլդը հաջող լինի։
Սցենարը կստանա տարբերակների ցանկ, ներբեռնելու է կազմաձևման ֆայլը, դրա մեջ կգրի տարբերակների ցանկը մեզ անհրաժեշտ տեղում և այն նորից կտեղադրի: Այո՛։ Ճիշտ է. Գրեք XML-ի տարբերակների ցանկը այն տեղում, որտեղ արդեն կա տարբերակների ցանկ (կլինի ապագայում՝ սցենարի առաջին գործարկումից հետո): Ես գիտեմ, որ աշխարհում դեռևս կան կանոնավոր արտահայտությունների կատաղի երկրպագուներ: Ես նրանց չեմ պատկանում։ Խնդրում ենք տեղադրել xmlstarler դեպի այն սարքը, որտեղ կազմաձևը կխմբագրվի: Ինձ թվում է, որ սա այնքան էլ մեծ գին չէ sed-ի միջոցով XML խմբագրումից խուսափելու համար:

Սփոյլերի տակ ներկայացնում եմ վերը նշված հաջորդականությունն ամբողջությամբ կատարող կոդը։

Հեռավոր սերվերի թղթապանակից կազմաձևում գրեք տարբերակների ցանկ

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

Եթե ​​նախընտրում եք Jenkins-ից տարբերակներ ստանալու տարբերակը, և դուք նույնքան ծույլ եք, որքան ես, ապա սփոյլերի տակ նույն ծածկագիրն է, բայց ցուցակը Jenkins-ից.

Գրեք տարբերակների ցանկ Ջենքինսից մինչև կոնֆիգուրացիա
Պարզապես նկատի ունեցեք սա. իմ հավաքի անունը բաղկացած է հաջորդական համարից և տարբերակի համարից՝ բաժանված երկու կետով: Համապատասխանաբար, awk-ը կտրում է ավելորդ մասը։ Ինքներդ ձեզ համար փոխեք այս գիծը՝ ձեր կարիքներին համապատասխան:

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

Տեսականորեն, եթե դուք փորձարկել եք վերը նշված օրինակների հիման վրա գրված կոդը, ապա տեղակայման առաջադրանքում դուք արդեն պետք է ունենաք բացվող ցուցակ՝ տարբերակներով: Դա նման է սփոյլերի տակ գտնվող սքրինշոթին:

Ճիշտ լրացված տարբերակների ցանկը
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Եթե ​​ամեն ինչ աշխատեց, ապա պատճենեք-տեղադրեք սցենարը մեջ Գործարկել shell հրամանը և պահպանել փոփոխությունները:

Միացում Cloud shell-ին

Մենք ունենք կոլեկցիոներներ կոնտեյներով: Մենք օգտագործում ենք Ansible-ը որպես մեր հավելվածների առաքման գործիք և կազմաձևման կառավարիչ: Համապատասխանաբար, երբ խոսքը վերաբերում է կոնտեյներների կառուցմանը, երեք տարբերակ է առաջանում՝ տեղադրել Docker-ը Docker-ում, տեղադրել Docker-ը Ansible աշխատող մեքենայի վրա կամ կոնտեյներներ կառուցել ամպային վահանակում: Մենք պայմանավորվեցինք լռել Ջենքինսի համար նախատեսված հավելումների մասին այս հոդվածում: Հիշո՞ւմ ես:

Ես որոշեցի. լավ, քանի որ «արկղից դուրս» բեռնարկղերը կարող են հավաքվել ամպի վահանակում, ապա ինչու՞ անհանգստանալ: Մաքուր պահիր, չէ՞: Ես ուզում եմ հավաքել Jenkins-ի կոնտեյներները ամպի վահանակում, այնուհետև այնտեղից դրանք գործարկել խորանարդի մեջ: Ավելին, Google-ն իր ենթակառուցվածքում ունի շատ հարուստ ալիքներ, որոնք բարենպաստ ազդեցություն կունենան տեղակայման արագության վրա։

Ամպային վահանակին միանալու համար ձեզ հարկավոր է երկու բան. gcloud և մուտքի իրավունքներ Google Cloud API VM օրինակի համար, որի հետ այս նույն կապը կկատարվի:

Նրանց համար, ովքեր նախատեսում են միանալ ոչ թե Google-ի ամպից
Google-ը թույլ է տալիս իր ծառայություններում ինտերակտիվ թույլտվությունն անջատելու հնարավորությունը: Սա թույլ կտա միանալ կոնսոլին նույնիսկ սուրճի մեքենայից, եթե այն աշխատում է *nix-ով և ինքն ունի կոնսոլ:

Եթե ​​այս գրառման շրջանակներում այս խնդրին ավելի մանրամասն անդրադառնալու կարիք կա, գրեք մեկնաբանություններում։ Եթե ​​բավականաչափ ձայներ հավաքենք, ես թարմացում կգրեմ այս թեմայի վերաբերյալ:

Իրավունքներ տրամադրելու ամենահեշտ ձևը վեբ ինտերֆեյսի միջոցով է:

  1. Դադարեցրեք VM-ի օրինակը, որից դուք հետագայում միանալու եք ամպային վահանակին:
  2. Բացեք «Instance Details» և սեղմեք Ուղղել.
  3. Էջի հենց ներքևում ընտրեք օրինակի մուտքի շրջանակը Ամբողջական հասանելիություն բոլոր Cloud API-ներին.

    Screenshot
    Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

  4. Պահպանեք ձեր փոփոխությունները և գործարկեք օրինակը:

Երբ VM-ն ավարտի բեռնումը, միացեք դրան SSH-ի միջոցով և համոզվեք, որ կապը տեղի է ունենում առանց սխալի: Օգտագործեք հրամանը.

gcloud alpha cloud-shell ssh

Հաջող կապը մոտավորապես այսպիսի տեսք ունի
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Տեղադրել GKE-ում

Քանի որ մենք ամեն կերպ ձգտում ենք ամբողջությամբ անցնել IaC-ին (Ենթակառուցվածքը որպես կոդ), մեր դոկերի ֆայլերը պահվում են Git-ում։ Սա մի կողմից։ Իսկ kubernetes-ում տեղակայումը նկարագրվում է yaml ֆայլով, որն օգտագործվում է միայն այս առաջադրանքով, որն ինքնին նույնպես կոդի նման է։ Սա մյուս կողմից է։ Ընդհանուր առմամբ, ես նկատի ունեմ, որ պլանը հետևյալն է.

  1. Մենք վերցնում ենք փոփոխականների արժեքները BUILD_VERSION և, ըստ ցանկության, այն փոփոխականների արժեքները, որոնց միջով կանցնեն ENV.
  2. Ներբեռնեք dockerfile-ը Git-ից:
  3. Ստեղծեք yaml տեղակայման համար:
  4. Մենք վերբեռնում ենք այս երկու ֆայլերը scp-ի միջոցով ամպային վահանակ:
  5. Մենք այնտեղ կոնտեյներ ենք կառուցում և այն հրում Container ռեգիստր
  6. Մենք կիրառում ենք բեռի տեղակայման ֆայլը խորանարդի վրա:

Եկեք ավելի կոնկրետ լինենք. Մի անգամ մենք սկսեցինք խոսել ENV, ապա ենթադրենք, որ մենք պետք է փոխանցենք երկու պարամետրի արժեքները. PARAM1 и PARAM2. Մենք ավելացնում ենք դրանց առաջադրանքը տեղակայման համար, տիպ. Լարի պարամետր.

Screenshot
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Մենք կստեղծենք yaml պարզ վերահղումով կարոտել ներկայացնել. Ենթադրվում է, իհարկե, որ դուք ունեք ձեր dockerfile-ում PARAM1 и PARAM2որ բեռի անունը կլինի հիանալի հավելված, իսկ հավաքված կոնտեյները նշված տարբերակի կիրառմամբ գտնվում է Կոնտեյների ռեեստր ճանապարհին gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONՈրտեղ $BUILD_VERSION պարզապես ընտրվել է բացվող ցանկից:

Թիմի ցուցակում

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 գործակալը միացումից հետո օգտագործելով gcloud ալֆա cloud-shell ssh ինտերակտիվ ռեժիմը հասանելի չէ, ուստի մենք հրամաններ ենք ուղարկում ամպային վահանակին՝ օգտագործելով պարամետրը --հրաման.

Մենք մաքրում ենք ամպային վահանակի տնային թղթապանակը հին dockerfile-ից.

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

Տեղադրեք թարմ ներբեռնված dockerfile-ը ամպային վահանակի գլխավոր պանակում՝ օգտագործելով scp:

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

Մենք հավաքում, հատկորոշում և մղում ենք բեռնարկղը 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"

Մենք նույնն ենք անում տեղակայման ֆայլի հետ: Խնդրում ենք նկատի ունենալ, որ ստորև նշված հրամաններն օգտագործում են այն կլաստերի կեղծ անունները, որտեղ տեղի է ունենում տեղակայումը (awsm-կլաստեր) և նախագծի անվանումը (հիանալի-նախագիծ), որտեղ գտնվում է կլաստերը:

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"

Մենք գործարկում ենք առաջադրանքը, բացում ենք վահանակի ելքը և հույս ունենք տեսնել կոնտեյների հաջող հավաքումը:

Screenshot
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Եվ հետո հավաքված կոնտեյների հաջող տեղակայումը

Screenshot
Մենք ստեղծում ենք տեղակայման առաջադրանք GKE-ում առանց հավելումների, SMS-ի կամ գրանցման: Եկեք մի հայացք գցենք Ջենքինսի բաճկոնի տակից

Ես միտումնավոր անտեսեցի կարգավորումը Մուտք. Մեկ պարզ պատճառով՝ այն կարգավորելուց հետո աշխատանքային ծանրաբեռնվածություն տվյալ անունով, այն կմնա գործառնական, անկախ նրանից, թե այս անունով քանի տեղակայում եք կատարում: Դե, ընդհանուր առմամբ, սա մի փոքր դուրս է պատմության շրջանակներից։

Եզրակացությունների փոխարեն

Վերոհիշյալ բոլոր քայլերը, հավանաբար, չէին կարող կատարվել, այլ պարզապես տեղադրեցին որոշ պլագին Ջենկինսի համար՝ նրանց muuulion-ը: Բայց ինչ-ինչ պատճառներով ես չեմ սիրում պլագինները: Դե, ավելի ճիշտ, ես նրանց դիմում եմ միայն հուսահատությունից։

Եվ ես պարզապես սիրում եմ ինչ-որ նոր թեմա սկսել ինձ համար: Վերևի տեքստը նաև միջոց է կիսվելու այն բացահայտումներով, որոնք ես արել եմ հենց սկզբում նկարագրված խնդիրը լուծելիս: Կիսվեք նրանց հետ, ովքեր, ինչպես նա, ամենևին էլ սարսափելի գայլ չեն դևոպում: Եթե ​​իմ գտածոները գոնե մեկին օգնեն, ես երջանիկ կլինեմ:

Source: www.habr.com

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