Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Hər şey inkişaf qruplarımızdan birinin komanda rəhbəri bir gün əvvəl konteynerə qoyulmuş yeni tətbiqlərini sınaqdan keçirməyimizi xahiş etdikdə başladı. yerləşdirdim. Təxminən 20 dəqiqədən sonra ərizəni yeniləmək üçün müraciət gəldi, çünki ora çox lazımlı bir şey əlavə edildi. təzələdim. Daha bir neçə saatdan sonra... yaxşı, sonra nə baş verdiyini təxmin edə bilərsiniz...

Etiraf etməliyəm, mən kifayət qədər tənbələm (bunu əvvəllər etiraf etməmişəm? Xeyr?) və komanda rəhbərlərinin bütün CI/CD-yə malik olduğumuz Jenkins-ə çıxışı olduğunu nəzərə alaraq, düşündüm: qoy o, kimi yerləşdirsin. istədiyi qədər! Bir zarafat yadıma düşdü: adama balıq ver, bir gün yesin; bir adama Fed deyin və o, bütün həyatı boyu Fed olacaq. Və getdi işdə fəndlər oynayın, hər hansı bir uğurla qurulmuş versiyanın tətbiqini ehtiva edən bir konteyneri Kuber-ə yerləşdirə və istənilən dəyəri ona köçürə bilər. ENV (Mənim babam, filoloq, keçmişdə ingilis dili müəllimi idi, indi bu cümləni oxuyandan sonra barmağını məbədində fırladıb mənə çox ifadəli baxırdı).

Beləliklə, bu qeyddə sizə necə öyrəndiyimi söyləyəcəyəm:

  1. Jenkinsdəki işləri işin özündən və ya digər işlərdən dinamik şəkildə yeniləmək;
  2. Jenkins agenti quraşdırılmış qovşaqdan bulud konsoluna (Cloud shell) qoşulun;
  3. İş yükünü Google Kubernetes Mühərrikinə yerləşdirin.


Əslində mən təbii ki, bir qədər qeyri-səmimiyəm. Güman edilir ki, Google buludunda infrastrukturun ən azı bir hissəsi var və buna görə də siz onun istifadəçisisiniz və əlbəttə ki, GCP hesabınız var. Amma bu qeydin mövzusu bu deyil.

Bu mənim növbəti fırıldaq vərəqimdir. Mən yalnız bir halda belə qeydlər yazmaq istəyirəm: bir problemlə üzləşdim, əvvəlcə onu necə həll edəcəyimi bilmədim, həlli hazır google-da yox idi, ona görə də onu hissə-hissə google-da axtardım və sonda problemi həll etdim. Gələcəkdə bunu necə etdiyimi unutduğum zaman hər şeyi parça-parça google-da axtarıb bir yerdə toplamaq məcburiyyətində qalmamaq üçün özümə belə fırıldaq vərəqləri yazıram.

Disclaimer: 1. Qeyd “özüm üçün”, rol üçün yazılmışdır ən yaxşı təcrübə tətbiq edilmir. Şərhlərdə "belə etmək daha yaxşı olardı" variantlarını oxumaqdan məmnunam.
2. Əgər notun tətbiq olunan hissəsi duz sayılırsa, bütün əvvəlki qeydlərim kimi bu da zəif duz məhluludur.

Jenkins-də iş parametrlərinin dinamik olaraq yenilənməsi

Sualınızı qabaqcadan görürəm: dinamik iş yeniləməsinin bununla nə əlaqəsi var? Simli parametrin dəyərini əl ilə daxil edin və çıxın!

Cavab verirəm: Mən həqiqətən tənbələm, şikayət etdikdə xoşuma gəlmir: Mişa, yerləşdirmə çökür, hər şey getdi! Siz axtarmağa başlayırsınız və bəzi tapşırığın işə salınma parametrinin dəyərində səhv var. Buna görə də hər şeyi mümkün qədər səmərəli etməyə üstünlük verirəm. Bunun əvəzinə seçim etmək üçün dəyərlər siyahısını verməklə istifadəçinin birbaşa məlumat daxil etməsinə mane olmaq mümkündürsə, seçimi təşkil edirəm.

Plan belədir: biz Jenkins-də bir iş yaradırıq, orada işə başlamazdan əvvəl siyahıdan bir versiya seçə, konteynerə ötürülən parametrlər üçün dəyərləri təyin edə bilərik. ENV, sonra konteyneri toplayır və Konteyner Reyestrinə itələyir. Sonra oradan konteyner kub şəklində işə salınır iş yükü işdə göstərilən parametrlərlə.

Jenkins-də iş yaratmaq və qurmaq prosesini nəzərdən keçirməyəcəyik, bu mövzudan kənardır. Tapşırığın hazır olduğunu güman edəcəyik. Versiyalarla yenilənmiş siyahını həyata keçirmək üçün bizə iki şey lazımdır: apriori etibarlı versiya nömrələri olan mövcud mənbə siyahısı və bu kimi dəyişən. Seçim parametri vəzifədə. Bizim nümunəmizdə dəyişənə ad verilsin BUILD_VERSION, biz onun üzərində ətraflı dayanmayacağıq. Ancaq mənbə siyahısına daha yaxından nəzər salaq.

O qədər də çox variant yoxdur. Dərhal iki şey ağlıma gəldi:

  • Jenkins-in istifadəçilərinə təklif etdiyi Uzaqdan giriş API-dən istifadə edin;
  • Uzaq depo qovluğunun məzmununu tələb edin (bizim vəziyyətimizdə bu JFrog Artifactory-dir, bu vacib deyil).

Jenkins Uzaqdan giriş API

Yaranmış əla ənənəyə görə, mən uzun izahatlardan qaçmağa üstünlük verərdim.
Mən özümə yalnız birinci abzasın bir hissəsinin pulsuz tərcüməsinə icazə verəcəm API sənədlərinin ilk səhifəsi:

Jenkins onun funksionallığına uzaqdan maşın tərəfindən oxuna bilən giriş üçün API təmin edir. <…> Uzaqdan giriş REST kimi bir üslubda təklif olunur. Bu o deməkdir ki, bütün funksiyalar üçün vahid giriş nöqtəsi yoxdur, bunun əvəzinə " kimi bir URL var..../api/", Harada"..." API imkanlarının tətbiq olunduğu obyekt deməkdir.

Başqa sözlə, əgər hazırda haqqında danışdığımız yerləşdirmə tapşırığı burada mövcuddursa http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, sonra bu tapşırıq üçün API fitləri burada mövcuddur http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Sonra, çıxışı hansı formada alacağımız barədə seçimimiz var. XML-ə diqqət yetirək, çünki API yalnız bu halda filtrləşdirməyə imkan verir.

Gəlin bütün işlərin siyahısını əldə etməyə çalışaq. Bizi yalnız məclisin adı maraqlandırır (ekran adı) və onun nəticəsi (nəticələnəcək):

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

Çıxdı?

İndi gəlin yalnız nəticə ilə bitən qaçışları süzgəcdən keçirək SUCCESS. Gəlin arqumentdən istifadə edək &xaric et və parametr kimi ona bərabər olmayan qiymətə gedən yolu keçəcəyik SUCCESS. Hə hə. İkiqat mənfi bir ifadədir. Bizi maraqlandırmayan hər şeyi istisna edirik:

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

Uğurluların siyahısının ekran görüntüsü
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Yaxşı, əylənmək üçün filtrin bizi aldatmadığına əmin olaq (filtrlər heç vaxt yalan danışmır!) və "uğursuz" olanların siyahısını göstərək:

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

Uğur qazanmayanların siyahısının ekran görüntüsü
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Uzaq serverdəki qovluqdakı versiyaların siyahısı

Versiyaların siyahısını əldə etməyin ikinci yolu var. Jenkins API-ə daxil olmaqdan daha çox xoşuma gəlir. Yaxşı, çünki proqram uğurla qurulubsa, bu, paketləndiyini və müvafiq qovluqdakı depoya yerləşdirildiyini göstərir. Necə ki, depo proqramların işləyən versiyalarının standart saxlanmasıdır. Kimi. Yaxşı, ondan hansı versiyaların saxlandığını soruşaq. Uzaq qovluğu bükəcəyik, grep edəcəyik və awk edəcəyik. Əgər kimsə onelinerlə maraqlanırsa, o, spoylerin altındadır.

Bir sətir əmri
Zəhmət olmasa iki şeyi qeyd edin: bağlantı təfərrüatlarını başlıqda qeyd edirəm və qovluqdakı bütün versiyalara ehtiyacım yoxdur və yalnız bir ay ərzində yaradılanları seçirəm. Reallıqlarınıza və ehtiyaclarınıza uyğun olaraq əmri redaktə edin:

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

Jenkins-də işlərin və iş konfiqurasiya faylının qurulması

Versiyaların siyahısının mənbəyini tapdıq. İndi nəticədə əldə edilən siyahını tapşırığa daxil edək. Mənim üçün aşkar həll proqram qurmaq tapşırığına bir addım əlavə etmək idi. Nəticə "uğur" olarsa icra olunacaq addım.

Montaj tapşırığı parametrlərini açın və ən aşağıya sürüşdürün. Düymələrə klikləyin: Quraşdırma addımı əlavə et -> Şərti addım (tək). Addım parametrlərində şərti seçin Hazırkı tikinti vəziyyəti, dəyəri təyin edin SUCCESS, uğurlu olarsa yerinə yetiriləcək hərəkət Shell əmrini yerinə yetirin.

Və indi əyləncəli hissə. Jenkins iş konfiqurasiyalarını fayllarda saxlayır. XML formatında. Yol boyunca http://путь-до-задания/config.xml Müvafiq olaraq, siz konfiqurasiya faylını yükləyə, lazım olduqda redaktə edə və əldə etdiyiniz yerə qaytara bilərsiniz.

Unutmayın, yuxarıda razılaşdıq ki, versiyaların siyahısı üçün bir parametr yaradacağıq BUILD_VERSION?

Konfiqurasiya faylını yükləyək və içərisinə nəzər salaq. Sadəcə parametrin yerində və istədiyiniz tipdə olduğundan əmin olmaq üçün.

Spoiler altında ekran görüntüsü.

config.xml fraqmentiniz eyni görünməlidir. Yalnız seçim elementinin məzmunu hələ yoxdur
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Sən əminsən? Budur, qurulma uğurlu olarsa, icra ediləcək bir skript yazaq.
Skript versiyaların siyahısını alacaq, konfiqurasiya faylını yükləyin, versiyaların siyahısını bizə lazım olan yerə yazın və sonra onu geri qoyun. Bəli. Düzdür. Artıq versiyaların siyahısı olan yerdə XML-də versiyaların siyahısını yazın (gələcəkdə, skriptin ilk işə salınmasından sonra olacaq). Bilirəm ki, dünyada hələ də müntəzəm ifadələrin şiddətli pərəstişkarları var. Mən onlara aid deyiləm. Zəhmət olmasa quraşdırın xmlstarler konfiqurasiyanın redaktə ediləcəyi maşına. Mənə elə gəlir ki, sed istifadə edərək XML-i redaktə etməmək üçün bu o qədər də böyük qiymət deyil.

Spoiler altında yuxarıdakı ardıcıllığı tam şəkildə yerinə yetirən kodu təqdim edirəm.

Uzaq serverdəki qovluqdan konfiqurasiyaya versiyaların siyahısını yazın

#!/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-dən versiyalar əldə etmək seçiminə üstünlük verirsinizsə və mənim kimi tənbəlsinizsə, spoylerin altında eyni kod var, ancaq Jenkins-dən bir siyahı:

Jenkins-dən konfiqurasiyaya qədər versiyaların siyahısını yazın
Sadəcə bunu yadda saxlayın: mənim montaj adım iki nöqtə ilə ayrılmış ardıcıllıq nömrəsi və versiya nömrəsindən ibarətdir. Müvafiq olaraq, awk lazımsız hissəni kəsir. Özünüz üçün, ehtiyaclarınıza uyğun olaraq bu xətti dəyişdirin.

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

Teorik olaraq, yuxarıdakı nümunələr əsasında yazılmış kodu sınamısınızsa, yerləşdirmə tapşırığında artıq versiyaları olan bir açılan siyahı olmalıdır. Bu, spoylerin altındakı skrinşotdakı kimidir.

Versiyaların düzgün doldurulmuş siyahısı
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Hər şey işlədisə, skripti kopyalayıb yapışdırın Shell əmrini yerinə yetirin və dəyişiklikləri yadda saxlayın.

Bulud qabığına qoşulur

Konteynerlərdə kollektorlarımız var. Biz Ansible-dan proqram çatdırılma alətimiz və konfiqurasiya meneceri kimi istifadə edirik. Müvafiq olaraq, konteynerlərin qurulmasına gəldikdə, üç seçim ağlınıza gəlir: Docker-də Docker-i quraşdırın, Docker-i Ansible ilə işləyən maşına quraşdırın və ya bulud konsolunda konteynerlər qurun. Bu məqalədə Jenkins üçün plaginlər haqqında susmağa razılaşdıq. Yadınızdadır?

Qərara gəldim: yaxşı, "qutudan çıxan" qablar bulud konsolunda toplana bildiyi üçün, niyə narahat olursunuz? Təmiz saxlayın, elə deyilmi? Mən Jenkins konteynerlərini bulud konsolunda toplamaq və sonra onları oradan kubra işə salmaq istəyirəm. Üstəlik, Google öz infrastrukturunda çox zəngin kanallara malikdir ki, bu da yerləşdirmə sürətinə faydalı təsir göstərəcək.

Bulud konsoluna qoşulmaq üçün sizə iki şey lazımdır: gcloud və giriş hüquqları Google Cloud API eyni əlaqənin ediləcəyi VM nümunəsi üçün.

Heç Google buludundan deyil, qoşulmağı planlaşdıranlar üçün
Google öz xidmətlərində interaktiv avtorizasiyanı söndürmək imkanı verir. Bu, hətta *nix işləyirsə və konsolun özü varsa, hətta qəhvə maşınından da konsola qoşulmağa imkan verəcək.

Bu qeyd çərçivəsində bu məsələni daha ətraflı işıqlandırmağıma ehtiyac yaranarsa, şərhlərdə yazın. Əgər kifayət qədər səs toplasaq, bu mövzuda yeniliklər yazacağam.

Hüquqların verilməsinin ən asan yolu veb interfeysindən keçir.

  1. Sonradan bulud konsoluna qoşulacağınız VM instansiyasını dayandırın.
  2. Nümunə Təfərrüatlarını açın və vurun düzəliş etmək.
  3. Səhifənin ən aşağı hissəsində nümunəyə giriş sahəsini seçin Bütün Bulud API-lərinə tam giriş.

    Screenshot
    Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

  4. Dəyişikliklərinizi yadda saxlayın və nümunəni işə salın.

VM yüklənməsini bitirdikdən sonra ona SSH vasitəsilə qoşulun və əlaqənin xətasız baş verdiyinə əmin olun. Komandanı istifadə edin:

gcloud alpha cloud-shell ssh

Uğurlu bir əlaqə bu kimi görünür
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

GKE-də yerləşdirin

Biz IaC-yə (Kod kimi İnfrastuktura) tamamilə keçmək üçün hər cür səy göstərdiyimiz üçün docker fayllarımız Git-də saxlanılır. Bu bir tərəfdən. Və kubernetlərdə yerləşdirmə yaml faylı ilə təsvir edilir, yalnız bu tapşırıq tərəfindən istifadə olunur, özü də kod kimidir. Bu digər tərəfdəndir. Ümumiyyətlə, plan belədir:

  1. Dəyişənlərin dəyərlərini alırıq BUILD_VERSION və isteğe bağlı olaraq, keçəcək dəyişənlərin dəyərləri ENV.
  2. Docker faylını Git-dən yükləyin.
  3. Yerləşdirmə üçün yaml yaradın.
  4. Bu faylların hər ikisini scp vasitəsilə bulud konsoluna yükləyirik.
  5. Biz orada konteyner qururuq və onu Konteyner reyestrinə itələyirik
  6. Yük yerləşdirmə faylını kuba tətbiq edirik.

Daha konkret olaq. Bir dəfə danışmağa başladıq ENV, onda iki parametrin dəyərlərini ötürməli olduğumuzu düşünək: PARAM1 и PARAM2. Yerləşdirmə üçün onların tapşırığını əlavə edirik, yazın - String Parametri.

Screenshot
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Sadə bir yönləndirmə ilə yaml yaradacağıq miss sənədləşdirmək. Əlbəttə ki, docker faylınızda olduğu güman edilir PARAM1 и PARAM2yük adı olacaq zəhmli proqram, və göstərilən versiyanın tətbiqi ilə yığılmış konteyner yatır Konteyner reyestri yol boyunca gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONHara $BUILD_VERSION sadəcə açılan siyahıdan seçildi.

Komanda siyahısı

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 agenti istifadə etdikdən sonra gcloud alfa bulud qabığı ssh interaktiv rejim mövcud deyil, buna görə parametrdən istifadə edərək bulud konsoluna əmrlər göndəririk --əmr.

Bulud konsolundakı ev qovluğunu köhnə docker faylından təmizləyirik:

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

Təzə yüklənmiş docker faylını scp istifadə edərək bulud konsolunun əsas qovluğuna yerləşdirin:

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

Konteyneri yığırıq, etiketləyirik və Konteyner reyestrinə itələyirik:

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"

Yerləşdirmə faylı ilə eyni şeyi edirik. Nəzərə alın ki, aşağıdakı əmrlər yerləşdirmənin baş verdiyi klasterin uydurma adlarından istifadə edir (awsm-klaster) və layihənin adı (möhtəşəm layihə), klasterin yerləşdiyi yer.

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"

Tapşırığı yerinə yetiririk, konsol çıxışını açırıq və konteynerin uğurlu montajını görəcəyimizə ümid edirik.

Screenshot
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Və sonra yığılmış konteynerin uğurlu yerləşdirilməsi

Screenshot
Biz plaginlər, SMS və ya qeydiyyat olmadan GKE-də yerləşdirmə tapşırığı yaradırıq. Gəlin Cenkinsin pencəyinin altına nəzər salaq

Mən qəsdən ayara məhəl qoymadım Girme. Bir sadə səbəbə görə: onu qurduqdan sonra iş yükü müəyyən bir adla, bu adla nə qədər yerləşdirmə həyata keçirməyinizdən asılı olmayaraq, o işlək qalacaq. Yaxşı, ümumiyyətlə, bu, tarixin əhatə dairəsindən bir qədər kənardır.

Xülasə yerinə

Bütün yuxarıda göstərilən addımlar yəqin ki, edilə bilməzdi, lakin sadəcə Jenkins üçün bəzi plaginlər quraşdırdılar, onların çoxu. Amma nədənsə plaginləri sevmirəm. Yaxşı, daha dəqiq desəm, yalnız çarəsizlikdən onlara müraciət edirəm.

Və mən sadəcə özüm üçün yeni bir mövzu seçməyi xoşlayıram. Yuxarıdakı mətn həm də başlanğıcda təsvir olunan problemi həll edərkən əldə etdiyim nəticələri bölüşmək üçün bir yoldur. Onun kimi devoplarda heç də qorxunc canavar olmayanlarla paylaşın. Tapıntılarım heç olmasa kiməsə kömək etsə, xoşbəxt olaram.

Mənbə: www.habr.com

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