เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

ทุกอย่างเริ่มต้นเมื่อหัวหน้าทีมของทีมพัฒนาทีมหนึ่งของเราขอให้เราทดสอบแอปพลิเคชันใหม่ของพวกเขา ซึ่งได้รับการบรรจุในคอนเทนเนอร์เมื่อวันก่อน ฉันโพสต์มัน หลังจากนั้นประมาณ 20 นาที ก็ได้รับคำขอให้อัปเดตแอปพลิเคชัน เนื่องจากมีการเพิ่มสิ่งที่จำเป็นมากเข้าไปที่นั่น ฉันต่ออายุ หลังจากนั้นอีกสองสามชั่วโมง...ก็เดาได้ว่าจะเกิดอะไรขึ้นต่อไป...

ฉันต้องยอมรับ ฉันค่อนข้างขี้เกียจ (ฉันยอมรับก่อนหน้านี้แล้วไม่ใช่หรือ ไม่?) และเมื่อพิจารณาจากข้อเท็จจริงที่ว่าหัวหน้าทีมสามารถเข้าถึง Jenkins ซึ่งเรามี CI/CD ทั้งหมด ฉันคิดว่า: ปล่อยให้เขาปรับใช้เป็น มากเท่าที่เขาต้องการ ! ฉันจำเรื่องตลกได้: ให้ปลากับผู้ชายแล้วเขาจะกินได้หนึ่งวัน เรียกคนว่าเฟดแล้วเขาจะได้รับเฟดไปตลอดชีวิต และไป เล่นกลในการทำงานซึ่งจะสามารถปรับใช้คอนเทนเนอร์ที่มีแอปพลิเคชันของเวอร์ชันที่สร้างสำเร็จลงใน Kuber และถ่ายโอนค่าใด ๆ ไปยังมัน ENV (ปู่ของฉัน ซึ่งเป็นนักปรัชญา และเป็นครูสอนภาษาอังกฤษในอดีต ตอนนี้จะหมุนนิ้วไปที่ขมับแล้วมองฉันอย่างแสดงออกมากหลังจากอ่านประโยคนี้)

ดังนั้น ในบันทึกนี้ ฉันจะบอกคุณว่าฉันเรียนรู้ได้อย่างไร:

  1. อัปเดตงานใน Jenkins แบบไดนามิกจากงานเองหรือจากงานอื่น
  2. เชื่อมต่อกับคอนโซลคลาวด์ (Cloud Shell) จากโหนดที่ติดตั้งเอเจนต์ Jenkins
  3. ปรับใช้ภาระงานกับ Google Kubernetes Engine


จริงๆ แล้ว ฉันเป็นคนค่อนข้างไม่จริงใจเลย ระบบจะถือว่าคุณมีโครงสร้างพื้นฐานอย่างน้อยบางส่วนในระบบคลาวด์ของ Google ดังนั้นคุณจึงเป็นผู้ใช้และแน่นอนว่าคุณมีบัญชี GCP แต่นั่นไม่ใช่สิ่งที่บันทึกนี้เกี่ยวกับ

นี่คือสูตรโกงถัดไปของฉัน ฉันต้องการเขียนบันทึกดังกล่าวในกรณีเดียวเท่านั้น: ฉันประสบปัญหา ในตอนแรกฉันไม่รู้วิธีการแก้ปัญหา วิธีแก้ปัญหาไม่ใช่แบบสำเร็จรูปใน Google ดังนั้นฉันจึงค้นหาใน Google บางส่วนและในที่สุดก็แก้ไขปัญหาได้ และเพื่อว่าในอนาคต เมื่อฉันลืมไปแล้วว่าฉันทำมันยังไง ฉันไม่ต้องค้นหาทุกอย่างใน Google ทีละชิ้นอีกครั้งและรวบรวมมันเข้าด้วยกัน ฉันจึงเขียนสูตรโกงดังกล่าวให้กับตัวเอง

คำออกตัว: 1. ข้อความนี้เขียนว่า "เพื่อตัวฉันเอง" สำหรับบทบาทนี้ ปฏิบัติที่ดีที่สุด ไม่ได้ใช้ ฉันดีใจที่ได้อ่านตัวเลือก "คงจะดีกว่าถ้าทำแบบนี้" ในความคิดเห็น
2. หากส่วนที่ใส่ของโน้ตถือเป็นเกลือ ก็เหมือนกับบันทึกก่อนหน้าทั้งหมดของฉัน ส่วนนี้เป็นสารละลายเกลืออ่อน

อัปเดตการตั้งค่างานแบบไดนามิกใน Jenkins

ฉันมองเห็นคำถามของคุณ: การอัปเดตงานแบบไดนามิกเกี่ยวข้องกับอะไร? ป้อนค่าของพารามิเตอร์สตริงด้วยตนเองและไปได้เลย!

ฉันตอบ: ฉันขี้เกียจจริงๆ ฉันไม่ชอบเมื่อพวกเขาบ่น: มิชา การใช้งานขัดข้อง ทุกอย่างหายไป! คุณเริ่มค้นหา และมีการพิมพ์ผิดในค่าของพารามิเตอร์การเรียกใช้งานบางอย่าง ดังนั้นฉันจึงชอบทำทุกอย่างอย่างมีประสิทธิภาพมากที่สุด หากเป็นไปได้ที่จะป้องกันไม่ให้ผู้ใช้ป้อนข้อมูลโดยตรงโดยให้รายการค่าให้เลือกแทน ฉันจะจัดระเบียบส่วนที่เลือก

แผนคือเราสร้างงานใน Jenkins ซึ่งก่อนเปิดตัวเราสามารถเลือกเวอร์ชันจากรายการระบุค่าสำหรับพารามิเตอร์ที่ส่งไปยังคอนเทนเนอร์ผ่าน ENVจากนั้นจะรวบรวมคอนเทนเนอร์และพุชเข้าไปใน Container Registry จากนั้นคอนเทนเนอร์ก็จะถูกเปิดตัวในรูปแบบ cuber จำนวนงาน ด้วยพารามิเตอร์ที่ระบุในงาน

เราจะไม่พิจารณากระบวนการสร้างและตั้งค่างานใน Jenkins ซึ่งอยู่นอกประเด็น เราจะถือว่างานพร้อมแล้ว หากต้องการใช้รายการที่อัปเดตกับเวอร์ชันต่างๆ เราจำเป็นต้องมีสองสิ่ง: รายการแหล่งที่มาที่มีอยู่ซึ่งมีหมายเลขเวอร์ชันที่ถูกต้องตามลำดับความสำคัญ และตัวแปรเช่น พารามิเตอร์ทางเลือก ในภารกิจ ในตัวอย่างของเรา ให้ตั้งชื่อตัวแปร BUILD_VERSIONเราจะไม่พูดถึงมันอย่างละเอียด แต่ลองมาดูรายชื่อแหล่งที่มาให้ละเอียดยิ่งขึ้น

มีตัวเลือกไม่มากนัก มีสองสิ่งที่เข้ามาในใจทันที:

  • ใช้ API การเข้าถึงระยะไกลที่ Jenkins เสนอให้กับผู้ใช้
  • ขอเนื้อหาของโฟลเดอร์ที่เก็บระยะไกล (ในกรณีของเราคือ JFrog Artifactory ซึ่งไม่สำคัญ)

API การเข้าถึงระยะไกลของเจนกินส์

ตามประเพณีที่ดีเยี่ยมที่เป็นที่ยอมรับ ข้าพเจ้าขอหลีกเลี่ยงการอธิบายที่ยืดยาว
ฉันจะอนุญาตให้ตัวเองแปลเพียงส่วนหนึ่งของย่อหน้าแรกฟรีเท่านั้น หน้าแรกของเอกสาร API:

Jenkins จัดเตรียม API สำหรับการเข้าถึงฟังก์ชันการทำงานที่เครื่องอ่านได้จากระยะไกล <…> การเข้าถึงระยะไกลมีให้ในรูปแบบ REST ซึ่งหมายความว่าไม่มีจุดเริ่มต้นเดียวสำหรับคุณลักษณะทั้งหมด แต่มี URL เช่น ".../เอพีไอ/", ที่ไหน "..." หมายถึงออบเจ็กต์ที่ใช้ความสามารถของ API

กล่าวอีกนัยหนึ่ง หากงานการปรับใช้งานที่เรากำลังพูดถึงอยู่มีอยู่ที่ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_buildจากนั้นสามารถดูนกหวีด API สำหรับงานนี้ได้ที่ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

ต่อไปเรามีตัวเลือกว่าจะรับเอาต์พุตในรูปแบบใด เรามาเน้นที่ XML กันดีกว่า เนื่องจาก API อนุญาตให้กรองได้ในกรณีนี้เท่านั้น

เรามาลองรับรายการการรันงานทั้งหมดกัน เราสนใจเฉพาะชื่อชุดประกอบ (ชื่อที่แสดง) และผลลัพธ์ของมัน (ผล):

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

มันใช้งานได้หรือ

ตอนนี้เรามากรองเฉพาะการรันที่ลงเอยด้วยผลลัพธ์เท่านั้น ความสำเร็จ. ลองใช้ข้อโต้แย้งกัน &ไม่รวม และในฐานะพารามิเตอร์เราจะส่งเส้นทางไปยังค่าที่ไม่เท่ากับ ความสำเร็จ. ใช่ ๆ. ลบสองเท่าคือคำสั่ง เรายกเว้นทุกสิ่งที่ไม่สนใจเรา:

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

ภาพหน้าจอของรายการสำเร็จ
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

เพื่อความสนุกสนาน ตรวจสอบให้แน่ใจว่าตัวกรองไม่ได้หลอกลวงเรา (ตัวกรองไม่เคยโกหก!) และแสดงรายการตัวกรองที่ "ไม่สำเร็จ":

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

ภาพหน้าจอของรายการที่ไม่สำเร็จ
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

รายการเวอร์ชันจากโฟลเดอร์บนเซิร์ฟเวอร์ระยะไกล

มีวิธีที่สองในการรับรายการเวอร์ชัน ฉันชอบมันมากกว่าการเข้าถึง Jenkins API เพราะหากสร้างแอปพลิเคชันสำเร็จ แสดงว่าแอปพลิเคชันได้รับการบรรจุและวางไว้ในที่เก็บข้อมูลในโฟลเดอร์ที่เหมาะสม เช่นเดียวกับพื้นที่เก็บข้อมูลเป็นที่เก็บข้อมูลเริ่มต้นของแอปพลิเคชันเวอร์ชันที่ใช้งานได้ ชอบ. ลองถามเขาดูว่ามีเวอร์ชันใดบ้างในการจัดเก็บ เราจะขด grep และ awk โฟลเดอร์ระยะไกล ถ้าใครสนใจ oneliner ก็อยู่ใต้สปอยล์ครับ

คำสั่งบรรทัดเดียว
โปรดทราบสองสิ่ง: ฉันส่งรายละเอียดการเชื่อมต่อในส่วนหัวและฉันไม่ต้องการเวอร์ชันทั้งหมดจากโฟลเดอร์ และฉันเลือกเฉพาะเวอร์ชันที่สร้างขึ้นภายในหนึ่งเดือน แก้ไขคำสั่งให้เหมาะกับความเป็นจริงและความต้องการของคุณ:

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

เราพบแหล่งที่มาของรายการเวอร์ชันแล้ว ตอนนี้เรามารวมรายการผลลัพธ์เข้ากับงานกันดีกว่า สำหรับฉัน วิธีแก้ปัญหาที่ชัดเจนคือการเพิ่มขั้นตอนในงานสร้างแอปพลิเคชัน ขั้นตอนที่จะดำเนินการหากผลลัพธ์คือ "ความสำเร็จ"

เปิดการตั้งค่างานแอสเซมบลีแล้วเลื่อนไปที่ด้านล่างสุด คลิกที่ปุ่ม: เพิ่มขั้นตอนการสร้าง -> ขั้นตอนแบบมีเงื่อนไข (เดี่ยว). ในการตั้งค่าขั้นตอน ให้เลือกเงื่อนไข สถานะการสร้างปัจจุบันให้ตั้งค่า ความสำเร็จการกระทำที่จะดำเนินการหากสำเร็จ รันคำสั่งเชลล์.

และตอนนี้ส่วนที่สนุก Jenkins เก็บการกำหนดค่างานไว้ในไฟล์ ในรูปแบบ XML ระหว่างทาง http://путь-до-задания/config.xml ดังนั้น คุณสามารถดาวน์โหลดไฟล์การกำหนดค่า แก้ไขได้ตามความจำเป็น และนำกลับมาไว้ในที่ที่คุณได้รับ

โปรดจำไว้ว่าเราได้ตกลงไว้ข้างต้นว่าเราจะสร้างพารามิเตอร์สำหรับรายการเวอร์ชัน BUILD_VERSION?

มาดาวน์โหลดไฟล์การกำหนดค่าและดูข้างในกัน เพียงเพื่อให้แน่ใจว่าพารามิเตอร์อยู่ในตำแหน่งและเป็นประเภทที่ต้องการ

ภาพหน้าจอใต้สปอยเลอร์

ส่วน config.xml ของคุณควรมีลักษณะเหมือนกัน ยกเว้นว่าเนื้อหาขององค์ประกอบตัวเลือกยังขาดหายไป
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

คุณแน่ใจไหม? แค่นั้นแหละ มาเขียนสคริปต์ที่จะดำเนินการหากการสร้างสำเร็จ
สคริปต์จะได้รับรายการเวอร์ชัน ดาวน์โหลดไฟล์กำหนดค่า เขียนรายการเวอร์ชันลงในตำแหน่งที่เราต้องการ จากนั้นจึงนำกลับคืน ใช่. ถูกตัอง. เขียนรายการเวอร์ชันใน XML ในตำแหน่งที่มีรายการเวอร์ชันอยู่แล้ว (จะอยู่ในอนาคตหลังจากเปิดตัวสคริปต์ครั้งแรก) ฉันรู้ว่ายังมีแฟนตัวยงของการแสดงออกเป็นประจำในโลกนี้ ฉันไม่ได้เป็นของพวกเขา กรุณาติดตั้ง xmlstarler.xml ไปยังเครื่องที่จะแก้ไขการกำหนดค่า สำหรับฉันดูเหมือนว่านี่ไม่ใช่ราคาที่ต้องจ่ายมากนักเพื่อหลีกเลี่ยงการแก้ไข XML โดยใช้ sed

ภายใต้สปอยเลอร์ ฉันนำเสนอโค้ดที่ดำเนินการตามลำดับข้างต้นอย่างครบถ้วน

เขียนรายการเวอร์ชันจากโฟลเดอร์บนเซิร์ฟเวอร์ระยะไกลไปยังการกำหนดค่า

#!/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 และคุณขี้เกียจเหมือนฉัน ใต้สปอยเลอร์ก็เป็นรหัสเดียวกัน แต่เป็นรายการจาก Jenkins:

เขียนรายการเวอร์ชันจาก Jenkins ไปยังการกำหนดค่า
เพียงจำไว้ว่า: ชื่อแอสเซมบลีของฉันประกอบด้วยหมายเลขลำดับและหมายเลขเวอร์ชัน คั่นด้วยเครื่องหมายทวิภาค ดังนั้น 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

ตามทฤษฎีแล้ว หากคุณได้ทดสอบโค้ดที่เขียนตามตัวอย่างข้างต้นแล้ว ในงานการปรับใช้งาน คุณควรมีรายการแบบเลื่อนลงพร้อมเวอร์ชันต่างๆ อยู่แล้ว เหมือนในภาพแคปหน้าจอใต้สปอยล์เลย

รายการเวอร์ชันที่สมบูรณ์ถูกต้อง
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

หากทุกอย่างได้ผล ให้คัดลอกและวางสคริปต์ลงไป รันคำสั่งเชลล์ และบันทึกการเปลี่ยนแปลง

กำลังเชื่อมต่อกับคลาวด์เชลล์

เรามีนักสะสมในตู้คอนเทนเนอร์ เราใช้ Ansible เป็นเครื่องมือจัดส่งแอปพลิเคชันและเครื่องมือจัดการการกำหนดค่า ดังนั้น เมื่อพูดถึงการสร้างคอนเทนเนอร์ จึงมีสามตัวเลือกที่ควรคำนึงถึง: ติดตั้ง Docker ใน Docker, ติดตั้ง Docker บนเครื่องที่ใช้ Ansible หรือสร้างคอนเทนเนอร์ในคอนโซลคลาวด์ เราตกลงที่จะไม่พูดถึงปลั๊กอินสำหรับเจนกินส์ในบทความนี้ จดจำ?

ฉันตัดสินใจแล้ว: เนื่องจากสามารถรวบรวมคอนเทนเนอร์ "นอกกรอบ" ในคอนโซลคลาวด์ได้ แล้วทำไมต้องกังวล? รักษาความสะอาดใช่มั้ย? ฉันต้องการรวบรวมคอนเทนเนอร์ Jenkins ในคอนโซลระบบคลาวด์ จากนั้นจึงเปิดใช้งานลงในคิวบ์จากที่นั่น นอกจากนี้ Google ยังมีช่องทางที่หลากหลายภายในโครงสร้างพื้นฐาน ซึ่งจะส่งผลดีต่อความเร็วในการปรับใช้

หากต้องการเชื่อมต่อกับคอนโซลคลาวด์ คุณต้องมีสองสิ่ง: จีคลาวด์ และสิทธิในการเข้าถึง Google Cloud API สำหรับอินสแตนซ์ VM ที่จะทำการเชื่อมต่อเดียวกันนี้

สำหรับผู้ที่วางแผนจะเชื่อมต่อโดยไม่ได้เชื่อมต่อจาก Google Cloud เลย
Google อนุญาตให้มีความเป็นไปได้ในการปิดใช้งานการให้สิทธิ์แบบโต้ตอบในบริการของตน สิ่งนี้จะช่วยให้คุณสามารถเชื่อมต่อกับคอนโซลได้แม้กระทั่งจากเครื่องชงกาแฟ หากเครื่องนั้นรัน *nix และมีคอนโซลด้วย

หากจำเป็นต้องกล่าวถึงปัญหานี้โดยละเอียดเพิ่มเติมภายในกรอบของบันทึกนี้ โปรดเขียนความคิดเห็นไว้ หากฉันได้รับคะแนนโหวตเพียงพอ ฉันจะเขียนข้อมูลอัปเดตในหัวข้อนี้

วิธีที่ง่ายที่สุดในการให้สิทธิ์คือผ่านทางเว็บอินเตอร์เฟส

  1. หยุดอินสแตนซ์ VM ที่คุณจะเชื่อมต่อกับคอนโซลระบบคลาวด์ในภายหลัง
  2. เปิดรายละเอียดอินสแตนซ์แล้วคลิก เปลี่ยนแปลง.
  3. ที่ด้านล่างสุดของหน้า ให้เลือกขอบเขตการเข้าถึงอินสแตนซ์ สิทธิ์เข้าถึง Cloud API ทั้งหมดโดยสมบูรณ์.

    ภาพหน้าจอ
    เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

  4. บันทึกการเปลี่ยนแปลงของคุณและเปิดใช้งานอินสแตนซ์

เมื่อ VM โหลดเสร็จแล้ว ให้เชื่อมต่อผ่าน SSH และตรวจสอบให้แน่ใจว่าการเชื่อมต่อเกิดขึ้นโดยไม่มีข้อผิดพลาด ใช้คำสั่ง:

gcloud alpha cloud-shell ssh

การเชื่อมต่อที่สำเร็จจะมีลักษณะดังนี้
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

ทำให้ใช้งานได้กับ GKE

เนื่องจากเราพยายามทุกวิถีทางที่เป็นไปได้เพื่อเปลี่ยนไปใช้ IaC (โครงสร้างพื้นฐานเป็นโค้ด) โดยสมบูรณ์ ไฟล์นักเทียบท่าของเราจึงถูกจัดเก็บไว้ใน Git นี่คือด้านหนึ่ง และการปรับใช้ใน kubernetes นั้นอธิบายด้วยไฟล์ yaml ซึ่งถูกใช้โดยงานนี้เท่านั้น ซึ่งตัวมันเองก็เหมือนกับโค้ดเช่นกัน นี่คือจากอีกด้านหนึ่ง โดยทั่วไปฉันหมายถึงแผนคือ:

  1. เรารับค่าของตัวแปร BUILD_VERSION และทางเลือกคือค่าของตัวแปรที่จะถูกส่งผ่าน ENV.
  2. ดาวน์โหลดไฟล์ docker จาก Git
  3. สร้าง yaml สำหรับการปรับใช้
  4. เราอัปโหลดทั้งสองไฟล์นี้ผ่าน scp ไปยังคอนโซลคลาวด์
  5. เราสร้างคอนเทนเนอร์ที่นั่นและพุชมันเข้าไปในรีจีสทรีคอนเทนเนอร์
  6. เราใช้ไฟล์การปรับใช้โหลดกับคิวเบอร์

เจาะจงมากขึ้น เมื่อเราเริ่มพูดถึง ENVจากนั้นสมมติว่าเราต้องส่งค่าของพารามิเตอร์สองตัว: พารามิเตอร์1 и พารามิเตอร์2. เราเพิ่มงานสำหรับการปรับใช้ประเภท - พารามิเตอร์สตริง.

ภาพหน้าจอ
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

เราจะสร้าง yaml ด้วยการเปลี่ยนเส้นทางแบบง่ายๆ เสียงสะท้อน เพื่อยื่น แน่นอนว่าจะถือว่าคุณมีอยู่ใน dockerfile ของคุณ พารามิเตอร์1 и พารามิเตอร์2ว่าชื่อโหลดจะเป็น แอพที่ยอดเยี่ยมและคอนเทนเนอร์ที่ประกอบขึ้นพร้อมกับแอปพลิเคชันเวอร์ชันที่ระบุนั้นอยู่ในนั้น ทะเบียนตู้คอนเทนเนอร์ ระหว่างทาง 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 อัลฟ่าคลาวด์เชลล์ ssh โหมดโต้ตอบไม่พร้อมใช้งาน ดังนั้นเราจึงส่งคำสั่งไปยังคอนโซลคลาวด์โดยใช้พารามิเตอร์ --สั่งการ.

เราทำความสะอาดโฟลเดอร์หลักในคอนโซลคลาวด์จาก dockerfile เก่า:

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

วาง 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"

เรารันงาน เปิดคอนโซลเอาต์พุต และหวังว่าจะเห็นการประกอบคอนเทนเนอร์สำเร็จ

ภาพหน้าจอ
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

และแล้วการติดตั้งคอนเทนเนอร์ที่ประกอบก็ประสบความสำเร็จ

ภาพหน้าจอ
เราสร้างงานการทำให้ใช้งานได้ใน GKE โดยไม่ต้องใช้ปลั๊กอิน, SMS หรือการลงทะเบียน มาดูใต้แจ็กเก็ตของเจนกินส์กันดีกว่า

ฉันจงใจเพิกเฉยต่อฉากนี้ สิทธิในการเข้า. ด้วยเหตุผลง่ายๆ ประการหนึ่ง: เมื่อคุณตั้งค่าแล้ว จำนวนงาน ด้วยชื่อที่กำหนด ชื่อนี้จะยังคงใช้งานได้ ไม่ว่าคุณจะใช้งานชื่อนี้กี่ครั้งก็ตาม โดยทั่วไปแล้วนี่อยู่นอกเหนือขอบเขตของประวัติศาสตร์เล็กน้อย

แทนที่จะได้ข้อสรุป

ขั้นตอนข้างต้นทั้งหมดอาจไม่สามารถทำได้ แต่เพียงติดตั้งปลั๊กอินบางตัวสำหรับ Jenkins ซึ่งเป็น muuulion ของพวกเขา แต่ด้วยเหตุผลบางอย่างฉันไม่ชอบปลั๊กอิน แม่นยำยิ่งขึ้นฉันหันไปหาพวกเขาด้วยความสิ้นหวังเท่านั้น

และฉันก็แค่อยากหยิบหัวข้อใหม่มาให้ฉัน ข้อความข้างต้นเป็นวิธีแบ่งปันสิ่งที่ฉันค้นพบขณะแก้ไขปัญหาที่อธิบายไว้ตอนเริ่มต้น แบ่งปันให้กับผู้ที่ไม่ได้เป็นหมาป่าที่น่ากลัวเหมือนเขาเลย หากการค้นพบของฉันช่วยใครซักคนได้อย่างน้อยฉันก็ยินดี

ที่มา: will.com

เพิ่มความคิดเห็น