ãã¹ãŠã¯ãéçºããŒã ã® 20 ã€ã®ããŒã ãªãŒããŒããåæ¥ã«ã³ã³ããåãããæ°ããã¢ããªã±ãŒã·ã§ã³ããã¹ãããããã«ç§ãã¡ã«äŸé Œãããšãã«å§ãŸããŸããã æçš¿ããŸããã XNUMXåã»ã©åŸãéåžžã«å¿ èŠãªãã®ãè¿œå ãããŠãããããã¢ããªã±ãŒã·ã§ã³ãæŽæ°ããããã«èŠæ±ãããŸããã ãªãã¥ãŒã¢ã«ããŸããã ããã«æ°æéåŸ...ãŸãã次ã«äœãèµ·ããå§ãããã¯æ³åã§ããã§ããã...
æ£çŽã«èšããšãç§ã¯ããªãæ ãè ã§ã (ããã以åã«èªããŸããã§ããã? ããã?)ãããŒã ãªãŒããŒããã¹ãŠã® CI/CD ãæã£ãŠãã Jenkins ã«ã¢ã¯ã»ã¹ã§ãããšããäºå®ãèæ ®ããŠã圌ã«æ¬¡ã®ããã«ãããã€ãããããšæããŸããã圌ãæãã ãïŒ ç§ã¯ãžã§ãŒã¯ãæãåºããŸãããã人ã«éãäžå¹äžããã°ãäžæ¥é£ã¹ãããã§ããããã ãã人ããFedããšåŒã¶ãšããã®äººã¯äžçFedãããããšã«ãªãã ãããŠãè¡ã£ãŠããŸãã ä»äºäžã«ãããããããããã«ãããæ£åžžã«æ§ç¯ãããããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ãå«ãã³ã³ããã Kuber ã«ãããã€ããããã«ä»»æã®å€ã転éã§ããããã«ãªããŸãã ENV ïŒç§ã®ç¥ç¶ã¯æç®åŠè ã§ãæã¯è±èªã®æåž«ã§ããããä»ã§ã¯ãã®æãèªãã åŸããããã¿ã§æãåããéåžžã«è¡šæ è±ãã«ç§ãèŠã€ããŠããŸããïŒã
ããã§ããã®ã¡ã¢ã§ã¯ãç§ãã©ã®ããã«åŠãã ãã説æããŸãã
- Jenkins ã§ãžã§ãèªäœãŸãã¯ä»ã®ãžã§ããããžã§ããåçã«æŽæ°ããŸãã
- Jenkins ãšãŒãžã§ã³ããã€ã³ã¹ããŒã«ãããŠããããŒãããã¯ã©ãŠã ã³ã³ãœãŒã« (Cloud Shell) ã«æ¥ç¶ããŸãã
- ã¯ãŒã¯ããŒãã Google Kubernetes Engine ã«ãããã€ããŸãã
å®éã®ãšããããã¡ããç§ã¯å€å°äžèª å®ãªãšããããããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å°ãªããšãäžéšã Google ã¯ã©ãŠãã«ããããšãåæãšããŠããŸãããããã£ãŠãããªãã¯ãã®ãŠãŒã¶ãŒã§ãããåœç¶ GCP ã¢ã«ãŠã³ããæã£ãŠããŸãã ããããããã¯ãã®ã¡ã¢ã®å
容ã§ã¯ãããŸããã
ããã次åã®ããŒãã·ãŒãã§ãã ç§ã¯ãã®ãããªã¡ã¢ãXNUMXã€ã®ã±ãŒã¹ã§ã®ã¿æžããããšæããŸããåé¡ã«çŽé¢ããŸããããæåã¯ããã解決ããæ¹æ³ãããããŸããã§ããã解決çã¯æ¢è£œã®ãã®ã§ã¯ãªããGoogleã§æ€çŽ¢ãããããéšåçã«Googleã§æ€çŽ¢ããæçµçã«åé¡ã解決ããŸããã ãããŠãå°æ¥ãã©ã®ããã«ãã£ãããå¿ãããšãã«ããã¹ãŠãããäžåºŠã°ãŒã°ã«ã§èª¿ã¹ãŠãŸãšããŠãŸãšããå¿ èŠããªããªãããã«ããã®ãããªã«ã³ãã³ã°ããŒããŒãèªåã§æžããŸãã
å 責äºé ïŒ 1. ãã®ã¡ã¢ã¯ãèªåã®ãããã圹ã®ããã«æžããã ãã¹ããã©ã¯ãã£ã¹ é©çšãããŸããã ã³ã¡ã³ãã§ãããããã»ããããã£ãããšããéžæè¢ãèªãã§ããããæããŸãã
2. ããŒãã®é©çšéšåãå¡©ã§ãããšã¿ãªãããå ŽåããããŸã§ã®ãã¹ãŠã®ããŒããšåæ§ãããã¯åŒ±ã塩溶液ã§ãã
Jenkins ã§ã®ãžã§ãèšå®ã®åçæŽæ°
ããªãã®è³ªåã¯äºæ³éãã§ã: åçãžã§ãæŽæ°ã¯ãããšã©ã®ãããªé¢ä¿ãããã®ã§ãã? æååãã©ã¡ãŒã¿ã®å€ãæåã§å ¥åãããšãäœæ¥ãå§ãŸããŸãã
ç§ã¯çããŸãïŒç§ã¯æ¬åœã«æ ãè ã§ãã圌ããæå¥ãèšãã®ã¯å¥œãã§ã¯ãããŸããïŒããŒã·ã£ããããã€ã¡ã³ããã¯ã©ãã·ã¥ããŠããŸãããã¹ãŠãæ¶ããŠããŸãïŒ èª¿ã¹å§ãããšãã¿ã¹ã¯èµ·åãã©ã¡ãŒã¿ã®å€ã«ã¿ã€ããã¹ããããŸããã ãããã£ãŠãç§ã¯ãã¹ãŠãã§ããã ãå¹ççã«è¡ãããšã奜ã¿ãŸãã 代ããã«éžæã§ããå€ã®ãªã¹ããæäŸããããšã§ããŠãŒã¶ãŒãããŒã¿ãçŽæ¥å ¥åã§ããªãããã«ã§ããå Žåã¯ãéžæå 容ãæŽçããŸãã
èšç»ã¯æ¬¡ã®ãšããã§ããJenkins ã§ãžã§ããäœæããŸãããžã§ããèµ·åããåã«ããªã¹ãããããŒãžã§ã³ãéžæããã³ã³ãããŒã«æž¡ããããã©ã¡ãŒã¿ãŒã®å€ãæå®ããŸãã ENVã次ã«ãã³ã³ãããŒãåéãããããã³ã³ãã㌠ã¬ãžã¹ããªã«ããã·ã¥ããŸãã 次ã«ãããããã³ã³ããã cuber ã§æ¬¡ã®ããã«èµ·åãããŸãã ã¯ãŒã¯ããŒã ãžã§ãã§æå®ããããã©ã¡ãŒã¿ã䜿çšããŸãã
Jenkins ã§ãžã§ããäœæããŠèšå®ããããã»ã¹ã«ã€ããŠã¯èæ ®ããŸãããããã¯æ¬é¡ããå€ããŸãã ã¿ã¹ã¯ã®æºåãã§ããŠãããšä»®å®ããŸãã ããŒãžã§ã³ãå«ãæŽæ°ããããªã¹ããå®è£ ããã«ã¯ãäºåã«æå¹ãªããŒãžã§ã³çªå·ãå«ãæ¢åã®ãœãŒã¹ ãªã¹ããšæ¬¡ã®ãããªå€æ°ã® XNUMX ã€ãå¿ èŠã§ãã éžæãã©ã¡ãŒã¿ ã¿ã¹ã¯ã®äžã§ã ãã®äŸã§ã¯ãå€æ°ã«æ¬¡ã®ååãä»ããŸãã ãã«ã_ããŒãžã§ã³ãããã«ã€ããŠã¯è©³ãã説æããŸããã ãããããœãŒã¹ãªã¹ãã詳ããèŠãŠã¿ãŸãããã
éžæè¢ã¯ããã»ã©å€ããããŸããã ããã«æ¬¡ã® XNUMX ã€ã®ããšãæãæµ®ãã³ãŸããã
- Jenkins ããŠãŒã¶ãŒã«æäŸãããªã¢ãŒã ã¢ã¯ã»ã¹ API ã䜿çšããŸãã
- ãªã¢ãŒã ãªããžã㪠ãã©ã«ããŒã®ã³ã³ãã³ãããªã¯ãšã¹ãããŸã (ãã®å Žåããã㯠JFrog Artifactory ã§ãããããã¯éèŠã§ã¯ãããŸãã)ã
Jenkins ãªã¢ãŒã ã¢ã¯ã»ã¹ 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 ã«çŠç¹ãåœãŠãŸãããã
ãã¹ãŠã®ãžã§ãå®è¡ã®ãªã¹ããååŸããŠã¿ãŸãããã ã¢ã»ã³ããªåã®ã¿ã«é¢å¿ããããŸã (displayName) ãšãã®çµæ (çµæ):
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]
ããã¯åäœããŸãããïŒ
次ã«ãçµæãåŸãããå®è¡ã®ã¿ããã£ã«ã¿ãªã³ã°ããŸããã æåã åŒæ°ã䜿ã£ãŠã¿ãŸããã é€å€(&X) ãããŠãã©ã¡ãŒã¿ãšããŠãçãããªãå€ãžã®ãã¹ãæž¡ããŸãã æåã ã¯ãã¯ãã äºéåŠå®ã¯ã¹ããŒãã¡ã³ãã§ãã èå³ã®ãªããã®ã¯ãã¹ãŠé€å€ããŸãã
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']
倱æãããã®ã®ãªã¹ãã®ã¹ã¯ãªãŒã³ã·ã§ãã
ãªã¢ãŒããµãŒããŒäžã®ãã©ã«ããŒããã®ããŒãžã§ã³ã®ãªã¹ã
ããŒãžã§ã³ã®ãªã¹ããååŸãã XNUMX çªç®ã®æ¹æ³ããããŸãã ç§ã¯ Jenkins API ã«ã¢ã¯ã»ã¹ããããããã®æ¹æ³ã®æ¹ã奜ãã§ãã ã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«æ§ç¯ããããšããããšã¯ãã¢ããªã±ãŒã·ã§ã³ãããã±ãŒãžåãããé©åãªãã©ã«ããŒã®ãªããžããªã«é 眮ãããããšãæå³ããããã§ãã åæ§ã«ããªããžããªã¯ã¢ããªã±ãŒã·ã§ã³ã®åäœããŒãžã§ã³ã®ããã©ã«ãã®ã¹ãã¬ãŒãžã§ãã ã®ããã«ã ã§ã¯ãã¹ãã¬ãŒãžã«ã©ã®ããŒãžã§ã³ãããã®ãââèããŠã¿ãŸãããã ãªã¢ãŒã ãã©ã«ããŒã«å¯ŸããŠãcurlãgrepãããã³ awk ãå®è¡ããŸãã ã¯ã³ã©ã€ããŒã«èå³ããã人ã¯ãã¹ãã€ã©ãŒã®äžã«ãããŸãã
äžè¡ã³ãã³ã
XNUMX ã€ã®ããšã«æ³šæããŠãã ãããããããŒã§æ¥ç¶ã®è©³çŽ°ãæž¡ããŸãããã©ã«ããŒå
ã®ãã¹ãŠã®ããŒãžã§ã³ã¯å¿
èŠãªããXNUMX ãæ以å
ã«äœæãããããŒãžã§ã³ã®ã¿ãéžæããŸãã çŸå®ãšããŒãºã«åãããŠã³ãã³ããç·šéããŸãã
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
ãããã£ãŠãæ§æãã¡ã€ã«ãããŠã³ããŒãããå¿
èŠã«å¿ããŠç·šéããå
¥æããå Žæã«æ»ãããšãã§ããŸãã
ããŒãžã§ã³ã®ãªã¹ãã®ãã©ã¡ãŒã¿ãäœæããããšã«äžèšã§åæããããšãæãåºããŠãã ããã ãã«ã_ããŒãžã§ã³?
æ§æãã¡ã€ã«ãããŠã³ããŒãããŠããã®äžèº«ãèŠãŠã¿ãŸãããã ãã©ã¡ãŒã¿ãŒãé©åã«é 眮ãããç®çã®ã¿ã€ãã§ããããšã確èªããããã§ãã
ã¹ãã€ã©ãŒã®äžã®ã¹ã¯ãªãŒã³ã·ã§ããã
config.xml ãã©ã°ã¡ã³ãã¯åãããã«èŠããã¯ãã§ãã ãã ããchoices èŠçŽ ã®å
容ããŸã æ¬ èœããŠããŸãã
æ¬æ°ã§ããïŒ ããã§ããã«ããæåããå Žåã«å®è¡ãããã¹ã¯ãªãããäœæããŸãããã
ã¹ã¯ãªããã¯ããŒãžã§ã³ã®ãªã¹ããåãåããæ§æãã¡ã€ã«ãããŠã³ããŒãããå¿
èŠãªå Žæã«ããŒãžã§ã³ã®ãªã¹ããæžã蟌ã¿ããããå
ã«æ»ããŸãã ã¯ãã ããã¯æ£ããã ããŒãžã§ã³ã®ãªã¹ããæ¢ã«ååšããå Žæ (å°æ¥ãã¹ã¯ãªããã®æåã®èµ·ååŸã«è¿œå ãããŸã) ã«ã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
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
çè«çã«ã¯ãäžèšã®äŸã«åºã¥ããŠèšè¿°ãããã³ãŒãããã¹ãããå Žåãå±éã¿ã¹ã¯ã«ã¯ããŒãžã§ã³ãå«ãããããããŠã³ ãªã¹ãããã§ã«ååšããŠããã¯ãã§ãã ã¹ãã€ã©ãŒã®äžã®ã¹ã¯ãªãŒã³ã·ã§ããã®ãããªæãã§ãã
æ£ããå®æããããŒãžã§ã³ã®ãªã¹ã
ãã¹ãŠãããŸããã£ãå Žåã¯ãã¹ã¯ãªãããã³ããŒããŠè²Œãä»ããŸãã ã·ã§ã«ã³ãã³ããå®è¡ãã ãããŠå€æŽãä¿åããŸãã
ã¯ã©ãŠãã·ã§ã«ãžã®æ¥ç¶
ã³ã³ããã«ã³ã¬ã¯ã¿ãŒãããŸãã åœç€Ÿã§ã¯ãã¢ããªã±ãŒã·ã§ã³é ä¿¡ããŒã«ããã³æ§æãããŒãžã£ãŒãšã㊠Ansible ã䜿çšããŠããŸãã ãããã£ãŠãã³ã³ãããŒãæ§ç¯ããå ŽåãDocker ã Docker ã«ã€ã³ã¹ããŒã«ãããAnsible ãå®è¡ããŠãããã·ã³ã« Docker ãã€ã³ã¹ããŒã«ããããŸãã¯ã¯ã©ãŠã ã³ã³ãœãŒã«ã§ã³ã³ãããŒãæ§ç¯ãããšãã XNUMX ã€ã®ãªãã·ã§ã³ãæãæµ®ãã³ãŸãã ãã®èšäºã§ã¯ Jenkins ã®ãã©ã°ã€ã³ã«ã€ããŠã¯æ²é»ããããšã«åæããŸããã èŠããŠïŒ
ç§ã¯æ¬¡ã®ããã«å€æããŸããããããã«äœ¿ãããã³ã³ãããŒã¯ã¯ã©ãŠã ã³ã³ãœãŒã«ã§åéã§ããã®ã§ããããããããè¡ãå¿ èŠã¯ãããŸããã ãããã«ããŠãããŠãã ãããïŒ ã¯ã©ãŠã ã³ã³ãœãŒã«ã§ Jenkins ã³ã³ãããåéãããããã cuber ã§èµ·åããããšèããŠããŸãã ããã«ãGoogle ã®ã€ã³ãã©ã¹ãã©ã¯ãã£å ã«ã¯éåžžã«è±å¯ãªãã£ãã«ããããå±éã®é床ã«æçãªå¹æããããããŸãã
ã¯ã©ãŠã ã³ã³ãœãŒã«ã«æ¥ç¶ããã«ã¯ã次㮠XNUMX ã€ã®ãã®ãå¿ èŠã§ãã gã¯ã©ãŠã ããã³ã¢ã¯ã»ã¹æš© Googleã¯ã©ãŠãAPI ãããšåãæ¥ç¶ã確ç«ããã VM ã€ã³ã¹ã¿ã³ã¹ã®å Žåã
Google Cloud 以å€ããæ¥ç¶ããäºå®ãããæ¹ãž
Google ã¯ããã®ãµãŒãã¹ã§å¯Ÿè©±åèªèšŒãç¡å¹ã«ããå¯èœæ§ãèš±å¯ããŠããŸãã ããã«ããã*nix ãå®è¡ããŠããŠã³ã³ãœãŒã«èªäœãããå Žåã¯ãã³ãŒããŒãã·ã³ããã§ãã³ã³ãœãŒã«ã«æ¥ç¶ã§ããããã«ãªããŸãã
ãã®ã¡ã¢ã®æ çµã¿ã®äžã§ãã®åé¡ãããã«è©³ãã説æããå¿ èŠãããå Žåã¯ãã³ã¡ã³ãã«æžããŠãã ããã ååãªç¥šãéãŸã£ããããã®ãããã¯ã«ã€ããŠææ°æ å ±ãæžããŸãã
æš©å©ãä»äžããæãç°¡åãªæ¹æ³ã¯ãWeb ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããšã§ãã
- åŸã§ã¯ã©ãŠã ã³ã³ãœãŒã«ã«æ¥ç¶ãã VM ã€ã³ã¹ã¿ã³ã¹ãåæ¢ããŸãã
- ãã€ã³ã¹ã¿ã³ã¹ã®è©³çŽ°ããéãããã€ã³ã¹ã¿ã³ã¹ã®è©³çŽ°ããã¯ãªãã¯ããŸãã ä¿®æ£ããŸã.
- ããŒãžã®äžçªäžã§ãã€ã³ã¹ã¿ã³ã¹ã®ã¢ã¯ã»ã¹ç¯å²ãéžæããŸã ãã¹ãŠã®ã¯ã©ãŠã API ãžã®ãã«ã¢ã¯ã»ã¹.
ã¹ã¯ãªãŒã³ã·ã§ãã
- å€æŽãä¿åããã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸãã
VM ã®èªã¿èŸŒã¿ãå®äºããããSSH çµç±ã§ VM ã«æ¥ç¶ãããšã©ãŒãªãæ¥ç¶ãè¡ãããããšã確èªããŸãã 次ã®ã³ãã³ãã䜿çšããŸãã
gcloud alpha cloud-shell ssh
æåããæ¥ç¶ã¯æ¬¡ã®ããã«ãªããŸã
GKE ãžã®ãããã€
ç§ãã¡ã¯ããããæ¹æ³ã§ IaC (Infrastucture as a Code) ãžã®å®å šãªç§»è¡ã«åãçµãã§ãããããDocker ãã¡ã€ã«ã¯ Git ã«ä¿åãããŠããŸãã ããã¯äžæ¹ã§ã¯ã ãŸããkubernetes ã§ã®ãããã€ã¡ã³ãã¯ããã®ã¿ã¹ã¯ã§ã®ã¿äœ¿çšããã yaml ãã¡ã€ã«ã«ãã£ãŠèšè¿°ãããããèªäœãã³ãŒãã®ãããªãã®ã§ãã ããã¯å察åŽããã§ãã ã€ãŸãã倧ãŸãã«èšããšãèšç»ã¯æ¬¡ã®ãšããã§ãã
- å€æ°ã®å€ãååŸããŸã ãã«ã_ããŒãžã§ã³ ããã³ãªãã·ã§ã³ã§ãæž¡ãããå€æ°ã®å€ ENV.
- Git ãã dockerfile ãããŠã³ããŒãããŸãã
- ãããã€ã¡ã³ãçšã® yaml ãçæããŸãã
- ãããã®ãã¡ã€ã«ã¯äž¡æ¹ãšã scp çµç±ã§ã¯ã©ãŠã ã³ã³ãœãŒã«ã«ã¢ããããŒãããŸãã
- ããã§ã³ã³ãããæ§ç¯ããã³ã³ãã ã¬ãžã¹ããªã«ããã·ã¥ããŸãã
- ããŒããããã€ã¡ã³ããã¡ã€ã«ã cuber ã«é©çšããŸãã
ãã£ãšå ·äœçã«èšã£ãŠã¿ãŸãããã ã«ã€ããŠè©±ãå§ãããšã ENV次ã«ãXNUMX ã€ã®ãã©ã¡ãŒã¿ã®å€ãæž¡ãå¿ èŠããããšããŸãã ãã©ã¡ãŒã¿1 О ãã©ã¡ãŒã¿2ã ãããã€ã¡ã³ãçšã®ã¿ã¹ã¯ãè¿œå ããŸããã-ããšå ¥åããŸãã æååãã©ã¡ãŒã¿.
ã¹ã¯ãªãŒã³ã·ã§ãã
åçŽãªãªãã€ã¬ã¯ãã䜿çšã㊠yaml ãçæããŸã echo ãã¡ã€ã«ãžã ãã¡ããã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
ã䜿çšããŠæ¥ç¶ããåŸã® Jenkins ãšãŒãžã§ã³ã gcloud alpha ã¯ã©ãŠãã·ã§ã« ssh ã€ã³ã¿ã©ã¯ãã£ã ã¢ãŒãã¯å©çšã§ããªãããããã©ã¡ãŒã¿ã䜿çšããŠã³ãã³ããã¯ã©ãŠã ã³ã³ãœãŒã«ã«éä¿¡ããŸãã - æ瀺.
ã¯ã©ãŠã ã³ã³ãœãŒã«ã®ããŒã ãã©ã«ããŒãå€ã dockerfile ããåé€ããŸãã
gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"
scp ã䜿çšããŠãæ°ããããŠã³ããŒããã dockerfile ãã¯ã©ãŠã ã³ã³ãœãŒã«ã®ããŒã ãã©ã«ããŒã«é 眮ããŸãã
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"
ã¿ã¹ã¯ãå®è¡ããã³ã³ãœãŒã«åºåãéããã³ã³ãããŒã®ã¢ã»ã³ããªãæåããããšãæåŸ ããŸãã
ã¹ã¯ãªãŒã³ã·ã§ãã
ãããŠãçµã¿ç«ãŠãããã³ã³ããã®ãããã€ãæåããŸãã
ã¹ã¯ãªãŒã³ã·ã§ãã
æå³çã«èšå®ãç¡èŠãã é²å ¥ã åçŽãªçç±ã¯ XNUMX ã€ãããŸããäžåºŠã»ããã¢ãããããšã ã¯ãŒã¯ããŒã æå®ããååã䜿çšãããšããã®ååã§ãããã€ã¡ã³ããäœåå®è¡ããŠããåäœãç¶ããŸãã ãŸããäžè¬çã«ãããã¯æŽå²ã®ç¯å²ãå°ãè¶ ããŠããŸãã
çµè«ã®ä»£ããã«
äžèšã®ãã¹ãŠã®æé ã¯ããããå®è¡ã§ãããJenkins ã®æ©èœã§ãã Jenkins çšã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããã ãã§æžã¿ãŸããã ããããã©ããããããç§ã¯ãã©ã°ã€ã³ã奜ãã§ã¯ãããŸããã ããã§ãããããæ£ç¢ºã«èšãã°ãç§ã¯çµ¶æçãªæ°æã¡ãããããã«é Œã£ãŠããã ãã§ãã
ãããŠãç§ã¯èªåã«ãšã£ãŠæ°ãããããã¯ãåãäžããããšæã£ãŠããŸãã äžèšã®ããã¹ãã¯ãæåã«èª¬æããåé¡ã解決ããéã«åŸãçºèŠãå
±æããæ¹æ³ã§ããããŸãã 圌ã®ããã«ãDevops ã«ãããŠãŸã£ãããã€ã¢ãŠã«ãã§ã¯ãªã人ã
ãšå
±æããŠãã ããã ç§ã®èª¿æ»çµæãå°ãªããšã誰ãã®åœ¹ã«ç«ãŠã°å¹žãã§ãã
åºæïŒ habr.com