Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Semuanya bermula apabila ketua pasukan salah satu pasukan pembangunan kami meminta kami untuk menguji aplikasi baharu mereka, yang telah disimpan dalam kontena sehari sebelumnya. Saya menyiarkannya. Selepas kira-kira 20 minit, permintaan telah diterima untuk mengemas kini aplikasi, kerana perkara yang sangat perlu telah ditambah di sana. Saya memperbaharui. Selepas beberapa jam lagi... baik, anda boleh meneka apa yang mula berlaku seterusnya...

Saya mesti mengakui, saya agak malas (bukankah saya mengakui ini lebih awal? Tidak?), dan memandangkan fakta bahawa ketua pasukan mempunyai akses kepada Jenkins, di mana kita mempunyai semua CI/CD, saya fikir: biarkan dia menggunakan sebagai sebanyak yang dia mahu! Saya teringat satu jenaka: beri seorang lelaki ikan dan dia akan makan selama sehari; panggil seseorang itu Fed dan dia akan diberi makan sepanjang hayatnya. Dan pergi bermain helah dalam kerja, yang akan dapat menggunakan bekas yang mengandungi aplikasi mana-mana versi yang berjaya dibina ke dalam Kuber dan memindahkan sebarang nilai kepadanya ENV (Datuk saya, seorang ahli filologi, seorang guru bahasa Inggeris pada masa lalu, kini akan memutar jarinya ke pelipisnya dan memandang saya dengan sangat ekspresif selepas membaca ayat ini).

Jadi, dalam nota ini saya akan memberitahu anda bagaimana saya belajar:

  1. Kemas kini kerja dalam Jenkins secara dinamik daripada kerja itu sendiri atau daripada kerja lain;
  2. Sambung ke konsol awan (Cloud shell) dari nod dengan ejen Jenkins dipasang;
  3. Sebarkan beban kerja ke Enjin Kubernetes Google.


Sebenarnya, saya, sudah tentu, agak tidak jujur. Diandaikan bahawa anda mempunyai sekurang-kurangnya sebahagian daripada infrastruktur dalam awan Google, dan, oleh itu, anda adalah penggunanya dan, sudah tentu, anda mempunyai akaun GCP. Tetapi bukan itu yang dimaksudkan dengan nota ini.

Ini adalah helaian cheat saya yang seterusnya. Saya hanya mahu menulis nota sedemikian dalam satu kes: Saya berhadapan dengan masalah, saya pada mulanya tidak tahu bagaimana untuk menyelesaikannya, penyelesaiannya tidak digoogle siap sedia, jadi saya google beberapa bahagian dan akhirnya menyelesaikan masalah itu. Dan supaya pada masa akan datang, apabila saya terlupa bagaimana saya melakukannya, saya tidak perlu google semuanya sekali lagi sekeping demi sekeping dan menyusunnya bersama-sama, saya menulis sendiri helaian curang sedemikian.

Penafian: 1. Nota itu ditulis "untuk diri saya sendiri", untuk peranan itu amalan terbaik tidak terpakai. Saya gembira membaca pilihan "lebih baik melakukannya dengan cara ini" dalam ulasan.
2. Jika bahagian nota yang digunakan dianggap garam, maka, seperti semua nota saya sebelum ini, yang ini adalah larutan garam yang lemah.

Mengemas kini tetapan kerja secara dinamik dalam Jenkins

Saya meramalkan soalan anda: apakah kaitan pengemaskinian kerja dinamik dengannya? Masukkan nilai parameter rentetan secara manual dan teruskan!

Saya menjawab: Saya benar-benar malas, saya tidak suka apabila mereka mengadu: Misha, penempatan sedang ranap, semuanya hilang! Anda mula mencari, dan terdapat kesilapan taip dalam nilai beberapa parameter pelancaran tugas. Oleh itu, saya lebih suka melakukan segala-galanya dengan cekap yang mungkin. Jika ada kemungkinan untuk menghalang pengguna daripada memasukkan data secara langsung dengan memberikan senarai nilai untuk dipilih, maka saya mengatur pemilihan.

Pelannya adalah ini: kami membuat kerja di Jenkins, di mana, sebelum melancarkan, kami boleh memilih versi daripada senarai, menentukan nilai untuk parameter yang dihantar ke bekas melalui ENV, kemudian ia mengumpul bekas dan menolaknya ke dalam Daftar Bekas. Kemudian dari situ bekas itu dilancarkan dalam cuber as beban kerja dengan parameter yang dinyatakan dalam kerja.

Kami tidak akan mempertimbangkan proses mencipta dan menyediakan pekerjaan di Jenkins, ini di luar topik. Kami akan menganggap bahawa tugas itu sudah siap. Untuk melaksanakan senarai yang dikemas kini dengan versi, kami memerlukan dua perkara: senarai sumber sedia ada dengan nombor versi yang sah priori dan pembolehubah seperti Parameter pilihan dalam tugasan. Dalam contoh kami, biarkan pembolehubah dinamakan BUILD_VERSION, kami tidak akan membincangkannya secara terperinci. Tetapi mari kita lihat dengan lebih dekat senarai sumber.

Tidak banyak pilihan. Dua perkara segera terlintas di fikiran:

  • Gunakan API akses Jauh yang Jenkins tawarkan kepada penggunanya;
  • Minta kandungan folder repositori jauh (dalam kes kami ini ialah JFrog Artifactory, yang tidak penting).

API capaian jauh Jenkins

Mengikut tradisi cemerlang yang telah ditetapkan, saya lebih suka mengelakkan penjelasan yang panjang lebar.
Saya akan membenarkan diri saya hanya terjemahan percuma sekeping perenggan pertama halaman pertama dokumentasi API:

Jenkins menyediakan API untuk akses boleh dibaca mesin jauh ke fungsinya. <…> Akses jauh ditawarkan dalam gaya seperti REST. Ini bermakna tiada titik masuk tunggal untuk semua ciri, sebaliknya URL seperti ".../api/", Di mana"..." bermaksud objek yang digunakan untuk keupayaan API.

Dengan kata lain, jika tugas penempatan yang sedang kita bicarakan tersedia di http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, maka wisel API untuk tugasan ini tersedia di http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Seterusnya, kita mempunyai pilihan dalam bentuk apa untuk menerima output. Mari fokus pada XML, kerana API hanya membenarkan penapisan dalam kes ini.

Mari cuba dapatkan senarai semua kerja yang dijalankan. Kami hanya berminat dengan nama perhimpunan (nama paparan) dan hasilnya (mengakibatkan):

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

Adakah ia berfungsi?

Sekarang mari kita menapis hanya larian yang berakhir dengan hasilnya KEJAYAAN. Mari kita gunakan hujah &kecualikan dan sebagai parameter kami akan meneruskannya laluan ke nilai yang tidak sama dengannya KEJAYAAN. Ya Ya. Negatif berganda ialah pernyataan. Kami mengecualikan semua yang tidak menarik minat kami:

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

Tangkapan skrin senarai yang berjaya
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Nah, hanya untuk keseronokan, mari pastikan penapis itu tidak menipu kita (penapis tidak pernah berbohong!) dan memaparkan senarai yang "tidak berjaya":

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

Tangkapan skrin senarai yang tidak berjaya
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Senarai versi daripada folder pada pelayan jauh

Terdapat cara kedua untuk mendapatkan senarai versi. Saya lebih menyukainya daripada mengakses API Jenkins. Nah, kerana jika aplikasi itu berjaya dibina, ia bermakna ia telah dibungkus dan diletakkan dalam repositori dalam folder yang sesuai. Seperti, repositori ialah storan lalai bagi versi aplikasi yang berfungsi. Suka. Baiklah, mari kita tanya dia versi apa yang ada dalam storan. Kami akan curl, grep dan awk folder jauh. Jika ada yang berminat dengan oneliner, maka ia adalah di bawah spoiler.

Perintah satu baris
Sila ambil perhatian dua perkara: Saya menghantar butiran sambungan dalam pengepala dan saya tidak memerlukan semua versi daripada folder, dan saya hanya memilih versi yang dibuat dalam masa sebulan. Edit arahan untuk disesuaikan dengan realiti dan keperluan anda:

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

Menyediakan kerja dan fail konfigurasi kerja dalam Jenkins

Kami mengetahui sumber senarai versi. Sekarang mari kita masukkan senarai yang terhasil ke dalam tugasan. Bagi saya, penyelesaian yang jelas ialah menambah satu langkah dalam tugas membina aplikasi. Langkah yang akan dilaksanakan jika hasilnya "berjaya".

Buka tetapan tugas pemasangan dan tatal ke bahagian paling bawah. Klik pada butang: Tambah langkah binaan -> Langkah bersyarat (tunggal). Dalam tetapan langkah, pilih syarat Status binaan semasa, tetapkan nilai KEJAYAAN, tindakan yang perlu dilakukan jika berjaya Jalankan arahan shell.

Dan sekarang bahagian yang menyeronokkan. Jenkins menyimpan konfigurasi kerja dalam fail. Dalam format XML. Sepanjang jalan http://ΠΏΡƒΡ‚ΡŒ-Π΄ΠΎ-задания/config.xml Sehubungan itu, anda boleh memuat turun fail konfigurasi, mengeditnya mengikut keperluan dan meletakkannya semula di tempat anda mendapatnya.

Ingat, kami bersetuju di atas bahawa kami akan membuat parameter untuk senarai versi BUILD_VERSION?

Mari muat turun fail konfigurasi dan lihat di dalamnya. Hanya untuk memastikan bahawa parameter berada di tempat dan jenis yang dikehendaki.

Tangkapan skrin di bawah spoiler.

Serpihan config.xml anda sepatutnya kelihatan sama. Kecuali kandungan elemen pilihan masih tiada
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Adakah anda pasti? Itu sahaja, mari kita tulis skrip yang akan dilaksanakan jika binaan berjaya.
Skrip akan menerima senarai versi, memuat turun fail konfigurasi, menulis senarai versi ke dalamnya di tempat yang kami perlukan, dan kemudian meletakkannya semula. ya. betul tu. Tulis senarai versi dalam XML di tempat yang sudah ada senarai versi (akan ada pada masa hadapan, selepas pelancaran pertama skrip). Saya tahu masih ada peminat sengit ungkapan biasa di dunia. Saya bukan milik mereka. Sila pasang xmlstarler ke mesin di mana konfigurasi akan diedit. Nampaknya saya ini bukan harga yang mahal untuk dibayar untuk mengelakkan penyuntingan XML menggunakan sed.

Di bawah spoiler, saya membentangkan kod yang melaksanakan urutan di atas secara keseluruhannya.

Tulis senarai versi daripada folder pada pelayan jauh ke konfigurasi

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

Jika anda lebih suka pilihan untuk mendapatkan versi daripada Jenkins dan anda malas seperti saya, maka di bawah spoiler adalah kod yang sama, tetapi senarai dari Jenkins:

Tulis senarai versi dari Jenkins ke konfigurasi
Perlu diingat ini: nama pemasangan saya terdiri daripada nombor jujukan dan nombor versi, dipisahkan oleh titik bertindih. Oleh itu, awk memotong bahagian yang tidak perlu. Untuk diri sendiri, tukar baris ini mengikut keperluan anda.

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

Secara teori, jika anda telah menguji kod yang ditulis berdasarkan contoh di atas, maka dalam tugas penempatan anda sepatutnya sudah mempunyai senarai juntai bawah dengan versi. Ia seperti dalam tangkapan skrin di bawah spoiler.

Senarai versi yang dilengkapkan dengan betul
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Jika semuanya berjaya, kemudian salin-tampal skrip ke dalam Jalankan arahan shell dan simpan perubahan.

Menyambung ke Cloud shell

Kami mempunyai pengumpul dalam bekas. Kami menggunakan Ansible sebagai alat penghantaran aplikasi dan pengurus konfigurasi kami. Sehubungan itu, semasa membina bekas, tiga pilihan terlintas di fikiran: pasang Docker dalam Docker, pasang Docker pada mesin yang menjalankan Ansible, atau bina bekas dalam konsol awan. Kami bersetuju untuk berdiam diri tentang pemalam untuk Jenkins dalam artikel ini. Ingat tak?

Saya memutuskan: baik, kerana bekas "di luar kotak" boleh dikumpulkan dalam konsol awan, maka mengapa perlu bersusah payah? Jaga kebersihan, kan? Saya ingin mengumpul bekas Jenkins dalam konsol awan, dan kemudian melancarkannya ke dalam cuber dari sana. Lebih-lebih lagi, Google mempunyai saluran yang sangat kaya dalam infrastrukturnya, yang akan memberi kesan yang baik pada kelajuan penggunaan.

Untuk menyambung ke konsol awan, anda memerlukan dua perkara: gcloud dan hak akses kepada API Awan Google untuk contoh VM dari mana sambungan yang sama ini akan dibuat.

Bagi mereka yang bercadang untuk menyambung bukan dari awan Google sama sekali
Google membenarkan kemungkinan melumpuhkan kebenaran interaktif dalam perkhidmatannya. Ini akan membolehkan anda menyambung ke konsol walaupun dari mesin kopi, jika ia berjalan *nix dan mempunyai konsol itu sendiri.

Jika ada keperluan untuk saya mengupas isu ini dengan lebih terperinci dalam rangka kerja nota ini, tulis dalam ulasan. Jika kami mendapat undian yang mencukupi, saya akan menulis kemas kini mengenai topik ini.

Cara paling mudah untuk memberikan hak adalah melalui antara muka web.

  1. Hentikan contoh VM dari mana anda akan menyambung ke konsol awan kemudiannya.
  2. Buka Butiran Contoh dan klik meminda.
  3. Di bahagian paling bawah halaman, pilih skop akses tika Akses penuh kepada semua Cloud API.

    БкÑ € инÑоÑ,
    Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

  4. Simpan perubahan anda dan lancarkan contoh.

Setelah VM selesai dimuatkan, sambungkannya melalui SSH dan pastikan sambungan berlaku tanpa ralat. Gunakan arahan:

gcloud alpha cloud-shell ssh

Sambungan yang berjaya kelihatan seperti ini
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Sebarkan ke GKE

Memandangkan kami sedang berusaha dalam setiap cara yang mungkin untuk beralih sepenuhnya kepada IaC (Infrastuktur sebagai Kod), fail docker kami disimpan dalam Git. Ini di satu pihak. Dan penempatan dalam kubernetes diterangkan oleh fail yaml, yang hanya digunakan oleh tugas ini, yang juga seperti kod. Ini dari seberang. Secara umum, maksud saya, rancangannya adalah ini:

  1. Kami mengambil nilai pembolehubah BUILD_VERSION dan, secara pilihan, nilai pembolehubah yang akan dilalui ENV.
  2. Muat turun fail docker dari Git.
  3. Hasilkan yaml untuk penggunaan.
  4. Kami memuat naik kedua-dua fail ini melalui scp ke konsol awan.
  5. Kami membina bekas di sana dan menolaknya ke dalam pendaftaran Bekas
  6. Kami menggunakan fail penggunaan beban pada cuber.

Mari kita lebih spesifik. Sebaik sahaja kami mula bercakap tentang ENV, maka katakan kita perlu lulus nilai dua parameter: PARAM1 ΠΈ PARAM2. Kami menambah tugas mereka untuk penempatan, taip - Parameter Rentetan.

БкÑ € инÑоÑ,
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Kami akan menjana yaml dengan ubah hala yang mudah echo untuk memfailkan. Sudah tentu, diandaikan bahawa anda ada dalam fail docker anda PARAM1 ΠΈ PARAM2bahawa nama beban akan menjadi awesomeapp, dan bekas yang dipasang dengan aplikasi versi yang ditentukan terletak di dalamnya Pendaftaran kontena dalam perjalanan gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONJika $BUILD_VERSION baru sahaja dipilih daripada senarai juntai bawah.

Penyenaraian pasukan

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

Ejen Jenkins selepas menyambung menggunakan gcloud alpha cloud-shell ssh mod interaktif tidak tersedia, jadi kami menghantar arahan ke konsol awan menggunakan parameter --perintah.

Kami membersihkan folder rumah dalam konsol awan daripada fail docker lama:

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

Letakkan fail docker yang baru dimuat turun dalam folder rumah konsol awan menggunakan scp:

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

Kami mengumpul, menandai dan menolak bekas ke pendaftaran Bekas:

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"

Kami melakukan perkara yang sama dengan fail penempatan. Sila ambil perhatian bahawa arahan di bawah menggunakan nama rekaan bagi kluster tempat penempatan berlaku (awsm-cluster) dan nama projek (awesome-projek), di mana kluster terletak.

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"

Kami menjalankan tugas, membuka output konsol dan berharap dapat melihat pemasangan bekas yang berjaya.

БкÑ € инÑоÑ,
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Dan kemudian kejayaan penggunaan bekas yang dipasang

БкÑ € инÑоÑ,
Kami membuat tugasan penggunaan dalam GKE tanpa pemalam, SMS atau pendaftaran. Mari kita lihat di bawah jaket Jenkins

Saya sengaja mengabaikan tetapan itu Ingress. Untuk satu sebab mudah: sebaik sahaja anda menyediakannya beban kerja dengan nama yang diberikan, ia akan kekal beroperasi, tidak kira berapa banyak penempatan dengan nama ini yang anda lakukan. Nah, secara umum, ini sedikit di luar skop sejarah.

Daripada kesimpulan

Semua langkah di atas mungkin tidak boleh dilakukan, tetapi hanya memasang beberapa pemalam untuk Jenkins, muuulion mereka. Tetapi atas sebab tertentu saya tidak suka pemalam. Lebih tepat lagi, saya menggunakan mereka hanya kerana terdesak.

Dan saya hanya ingin mengambil beberapa topik baru untuk saya. Teks di atas juga merupakan cara untuk berkongsi penemuan yang saya buat semasa menyelesaikan masalah yang diterangkan pada awal-awal lagi. Berkongsi dengan mereka yang, seperti dia, sama sekali bukan serigala yang mengerikan dalam devops. Jika penemuan saya membantu sekurang-kurangnya seseorang, saya akan gembira.

Sumber: www.habr.com

Tambah komen