همه چیز از آنجا شروع شد که سرپرست تیم یکی از تیم های توسعه ما از ما خواست تا برنامه جدید آنها را که روز قبل کانتینری شده بود آزمایش کنیم. من آن را پست کردم. بعد از حدود 20 دقیقه درخواست به روز رسانی اپلیکیشن دریافت شد، زیرا یک مورد بسیار ضروری در آنجا اضافه شده بود. تمدید کردم بعد از یکی دو ساعت دیگر...خب، می توانید حدس بزنید که بعد از آن چه اتفاقی افتاد...
باید اعتراف کنم، من کاملا تنبل هستم (آیا قبلاً این را اعتراف نکردم؟ نه؟)، و با توجه به این واقعیت که رهبران تیم به جنکینز دسترسی دارند، که در آن همه CI/CD داریم، فکر کردم: اجازه دهید او به عنوان مستقر شود. آنقدر که او می خواهد! یاد یک لطیفه افتادم: به یک مرد ماهی بدهید تا یک روز بخورد. یک نفر را فدرال رزرو کنید و او تمام عمرش فدرال خواهد بود. و رفت کلاهبرداری در کار، که می تواند یک کانتینر حاوی برنامه هر نسخه با موفقیت ساخته شده را در Kuber مستقر کند و هر مقدار را به آن منتقل کند. ENV (پدربزرگم، فیلولوژیست، معلم زبان انگلیسی در گذشته، اکنون پس از خواندن این جمله، انگشت خود را به سمت شقیقهاش میچرخاند و به من نگاه میکند).
بنابراین، در این یادداشت به شما خواهم گفت که چگونه یاد گرفتم:
- به طور پویا مشاغل در جنکینز را از خود شغل یا از مشاغل دیگر به روز کنید.
- با نصب عامل جنکینز از یک گره به کنسول ابری (پوسته ابری) متصل شوید.
- بار کاری را در Google Kubernetes Engine مستقر کنید.
در واقع، من البته تا حدودی ناصادق هستم. فرض بر این است که شما حداقل بخشی از زیرساخت را در ابر گوگل دارید و بنابراین کاربر آن هستید و البته یک حساب GCP دارید. اما موضوع این یادداشت نیست.
این برگه تقلب بعدی من است. من فقط می خواهم در یک مورد چنین یادداشت هایی بنویسم: من با مشکلی مواجه شدم، در ابتدا نمی دانستم چگونه آن را حل کنم، راه حل به صورت آماده در گوگل جستجو نشده بود، بنابراین آن را در قسمت هایی در گوگل جستجو کردم و در نهایت مشکل را حل کردم. و برای اینکه در آینده، وقتی یادم میرود چگونه این کار را انجام دادهام، مجبور نباشم دوباره همه چیز را تکه تکه در گوگل جستجو کنم و آنها را جمعآوری کنم، برای خودم چنین برگههای تقلبی مینویسم.
سلب مسئولیت: 1. یادداشت "برای خودم"، برای نقش نوشته شده بود بهترین تمرین صدق نمی کند. من خوشحالم که گزینه های "بهتر بود اینطور انجام می شد" را در نظرات می خوانم.
2. اگر قسمت اعمال شده نت نمک در نظر گرفته می شود، پس مانند تمام نت های قبلی من، این یک محلول نمک ضعیف است.
بهروزرسانی پویا تنظیمات کار در جنکینز
من سوال شما را پیش بینی می کنم: به روز رسانی پویا شغل چه ربطی به آن دارد؟ مقدار پارامتر رشته را به صورت دستی وارد کنید و ادامه دهید!
من پاسخ می دهم: من واقعاً تنبل هستم، دوست ندارم وقتی شکایت می کنند: میشا، استقرار در حال خراب شدن است، همه چیز از بین رفته است! شما شروع به جستجو می کنید، و یک اشتباه تایپی در مقدار پارامتر راه اندازی کار وجود دارد. بنابراین، من ترجیح می دهم همه چیز را تا حد امکان کارآمد انجام دهم. اگر بتوانید با دادن لیستی از مقادیر برای انتخاب، از وارد کردن مستقیم داده توسط کاربر جلوگیری کنید، انتخاب را سازماندهی می کنم.
طرح به این صورت است: ما یک شغل در Jenkins ایجاد می کنیم که در آن، قبل از راه اندازی، می توانیم یک نسخه را از لیست انتخاب کنیم، مقادیری را برای پارامترهای ارسال شده به کانتینر از طریق تعیین کنیم. ENV، سپس ظرف را جمع آوری می کند و آن را به رجیستری کانتینر فشار می دهد. سپس از آنجا ظرف به شکل cuber پرتاب می شود حجم کار با پارامترهای مشخص شده در کار.
ما روند ایجاد و راه اندازی شغل در جنکینز را در نظر نخواهیم گرفت، این خارج از موضوع است. ما فرض می کنیم که کار آماده است. برای پیاده سازی یک لیست به روز شده با نسخه ها، به دو چیز نیاز داریم: یک لیست منبع موجود با شماره نسخه های معتبر قبلی و یک متغیر مانند پارامتر انتخاب در وظیفه در مثال ما، اجازه دهید متغیر نامگذاری شود BUILD_VERSION، به تفصیل به آن نمی پردازیم. اما بیایید نگاهی دقیق تر به فهرست منبع بیندازیم.
گزینه های زیادی وجود ندارد. دو چیز بلافاصله به ذهنم خطور کرد:
- از API دسترسی از راه دور که Jenkins به کاربران خود ارائه می دهد استفاده کنید.
- محتویات پوشه مخزن راه دور را درخواست کنید (در مورد ما این JFrog Artifactory است که مهم نیست).
API دسترسی از راه دور جنکینز
طبق سنت عالی ثابت شده، ترجیح می دهم از توضیحات طولانی اجتناب کنم.
من فقط به خودم اجازه میدهم که یک قطعه از پاراگراف اول را آزاد کنم
جنکینز یک API برای دسترسی از راه دور قابل خواندن توسط ماشین به عملکرد آن ارائه می دهد. <…> دسترسی از راه دور به سبک REST ارائه می شود. این به این معنی است که هیچ نقطه ورودی واحدی برای همه ویژگی ها وجود ندارد، بلکه یک URL مانند ".../api/"، جایی که "..." به معنای شیئی است که قابلیت های 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']
اسکرین شات از لیست موفق
خوب، فقط برای سرگرمی، بیایید مطمئن شویم که فیلتر ما را فریب نداده است (فیلترها هرگز دروغ نمی گویند!) و لیستی از موارد "ناموفق" را نمایش دهیم:
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']
اسکرین شات از لیست افراد ناموفق
لیست نسخه های یک پوشه در یک سرور راه دور
راه دومی برای دریافت لیست نسخه ها وجود دارد. من آن را حتی بیشتر از دسترسی به 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[^/]+' )
راه اندازی jobs و فایل پیکربندی کار در Jenkins
ما منبع لیست نسخه ها را فهمیدیم. بیایید اکنون لیست به دست آمده را با کار ترکیب کنیم. برای من، راه حل واضح اضافه کردن یک مرحله در کار ساخت اپلیکیشن بود. مرحله ای که اگر نتیجه "موفقیت" بود، اجرا می شد.
تنظیمات کار اسمبلی را باز کنید و به پایین بروید. روی دکمه ها کلیک کنید: افزودن مرحله ساخت -> مرحله شرطی (تک). در تنظیمات مرحله، شرط را انتخاب کنید وضعیت ساخت فعلی، مقدار را تنظیم کنید موفقیت، اقدامی که در صورت موفقیت انجام می شود دستور shell را اجرا کنید.
و حالا قسمت سرگرم کننده. جنکینز تنظیمات کار را در فایلها ذخیره میکند. در قالب XML. در طول مسیر http://путь-до-задания/config.xml
بر این اساس، میتوانید فایل پیکربندی را دانلود کنید، آن را در صورت لزوم ویرایش کنید و آن را در جایی که دریافت کردید برگردانید.
به یاد داشته باشید، ما در بالا توافق کردیم که یک پارامتر برای لیست نسخه ها ایجاد کنیم BUILD_VERSION?
بیایید فایل پیکربندی را دانلود کنیم و داخل آن را نگاه کنیم. فقط برای اینکه مطمئن شوید پارامتر در جای خود و از نوع دلخواه است.
اسکرین شات زیر اسپویلر.
قطعه config.xml شما باید یکسان باشد. با این تفاوت که هنوز محتویات عنصر انتخاب وجود ندارد
مطمئنی؟ تمام است، بیایید یک اسکریپت بنویسیم که در صورت موفقیت آمیز بودن ساخت، اجرا شود.
اسکریپت لیستی از نسخه ها را دریافت می کند، فایل پیکربندی را دانلود می کند، لیست نسخه ها را در جایی که ما نیاز داریم در آن می نویسد و سپس آن را برمی گرداند. آره. درست است. فهرستی از نسخهها را در XML در جایی بنویسید که از قبل فهرستی از نسخهها وجود دارد (در آینده، پس از اولین راهاندازی اسکریپت خواهد بود). من می دانم که هنوز هم طرفداران سرسخت عبارات منظم در جهان وجود دارد. من به آنها تعلق ندارم. لطفا نصب کنید
در زیر اسپویلر، کدی را ارائه می کنم که دنباله فوق را به طور کامل انجام می دهد.
لیستی از نسخه ها را از یک پوشه در سرور راه دور به پیکربندی بنویسید
#!/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
اگر گزینه دریافت نسخه از جنکینز را ترجیح می دهید و به اندازه من تنبل هستید، در زیر اسپویلر همان کد وجود دارد، اما لیستی از جنکینز:
لیستی از نسخه ها از جنکینز به پیکربندی بنویسید
فقط این را در نظر داشته باشید: نام اسمبلی من شامل یک شماره دنباله و یک شماره نسخه است که با یک دونقطه از هم جدا شده اند. بر این اساس، 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
در تئوری، اگر کد نوشته شده بر اساس مثال های بالا را آزمایش کرده اید، در کار استقرار باید از قبل یک لیست کشویی با نسخه ها داشته باشید. مثل تصویر زیر اسپویلر است.
لیست نسخه ها به درستی تکمیل شده است
اگر همه چیز کار کرد، اسکریپت را در آن کپی-پیست کنید دستور shell را اجرا کنید و تغییرات را ذخیره کنید.
اتصال به پوسته ابری
ما کلکسیونرها در ظروف داریم. ما از Ansible به عنوان ابزار تحویل برنامه و مدیر پیکربندی خود استفاده می کنیم. بر این اساس، وقتی صحبت از ساخت کانتینرها می شود، سه گزینه به ذهن خطور می کند: نصب Docker در Docker، نصب Docker بر روی دستگاهی که Ansible را اجرا می کند، یا ساخت کانتینر در یک کنسول ابری. ما موافقت کردیم که در این مقاله در مورد افزونه های جنکینز سکوت کنیم. یاد آوردن؟
من تصمیم گرفتم: خوب، از آنجایی که ظروف "خارج از جعبه" را می توان در کنسول ابری جمع آوری کرد، پس چرا زحمت بکشیم؟ آن را تمیز نگه دارید، درست است؟ من میخواهم ظروف جنکینز را در کنسول ابری جمعآوری کنم و سپس آنها را از آنجا به داخل cuber راهاندازی کنم. علاوه بر این، گوگل دارای کانال های بسیار غنی در زیرساخت خود است که تأثیر مفیدی بر سرعت استقرار خواهد داشت.
برای اتصال به کنسول ابری به دو چیز نیاز دارید: gcloud و حقوق دسترسی به Google Cloud API برای مثال VM که از آن همین ارتباط برقرار خواهد شد.
برای کسانی که قصد دارند اصلاً از ابر گوگل وصل نشوند
گوگل امکان غیرفعال کردن مجوز تعاملی را در خدمات خود فراهم می کند. این به شما امکان می دهد حتی از یک دستگاه قهوه ساز به کنسول متصل شوید، اگر *nix در حال اجرا باشد و خود کنسول داشته باشد.
اگر نیاز است در چارچوب همین یادداشت به این موضوع بپردازم در نظرات بنویسید. اگر رای کافی به دست آوریم، یک به روز رسانی در مورد این موضوع می نویسم.
ساده ترین راه برای اعطای حقوق از طریق رابط وب است.
- نمونه VM را که متعاقباً از آن به کنسول ابری متصل خواهید شد، متوقف کنید.
- Instance Details را باز کرده و کلیک کنید اصلاح.
- در پایین صفحه، محدوده دسترسی نمونه را انتخاب کنید دسترسی کامل به تمام APIهای ابری.
عکس صفحه
- تغییرات خود را ذخیره کنید و نمونه را اجرا کنید.
پس از اتمام بارگذاری ماشین مجازی، از طریق SSH به آن متصل شوید و مطمئن شوید که اتصال بدون خطا انجام می شود. از دستور استفاده کنید:
gcloud alpha cloud-shell ssh
یک اتصال موفق چیزی شبیه به این است
به GKE مستقر شوید
از آنجایی که ما به هر طریق ممکن در تلاش هستیم تا به طور کامل به IaC (زیرساخت به عنوان کد) سوئیچ کنیم، فایلهای docker ما در Git ذخیره میشوند. این از یک طرف است. و استقرار در kubernetes توسط یک فایل yaml توصیف می شود که فقط توسط این وظیفه استفاده می شود که خود نیز مانند کد است. این از آن طرف است. به طور کلی منظورم این است که طرح این است:
- ما مقادیر متغیرها را می گیریم BUILD_VERSION و به صورت اختیاری، مقادیر متغیرهایی که از آنها عبور داده خواهد شد ENV.
- فایل docker را از Git دانلود کنید.
- Yaml را برای استقرار ایجاد کنید.
- ما هر دوی این فایل ها را از طریق scp در کنسول ابری آپلود می کنیم.
- ما یک کانتینر در آنجا می سازیم و آن را به رجیستری Container فشار می دهیم
- فایل استقرار بار را روی cuber اعمال می کنیم.
بیایید دقیق تر باشیم. یک بار شروع کردیم به صحبت کردن ENV، سپس فرض کنید که باید مقادیر دو پارامتر را ارسال کنیم: PARAM1 и PARAM2. ما وظیفه آنها را برای استقرار اضافه می کنیم، تایپ کنید - پارامتر رشته.
عکس صفحه
ما yaml را با یک تغییر مسیر ساده تولید خواهیم کرد از دست برای تشکیل پرونده البته فرض بر این است که شما در dockerfile خود دارید PARAM1 и PARAM2که نام بار خواهد بود برنامه عالی، و ظرف مونتاژ شده با استفاده از نسخه مشخص شده در آن قرار دارد رجیستری کانتینر در طول مسیر gcr.io/awesomeapp/wesomeapp-$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 alpha cloud-shell ssh حالت تعاملی در دسترس نیست، بنابراین دستورات را با استفاده از پارامتر به کنسول ابری ارسال می کنیم -- فرمان.
ما پوشه خانه را در کنسول ابری از dockerfile قدیمی پاک می کنیم:
gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"
فایل docker را که تازه دانلود شده است در پوشه اصلی کنسول ابری با استفاده از scp قرار دهید:
gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~
ما ظرف را جمعآوری میکنیم، برچسبگذاری میکنیم و به رجیستری Container فشار میدهیم:
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-cluster) و نام پروژه (پروژه عالی، جایی که خوشه در آن قرار دارد.
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"
ما وظیفه را اجرا می کنیم، خروجی کنسول را باز می کنیم و امیدواریم که مونتاژ موفق کانتینر را ببینیم.
عکس صفحه
و سپس استقرار موفقیت آمیز کانتینر مونتاژ شده
عکس صفحه
من عمداً تنظیمات را نادیده گرفتم ورود. به یک دلیل ساده: زمانی که آن را راه اندازی کردید حجم کار با یک نام مشخص، مهم نیست که چند استقرار با این نام انجام دهید، عملیاتی خواهد ماند. خب، به طور کلی، این کمی فراتر از محدوده تاریخ است.
به جای نتیجه گیری
تمام مراحل بالا احتمالاً نمیتوانست انجام شود، اما به سادگی پلاگینی را برای Jenkins، muuulion آنها نصب کرد. اما به دلایلی از افزونه ها خوشم نمی آید. خوب، دقیق تر، من فقط از روی ناامیدی به آنها متوسل می شوم.
و من فقط دوست دارم موضوع جدیدی را برای خودم انتخاب کنم. متن بالا همچنین راهی برای به اشتراک گذاشتن یافته هایی است که در حین حل مسئله ای که در همان ابتدا توضیح داده شد، بدست آوردم. با کسانی که مانند او اصلاً گرگ وحشتناکی نیستند به اشتراک بگذارید. اگر یافته های من حداقل به کسی کمک کند، خوشحال خواهم شد.
منبع: www.habr.com