ãã§ã«æ¬¡ã«äœãèµ·ããå§ããããæšæž¬ããŸã...ç§ã¯èªããªããã°ãªããŸãããç§ã¯ããªãæ æ°ã§ãïŒç§ã¯ããã以åã«èªããŸãããïŒãããïŒïŒãããŠãããŒã ãªãŒããŒããžã§ã³ãã³ã¹ã«ã¢ã¯ã»ã¹ã§ãããšããäºå®ãèãããšãç§ãã¡ã¯ãã¹ãŠã®CI / CDãæã£ãŠãããšæããŸããïŒåœŒã«å¥œããªã ãèªåèªèº«ãå±éãããŠãã ããïŒç§ã¯éžè©±ãæãåºããŸããïŒç·ã«éãäžãããšã圌ã¯ãã®æ¥ã¯æºè ¹ã«ãªããŸããæºè ¹ã®äººãåŒã¶ãšã圌ã¯äžçæºè ¹ã«ãªããŸãããããŠåœŒã¯ä»äºã§éã³ã«è¡ããŸãããæ£åžžã«çµã¿ç«ãŠãããããŒãžã§ã³ãé©çšããŠã³ã³ãããå±éããENVå€ã転éããããšãã§ããŸãïŒç§ã®ç¥ç¶ãå²åŠè ãéå»ã®è±èªã®æåž«ã¯ããããèªãã åŸã圌ã®å¯ºé¢ã§æãã²ãããç§ãéåžžã«è¡šçŸåè±ãã«èŠãŸãæïŒã
ããã§ãæçš¿ã§ç§ãã©ã®ããã«åŠãã ãã«ã€ããŠè©±ããŸãïŒ
- Jenkinsã®ãžã§ããããžã§ãèªäœãŸãã¯ä»ã®ãžã§ãããåçã«æŽæ°ããŸãã
- JenkinsãšãŒãžã§ã³ããã€ã³ã¹ããŒã«ãããŠããããŒãããã¯ã©ãŠãã³ã³ãœãŒã«ïŒã¯ã©ãŠãã·ã§ã«ïŒã«æ¥ç¶ããŸãã
- ã¯ãŒã¯ããŒããGoogleKubernetesEngineã«ãããã€ããŸãã
å®éãç§ã¯ãã¡ããå°ãç¡çŸã§ããææããŠããã€ã³ãã©ã¹ãã©ã¯ãã£ã®å°ãªããšãäžéšãGoogleã¯ã©ãŠãã«ãããšæ³å®ãããŠããããããŠãŒã¶ãŒã¯ãã®ãŠãŒã¶ãŒã§ããããã¡ããGCPã¢ã«ãŠã³ããæã£ãŠããŸããããããã¡ã¢ã¯ããã«ã€ããŠã§ã¯ãããŸããã
ããã¯ç§ã®æ¬¡ã®ããŒãã·ãŒãã§ãããã®ãããªã¡ã¢ãæžãããã®ã¯1ã€ã®å Žåã ãã§ãã以åã«åé¡ãçºçããæåã¯è§£æ±ºæ¹æ³ãããããã解決çã宿ãã圢ã§ã°ãŒã°ã«ãããŠããªãã£ããããéšåçã«ã°ãŒã°ã«ã§æ€çŽ¢ããæçµçã«åé¡ã解決ããŸããããããŠãå°æ¥ãèªåã®ããæ¹ãå¿ãããšãã«ããã¹ãŠãããäžåºŠã°ãŒã°ã«ã§æ€çŽ¢ããŠãŸãšããå¿ èŠããªãããã«ãèªåã§ãã®ãããªããŒãã·ãŒããäœæããŸãã
Disclaimer: 1. « », best practice . « » .
2. , , , â .
Jenkins
ç§ã¯ããªãã®è³ªåãäºèŠããŸãïŒåçãªä»äºã®æŽæ°ã¯ãããšäœã®é¢ä¿ããããŸããïŒæååãã©ã¡ãŒã¿ã®å€ããã³ãã«ã§å ¥åããŠå ã«é²ã¿ãŸãïŒ
çãã¯ïŒç§ã¯æ¬åœã«æ ãè ã§ãã圌ããäžå¹³ãèšããšããç§ã¯ããã奜ãã§ã¯ãããŸããïŒããŒã·ã£ãå±éã¯ã¯ã©ãã·ã¥ããŠããŸãããã¹ãŠããªããªã£ãŠããŸãïŒããªãã¯æ¢ãå§ããŸãããããŠããã€ãã®ã¿ã¹ã¯èµ·åãã©ã¡ãŒã¿ã®å€ã«ã¿ã€ããã¹ããããŸãããããã£ãŠãç§ã¯å¯èœãªéãå®å šã«ãã¹ãŠãè¡ãããšã奜ã¿ãŸãã代ããã«éžæããå€ã®ãªã¹ããæå®ããããšã§ããŠãŒã¶ãŒãããŒã¿ãçŽæ¥å ¥åã§ããªãããã«ããããšãå¯èœãªå Žåã¯ãéžæãæŽçããŸãã
èšç»ã¯æ¬¡ã®ãšããã§ãïŒJenkinsã§ãžã§ããäœæããŸãããã®ãžã§ãã§ã¯ãèµ·åããåã«ããªã¹ãããããŒãžã§ã³ãéžæããENVãä»ããŠã³ã³ããã«æž¡ããããã©ã¡ãŒã¿ã®å€ãæå®ããã³ã³ãããåéããŠã³ã³ããã¬ãžã¹ããªã«ããã·ã¥ããããšãã§ããŸããããã«ãããããã³ã³ããã¯ã¯ãã©ã§æ¬¡ã®ããã«çºå£²ãããŸããžã§ãã§æå®ããããã©ã¡ãŒã¿ãŒãæã€ã¯ãŒã¯ããŒãã
Jenkinsã§ãžã§ããäœæããã³æ§æããããã»ã¹ã«ã€ããŠã¯èæ ®ããŸãããããã¯ããããã¯ããå€ããŠããŸããã¿ã¹ã¯ã®æºåãã§ããŠãããšæ³å®ããŸããæŽæ°å¯èœãªããŒãžã§ã³ãªã¹ããå®è£ ããã«ã¯ã2ã€ã®ãã®ãå¿ èŠã§ããäºåã«æå¹ãªããŒãžã§ã³çªå·ãæã€æ¢åã®ãœãŒã¹ãªã¹ããšãã¿ã¹ã¯å ã®Choiceãã©ã¡ãŒã¿ã¿ã€ãã®å€æ°ã§ãããã®äŸã§ã¯ã倿°ã®ååãBUILD_VERSIONãšããŸããããã«ã€ããŠã¯ã詳ãã説æããŸããããããããœãŒã¹ãªã¹ãã詳ããèŠãŠã¿ãŸãããã
ããã»ã©å€ãã®ãªãã·ã§ã³ã¯ãããŸããã2ã€ã¯ããã«ç§ã«èµ·ãããŸããïŒ
- JenkinsããŠãŒã¶ãŒã«æäŸãããªã¢ãŒãã¢ã¯ã»ã¹APIã䜿çšããŸãã
- ãªã¢ãŒããªããžããªãã©ã«ãã®å 容ãã¯ãšãªããŸãïŒãã®å Žåãããã¯JFrog Artifactoryã§ãããéèŠã§ã¯ãããŸããïŒã
Jenkinsãªã¢ãŒãã¢ã¯ã»ã¹API
確ç«ãããçŽ æŽãããäŒçµ±ã«ããã°ãç§ã¯é·ã説æãé¿ããããšæããŸããAPIããã¥ã¡ã³ãã®æåã®ããŒãžã®
æåã®æ®µèœã®äžéšã®ã¿ãèªç±ã«ç¿»èš³ããããšãèš±å¯ããŸãã
Jenkinsã¯ããã®æ©èœãžã®ãªã¢ãŒããã·ã³èªã¿åãå¯èœã¢ã¯ã»ã¹çšã®APIãæäŸããŸãã<...>ãªã¢ãŒãã¢ã¯ã»ã¹ã¯RESTã®ãããªã¹ã¿ã€ã«ã§æäŸãããŸããããã¯ããã¹ãŠã®æ©èœãžã®åäžã®ãšã³ããªãã€ã³ãããªãã代ããã«ã... / api /ãã®ãããªURLã䜿çšãããããšãæå³ããŸããããã§ãã...ãã¯APIæ©èœãé©çšããããªããžã§ã¯ãã§ããã€ãŸããçŸåšè©±ããŠããå±éã¿ã¹ã¯ãã¢ãã¬ã¹
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_buildã§å©çšã§ããå Žåããã®ã¿ã¹ã¯ã®APIãã€ãã¹ã«ã¯
次ã§å©çšã§ããŸããåºåãåä¿¡ãã圢åŒãéžæã§ããŸãããã®å ŽåãAPIã¯ãã£ã«ã¿ãªã³ã°ã®ã¿ãèš±å¯ãããããXMLã«ã€ããŠè©³ããèŠãŠãããŸãããã
ãã¹ãŠã®ãžã§ãå®è¡ã®ãªã¹ããååŸããŠã¿ãŸããããã¢ã»ã³ããªåïŒdisplayNameïŒãšãã®çµæïŒresultïŒã®ã¿ã«é¢å¿ããããŸããhttp://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]
èµ·ãããŸããïŒ
ããã§ãSUCCESSã®çµæã«ãªãèµ·åã®ã¿ãé€å€ããŠã¿ãŸããããïŒexcludeåŒæ°ã䜿çšãããã©ã¡ãŒã¿ãŒãšããŠSUCCESSã«çãããªãå€ãžã®ãã¹ãæž¡ããŸããã¯ãã¯ããäºéåŠå®ã¯å£°æã§ããèå³ã®ãªããã®ã¯ãã¹ãŠé€å€ããŸãã
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']
倱æãããªã¹ãã®ã¹ã¯ãªãŒã³ã·ã§ãã
ãªã¢ãŒããµãŒããŒäžã®ãã©ã«ããŒããã®ããŒãžã§ã³ã®ãªã¹ã
ããŒãžã§ã³ã®ãªã¹ããååŸãã2çªç®ã®æ¹æ³ããããŸããJenkinsAPIåŒã³åºããããããã«æ°ã«å ¥ã£ãŠããŸããã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«ãã«ããããå Žåã¯ãããã±ãŒãžåãããŠããªããžããªã®é©åãªãã©ã«ãã«é 眮ãããŠããããã§ããåæ§ã«ããªããžããªã¯ããã©ã«ãã§ã¢ããªã±ãŒã·ã§ã³ã®åäœããŒãžã§ã³ã®ãªããžããªã§ãããæ°ã«å ¥ããããŠãã©ã®ããŒãžã§ã³ãã¹ãã¬ãŒãžã«ãããã圌ã«èããŠã¿ãŸãããããªã¢ãŒããã©ã«ããcurlãgrepãawkããŸãã誰ããã¢ã³ã©ã€ããŒã«èå³ããããªããããã¯ã¹ãã€ã©ãŒã®äžã«ãããŸãã
1è¡ã®ã³ãã³ã
: , , . :
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ã®ãžã§ãã»ããã¢ããããã³ãžã§ãæ§æãã¡ã€ã«
ããŒãžã§ã³ãªã¹ãã®ãœãŒã¹ãæŽçããŸãããçµæã®ãªã¹ããã¿ã¹ã¯ã«ãã蟌ã¿ãŸããããç§ã«ãšã£ãŠæãããªè§£æ±ºçã¯ãã¢ããªã±ãŒã·ã§ã³æ§ç¯ãžã§ãã«ã¹ãããã远å ããããšã§ãããçµæããæåãã®å Žåã«å®è¡ãããã¹ãããã
ã¢ã»ã³ããªã¿ã¹ã¯èšå®ãéããäžçªäžãŸã§ã¹ã¯ããŒã«ããŸãããã¿ã³ãã¯ãªãã¯ããŸãïŒãã«ãã¹ãããã®è¿œå ->æ¡ä»¶ä»ãã¹ãããïŒã·ã³ã°ã«ïŒãã¹ãããèšå®ã§ãçŸåšã®ãã«ãã¹ããŒã¿ã¹æ¡ä»¶ãéžæããSUCCESSå€ãèšå®ããŸããããã¯ãã·ã§ã«ã®å®è¡ã³ãã³ããæåããå Žåã«å®è¡ãããã¢ã¯ã·ã§ã³ã§ãã
ãããŠä»ã楜ããéšåã Jenkinsã¯ãžã§ãæ§æããã¡ã€ã«ã«ä¿åããŸãã XML圢åŒãéäžã§
http://--/config.xmlãããã£ãŠãæ§æãã¡ã€ã«ãããŠã³ããŒãããå¿
èŠã«å¿ããŠç·šéããŠãå
ã®å Žæã«é
眮ããããšãã§ããŸãã
äžèšã§ãããŒãžã§ã³ãªã¹ãã®BUILD_VERSIONãã©ã¡ãŒã¿ãäœæããããšã«åæããããšãèŠããŠããŸããïŒ
èšå®ãã¡ã€ã«ãããŠã³ããŒãããŠããã®äžãèŠãŠã¿ãŸãããããã©ã¡ãŒã¿ãé©åã«é 眮ãããæ¬åœã«æ£ããçš®é¡ã§ããããšã確èªããããã ãã«ã
ã¹ãã€ã©ãŒã®äžã®ã¹ã¯ãªãŒã³ã·ã§ããã
config.xmlã¹ããããã¯åãããã«èŠããã¯ãã§ããchoicesèŠçŽ ã®ã³ã³ãã³ãããŸã ååšããªãããšãé€ããŠ
ããªãã¯ç¢ºä¿¡ããŠããŸããïŒããŠããã«ããæåããå Žåã«å®è¡ãããã¹ã¯ãªãããäœæããŠããŸãã
ã¹ã¯ãªããã¯ããŒãžã§ã³ã®ãªã¹ããåãåããæ§æãã¡ã€ã«ãããŠã³ããŒãããå¿ èŠãªå Žæã«ããŒãžã§ã³ã®ãªã¹ããæžã蟌ãã§ãããå ã«æ»ããŸããã¯ãããã¹ãŠãæ£ããã§ããããŒãžã§ã³ã®ãªã¹ãããã§ã«ããå Žæã«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 '%s\n' "${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 '%s\n' "${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ã«ã€ã³ã¹ããŒã«ãããDockerãAnsibleãæèŒãããã·ã³ã«ã€ã³ã¹ããŒã«ããããŸãã¯ã¯ã©ãŠãã³ã³ãœãŒã«ã§ã³ã³ãããæ§ç¯ãããšãã3ã€ã®ãªãã·ã§ã³ãæãæµ®ãã³ãŸãããã®èšäºã§ã¯ãJenkinsã®ãã©ã°ã€ã³ã«ã€ããŠé»ã£ãŠããããšã«åæããŸãããèŠããŠããŸããïŒ
ãç®±ããåºããŠãã³ã³ãããã¯ã©ãŠãã³ã³ãœãŒã«ã§çµã¿ç«ãŠãããšãã§ããã®ã§ããªãéèåããã§ã³ã¹ã§å²ãã®ã§ãããããæž æœã«ä¿ã£ãŠãã ãããïŒã¯ã©ãŠãã³ã³ãœãŒã«ã§Jenkinsã䜿çšããŠã³ã³ãããäœæããããããKuberã«æã¡èŸŒã¿ãããšæããŸããããã«ãã€ã³ãã©ã¹ãã©ã¯ãã£å ã«ã¯ãGoogleã«ã¯éåžžã«å€ªããã£ãã«ããããå±éã®éåºŠã«æçãªå¹æããããããŸãã
ã¯ã©ãŠãã³ã³ãœãŒã«ã«æ¥ç¶ããã«ã¯ã次ã®2ã€ãå¿ èŠã§ããgcloudã¢ã¯ã»ã¹æš©ãGoogleã¯ã©ãŠãAPIãã®æ¥ç¶ãè¡ãããŸããããããVMã€ã³ã¹ã¿ã³ã¹ã®ã
Googleã¯ã©ãŠãããã§ã¯ãªãæ¥ç¶ããããšãèšç»ããŠãã人ã®ããã«
. , *nix' .
, â . â .
, â . â .
æš©éãä»äžããæãç°¡åãªæ¹æ³ã¯ãWebã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããšã§ãã
- å°æ¥ãã¯ã©ãŠãã³ã³ãœãŒã«ã«æ¥ç¶ããVMã€ã³ã¹ã¿ã³ã¹ã忢ããŸãã
- ã€ã³ã¹ã¿ã³ã¹ã®è©³çްãéãã[ç·šé]ãã¯ãªãã¯ããŸãã
- ããŒãžã®äžçªäžã§ãã€ã³ã¹ã¿ã³ã¹ã¢ã¯ã»ã¹ã¹ã³ãŒããéžæããŸãããã¹ãŠã®CloudAPIãžã®ãã«ã¢ã¯ã»ã¹ã
ã¹ã¯ãªãŒã³ã·ã§ãã
- 倿Žãä¿åããŠãã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸãã
VMã®èµ·åãå®äºããããSSHçµç±ã§VMã«æ¥ç¶ããæ¥ç¶ãæåããããšã確èªããŸããæ¬¡ã®ã³ãã³ãã䜿çšããŸãã
gcloud alpha cloud-shell ssh
æåããæ¥ç¶ã¯æ¬¡ã®ããã«ãªããŸã
GKEã«ãããã€ãã
IaCïŒInfrastucture as a CodeïŒã«å®å šã«åãæ¿ããããã«ããããæ¹æ³ã§åªåããŠãããããdockerfileãgitaã«ä¿åããŸããããã¯äžæ¹ã§ã§ããkubernetesã§ã®å±éã¯ãyamlãã¡ã€ã«ã«ãã£ãŠèšè¿°ãããŸãããã®ãã¡ã€ã«ã¯ããã®ã¿ã¹ã¯ã§ã®ã¿äœ¿çšãããããèªäœãã³ãŒãã®ãããªãã®ã§ããããã¯å察åŽã«ãããŸããäžè¬çã«ãç§ã¯èšç»ã次ã®ãšããã§ããããšãæå³ããŸãïŒ
- BUILD_VERSION倿°ã®å€ãååŸãããªãã·ã§ã³ã§ãENVãä»ããŠæž¡ããã倿°ã®å€ãååŸããŸãã
- gitaããdockerfileãããŠã³ããŒãããŠããŸãã
- å±éçšã®yamlãçæããŠããŸãã
- ãããã®ãã¡ã€ã«ã®äž¡æ¹ãscpçµç±ã§ã¯ã©ãŠãã³ã³ãœãŒã«ã«ã¢ããããŒãããŸãã
- ããã§ã³ã³ãããäœæããã³ã³ããã¬ãžã¹ããªã«ããã·ã¥ããŸã
- ããŒããããã€ã¡ã³ããã¡ã€ã«ãKuberã«é©çšããŸãã
ãã£ãšå ·äœçã«ããŸããããENVã«ã€ããŠè©±ããŠããã®ã§ãPARAM1ãšPARAM2ã®2ã€ã®ãã©ã¡ãŒã¿ãŒã®å€ãæž¡ãå¿ èŠããããšããŸãããã-å±éãã¿ã€ãã®ããã«èªåã®ã¿ã¹ã¯ã远å ããŸãæååãã©ã¡ãŒã¿ã
ã¹ã¯ãªãŒã³ã·ã§ãã
echoããã¡ã€ã«ã« ãªãã€ã¬ã¯ãããã ãã§yamlãçæããŸãããã¡ãããdockerfileã«PARAM1ãšPARAM2ããããããŒãåã¯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ã䜿çšã㊠JenkinsãšãŒãžã§ã³ãã«æ¥ç¶ããåŸãã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã䜿çšã§ããªãããã-commandãã©ã¡ãŒã¿ãŒã䜿çšããŠã¯ã©ãŠãã³ã³ãœãŒã«ã«ã³ãã³ããéä¿¡ããŸãã
å€ã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-clusterïŒãšãã¯ã©ã¹ã¿ãŒãé 眮ãããŠãããããžã§ã¯ãã®ååïŒawesome-projectïŒã䜿çšããŠããããšã«æ³šæããŠãã ããã
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"
ã¿ã¹ã¯ãéå§ããã³ã³ãœãŒã«åºåãéããŠãã³ã³ãããŒãæ£åžžã«ãã«ããããããšã確èªããŸãã
ã¹ã¯ãªãŒã³ã·ã§ãã
ãããŠãçµã¿ç«ãŠãããã³ã³ããã®å±éã®æå
ã¹ã¯ãªãŒã³ã·ã§ãã
Ingressã® èšå®ãæå³çã«ç¡èŠããŸãããåçŽãªçç±ã®1ã€ã¯ãç¹å®ã®ååã®ã¯ãŒã¯ããŒãçšã«æ§æãããšããã®ååã®ãããã€ã¡ã³ããããã€å®è¡ãããŠããæäœå¯èœãªãŸãŸã«ãªããŸãããŸããäžè¬çã«ãããã¯æŽå²ã®ç¯å²ãå°ãè¶ ããŠããŸãã
çµè«ã®ä»£ããã«
äžèšã®ãã¹ãŠã®æé ã¯ãããããå®è¡ã§ããªãã£ãå¯èœæ§ããããŸãããJenkinsã®muuulionçšã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããã ãã§ãããããããã©ããããããç§ã¯ãã©ã°ã€ã³ã奜ãã§ã¯ãããŸããããŸãããã£ãšæ£ç¢ºã«èšãã°ãç§ã¯çµ¶æããã ã圌ãã«é ŒããŸãã
ãããŠãç§ã¯ç§ã®ããã«ããã€ãã®æ°ãããããã¯ãåãäžããã®ã奜ãã§ããäžèšã®ããã¹ãã¯ãç§ãè¡ã£ã調æ»çµæãå ±æããæ¹æ³ã§ããããæåã«èª¬æããåé¡ã解決ããŸããã®ããã«ãdevopsã®æ²æšãªãªãªã«ãã§ã¯ãªã人ã ãšå ±æããŠãã ãããç§ã®çºèŠãå°ãªããšã誰ããå©ãããªããç§ã¯å¹žãã«ãªãã§ãããã