Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Semuanya bermula ketika pimpinan tim dari salah satu tim pengembangan kami meminta kami untuk menguji aplikasi baru mereka, yang telah dimasukkan ke dalam container sehari sebelumnya. Saya mempostingnya. Setelah sekitar 20 menit, permintaan diterima untuk memperbarui aplikasi, karena telah ditambahkan hal yang sangat diperlukan di sana. saya memperbarui. Setelah beberapa jam... yah, Anda bisa menebak apa yang mulai terjadi selanjutnya...

Harus saya akui, saya cukup malas (bukankah saya sudah mengakuinya sebelumnya? Tidak?), dan mengingat fakta bahwa pimpinan tim memiliki akses ke Jenkins, di mana kita memiliki semua CI/CD, saya berpikir: biarkan dia diterapkan sebagai sebanyak yang dia mau! Saya teringat sebuah lelucon: beri seseorang seekor ikan dan dia akan makan selama sehari; panggil seseorang Fed dan dia akan diberi Fed sepanjang hidupnya. Dan pergi bermain trik di tempat kerja, yang dapat menyebarkan container yang berisi aplikasi versi apa pun yang berhasil dibuat ke dalam Kuber dan mentransfer nilai apa pun ke dalamnya ENV (Kakek saya, seorang filolog, seorang guru bahasa Inggris di masa lalu, sekarang memutar jarinya ke pelipisnya dan menatap saya dengan sangat ekspresif setelah membaca kalimat ini).

Jadi, dalam catatan ini saya akan memberi tahu Anda bagaimana saya belajar:

  1. Memperbarui pekerjaan di Jenkins secara dinamis dari pekerjaan itu sendiri atau dari pekerjaan lain;
  2. Terhubung ke konsol cloud (Cloud shell) dari node dengan agen Jenkins terinstal;
  3. Terapkan beban kerja ke Google Kubernetes Engine.


Faktanya, tentu saja saya bersikap tidak jujur. Diasumsikan bahwa Anda memiliki setidaknya sebagian infrastruktur di cloud Google, dan oleh karena itu, Anda adalah penggunanya dan, tentu saja, Anda memiliki akun GCP. Tapi bukan itu maksud dari catatan ini.

Ini adalah lembar contekan saya berikutnya. Saya hanya ingin menulis catatan seperti itu dalam satu kasus: Saya dihadapkan pada suatu masalah, awalnya saya tidak tahu bagaimana menyelesaikannya, solusinya tidak siap pakai di Google, jadi saya mencari di Google sebagian dan akhirnya menyelesaikan masalah. Dan agar di kemudian hari, ketika saya lupa bagaimana saya melakukannya, saya tidak perlu lagi mencari semuanya di Google sepotong demi sepotong dan menyusunnya bersama-sama, saya menulis sendiri lembar contekan tersebut.

Penolakan: 1. Catatan itu ditulis β€œuntuk diriku sendiri”, untuk peran tersebut praktek terbaik tidak berlaku. Saya senang membaca opsi β€œakan lebih baik melakukannya dengan cara ini” di komentar.
2. Jika bagian nota yang diaplikasikan dianggap garam, maka seperti semua nota saya sebelumnya, nota ini adalah larutan garam lemah.

Memperbarui pengaturan pekerjaan di Jenkins secara dinamis

Saya memperkirakan pertanyaan Anda: apa hubungannya pembaruan pekerjaan dinamis dengan itu? Masukkan nilai parameter string secara manual dan berangkatlah!

Saya jawab: Saya malas banget, saya tidak suka kalau mereka mengeluh: Misha, deployment-nya crash, semuanya hilang! Anda mulai mencari, dan ada kesalahan ketik pada nilai beberapa parameter peluncuran tugas. Oleh karena itu, saya lebih memilih melakukan segala sesuatunya seefisien mungkin. Jika memungkinkan untuk mencegah pengguna memasukkan data secara langsung dengan memberikan daftar nilai untuk dipilih, maka saya mengatur pilihannya.

Rencananya begini: kita membuat pekerjaan di Jenkins, di mana, sebelum diluncurkan, kita bisa memilih versi dari daftar, menentukan nilai parameter yang diteruskan ke container melalui ENV, lalu ia mengumpulkan kontainer dan memasukkannya ke dalam Container Registry. Kemudian dari situ wadah diluncurkan dalam cuber as beban kerja dengan parameter yang ditentukan dalam pekerjaan.

Kami tidak akan mempertimbangkan proses pembuatan dan pengaturan pekerjaan di Jenkins, ini di luar topik. Kami berasumsi bahwa tugas sudah siap. Untuk mengimplementasikan daftar yang diperbarui dengan versi, kita memerlukan dua hal: daftar sumber yang ada dengan nomor versi yang valid secara apriori dan variabel seperti Parameter pilihan dalam tugas. Dalam contoh kita, biarkan variabel diberi nama BUILD_VERSION, kami tidak akan membahasnya secara detail. Tapi mari kita lihat lebih dekat daftar sumbernya.

Tidak banyak pilihan. Dua hal segera terlintas dalam pikiran:

  • Gunakan API akses jarak jauh yang ditawarkan Jenkins kepada penggunanya;
  • Minta isi folder repositori jarak jauh (dalam kasus kami ini adalah JFrog Artifactory, yang tidak penting).

API akses jarak jauh Jenkins

Menurut tradisi baik yang sudah ada, saya lebih suka menghindari penjelasan panjang lebar.
Saya hanya mengizinkan diri saya menerjemahkan sebagian paragraf pertama secara gratis halaman pertama dokumentasi API:

Jenkins menyediakan API untuk akses jarak jauh yang dapat dibaca mesin ke fungsinya. <…> Akses jarak jauh ditawarkan dengan gaya seperti REST. Artinya, tidak ada satu titik masuk ke semua fitur, melainkan URL seperti ".../api/", Di mana "..." berarti objek yang kemampuan API-nya diterapkan.

Dengan kata lain, jika tugas penerapan yang sedang kita bicarakan tersedia di http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, lalu peluit API untuk tugas ini tersedia di http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Selanjutnya, kita mempunyai pilihan dalam bentuk apa untuk menerima output. Mari fokus pada XML, karena API hanya mengizinkan pemfilteran dalam kasus ini.

Mari kita coba mendapatkan daftar semua pekerjaan yang dijalankan. Kami hanya tertarik pada nama perakitan (nama tampilan) dan hasilnya (mengakibatkan):

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

Got it?

Sekarang mari kita memfilter hanya proses yang menghasilkan hasil KEBERHASILAN. Mari kita gunakan argumennya &mengecualikan dan sebagai parameter kita akan meneruskannya ke jalur yang nilainya tidak sama KEBERHASILAN. Ya ya. Negatif ganda adalah sebuah pernyataan. Kami mengecualikan segala sesuatu yang tidak menarik bagi kami:

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

Tangkapan layar daftar yang berhasil
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Nah, hanya untuk bersenang-senang, mari kita pastikan bahwa filter tersebut tidak menipu kita (filter tidak pernah berbohong!) dan tampilkan daftar yang β€œtidak berhasil”:

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

Cuplikan layar dari daftar yang tidak berhasil
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Daftar versi dari folder di server jauh

Ada cara kedua untuk mendapatkan daftar versi. Saya lebih menyukainya daripada mengakses Jenkins API. Nah, karena jika aplikasi berhasil dibangun berarti sudah dipaket dan ditempatkan di repositori di folder yang sesuai. Misalnya, repositori adalah penyimpanan default dari versi aplikasi yang berfungsi. Menyukai. Baiklah, mari kita tanyakan padanya versi apa yang ada di penyimpanan. Kami akan menggulung, mengambil, dan awk folder jarak jauh. Kalau ada yang tertarik dengan onelinernya, maka itu ada di bawah spoiler.

Perintah satu baris
Harap perhatikan dua hal: Saya meneruskan detail koneksi di header dan saya tidak memerlukan semua versi dari folder, dan saya hanya memilih versi yang dibuat dalam waktu satu bulan. Edit perintah agar sesuai dengan kenyataan dan kebutuhan 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[^/]+' )

Menyiapkan pekerjaan dan file konfigurasi pekerjaan di Jenkins

Kami menemukan sumber daftar versinya. Sekarang mari kita gabungkan daftar yang dihasilkan ke dalam tugas. Bagi saya, solusi yang jelas adalah menambahkan langkah dalam tugas pembuatan aplikasi. Langkah yang akan dijalankan jika hasilnya β€œsukses”.

Buka pengaturan tugas perakitan dan gulir ke bagian paling bawah. Klik pada tombol: Tambahkan langkah build -> Langkah bersyarat (tunggal). Di pengaturan langkah, pilih kondisi Status pembangunan saat ini, tetapkan nilainya KEBERHASILAN, tindakan yang akan dilakukan jika berhasil Jalankan perintah shell.

Dan sekarang bagian yang menyenangkan. Jenkins menyimpan konfigurasi pekerjaan dalam file. Dalam format XML. Sepanjang jalan http://ΠΏΡƒΡ‚ΡŒ-Π΄ΠΎ-задания/config.xml Oleh karena itu, Anda dapat mengunduh file konfigurasi, mengeditnya seperlunya, dan mengembalikannya ke tempat Anda mendapatkannya.

Ingat, kami sepakat di atas bahwa kami akan membuat parameter untuk daftar versi BUILD_VERSION?

Mari unduh file konfigurasi dan lihat di dalamnya. Hanya untuk memastikan bahwa parameternya ada dan jenisnya diinginkan.

Tangkapan layar di bawah spoiler.

Fragmen config.xml Anda akan terlihat sama. Kecuali isi elemen pilihannya belum hilang
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Apa kamu yakin? Itu saja, mari kita tulis skrip yang akan dieksekusi jika build berhasil.
Script akan menerima daftar versi, mendownload file konfigurasi, menulis daftar versi ke dalamnya di tempat yang kita butuhkan, dan kemudian mengembalikannya. Ya. Itu benar. Tulis daftar versi dalam XML di tempat yang sudah ada daftar versinya (akan terjadi di masa mendatang, setelah peluncuran pertama skrip). Saya tahu masih ada penggemar setia ekspresi reguler di dunia. Saya bukan milik mereka. Silakan instal xmlstarler ke mesin tempat konfigurasi akan diedit. Menurut saya, ini bukan harga mahal yang harus dibayar untuk menghindari pengeditan XML dengan sed.

Di bawah spoiler, saya menyajikan kode yang menjalankan urutan di atas secara keseluruhan.

Tulis daftar versi dari folder di server 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 opsi untuk mendapatkan versi dari Jenkins dan Anda sama malasnya dengan saya, maka di bawah spoiler ada kode yang sama, tetapi daftar dari Jenkins:

Tulis daftar versi dari Jenkins ke konfigurasi
Ingatlah ini: nama Majelis saya terdiri dari nomor urut dan nomor versi, dipisahkan oleh titik dua. Oleh karena itu, awk memotong bagian yang tidak perlu. Untuk Anda sendiri, ubah baris ini sesuai dengan kebutuhan 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 kode yang ditulis berdasarkan contoh di atas, maka dalam tugas penerapan Anda seharusnya sudah memiliki daftar drop-down dengan versinya. Ini seperti pada tangkapan layar di bawah spoiler.

Daftar versi yang diselesaikan dengan benar
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Jika semuanya berhasil, maka copy-paste script tersebut ke Jalankan perintah shell dan simpan perubahan.

Menghubungkan ke Cloud shell

Kami memiliki kolektor dalam wadah. Kami menggunakan Ansible sebagai alat pengiriman aplikasi dan manajer konfigurasi kami. Oleh karena itu, ketika membangun container, ada tiga opsi yang terlintas dalam pikiran: menginstal Docker di Docker, menginstal Docker di mesin yang menjalankan Ansible, atau membuat container di konsol cloud. Kami sepakat untuk tetap bungkam tentang plugin untuk Jenkins di artikel ini. Ingat?

Saya memutuskan: ya, karena container β€œout of the box” dapat dikumpulkan di konsol cloud, lalu mengapa repot-repot? Jaga kebersihannya, bukan? Saya ingin mengumpulkan kontainer Jenkins di konsol cloud, dan kemudian meluncurkannya ke dalam kubus dari sana. Selain itu, Google memiliki saluran yang sangat kaya dalam infrastrukturnya, yang akan memberikan efek menguntungkan pada kecepatan penerapan.

Untuk terhubung ke konsol cloud, Anda memerlukan dua hal: gcloud dan hak akses ke Google Cloud API untuk instance VM yang akan digunakan untuk membuat koneksi yang sama.

Bagi mereka yang berencana untuk terhubung bukan dari Google cloud sama sekali
Google mengizinkan kemungkinan menonaktifkan otorisasi interaktif di layanannya. Ini akan memungkinkan Anda untuk terhubung ke konsol bahkan dari mesin kopi, jika konsol tersebut menjalankan *nix dan memiliki konsol itu sendiri.

Jika saya perlu membahas masalah ini lebih detail dalam kerangka catatan ini, tulis di komentar. Jika kami mendapat cukup suara, saya akan menulis pembaruan tentang topik ini.

Cara termudah untuk memberikan hak adalah melalui antarmuka web.

  1. Hentikan instance VM yang nantinya akan Anda sambungkan ke konsol cloud.
  2. Buka Detail Instans dan klik merubah.
  3. Di bagian paling bawah halaman, pilih cakupan akses instans Akses penuh ke semua Cloud API.

    Tangkapan layar
    Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

  4. Simpan perubahan Anda dan luncurkan instance.

Setelah VM selesai dimuat, sambungkan melalui SSH dan pastikan koneksi terjadi tanpa kesalahan. Gunakan perintah:

gcloud alpha cloud-shell ssh

Koneksi yang berhasil terlihat seperti ini
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Terapkan ke GKE

Karena kami berusaha sekuat tenaga untuk sepenuhnya beralih ke IaC (Infrastruktur sebagai Kode), file buruh pelabuhan kami disimpan di Git. Ini di satu sisi. Dan penerapan di kubernetes dijelaskan oleh file yaml, yang hanya digunakan oleh tugas ini, yang juga seperti kode. Ini dari sisi lain. Secara umum, maksud saya, rencananya begini:

  1. Kami mengambil nilai variabel BUILD_VERSION dan, secara opsional, nilai variabel yang akan dilewati ENV.
  2. Unduh file galangan dari Git.
  3. Hasilkan yaml untuk penerapan.
  4. Kami mengunggah kedua file ini melalui scp ke konsol cloud.
  5. Kami membangun sebuah container di sana dan memasukkannya ke dalam registri Container
  6. Kami menerapkan file penerapan beban ke cuber.

Mari kita lebih spesifik. Begitu kami mulai membicarakannya ENV, maka misalkan kita perlu meneruskan nilai dari dua parameter: PARAM1 ΠΈ PARAM2. Kami menambahkan tugas mereka untuk penerapan, ketik - Parameter Tali.

Tangkapan layar
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Kami akan menghasilkan yaml dengan pengalihan sederhana gema untuk mengajukan. Tentu saja diasumsikan bahwa Anda memiliki file galangan Anda PARAM1 ΠΈ PARAM2bahwa nama bebannya adalah aplikasi luar biasa, dan wadah rakitan dengan aplikasi versi yang ditentukan terletak di dalamnya Registri kontainer sepanjang jalan gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONDimana $BUILD_VERSION baru saja dipilih dari daftar drop-down.

Daftar tim

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

Agen Jenkins setelah terhubung menggunakan gcloud alpha cloud-shell ssh mode interaktif tidak tersedia, jadi kami mengirimkan perintah ke konsol cloud menggunakan parameter --memerintah.

Kami membersihkan folder home di cloud console dari dockerfile lama:

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

Tempatkan dockerfile yang baru diunduh di folder beranda konsol cloud menggunakan scp:

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

Kami mengumpulkan, memberi tag, dan memasukkan kontainer ke registri Kontainer:

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 hal yang sama dengan file penerapan. Harap perhatikan bahwa perintah di bawah ini menggunakan nama kluster fiktif tempat penerapan terjadi (cluster awsm) dan nama proyek (proyek yang luar biasa), di mana cluster berada.

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 keluaran konsol dan berharap melihat perakitan wadah berhasil.

Tangkapan layar
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Dan kemudian keberhasilan penerapan wadah rakitan

Tangkapan layar
Kami membuat tugas penerapan di GKE tanpa plugin, SMS, atau registrasi. Mari kita intip di balik jaket Jenkins

Saya sengaja mengabaikan settingnya Jalan masuk. Untuk satu alasan sederhana: setelah Anda mengaturnya beban kerja dengan nama tertentu, ini akan tetap beroperasi, tidak peduli berapa banyak penerapan dengan nama ini yang Anda lakukan. Secara umum, ini sedikit di luar cakupan sejarah.

Alih-alih kesimpulan

Semua langkah di atas mungkin tidak dapat dilakukan, tetapi cukup menginstal beberapa plugin untuk Jenkins, muuulionnya. Tapi entah kenapa saya tidak suka plugin. Lebih tepatnya, saya menggunakan mereka hanya karena putus asa.

Dan saya hanya ingin mengambil topik baru untuk saya. Teks di atas juga merupakan cara untuk berbagi temuan yang saya buat saat memecahkan masalah yang dijelaskan di awal. Berbagilah dengan mereka yang, seperti dia, sama sekali bukan serigala yang mengerikan dalam hal devops. Jika temuan saya membantu setidaknya seseorang, saya akan senang.

Sumber: www.habr.com

Tambah komentar