మేము ప్లగిన్‌లు, SMS లేదా రిజిస్ట్రేషన్ లేకుండా GKEలో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

మా డెవలప్‌మెంట్ టీమ్‌లలో ఒకదానికి చెందిన టీమ్ లీడ్ వారి కొత్త అప్లికేషన్‌ను పరీక్షించమని మమ్మల్ని అడిగినప్పుడు ఇదంతా ప్రారంభమైంది, అది ముందు రోజు కంటెయినరైజ్ చేయబడింది. నేను దానిని పోస్ట్ చేసాను. సుమారు 20 నిమిషాల తర్వాత, అప్లికేషన్‌ను అప్‌డేట్ చేయమని అభ్యర్థన వచ్చింది, ఎందుకంటే అక్కడ చాలా అవసరమైన విషయం జోడించబడింది. నేను పునరుద్ధరించాను. ఇంకో రెండు గంటల తర్వాత... తర్వాత ఏం జరగబోతోందో మీరే ఊహించవచ్చు...

నేను ఒప్పుకోక తప్పదు, నేను చాలా బద్ధకంగా ఉన్నాను (నేను దీన్ని ఇంతకు ముందు ఒప్పుకోలేదా? కాదా?), మరియు టీమ్ లీడ్స్‌కు జెంకిన్స్‌కి యాక్సెస్ ఉన్నందున, మా వద్ద మొత్తం CI/CD ఉంది, నేను అనుకున్నాను: అతనిని ఇలా మోహరించనివ్వండి అతనికి కావలసినంత! నేను ఒక జోక్ జ్ఞాపకం చేసుకున్నాను: మనిషికి ఒక చేప ఇవ్వండి మరియు అతను ఒక రోజు తింటాడు; ఒక వ్యక్తిని ఫెడ్ అని పిలవండి మరియు అతని జీవితమంతా అతనికి ఆహారం ఇవ్వబడుతుంది. మరియు వెళ్ళాడు ఉద్యోగంలో మాయలు ఆడతారు, ఇది విజయవంతంగా నిర్మించిన ఏదైనా సంస్కరణ యొక్క అప్లికేషన్‌ను కలిగి ఉన్న కంటైనర్‌ను కుబేర్‌లోకి అమర్చగలదు మరియు దానికి ఏదైనా విలువలను బదిలీ చేయగలదు ENV (మా తాత, గతంలో ఒక ఫిలాజిస్ట్, ఆంగ్ల ఉపాధ్యాయుడు, ఇప్పుడు తన గుడిలో వేలు తిప్పి, ఈ వాక్యం చదివిన తర్వాత నన్ను చాలా స్పష్టంగా చూసేవారు).

కాబట్టి, ఈ నోట్‌లో నేను ఎలా నేర్చుకున్నానో మీకు చెప్తాను:

  1. జెంకిన్స్‌లోని ఉద్యోగాలను ఉద్యోగం నుండి లేదా ఇతర ఉద్యోగాల నుండి డైనమిక్‌గా అప్‌డేట్ చేయండి;
  2. జెంకిన్స్ ఏజెంట్ ఇన్‌స్టాల్ చేయబడిన నోడ్ నుండి క్లౌడ్ కన్సోల్ (క్లౌడ్ షెల్)కి కనెక్ట్ చేయండి;
  3. Google Kubernetes ఇంజిన్‌కు పనిభారాన్ని అమలు చేయండి.


వాస్తవానికి, నేను కొంత అసహ్యంగా ఉన్నాను. మీరు Google క్లౌడ్‌లో మౌలిక సదుపాయాలలో కనీసం కొంత భాగాన్ని కలిగి ఉన్నారని భావించబడుతుంది మరియు అందువల్ల, మీరు దాని వినియోగదారు మరియు, వాస్తవానికి, మీకు GCP ఖాతా ఉంది. అయితే ఈ నోట్ గురించి అది కాదు.

ఇది నా తదుపరి చీట్ షీట్. నేను అలాంటి గమనికలను ఒక సందర్భంలో మాత్రమే వ్రాయాలనుకుంటున్నాను: నేను ఒక సమస్యను ఎదుర్కొన్నాను, దానిని ఎలా పరిష్కరించాలో నాకు మొదట్లో తెలియదు, పరిష్కారం రెడీమేడ్‌గా గూగుల్ చేయలేదు, కాబట్టి నేను దానిని భాగాలుగా గూగుల్ చేసి చివరికి సమస్యను పరిష్కరించాను. భవిష్యత్తులో, నేను దీన్ని ఎలా చేశానో మరచిపోయినప్పుడు, నేను ప్రతిదీ ముక్కలవారీగా గూగుల్ చేసి, కలిసి కంపైల్ చేయనవసరం లేదు, అలాంటి చీట్ షీట్లను నేనే వ్రాస్తాను.

తనది కాదను వ్యక్తి: 1. నోట్ "నా కోసం", పాత్ర కోసం వ్రాయబడింది ఉత్తమ అభ్యాసం వర్తించదు. వ్యాఖ్యలలో “ఈ విధంగా చేస్తే బాగుండేది” ఎంపికలను చదవడం నాకు సంతోషంగా ఉంది.
2. నోట్‌లోని అప్లైడ్ భాగాన్ని ఉప్పుగా పరిగణిస్తే, నా మునుపటి అన్ని గమనికల మాదిరిగానే ఇది కూడా బలహీనమైన ఉప్పు ద్రావణం.

జెంకిన్స్‌లో ఉద్యోగ సెట్టింగ్‌లను డైనమిక్‌గా అప్‌డేట్ చేస్తోంది

నేను మీ ప్రశ్నను ముందే ఊహించాను: డైనమిక్ జాబ్ అప్‌డేట్‌కి దానితో సంబంధం ఏమిటి? స్ట్రింగ్ పరామితి యొక్క విలువను మాన్యువల్‌గా నమోదు చేయండి మరియు మీరు వెళ్ళండి!

నేను సమాధానం: నేను నిజంగా సోమరి ఉన్నాను, వారు ఫిర్యాదు చేసినప్పుడు నేను ఇష్టపడను: మిషా, విస్తరణ క్రాష్ అవుతోంది, ప్రతిదీ పోయింది! మీరు చూడటం ప్రారంభించండి మరియు కొన్ని టాస్క్ లాంచ్ పారామీటర్ విలువలో అక్షర దోషం ఉంది. అందువల్ల, నేను ప్రతిదీ సాధ్యమైనంత సమర్థవంతంగా చేయడానికి ఇష్టపడతాను. బదులుగా ఎంచుకోవడానికి విలువల జాబితాను ఇవ్వడం ద్వారా వినియోగదారు నేరుగా డేటాను నమోదు చేయకుండా నిరోధించడం సాధ్యమైతే, నేను ఎంపికను నిర్వహిస్తాను.

ప్రణాళిక ఇది: మేము జెంకిన్స్‌లో ఉద్యోగాన్ని సృష్టిస్తాము, దీనిలో, ప్రారంభించే ముందు, మేము జాబితా నుండి ఒక సంస్కరణను ఎంచుకోవచ్చు, దీని ద్వారా కంటైనర్‌కు పంపబడిన పారామితుల కోసం విలువలను పేర్కొనవచ్చు ENV, అప్పుడు అది కంటైనర్‌ను సేకరించి కంటైనర్ రిజిస్ట్రీలోకి నెట్టివేస్తుంది. అప్పుడు అక్కడ నుండి కంటైనర్‌ను క్యూబర్‌లో లాంచ్ చేస్తారు పనిభారం ఉద్యోగంలో పేర్కొన్న పారామితులతో.

మేము జెంకిన్స్‌లో ఉద్యోగాన్ని సృష్టించే మరియు సెటప్ చేసే ప్రక్రియను పరిగణించము, ఇది ఆఫ్-టాపిక్. పని సిద్ధంగా ఉందని మేము అనుకుంటాము. సంస్కరణలతో నవీకరించబడిన జాబితాను అమలు చేయడానికి, మాకు రెండు అంశాలు అవసరం: ప్రయోరి చెల్లుబాటు అయ్యే సంస్కరణ సంఖ్యలతో ఇప్పటికే ఉన్న మూలాధార జాబితా మరియు వేరియబుల్ వంటిది ఎంపిక పరామితి పనిలో. మా ఉదాహరణలో, వేరియబుల్ పేరు పెట్టనివ్వండి BUILD_VERSION, మేము దానిపై వివరంగా నివసించము. అయితే మూలాధార జాబితాను నిశితంగా పరిశీలిద్దాం.

చాలా ఎంపికలు లేవు. వెంటనే రెండు విషయాలు గుర్తుకు వచ్చాయి:

  • Jenkins దాని వినియోగదారులకు అందించే రిమోట్ యాక్సెస్ APIని ఉపయోగించండి;
  • రిమోట్ రిపోజిటరీ ఫోల్డర్ యొక్క కంటెంట్‌లను అభ్యర్థించండి (మా విషయంలో ఇది JFrog ఆర్టిఫ్యాక్టరీ, ఇది ముఖ్యమైనది కాదు).

జెంకిన్స్ రిమోట్ యాక్సెస్ API

స్థాపించబడిన అద్భుతమైన సంప్రదాయం ప్రకారం, నేను సుదీర్ఘ వివరణలను నివారించడానికి ఇష్టపడతాను.
నేను మొదటి పేరాలోని కొంత భాగాన్ని మాత్రమే ఉచిత అనువాదాన్ని అనుమతిస్తాను API డాక్యుమెంటేషన్ మొదటి పేజీ:

Jenkins దాని ఫంక్షనాలిటీకి రిమోట్ మెషిన్-రీడబుల్ యాక్సెస్ కోసం 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/

తర్వాత, అవుట్‌పుట్‌ను ఏ రూపంలో స్వీకరించాలో మనకు ఎంపిక ఉంటుంది. ఈ సందర్భంలో మాత్రమే API ఫిల్టరింగ్‌ని అనుమతిస్తుంది కాబట్టి, XMLపై దృష్టి పెడదాం.

అన్ని జాబ్ పరుగుల జాబితాను పొందడానికి ప్రయత్నిద్దాం. మేము అసెంబ్లీ పేరుపై మాత్రమే ఆసక్తి కలిగి ఉన్నాము (ప్రదర్శన పేరు) మరియు దాని ఫలితం (ఫలితంగా):

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

అది పని చేశారా?

ఇప్పుడు ఫలితంతో ముగిసే పరుగులను మాత్రమే ఫిల్టర్ చేద్దాం SUCCESS. వాదనను ఉపయోగించుకుందాం & మినహాయించండి మరియు ఒక పరామితిగా మనం దానికి సమానం కాని విలువకు మార్గాన్ని పంపుతాము SUCCESS. అవును అవును. డబుల్ నెగటివ్ అనేది ఒక ప్రకటన. మాకు ఆసక్తి లేని ప్రతిదాన్ని మేము మినహాయిస్తాము:

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లో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

రిమోట్ సర్వర్‌లోని ఫోల్డర్ నుండి సంస్కరణల జాబితా

సంస్కరణల జాబితాను పొందడానికి రెండవ మార్గం ఉంది. నేను జెంకిన్స్ APIని యాక్సెస్ చేయడం కంటే దీన్ని ఎక్కువగా ఇష్టపడుతున్నాను. బాగా, ఎందుకంటే అప్లికేషన్ విజయవంతంగా నిర్మించబడితే, అది ప్యాక్ చేయబడి, తగిన ఫోల్డర్‌లోని రిపోజిటరీలో ఉంచబడిందని అర్థం. ఇలా, రిపోజిటరీ అనేది అప్లికేషన్‌ల వర్కింగ్ వెర్షన్‌ల డిఫాల్ట్ నిల్వ. ఇష్టం. సరే, స్టోరేజీలో ఏ వెర్షన్లు ఉన్నాయో అతనిని అడుగుదాం. మేము రిమోట్ ఫోల్డర్‌ను కర్ల్ చేస్తాము, grep చేస్తాము మరియు awk చేస్తాము. ఎవరైనా వన్‌లైనర్‌పై ఆసక్తి కలిగి ఉంటే, అది స్పాయిలర్ కింద ఉంది.

వన్ లైన్ కమాండ్
దయచేసి రెండు విషయాలను గమనించండి: నేను కనెక్షన్ వివరాలను హెడర్‌లో పాస్ చేస్తాను మరియు ఫోల్డర్ నుండి నాకు అన్ని వెర్షన్‌లు అవసరం లేదు మరియు నేను నెలలోపు సృష్టించిన వాటిని మాత్రమే ఎంచుకుంటాను. మీ వాస్తవాలు మరియు అవసరాలకు అనుగుణంగా ఆదేశాన్ని సవరించండి:

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[^/]+' )

జెంకిన్స్‌లో జాబ్‌లు మరియు జాబ్ కాన్ఫిగరేషన్ ఫైల్‌ని సెటప్ చేస్తోంది

మేము సంస్కరణల జాబితా యొక్క మూలాన్ని కనుగొన్నాము. ఇప్పుడు ఫలిత జాబితాను టాస్క్‌లో చేర్చుదాం. నా కోసం, అప్లికేషన్ బిల్డ్ టాస్క్‌లో ఒక దశను జోడించడం స్పష్టమైన పరిష్కారం. ఫలితం "విజయం" అయితే అమలు చేయబడే దశ.

అసెంబ్లీ టాస్క్ సెట్టింగ్‌లను తెరిచి, దిగువకు స్క్రోల్ చేయండి. బటన్లపై క్లిక్ చేయండి: బిల్డ్ స్టెప్ జోడించండి -> షరతులతో కూడిన దశ (ఒకే). దశ సెట్టింగ్‌లలో, పరిస్థితిని ఎంచుకోండి ప్రస్తుత నిర్మాణ స్థితి, విలువను సెట్ చేయండి SUCCESS, విజయవంతమైతే చేయవలసిన చర్య షెల్ ఆదేశాన్ని అమలు చేయండి.

మరియు ఇప్పుడు సరదా భాగం. Jenkins జాబ్ కాన్ఫిగరేషన్‌లను ఫైల్‌లలో నిల్వ చేస్తుంది. XML ఆకృతిలో. దారి పొడవునా http://путь-до-задания/config.xml దీని ప్రకారం, మీరు కాన్ఫిగరేషన్ ఫైల్‌ను డౌన్‌లోడ్ చేసుకోవచ్చు, దానిని అవసరమైన విధంగా సవరించవచ్చు మరియు మీకు లభించిన చోట తిరిగి ఉంచవచ్చు.

గుర్తుంచుకోండి, మేము సంస్కరణల జాబితా కోసం పరామితిని సృష్టిస్తామని పైన అంగీకరించాము BUILD_VERSION?

కాన్ఫిగరేషన్ ఫైల్‌ను డౌన్‌లోడ్ చేసి, దాని లోపల చూద్దాం. పరామితి స్థానంలో ఉందని మరియు కావలసిన రకంగా ఉందని నిర్ధారించుకోవడానికి.

స్పాయిలర్ కింద స్క్రీన్‌షాట్.

మీ config.xml భాగం అలాగే కనిపించాలి. ఎంపికల మూలకం యొక్క కంటెంట్‌లు ఇంకా లేవు
మేము ప్లగిన్‌లు, SMS లేదా రిజిస్ట్రేషన్ లేకుండా GKEలో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

మీరు చెప్పేది నిజమా? అంతే, బిల్డ్ సక్సెస్ అయితే ఎగ్జిక్యూట్ అయ్యే స్క్రిప్ట్ రాసుకుందాం.
స్క్రిప్ట్ సంస్కరణల జాబితాను అందుకుంటుంది, కాన్ఫిగరేషన్ ఫైల్‌ను డౌన్‌లోడ్ చేసి, మనకు అవసరమైన స్థలంలో సంస్కరణల జాబితాను వ్రాసి, ఆపై దాన్ని తిరిగి ఉంచండి. అవును. అది నిజమే. ఇప్పటికే సంస్కరణల జాబితా ఉన్న ప్రదేశంలో XMLలో సంస్కరణల జాబితాను వ్రాయండి (భవిష్యత్తులో, స్క్రిప్ట్ యొక్క మొదటి లాంచ్ తర్వాత ఉంటుంది). ప్రపంచంలో ఇప్పటికీ రెగ్యులర్ ఎక్స్‌ప్రెషన్స్‌కి విపరీతమైన అభిమానులు ఉన్నారని నాకు తెలుసు. నేను వారికి చెందను. దయచేసి ఇన్‌స్టాల్ చేయండి xmlstarler కాన్ఫిగరేషన్ సవరించబడే యంత్రానికి. సెడ్‌ని ఉపయోగించి 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

సిద్ధాంతంలో, మీరు పైన ఉన్న ఉదాహరణల ఆధారంగా వ్రాసిన కోడ్‌ను పరీక్షించినట్లయితే, విస్తరణ పనిలో మీరు ఇప్పటికే సంస్కరణలతో కూడిన డ్రాప్-డౌన్ జాబితాను కలిగి ఉండాలి. ఇది స్పాయిలర్ కింద స్క్రీన్‌షాట్‌లో ఉన్నట్లుగా ఉంది.

సరిగ్గా పూర్తయిన సంస్కరణల జాబితా
మేము ప్లగిన్‌లు, SMS లేదా రిజిస్ట్రేషన్ లేకుండా GKEలో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

ప్రతిదీ పని చేస్తే, స్క్రిప్ట్‌ను కాపీ-పేస్ట్ చేయండి షెల్ ఆదేశాన్ని అమలు చేయండి మరియు మార్పులను సేవ్ చేయండి.

క్లౌడ్ షెల్‌కి కనెక్ట్ చేస్తోంది

మాకు కంటైనర్లలో కలెక్టర్లు ఉన్నాయి. మేము మా అప్లికేషన్ డెలివరీ సాధనం మరియు కాన్ఫిగరేషన్ మేనేజర్‌గా Ansibleని ఉపయోగిస్తాము. దీని ప్రకారం, కంటైనర్‌లను నిర్మించడం విషయానికి వస్తే, మూడు ఎంపికలు గుర్తుకు వస్తాయి: డాకర్‌లో డాకర్‌ను ఇన్‌స్టాల్ చేయండి, యాన్సిబుల్ నడుస్తున్న మెషీన్‌లో డాకర్‌ను ఇన్‌స్టాల్ చేయండి లేదా క్లౌడ్ కన్సోల్‌లో కంటైనర్‌లను నిర్మించండి. ఈ కథనంలో జెంకిన్స్ కోసం ప్లగిన్‌ల గురించి మౌనంగా ఉండటానికి మేము అంగీకరించాము. గుర్తుందా?

నేను నిర్ణయించుకున్నాను: సరే, క్లౌడ్ కన్సోల్‌లో “బాక్స్ వెలుపల” కంటైనర్‌లను సేకరించవచ్చు కాబట్టి, ఎందుకు బాధపడాలి? శుభ్రంగా ఉంచండి, సరియైనదా? నేను క్లౌడ్ కన్సోల్‌లో జెంకిన్స్ కంటైనర్‌లను సేకరించి, ఆపై వాటిని అక్కడి నుండి క్యూబర్‌లోకి ప్రారంభించాలనుకుంటున్నాను. అంతేకాకుండా, Google దాని ఇన్‌ఫ్రాస్ట్రక్చర్‌లో చాలా గొప్ప ఛానెల్‌లను కలిగి ఉంది, ఇది విస్తరణ వేగంపై ప్రయోజనకరమైన ప్రభావాన్ని చూపుతుంది.

క్లౌడ్ కన్సోల్‌కి కనెక్ట్ చేయడానికి, మీకు రెండు విషయాలు అవసరం: gCloud మరియు యాక్సెస్ హక్కులు Google క్లౌడ్ API ఇదే కనెక్షన్ చేయబడే VM ఉదాహరణ కోసం.

Google క్లౌడ్ నుండి కనెక్ట్ అవ్వాలని ప్లాన్ చేసుకునే వారికి
Google దాని సేవల్లో ఇంటరాక్టివ్ అధికారాన్ని నిలిపివేసే అవకాశాన్ని అనుమతిస్తుంది. ఇది *nixని నడుపుతున్నప్పుడు మరియు కన్సోల్‌ను కలిగి ఉంటే, కాఫీ మెషీన్ నుండి కూడా కన్సోల్‌కి కనెక్ట్ చేయడానికి ఇది మిమ్మల్ని అనుమతిస్తుంది.

ఈ నోట్ ఫ్రేమ్‌వర్క్‌లో నేను ఈ సమస్యను మరింత వివరంగా కవర్ చేయాల్సిన అవసరం ఉంటే, వ్యాఖ్యలలో వ్రాయండి. మాకు తగినంత ఓట్లు వస్తే, నేను ఈ అంశంపై ఒక నవీకరణను వ్రాస్తాను.

హక్కులను మంజూరు చేయడానికి సులభమైన మార్గం వెబ్ ఇంటర్‌ఫేస్ ద్వారా.

  1. మీరు తదనంతరం క్లౌడ్ కన్సోల్‌కి కనెక్ట్ అయ్యే VM ఉదాహరణను ఆపివేయండి.
  2. ఉదాహరణ వివరాలను తెరిచి క్లిక్ చేయండి సవరించాలనే.
  3. పేజీ దిగువన, ఉదాహరణ యాక్సెస్ పరిధిని ఎంచుకోండి అన్ని క్లౌడ్ APIలకు పూర్తి యాక్సెస్.

    స్క్రీన్
    మేము ప్లగిన్‌లు, SMS లేదా రిజిస్ట్రేషన్ లేకుండా GKEలో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

  4. మీ మార్పులను సేవ్ చేసి, ఉదాహరణను ప్రారంభించండి.

VM లోడ్ అవడం పూర్తయిన తర్వాత, SSH ద్వారా దానికి కనెక్ట్ చేయండి మరియు కనెక్షన్ లోపం లేకుండా జరుగుతుందని నిర్ధారించుకోండి. ఆదేశాన్ని ఉపయోగించండి:

gcloud alpha cloud-shell ssh

విజయవంతమైన కనెక్షన్ ఇలా కనిపిస్తుంది
మేము ప్లగిన్‌లు, SMS లేదా రిజిస్ట్రేషన్ లేకుండా GKEలో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

GKEకి అమలు చేయండి

IaC (ఇన్‌ఫ్రాస్ట్రక్చర్‌ని కోడ్‌గా)కి పూర్తిగా మారడానికి మేము అన్ని విధాలుగా ప్రయత్నిస్తున్నాము కాబట్టి, మా డాకర్ ఫైల్‌లు Gitలో నిల్వ చేయబడతాయి. ఇది ఒకవైపు. మరియు kubernetes లో విస్తరణ ఒక yaml ఫైల్ ద్వారా వివరించబడింది, ఇది ఈ టాస్క్ ద్వారా మాత్రమే ఉపయోగించబడుతుంది, ఇది కూడా కోడ్ లాగా ఉంటుంది. ఇది అవతలి వైపు నుండి. సాధారణంగా, నా ఉద్దేశ్యం, ప్రణాళిక ఇది:

  1. మేము వేరియబుల్స్ యొక్క విలువలను తీసుకుంటాము BUILD_VERSION మరియు, ఐచ్ఛికంగా, పంపబడే వేరియబుల్స్ విలువలు ENV.
  2. Git నుండి డాకర్‌ఫైల్‌ను డౌన్‌లోడ్ చేయండి.
  3. విస్తరణ కోసం యామల్‌ను రూపొందించండి.
  4. మేము ఈ రెండు ఫైల్‌లను scp ద్వారా క్లౌడ్ కన్సోల్‌కు అప్‌లోడ్ చేస్తాము.
  5. మేము అక్కడ ఒక కంటైనర్‌ను నిర్మిస్తాము మరియు దానిని కంటైనర్ రిజిస్ట్రీకి నెట్టివేస్తాము
  6. మేము లోడ్ విస్తరణ ఫైల్‌ను క్యూబర్‌కి వర్తింపజేస్తాము.

మరింత నిర్దిష్టంగా చెప్పండి. ఒకసారి మేము మాట్లాడుకోవడం ప్రారంభించాము ENV, అప్పుడు మనం రెండు పారామితుల విలువలను పాస్ చేయవలసి ఉందని అనుకుందాం: PARAM1 и PARAM2. మేము విస్తరణ కోసం వారి పనిని జోడిస్తాము, టైప్ చేయండి - స్ట్రింగ్ పరామితి.

స్క్రీన్
మేము ప్లగిన్‌లు, SMS లేదా రిజిస్ట్రేషన్ లేకుండా GKEలో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

మేము సాధారణ దారి మళ్లింపుతో yamlని ఉత్పత్తి చేస్తాము echo ఫైల్ చేయడానికి. మీరు మీ డాకర్‌ఫైల్‌లో ఉన్నారని భావించబడుతుంది PARAM1 и PARAM2లోడ్ పేరు ఉంటుంది అద్భుతమైన యాప్, మరియు పేర్కొన్న సంస్కరణ యొక్క అప్లికేషన్‌తో సమీకరించబడిన కంటైనర్‌లో ఉంటుంది కంటైనర్ రిజిస్ట్రీ దారిలో 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

ఉపయోగించి కనెక్ట్ చేసిన తర్వాత Jenkins ఏజెంట్ gcloud ఆల్ఫా క్లౌడ్-షెల్ 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-క్లస్టర్) మరియు ప్రాజెక్ట్ పేరు (అద్భుతమైన-ప్రాజెక్ట్), క్లస్టర్ ఎక్కడ ఉంది.

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లో విస్తరణ పనిని సృష్టిస్తాము. జెంకిన్స్ జాకెట్ కింద ఒక పీక్ తీసుకుందాం

నేను ఉద్దేశపూర్వకంగా సెట్టింగ్‌ను విస్మరించాను లోపల ప్రవేశించుట. ఒక సాధారణ కారణం కోసం: మీరు దీన్ని సెటప్ చేసిన తర్వాత పనిభారం ఇచ్చిన పేరుతో, మీరు ఈ పేరుతో ఎన్ని డిప్లాయ్‌మెంట్‌లు చేసినా అది పని చేస్తూనే ఉంటుంది. బాగా, సాధారణంగా, ఇది చరిత్ర పరిధికి మించినది.

తీర్మానాలకు బదులుగా

పైన పేర్కొన్న అన్ని దశలను బహుశా పూర్తి చేసి ఉండకపోవచ్చు, కానీ జెంకిన్స్, వారి మ్యుయులియన్ కోసం కొన్ని ప్లగ్ఇన్‌లను ఇన్‌స్టాల్ చేసారు. కానీ కొన్ని కారణాల వల్ల నేను ప్లగిన్‌లను ఇష్టపడను. బాగా, మరింత ఖచ్చితంగా, నేను నిరాశతో మాత్రమే వాటిని ఆశ్రయిస్తాను.

మరియు నేను నా కోసం ఏదైనా కొత్త అంశాన్ని ఎంచుకోవాలనుకుంటున్నాను. పై వచనం కూడా ప్రారంభంలో వివరించిన సమస్యను పరిష్కరించేటప్పుడు నేను కనుగొన్న వాటిని పంచుకోవడానికి ఒక మార్గం. డెవొప్స్‌లో అతని లాంటి భయంకరమైన తోడేలు లేని వారితో భాగస్వామ్యం చేయండి. నా పరిశోధనలు కనీసం ఎవరికైనా సహాయం చేస్తే, నేను సంతోషిస్తాను.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి