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:
- Kemas kini kerja dalam Jenkins secara dinamik daripada kerja itu sendiri atau daripada kerja lain;
- Sambung ke konsol awan (Cloud shell) dari nod dengan ejen Jenkins dipasang;
- 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
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
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
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
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
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
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.
- Hentikan contoh VM dari mana anda akan menyambung ke konsol awan kemudiannya.
- Buka Butiran Contoh dan klik meminda.
- Di bahagian paling bawah halaman, pilih skop akses tika Akses penuh kepada semua Cloud API.
ΓΒ‘ΓΒΊΓ β¬ ΓΒΈΓΒ½ΓΓΒΎΓ,
- 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
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:
- Kami mengambil nilai pembolehubah BUILD_VERSION dan, secara pilihan, nilai pembolehubah yang akan dilalui ENV.
- Muat turun fail docker dari Git.
- Hasilkan yaml untuk penggunaan.
- Kami memuat naik kedua-dua fail ini melalui scp ke konsol awan.
- Kami membina bekas di sana dan menolaknya ke dalam pendaftaran Bekas
- 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 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.
ΓΒ‘ΓΒΊΓ β¬ ΓΒΈΓΒ½ΓΓΒΎΓ,
Dan kemudian kejayaan penggunaan bekas yang dipasang
ΓΒ‘ΓΒΊΓ β¬ ΓΒΈΓΒ½ΓΓΒΎΓ,
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