Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Манай хөгжүүлэлтийн багуудын нэг багийн ахлагч биднээс өмнөх өдөр нь саванд хийсэн шинэ програмаа туршихыг хүссэнээр бүх зүйл эхэлсэн. Би үүнийг нийтэлсэн. 20 орчим минутын дараа програмыг шинэчлэх хүсэлт ирсэн, учир нь тэнд маш хэрэгтэй зүйл нэмэгдсэн байна. би шинэчилсэн. Дахиад хоёр цагийн дараа... дараа нь юу болсныг та таах болно...

Би хүлээн зөвшөөрөх ёстой, би нэлээд залхуу байна (би үүнийг өмнө нь хүлээн зөвшөөрөөгүй гэж үү? Үгүй юу?) ба багийн удирдагчид бидэнд бүх CI/CD-тэй Jenkins-д хандах боломжтой гэдгийг харгалзан үзээд би түүнийг өөрчилье гэж бодсон. түүний хүссэнээр! Би нэг онигоог санав: хүнд загас өг, тэр нэг өдрийн турш идэх болно; Хүнийг Fed гэж дууд, тэр бүх насаараа хооллох болно. Тэгээд явлаа ажил дээрээ заль мэх тоглох, ямар ч амжилттай баригдсан хувилбарын програмыг агуулсан контейнерийг Kuber-д байрлуулж, түүнд ямар ч утгыг шилжүүлэх боломжтой. ENV (Манай өвөө, өмнө нь филологич, англи хэлний багш байсан, одоо энэ өгүүлбэрийг уншсаны дараа сүм рүүгээ хуруугаа эргүүлж, над руу маш тод хардаг байсан).

Тиймээс, энэ тэмдэглэлд би хэрхэн сурснаа танд хэлэх болно.

  1. Женкинс дэх ажлын байрыг өөрөө эсвэл өөр ажлын байрнаас динамикаар шинэчлэх;
  2. Jenkins агент суулгасан зангилаанаас үүлэн консолд (Cloud shell) холбогдох;
  3. Google Kubernetes Engine-д ажлын ачааллыг байршуулах.


Ер нь мэдээжийн хэрэг, би бага зэрэг шударга бус хандаж байна. Та Google үүлэн дэх дэд бүтцийн дор хаяж нэг хэсэгтэй гэж үздэг тул та түүний хэрэглэгч бөгөөд мэдээжийн хэрэг та GCP данстай. Гэхдээ энэ тэмдэглэлийн тухай биш юм.

Энэ бол миний дараагийн хууран мэхлэх хуудас юм. Би ийм тэмдэглэлүүдийг зөвхөн нэг л тохиолдлоор бичихийг хүсч байна: Би асуудалтай тулгарсан, би үүнийг хэрхэн шийдвэрлэхээ мэдэхгүй байсан, шийдэл нь бэлэн google-д ороогүй байсан тул би үүнийг хэсэг хэсгээр нь google-ээр хайж, эцэст нь асуудлыг шийдсэн. Ирээдүйд би үүнийг хэрхэн хийснээ мартсан үедээ бүгдийг дахин хэсэг хэсгээр нь google-ээс хайж, хамтдаа эмхэтгэх шаардлагагүй тул би өөрөө ийм хууран мэхлэх хуудас бичдэг.

Disclaimer: 1. Тэмдэглэлийг “өөртөө зориулж”, дүрд зориулж бичсэн шилдэг туршлага хамаарахгүй. Сэтгэгдэл дээрх "ингэж хийсэн нь дээр байх байсан" гэсэн сонголтыг уншсандаа баяртай байна.
2. Хэрэв тэмдэглэлийн түрхсэн хэсгийг давс гэж үзвэл миний өмнөх тэмдэглэлүүдийн нэгэн адил энэ нь сул давсны уусмал юм.

Женкинс дэх ажлын тохиргоог динамикаар шинэчилж байна

Би таны асуултыг урьдчилан харж байна: ажлын динамик шинэчлэлт нь үүнтэй ямар холбоотой вэ? Мөрийн параметрийн утгыг гараар оруулаад унтраа!

Би хариулав: Би үнэхээр залхуу байна, тэд гомдоллоход би дургүй: Миша, байршуулалт гацаж байна, бүх зүйл алга болсон! Та хайж эхлэх бөгөөд ажил эхлүүлэх параметрийн утгад үсгийн алдаа байна. Тиймээс би бүх зүйлийг аль болох үр дүнтэй хийхийг илүүд үздэг. Хэрэв та сонгох утгуудын жагсаалтыг өгөх замаар хэрэглэгчийг шууд өгөгдөл оруулахаас урьдчилан сэргийлэх боломжтой бол би сонголтыг зохион байгуулдаг.

Төлөвлөгөө бол: бид Женкинс дэх ажлын байрыг бий болгож, үүнийг эхлүүлэхийн өмнө жагсаалтаас хувилбарыг сонгож, контейнерт дамжуулсан параметрүүдийн утгыг зааж өгч болно. ENV, дараа нь энэ нь савыг цуглуулж, Контейнерийн бүртгэл рүү түлхэнэ. Дараа нь тэндээс савыг куб хэлбэрээр эхлүүлнэ ажлын ачаалал ажилд заасан параметрүүдтэй.

Бид Женкинст ажлын байр бий болгох, бий болгох үйл явцыг авч үзэхгүй, энэ бол сэдвээс гадуур юм. Даалгавар бэлэн болсон гэж бид таамаглах болно. Хувилбартай шинэчлэгдсэн жагсаалтыг хэрэгжүүлэхийн тулд бидэнд хоёр зүйл хэрэгтэй: априори хүчинтэй хувилбарын дугаар бүхий одоо байгаа эх сурвалжийн жагсаалт болон хувьсагч гэх мэт. Сонголт параметр даалгаварт. Бидний жишээнд хувьсагчийг нэрлэе BUILD_VERSION, бид энэ талаар дэлгэрэнгүй ярихгүй. Гэхдээ эх сурвалжийн жагсаалтыг нарийвчлан авч үзье.

Тийм олон сонголт байхгүй. Тэр даруй хоёр зүйл санаанд оров:

  • Женкинсийн хэрэглэгчиддээ санал болгож буй Remote access API-г ашиглах;
  • Алсын нөөцийн хавтасны агуулгыг хүсэх (бидний тохиолдолд энэ нь JFrog Artifactory бөгөөд энэ нь чухал биш юм).

Jenkins Remote access API

Тогтсон гайхалтай уламжлалын дагуу би урт тайлбараас зайлсхийхийг илүүд үздэг.
Би зөвхөн эхний догол мөрийн хэсгийг үнэгүй орчуулахыг зөвшөөрнө API баримт бичгийн эхний хуудас:

Женкинс нь түүний функцийг алсаас машин унших боломжтой 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/

Дараа нь бид гаралтыг ямар хэлбэрээр хүлээн авахыг сонгох болно. API нь зөвхөн энэ тохиолдолд шүүхийг зөвшөөрдөг тул XML дээр анхаарлаа хандуулцгаая.

Бүх ажлын жагсаалтыг гаргахыг хичээцгээе. Бид зөвхөн чуулганы нэрийг сонирхож байна (харагдах нэр) ба түүний үр дүн (үр дүн):

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

Болсон уу?

Одоо зөвхөн үр дүнд хүрсэн гүйлтүүдийг шүүж үзье SUCCESS. Аргументыг ашиглацгаая &хасах параметрийн хувьд бид үүнийг тэнцүү биш утга руу шилжүүлэх болно SUCCESS. Тийм тийм. Давхар сөрөг нь мэдэгдэл юм. Бид сонирхдоггүй бүх зүйлийг хасдаг:

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

Амжилтанд хүрсэн жагсаалтын дэлгэцийн агшин
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Зүгээр л хөгжилтэй байхын тулд шүүлтүүр биднийг хуурч мэхлэхгүй байгаа эсэхийг шалгацгаая (шүүлтүүр хэзээ ч худлаа хэлдэггүй!) "амжилтгүй" гэсэн жагсаалтыг харуулъя:

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

Амжилтанд хүрээгүй хүмүүсийн жагсаалтын дэлгэцийн агшин
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Алсын сервер дээрх фолдерын хувилбаруудын жагсаалт

Хувилбаруудын жагсаалтыг авах хоёр дахь арга бий. Би Jenkins API-д хандахаас ч илүү дуртай. За, учир нь хэрэв програм амжилттай бүтээгдсэн бол энэ нь түүнийг багцалж, тохирох хавтсанд хадгалах газарт байрлуулсан гэсэн үг юм. Хадгалах газар нь програмуудын ажиллаж байгаа хувилбаруудын анхдагч хадгалалт юм. Дуртай. За, түүнээс ямар хувилбарууд хадгалагдаж байгааг асууя. Бид алсын хавтсыг curl, grep болон awk болгоно. Хэрэв хэн нэгэн oneliner-г сонирхож байгаа бол энэ нь spoiler-ийн доор байна.

Нэг мөр команд
Хоёр зүйлийг анхаарна уу: Би холболтын мэдээллийг толгой хэсэгт оруулдаг бөгөөд надад хавтсанд байгаа бүх хувилбарууд хэрэггүй бөгөөд зөвхөн нэг сарын дотор үүсгэсэн хувилбаруудыг л сонгоно. Өөрийн бодит байдал, хэрэгцээнд нийцүүлэн тушаалыг засна уу:

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

Женкинс дэх ажлын болон ажлын тохиргооны файлыг тохируулж байна

Бид хувилбаруудын жагсаалтын эх сурвалжийг олж мэдсэн. Одоо гарч ирсэн жагсаалтыг даалгаварт оруулъя. Миний хувьд ойлгомжтой шийдэл бол програм бүтээх ажилд нэг алхам нэмэх явдал байв. Үр дүн нь "амжилттай" бол гүйцэтгэх алхам.

Угсрах даалгаврын тохиргоог нээгээд хамгийн доод тал руу гүйлгэ. Товчнууд дээр дарна уу: Үүсгэх алхам нэмэх -> Нөхцөлт алхам (ганц). Алхам тохиргооноос нөхцөлийг сонгоно уу Одоогийн барилгын байдал, утгыг тохируулна уу SUCCESS, амжилттай бол гүйцэтгэх үйлдэл Shell командыг ажиллуулна уу.

Тэгээд одоо хөгжилтэй хэсэг. Женкинс ажлын тохиргоог файлд хадгалдаг. XML форматаар. Замын дагуу http://путь-до-задания/config.xml Үүний дагуу та тохиргооны файлыг татаж аваад шаардлагатай бол засварлаж, авсан газартаа буцааж тавьж болно.

Бид хувилбаруудын жагсаалтад параметр үүсгэхээр дээр тохиролцсон гэдгийг санаарай BUILD_VERSION?

Тохиргооны файлыг татаж аваад дотор нь харцгаая. Параметр нь байрандаа байгаа, хүссэн төрөл байгаа эсэхийг шалгахын тулд л.

Спойлер дор дэлгэцийн агшин.

Таны config.xml фрагмент ижил харагдах ёстой. Сонголтуудын элементийн агуулга хараахан алга болсныг эс тооцвол
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Чи итгэлтэй байна уу? Ингээд л бүтээж амжилттай болбол гүйцэтгэх скрипт бичье.
Скрипт нь хувилбаруудын жагсаалтыг хүлээн авч, тохиргооны файлыг татаж аваад, шаардлагатай газарт нь хувилбаруудын жагсаалтыг бичиж, дараа нь буцааж тавина. Тиймээ. Яг зөв. Хувилбаруудын жагсаалт аль хэдийн байгаа газарт 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

Хэрэв та Женкинсээс хувилбар авах сонголтыг илүүд үзэж, над шиг залхуу бол спойлерын доор ижил код байгаа боловч Женкинсийн жагсаалт:

Женкинсээс тохиргооны хувилбаруудын жагсаалтыг бичнэ үү
Үүнийг санаарай: миний угсралтын нэр нь хоёр цэгээр тусгаарлагдсан дарааллын дугаар болон хувилбарын дугаараас бүрдэнэ. Үүний дагуу 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

Онолын хувьд, хэрэв та дээрх жишээн дээр үндэслэн бичсэн кодыг туршиж үзсэн бол байршуулах даалгаварт та аль хэдийн хувилбаруудтай доош унах жагсаалттай байх ёстой. Энэ нь спойлер дор байгаа дэлгэцийн зураг шиг юм.

Зөв бөглөсөн хувилбаруудын жагсаалт
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Хэрэв бүх зүйл ажилласан бол скриптийг хуулж буулгана уу Shell командыг ажиллуулна уу өөрчлөлтүүдийг хадгалах.

Cloud shell-д холбогдож байна

Бид чингэлэгт цуглуулагчтай. Бид Ansible-г програм хангамжийн хэрэгсэл болон тохиргооны менежер болгон ашигладаг. Үүний дагуу контейнер барих тухайд гурван сонголт гарч ирдэг: Docker-ийг Docker-д суулгах, Docker-ийг Ansible дээр ажилладаг машин дээр суулгах эсвэл үүлэн консол дээр контейнер барих. Бид энэ тэмдэглэлд Женкинст зориулсан залгаасуудын талаар чимээгүй байхыг зөвшөөрсөн. Санаж байна уу?

Би шийдсэн: "хайрцагнаас гарсан" савыг үүлэн консол дээр цуглуулах боломжтой тул яагаад санаа зовох ёстой гэж? Үүнийг цэвэрхэн байлга, тийм үү? Би Женкинсийн савыг үүлэн консол дээр цуглуулж, тэндээс куб руу хөөргөхийг хүсч байна. Нэмж дурдахад Google нь дэд бүтэцдээ маш баялаг сувгуудтай бөгөөд энэ нь байршуулалтын хурдад сайнаар нөлөөлнө.

Үүлэн консолд холбогдохын тулд танд хоёр зүйл хэрэгтэй: gcloud хандах эрх Google Cloud API Үүнтэй ижил холболт хийгдэх VM жишээний хувьд.

Google үүлнээс огт холбогдоогүй хүмүүст зориулав
Google нь үйлчилгээндээ интерактив зөвшөөрлийг идэвхгүй болгох боломжийг олгодог. Энэ нь консол *nix ажиллаж байгаа бөгөөд өөрөө консолтой бол кофены машинаас ч холбогдох боломжтой болно.

Хэрэв надад энэ тэмдэглэлийн хүрээнд энэ асуудлыг илүү дэлгэрэнгүй тайлбарлах шаардлагатай бол сэтгэгдэл дээр бичээрэй. Хэрэв бид хангалттай санал авбал би энэ сэдвээр шинэчлэл бичих болно.

Эрх олгох хамгийн хялбар арга бол вэб интерфэйс юм.

  1. Дараа нь үүлэн консол руу холбогдох VM жишээг зогсооно уу.
  2. Instance Details-ийг нээгээд товшино уу нэмэлт, өөрчлөлт оруулах.
  3. Хуудасны хамгийн доод хэсэгт жишээний хандалтын хамрах хүрээг сонгоно уу Бүх Cloud API-д бүрэн хандах боломжтой.

    Дэлгэцийн зураг
    Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

  4. Өөрчлөлтүүдээ хадгалаад жишээг эхлүүлнэ үү.

VM-г ачаалж дууссаны дараа SSH-ээр холбогдож, холболт алдаагүй байгаа эсэхийг шалгаарай. Командыг ашиглана уу:

gcloud alpha cloud-shell ssh

Амжилттай холболт нь иймэрхүү харагдаж байна
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

GKE-д байршуулах

Бид IaC (Дэд бүтэц нь код) руу бүрэн шилжихийг бүх талаар хичээж байгаа тул манай докер файлууд Git-д хадгалагддаг. Энэ нэг талаараа. Мөн kubernetes-д байршуулалтыг зөвхөн энэ даалгаварт ашигладаг yaml файлаар дүрсэлсэн бөгөөд энэ нь өөрөө кодтой адил юм. Энэ бол нөгөө талаасаа. Ерөнхийдөө төлөвлөгөө нь дараах байдалтай байна.

  1. Бид хувьсагчдын утгыг авдаг BUILD_VERSION мөн сонголтоор дамжуулагдах хувьсагчдын утгууд ENV.
  2. Git-ээс докер файлыг татаж авна уу.
  3. Байршуулахын тулд yaml үүсгэнэ үү.
  4. Бид эдгээр хоёр файлыг scp-ээр дамжуулан үүлэн консол руу байршуулдаг.
  5. Бид тэнд контейнер барьж, Контейнерын бүртгэлд оруулдаг
  6. Бид cuber дээр ачааллын байршуулалтын файлыг ашигладаг.

Илүү тодорхой хэлье. Нэгэнт бид ярьж эхэлсэн ENV, дараа нь бид хоёр параметрийн утгыг дамжуулах хэрэгтэй гэж бодъё: PARAM1 и PARAM2. Бид тэдгээрийн даалгаврыг байрлуулж, бичнэ үү - Мөр параметр.

Дэлгэцийн зураг
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Бид энгийн дахин чиглүүлэлтээр yaml үүсгэх болно Echo файл болгох. Мэдээжийн хэрэг таны докер файлд байгаа гэж таамаглаж байна 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

Холбосны дараа Женкинс агентыг ашиглана gcloud alpha cloud-shell ssh интерактив горим байхгүй тул бид параметрийг ашиглан үүлэн консол руу тушаал илгээдэг --тушаал.

Бид үүлэн консол дахь гэрийн хавтсыг хуучин докер файлаас цэвэрлэдэг.

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

Шинээр татаж авсан докер файлыг scp ашиглан үүлэн консолын үндсэн хавтсанд байрлуулна уу:

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

Бид савыг цуглуулж, шошгож, Контейнерын бүртгэл рүү түлхэж байна:

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"

Бид даалгавраа гүйцэтгэж, консолын гаралтыг нээж, савны амжилттай угсралтыг харах болно гэж найдаж байна.

Дэлгэцийн зураг
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Дараа нь угсарсан савыг амжилттай байрлуулна

Дэлгэцийн зураг
Бид залгаас, SMS эсвэл бүртгэлгүйгээр GKE-д байршуулах ажлыг үүсгэдэг. Женкинсийн хүрэмний доороос харцгаая

Би тохиргоог санаатайгаар үл тоомсорлов Ingress. Нэг энгийн шалтгаанаар: та үүнийг тохируулсны дараа ажлын ачаалал өгөгдсөн нэрээр, энэ нь таны хэчнээн удаа ийм нэртэй байршуулалт хийж байгаагаас үл хамааран ажиллах болно. Яахав, ер нь энэ бол түүхийн хүрээнээс арай хэтэрсэн зүйл.

Дүгнэлт хийхийн оронд

Дээр дурдсан бүх алхмуудыг хийх боломжгүй байсан ч Женкинст зориулсан нэмэлт өргөтгөлүүдийг суулгасан байх. Гэхдээ зарим шалтгааны улмаас би залгаасуудад дургүй. Бүр тодруулбал, би цөхрөнгөө барсандаа л тэдэнд ханддаг.

Би зүгээр л өөртөө зориулж шинэ сэдэв сонгох дуртай. Дээрх текст нь эхэнд дурдсан асуудлыг шийдвэрлэх явцад олж мэдсэн зүйлээ хуваалцах арга юм. Түүн шиг devops-ийн аймшигт чоно биш хүмүүстэй хуваалцаарай. Хэрэв миний олж мэдсэн зүйл ядаж хэн нэгэнд тустай бол би баяртай байх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх