අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

ඒ සියල්ල ආරම්භ වූයේ අපගේ සංවර්ධන කණ්ඩායමක කණ්ඩායම් ප්‍රධානියා පෙර දින බහාලන ලද ඔවුන්ගේ නව යෙදුම පරීක්ෂා කරන ලෙස අපෙන් ඉල්ලා සිටීමත් සමඟය. මම එය පළ කළා. විනාඩි 20ක් විතර ගියාම ඇප්ලිකේෂන් එක අප්ඩේට් කරන්න රික්වෙස්ට් එකක් ආවා.මොකද එතනට ගොඩක් අවශ්‍ය දෙයක් එකතු වෙලා තිබුනා. මම අලුත් කළා. තවත් පැය දෙකකට පසු... ඊළඟට සිදුවන්නට පටන් ගත් දේ ඔබට අනුමාන කළ හැකිය.

මම පිළිගත යුතුයි, මම තරමක් කම්මැලියි (මම මෙය කලින් පිළිගත්තේ නැද්ද? නැහැ?), සහ කණ්ඩායම් නායකයින්ට ජෙන්කින්ස් වෙත ප්‍රවේශය ඇති බැවින්, අප සතුව සියලුම CI/CD ඇති බැවින්, මම සිතුවෙමි: ඔහුට යෙදවීමට ඉඩ දෙන්න ඔහුට අවශ්ය තරම්! මට විහිළුවක් මතක් විය: මිනිසෙකුට මාළු දෙන්න, ඔහු දිනකට කනවා; පුද්ගලයෙකුට ෆෙඩ් අමතන්න, එවිට ඔහුට ඔහුගේ මුළු ජීවිත කාලයම පෝෂණය වනු ඇත. සහ ගියා රැකියාවේදී උපක්‍රම සෙල්ලම් කරන්න, එය Kuber වෙත සාර්ථකව ගොඩනඟන ලද ඕනෑම අනුවාදයක යෙදුම අඩංගු බහාලුමක් යෙදවීමට සහ එයට ඕනෑම අගයක් මාරු කිරීමට හැකි වනු ඇත. ඊඑන්වී (මගේ සීයා, අතීතයේ භාෂා විද්‍යාඥයෙක්, ඉංග්‍රීසි ගුරුවරයෙක්, දැන් මෙම වාක්‍ය කියවීමෙන් පසු ඔහුගේ පන්සල දෙසට ඇඟිල්ල දිගු කර මා දෙස ඉතා පැහැදිලිව බලයි).

ඉතින්, මම ඉගෙන ගත් ආකාරය මෙම සටහනෙන් මම ඔබට කියමි:

  1. ජෙන්කින්ස් හි රැකියා රැකියාවෙන් හෝ වෙනත් රැකියා වලින් ගතිකව යාවත්කාලීන කරන්න;
  2. ජෙන්කින්ස් නියෝජිතයා ස්ථාපනය කර ඇති නෝඩයකින් වලාකුළු කොන්සෝලය (Cloud shell) වෙත සම්බන්ධ කරන්න;
  3. Google Kubernetes Engine වෙත කාර්ය භාරය යොදන්න.


ඇත්ත වශයෙන්ම, මම, ඇත්ත වශයෙන්ම, තරමක් අපකීර්තිමත් ය. ඔබට Google වලාකුළෙහි යටිතල පහසුකම්වලින් අවම වශයෙන් කොටසක් ඇති බව උපකල්පනය කර ඇති අතර, එබැවින්, ඔබ එහි පරිශීලකයා වන අතර, ඇත්ත වශයෙන්ම, ඔබට GCP ගිණුමක් ඇත. නමුත් මේ සටහන ඒ ගැන නොවේ.

මේ මගේ මීළඟ වංචා පත්‍රයයි. මට එවැනි සටහන් ලිවීමට අවශ්‍ය වන්නේ එක් අවස්ථාවක පමණි: මට ගැටලුවකට මුහුණ දීමට සිදු විය, එය විසඳන්නේ කෙසේදැයි මම මුලදී දැන සිටියේ නැත, විසඳුම ගූගල් විසින් සූදානම් කර නොතිබුණි, එබැවින් මම එය කොටස් වශයෙන් ගූගල් කර අවසානයේ ගැටලුව විසඳා ගත්තෙමි. අනාගතයේදී, මම එය කළ ආකාරය මට අමතක වූ විට, මට සියල්ල නැවත ගූගල් කර කෑල්ලෙන් එකට සම්පාදනය කිරීමට අවශ්‍ය නැත, මම එවැනි වංචා පත්‍ර මටම ලියමි.

වගකීමෙන් යුතුව ඔබ එවන: 1. සටහන "මා වෙනුවෙන්" ලියා ඇත, භූමිකාව සඳහා හොඳ පරිචයක් අදාළ නොවේ. අදහස් දැක්වීමේදී "මෙය මේ ආකාරයෙන් කිරීම වඩා හොඳ වනු ඇත" යන විකල්පයන් කියවීමට මම සතුටු වෙමි.
2. නෝට්ටුවේ යොදන ලද කොටස ලුණු ලෙස සලකන්නේ නම්, මගේ පෙර සටහන් සියල්ල මෙන් මෙයද දුර්වල ලුණු ද්‍රාවණයකි.

ජෙන්කින්ස් හි රැකියා සැකසුම් ගතිකව යාවත්කාලීන කිරීම

මම ඔබේ ප්‍රශ්නය අපේක්ෂා කරමි: ගතික රැකියා යාවත්කාලීන කිරීම එයට සම්බන්ධ වන්නේ කුමක්ද? තන්තු පරාමිතියේ අගය හස්තීයව ඇතුළත් කර ඔබ යන්න!

මම පිළිතුරු දෙමි: මම ඇත්තටම කම්මැලියි, ඔවුන් පැමිණිලි කරන විට මම එයට කැමති නැත: මිෂා, යෙදවීම කඩා වැටේ, සියල්ල නැති වී ඇත! ඔබ සෙවීමට පටන් ගන්නා අතර, සමහර කාර්ය දියත් කිරීමේ පරාමිතියක අගයෙහි ටයිප් එකක් තිබේ. ඒ නිසා මම කැමති හැම දෙයක්ම පුළුවන් තරම් කාර්යක්ෂමව කරන්න. ඒ වෙනුවට තෝරා ගැනීමට ඇති අගයන් ලැයිස්තුවක් ලබා දීමෙන් පරිශීලකයා කෙලින්ම දත්ත ඇතුළු කිරීම වැළැක්විය හැකි නම්, මම තේරීම සංවිධානය කරමි.

සැලැස්ම මෙයයි: අපි ජෙන්කින්ස් හි රැකියාවක් සාදන්නෙමු, දියත් කිරීමට පෙර, අපට ලැයිස්තුවෙන් අනුවාදයක් තෝරා ගත හැකිය, කන්ටේනරය වෙත යවන ලද පරාමිතීන් සඳහා අගයන් සඳහන් කරන්න. ඊඑන්වී, පසුව එය කන්ටේනරය එකතු කර එය බහාලුම් රෙජිස්ට්රි වෙත තල්ලු කරයි. ඉන්පසු එතැන් සිට කන්ටේනරය කියුබර් ලෙස දියත් කෙරේ වැඩ බර කාර්යයේ දක්වා ඇති පරාමිතීන් සමඟ.

ජෙන්කින්ස් හි රැකියාවක් නිර්මාණය කිරීමේ සහ පිහිටුවීමේ ක්‍රියාවලිය අපි සලකා බලන්නේ නැත, මෙය මාතෘකාවෙන් බැහැර ය. කාර්යය සූදානම් බව අපි උපකල්පනය කරමු. අනුවාද සමඟ යාවත්කාලීන ලැයිස්තුවක් ක්‍රියාත්මක කිරීමට, අපට කරුණු දෙකක් අවශ්‍ය වේ: පවතින ප්‍රභව ලැයිස්තුවක් priori වලංගු අනුවාද අංක සහිත සහ විචල්‍යයක් වැනි තේරීම් පරාමිතිය කාර්යය තුළ. අපගේ උදාහරණයේ දී, විචල්‍යය නම් කිරීමට ඉඩ දෙන්න BUILD_VERSION, අපි එය විස්තරාත්මකව වාසය නොකරමු. නමුත් අපි මූලාශ්ර ලැයිස්තුව දෙස සමීපව බලමු.

එතරම් විකල්ප නොමැත. කරුණු දෙකක් වහාම මතකයට නැඟුණි:

  • ජෙන්කින්ස් එහි පරිශීලකයින්ට ලබා දෙන දුරස්ථ ප්‍රවේශ API භාවිතා කරන්න;
  • දුරස්ථ ගබඩා ෆෝල්ඩරයේ අන්තර්ගතය ඉල්ලන්න (අපගේ නඩුවේ මෙය JFrog Artifactory වේ, එය වැදගත් නොවේ).

Jenkins Remote access API

ස්ථාපිත විශිෂ්ට සම්ප්රදායට අනුව, දිගු පැහැදිලි කිරීම් වළක්වා ගැනීමට මම කැමැත්තෙමි.
පළමු ඡේදයේ කොටසක නිදහස් පරිවර්තනයකට පමණක් මම ඉඩ දෙන්නෙමි 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']

සාර්ථක ලැයිස්තුවේ තිර රුවක්
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

හොඳයි, හුදෙක් විනෝදය සඳහා, පෙරහන අපව නොමඟ නොදැමීමට වග බලා ගනිමු (පෙරහන් කිසි විටෙකත් බොරු නොකියයි!) සහ "අසාර්ථක" ලැයිස්තුවක් ප්‍රදර්ශනය කරමු:

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

සාර්ථක නොවන අයගේ ලැයිස්තුවේ තිර රුවක්
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

දුරස්ථ සේවාදායකයක ෆෝල්ඩරයකින් අනුවාද ලැයිස්තුව

අනුවාද ලැයිස්තුවක් ලබා ගැනීමට දෙවන ක්‍රමයක් තිබේ. Jenkins API වෙත ප්‍රවේශ වීමට වඩා මම එයට කැමතියි. හොඳයි, මන්ද යෙදුම සාර්ථකව ගොඩනඟා ඇත්නම්, එයින් අදහස් වන්නේ එය ඇසුරුම් කර සුදුසු ෆෝල්ඩරයේ ගබඩාවේ තබා ඇති බවයි. හරියට, ගබඩාවක් යනු යෙදුම්වල ක්‍රියාකාරී අනුවාදවල පෙරනිමි ගබඩාවයි. මෙන්. හොඳයි, ගබඩාවේ ඇති අනුවාද මොනවාදැයි අපි ඔහුගෙන් විමසමු. අපි දුරස්ථ ෆෝල්ඩරය curl, 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 හි රැකියා සහ රැකියා වින්‍යාස ගොනුව සැකසීම

අපි අනුවාද ලැයිස්තුවේ මූලාශ්‍රය සොයා ගත්තෙමු. අපි දැන් ප්‍රතිඵල ලැයිස්තුව කාර්යයට ඇතුළත් කරමු. මට නම්, පැහැදිලි විසඳුම වූයේ යෙදුම් ගොඩනැගීමේ කාර්යයට පියවරක් එක් කිරීමයි. ප්‍රතිඵලය "සාර්ථකත්වය" නම් ක්‍රියාත්මක වන පියවර.

එකලස් කිරීමේ කාර්ය සැකසුම් විවෘත කර ඉතා පහළට අනුචලනය කරන්න. බොත්තම් මත ක්ලික් කරන්න: ගොඩනැගීමේ පියවර එකතු කරන්න -> කොන්දේසි සහිත පියවර (තනි). පියවර සැකසුම් තුළ, කොන්දේසිය තෝරන්න වත්මන් ගොඩනැගීමේ තත්ත්වය, අගය සකසන්න සාර්ථකත්වය, සාර්ථක නම් කළ යුතු ක්‍රියාව shell විධානය ක්‍රියාත්මක කරන්න.

දැන් විනෝදජනක කොටස. ජෙන්කින්ස් රැකියා වින්‍යාසයන් ගොනු තුළ ගබඩා කරයි. XML ආකෘතියෙන්. මඟ දිගේ http://путь-до-задания/config.xml ඒ අනුව, ඔබට වින්‍යාස ගොනුව බාගත කර අවශ්‍ය පරිදි එය සංස්කරණය කර ඔබට එය ලැබුණු තැනට තැබිය හැකිය.

මතක තබා ගන්න, අපි අනුවාද ලැයිස්තුව සඳහා පරාමිතියක් සාදනු ඇති බවට අපි ඉහත එකඟ විය BUILD_VERSION?

අපි වින්‍යාස ගොනුව බාගත කර එහි ඇතුළත බලමු. පරාමිතිය ස්ථානයේ සහ අපේක්ෂිත ආකාරයේ ඇති බව තහවුරු කර ගැනීම සඳහා පමණි.

ස්පොයිලර් යටතේ තිර රුවක්.

ඔබගේ config.xml කොටස සමාන විය යුතුය. තේරීම් මූලද්‍රව්‍යයේ අන්තර්ගතය තවමත් අස්ථානගත වී ඇති බව හැර
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

ඔයාට විශ්වාස ද? එච්චරයි, ගොඩනඟන එක සාර්ථක උනොත් ක්‍රියාත්මක වෙන ස්ක්‍රිප්ට් එකක් ලියමු.
ස්ක්‍රිප්ටයට අනුවාද ලැයිස්තුවක් ලැබෙනු ඇත, වින්‍යාස ගොනුව බාගන්න, අපට අවශ්‍ය ස්ථානයේ අනුවාද ලැයිස්තුවක් එයට ලියන්න, ඉන්පසු එය නැවත දමන්න. ඔව්. ඒක හරි. දැනටමත් අනුවාද ලැයිස්තුවක් ඇති ස්ථානයේ XML හි අනුවාද ලැයිස්තුවක් ලියන්න (අනාගතයේදී, ස්ක්‍රිප්ට් ප්‍රථම දියත් කිරීමෙන් පසුව වනු ඇත). නිත්‍ය ප්‍රකාශනවලට දැඩි රසික පිරිසක් තවමත් ලෝකයේ සිටින බව මම දනිමි. මම ඔවුන්ට අයිති නැහැ. කරුණාකර ස්ථාපනය කරන්න xmlstarler වින්‍යාසය සංස්කරණය කරනු ලබන යන්ත්‍රයට. sed භාවිතයෙන් 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

න්‍යායාත්මකව, ඔබ ඉහත උදාහරණ මත පදනම්ව ලියා ඇති කේතය පරීක්ෂා කර ඇත්නම්, යෙදවීමේ කාර්යයේදී ඔබට දැනටමත් අනුවාද සහිත පතන ලැයිස්තුවක් තිබිය යුතුය. ඒක හරියට ස්පොයිලර් යට තියෙන screenshot එකේ වගේ.

නිවැරදිව සම්පුර්ණ කරන ලද අනුවාද ලැයිස්තුව
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

සෑම දෙයක්ම ක්‍රියාත්මක වූයේ නම්, පිටපත පිටපත් කර අලවන්න shell විධානය ක්‍රියාත්මක කරන්න සහ වෙනස්කම් සුරකින්න.

Cloud shell වෙත සම්බන්ධ වෙමින්

අපි බහාලුම්වල එකතු කරන්නන් ඇත. අපි අපගේ යෙදුම් බෙදා හැරීමේ මෙවලම සහ වින්‍යාස කළමනාකරු ලෙස Ansible භාවිතා කරමු. ඒ අනුව, බහාලුම් තැනීමේදී, විකල්ප තුනක් මතකයට නැඟේ: Docker හි Docker ස්ථාපනය කිරීම, Ansible ධාවනය වන යන්ත්‍රයක Docker ස්ථාපනය කිරීම හෝ ක්ලවුඩ් කොන්සෝලය තුළ බහාලුම් තැනීම. මෙම ලිපියේ ජෙන්කින්ස් සඳහා ප්ලගීන ගැන නිහඬව සිටීමට අපි එකඟ විය. මතකද?

මම තීරණය කළා: හොඳයි, “පෙට්ටියෙන් පිටත” බහාලුම් වලාකුළු කොන්සෝලයේ එකතු කළ හැකි බැවින්, කරදර වන්නේ ඇයි? එය පිරිසිදුව තබා ගන්න, හරිද? මට ක්ලවුඩ් කොන්සෝලයේ ජෙන්කින්ස් බහාලුම් එකතු කිරීමට අවශ්‍යයි, ඉන්පසු ඒවා එහි සිට කියුබර් වෙත දියත් කරන්න. එපමනක් නොව, Google හට එහි යටිතල පහසුකම් තුළ ඉතා පොහොසත් නාලිකා ඇත, එය යෙදවීමේ වේගය කෙරෙහි හිතකර බලපෑමක් ඇති කරනු ඇත.

වලාකුළු කොන්සෝලය වෙත සම්බන්ධ වීමට, ඔබට කරුණු දෙකක් අවශ්‍ය වේ: gCloud සහ ප්‍රවේශ හිමිකම් Google Cloud API මෙම සම්බන්ධතාවයම සිදු කරනු ලබන VM අවස්ථාව සඳහා.

Google ක්ලවුඩ් වලින් සම්බන්ධ වීමට අදහස් කරන අය සඳහා
Google එහි සේවාවන්හි අන්තර්ක්‍රියාකාරී අවසරය අක්‍රිය කිරීමේ හැකියාවට ඉඩ දෙයි. මෙය *nix ක්‍රියාත්මක වන අතර කොන්සෝලයක් තිබේ නම්, කෝපි යන්ත්‍රයකින් පවා කොන්සෝලය වෙත සම්බන්ධ වීමට මෙය ඔබට ඉඩ සලසයි.

මෙම සටහනේ රාමුව තුළ මෙම ගැටළුව වඩාත් විස්තරාත්මකව ආවරණය කිරීමට මට අවශ්‍ය නම්, අදහස් දැක්වීමේදී ලියන්න. අපි ප්‍රමාණවත් ඡන්ද ලබා ගන්නේ නම්, මම මෙම මාතෘකාව පිළිබඳ යාවත්කාලීනයක් ලියන්නෙමි.

අයිතීන් ලබා දීමේ පහසුම ක්‍රමය වන්නේ වෙබ් අතුරු මුහුණතයි.

  1. ඔබ පසුව ක්ලවුඩ් කොන්සෝලය වෙත සම්බන්ධ වන VM අවස්ථාව නවත්වන්න.
  2. අවස්ථා විස්තර විවෘත කර ක්ලික් කරන්න සංශෝධනය.
  3. පිටුවේ පතුලේම, අවස්ථා ප්‍රවේශ විෂය පථය තෝරන්න සියලුම Cloud API වෙත පූර්ණ ප්‍රවේශය.

    තිර රුව
    අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

  4. ඔබගේ වෙනස්කම් සුරකින්න සහ උදාහරණය දියත් කරන්න.

VM පූරණය අවසන් වූ පසු, SSH හරහා එයට සම්බන්ධ කර දෝෂයකින් තොරව සම්බන්ධතාවය සිදු වන බවට වග බලා ගන්න. විධානය භාවිතා කරන්න:

gcloud alpha cloud-shell ssh

සාර්ථක සම්බන්ධතාවයක් මේ වගේ දෙයක් පෙනේ
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

GKE වෙත යොදවන්න

අපි හැකි සෑම ආකාරයකින්ම IaC (යටිතල පහසුකම් කේතයක් ලෙස) වෙත මාරු වීමට උත්සාහ කරන බැවින්, අපගේ ඩොකර් ගොනු Git හි ගබඩා කර ඇත. මේක එක පැත්තකින්. තවද kubernetes හි යෙදවීම විස්තර කර ඇත්තේ yaml ගොනුවකින් වන අතර එය භාවිතා කරනු ලබන්නේ මෙම කාර්යය මගින් පමණක් වන අතර එයද කේතයක් වැනිය. මෙය අනෙක් පැත්තෙන්. පොදුවේ, මම අදහස් කළේ, සැලැස්ම මෙයයි:

  1. අපි විචල්‍යවල අගයන් ගනිමු BUILD_VERSION සහ, විකල්ප වශයෙන්, සම්මත කරන විචල්‍යවල අගයන් ඊඑන්වී.
  2. Git එකෙන් dockerfile එක බාගන්න.
  3. යෙදවීම සඳහා යමහල් උත්පාදනය කරන්න.
  4. අපි මෙම ගොනු දෙකම scp හරහා cloud console වෙත උඩුගත කරමු.
  5. අපි එහි කන්ටේනරයක් ගොඩනඟා එය බහාලුම් රෙජිස්ට්රි වෙත තල්ලු කරමු
  6. අපි load deployment file එක cuber එකට යොදමු.

අපි වඩාත් නිශ්චිතව කියමු. එක පාරක් අපි කතා කරන්න පටන් ගත්තා ඊඑන්වී, එවිට අපට පරාමිති දෙකක අගයන් සම්මත කිරීමට අවශ්‍ය යැයි සිතමු: PARAM1 и PARAM2. අපි ඔවුන්ගේ කාර්යය යෙදවීම සඳහා එකතු කරමු, ටයිප් කරන්න - නූල් පරාමිතිය.

තිර රුව
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

අපි සරල හරවා යැවීමක් සමඟ yaml ජනනය කරන්නෙමු ප්රතිමාවේ ගොනු කිරීමට. ඇත්ත වශයෙන්ම, ඔබ ඔබේ ඩොකර් ගොනුවේ ඇති බව උපකල්පනය කෙරේ PARAM1 и PARAM2load name එක වෙයි කියලා awesomeapp, සහ නිශ්චිත අනුවාදයේ යෙදුම සමඟ එකලස් කරන ලද කන්ටේනරය ඇත බහාලුම් රෙජිස්ට්රි අතරමඟ 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 alpha cloud-shell ssh අන්තර්ක්‍රියාකාරී මාදිලිය නොමැත, එබැවින් අපි පරාමිතිය භාවිතයෙන් වලාකුළු කොන්සෝලය වෙත විධාන යවමු --විධානය.

අපි වලාකුළු කොන්සෝලයේ මුල් ෆෝල්ඩරය පැරණි ඩොකර් ගොනුවෙන් පිරිසිදු කරමු:

gcloud alpha cloud-shell ssh --command="rm -f 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-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"

අපි කාර්යය ක්රියාත්මක කරන්න, කොන්සෝල ප්රතිදානය විවෘත කර කන්ටේනරයේ සාර්ථක එකලස් කිරීම දැකීමට බලාපොරොත්තු වෙනවා.

තිර රුව
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

ඉන්පසුව එකලස් කරන ලද කන්ටේනරය සාර්ථකව යෙදවීම

තිර රුව
අපි ප්ලගීන, SMS හෝ ලියාපදිංචිය නොමැතිව GKE හි යෙදවීමේ කාර්යයක් නිර්මාණය කරමු. අපි ජෙන්කින්ස්ගේ ජැකට් එක යටට එබී බලමු

මම හිතාමතාම සැකසුම නොසලකා හැරියෙමි ආක්රමණය. එක් සරල හේතුවක් සඳහා: ඔබ එය සැකසූ පසු වැඩ බර දෙන ලද නමක් සමඟ, ඔබ මෙම නම සමඟ කොපමණ යෙදවීම් සිදු කළත් එය ක්‍රියාත්මකව පවතිනු ඇත. හොඳයි, පොදුවේ ගත් කල, මෙය ඉතිහාසයේ විෂය පථයෙන් ටිකක් ඔබ්බට ය.

නිගමන වෙනුවට

ඉහත සියලු පියවර බොහෝ විට සිදු කළ නොහැකි විය, නමුත් සරලව Jenkins සඳහා ප්ලගිනයක් ස්ථාපනය කර ඇත, ඔවුන්ගේ muuulion. නමුත් කිසියම් හේතුවක් නිසා මම ප්ලගීන වලට කැමති නැත. හොඳයි, වඩාත් නිවැරදිව, මම ඔවුන් වෙත යොමු වන්නේ බලාපොරොත්තු සුන්වීමෙන් පමණි.

ඒ වගේම මම මට අලුත් මාතෘකාවක් තෝරා ගැනීමට කැමතියි. ඉහත පාඨය ආරම්භයේදීම විස්තර කර ඇති ගැටලුව විසඳීමේදී මා විසින් කරන ලද සොයාගැනීම් බෙදාහදා ගැනීමට ක්රමයක් ද වේ. ඔහු වැනි, devops හි කිසිසේත්ම දරුණු වෘකයෙකු නොවන අය සමඟ බෙදා ගන්න. මගේ සොයාගැනීම් අවම වශයෙන් යමෙකුට උදව් කරන්නේ නම්, මම සතුටු වනු ඇත.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න