
ç§ã®ååã¯IlyaGulyaevã§ããDINSã®PostDeploymentVerificationããŒã ã®ãã¹ãèªååãšã³ãžãã¢ã§ãã
DINSã§ã¯ããã«ãã®æ§ç¯ãããããã€ã¡ã³ããèªåãã¹ãã®å®è¡ãŸã§ãå€ãã®ããã»ã¹ã§Jenkinsã䜿çšããŠããŸããç§ã®ããŒã ã§ã¯ãéçºç°å¢ããæ¬çªç°å¢ã«åãµãŒãã¹ãå±éããåŸãã¹ã¢ãŒã¯ãã§ãã¯ãåäžã«å®è¡ããããã®ãã©ãããã©ãŒã ãšããŠJenkinsã䜿çšããŠããŸãã
1幎åãä»ã®ããŒã ã¯ããã€ãã©ã€ã³ã䜿çšããŠãæŽæ°åŸã«1ã€ã®ãµãŒãã¹ããã§ãã¯ããã ãã§ãªããå€§èŠæš¡ãªãã¹ãããããå®è¡ããåã«ç°å¢å šäœã®ç¶æ ããã§ãã¯ããããšã決å®ããŸãããç§ãã¡ã®ãã©ãããã©ãŒã ã®è² è·ã¯10åã«å¢å ãããžã§ã³ãã³ã¹ã¯ç®åã®ã¿ã¹ã¯ã«å¯ŸåŠããã®ããããã¡ããã©èœã¡å§ããŸããããªãœãŒã¹ã远å ããŠã¬ããŒãžã³ã¬ã¯ã¿ãŒã調æŽãããšãåé¡ãé ããã ãã§ãå®å šã«ã¯è§£æ±ºãããªãå¯èœæ§ãããããšã«ããã«æ°ä»ããŸããããã®ããããžã§ã³ãã³ã¹ã®ããã«ããã¯ãèŠã€ããŠæé©åããããšã«ããŸããã
ãã®èšäºã§ã¯ãJenkins Pipelineãã©ã®ããã«æ©èœãããã説æãããã€ãã©ã€ã³ãé«éåããã®ã«åœ¹ç«ã€å¯èœæ§ã®ããç§ã®èª¿æ»çµæãå ±æããŸãããã®è³æã¯ããã§ã«JenkinsãšååããŠããŠãããŒã«ã«ã€ããŠãã£ãšããç¥ããããšã³ãžãã¢ã«åœ¹ç«ã¡ãŸãã
ãªããŠéç£ãžã§ã³ãã³ã¹ãã€ãã©ã€ã³
Jenkins Pipelineã¯ãããŸããŸãªããã»ã¹ãèªååã§ãã匷åãªããŒã«ã§ãã Jenkins Pipelineã¯ãGroovy DSLã®åœ¢åŒã§ã¢ã¯ã·ã§ã³ãèšè¿°ã§ãããã©ã°ã€ã³ã®ã»ããã§ãããBuildFlowãã©ã°ã€ã³ã®åŸç¶ã§ãã
Build Flowãã©ã°ã€ã³ã®ã¹ã¯ãªããã¯ãJenkinså éšAPIãžã®ã¢ã¯ã»ã¹ã劚ããéå£ãªãã«Groovyã³ãŒããå®è¡ããå¥ã®Javaã¹ã¬ããã®ãã¹ã¿ãŒã§çŽæ¥å®è¡ãããŸããããã®ã¢ãããŒãã¯ã»ãã¥ãªãã£ãªã¹ã¯ããããããŸãããããã¯åŸã«ãã«ããããŒãæŸæ£ããçç±ã®1ã€ã«ãªããã¹ã¯ãªãããå®è¡ããããã®å®å šã§ã¹ã±ãŒã©ãã«ãªããŒã«ã§ããJenkinsPipelineãäœæããããã®åææ¡ä»¶ãšããŠæ©èœããŸããã
Jenkins Pipelineã®äœæã®æŽå²ã«ã€ããŠè©³ããã¯ãèè ã®èšäºBuildFlowãŸãã¯Jenkinsã§ã®GroovyDSLã«é¢ããOlegNenashevã®è¬æŒã
ãžã§ã³ãã³ã¹ãã€ãã©ã€ã³ã®ããã¿
次ã«ããã€ãã©ã€ã³ãå éšããã©ã®ããã«æ©èœããããçè§£ããŸãããã圌ãã¯éåžžãJenkins Pipelineã¯ãWebã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãªãã¯ã§ããå€ãè¯ãããªãŒã¹ã¿ã€ã«ã®ãžã§ããšã¯ç°ãªããJenkinsã§ã¯ãŸã£ããç°ãªãçš®é¡ã®ãžã§ãã§ãããšèšããŸãããŠãŒã¶ãŒããèŠããšæ¬¡ã®ããã«ãªããŸããããžã§ã³ãã³ã¹åŽããèŠããšããã€ãã©ã€ã³ã¯ã¢ã¯ã·ã§ã³ã®èª¬æãã³ãŒãã«è»¢éã§ãããã©ã°ã€ã³ã®ã»ããã§ãã
ãã€ãã©ã€ã³ãšããªãŒã¹ã¿ã€ã«ã®ä»äºã®é¡äŒŒç¹
- ãžã§ãã®èª¬æïŒã¹ãããã§ã¯ãªãïŒã¯config.xmlãã¡ã€ã«ã«ä¿åãããŸã
- ãã©ã¡ãŒã¿ã¯config.xmlã«ä¿åãããŸã
- ããªã¬ãŒãconfig.xmlã«ä¿åãããŸã
- ãŸããäžéšã®ãªãã·ã§ã³ãconfig.xmlã«ä¿åãããŸã
ãããããããå ¬åŒããã¥ã¡ã³ãã¯ããã©ã¡ãŒã¿ãããªã¬ãŒãããã³ãªãã·ã§ã³ã¯ããã€ãã©ã€ã³ã§çŽæ¥èšå®ããããšãã§ããããšãèšããŸããçå®ã¯ã©ãã«ãããŸããïŒ
çå®ã¯ããã€ãã©ã€ã³ã§èª¬æãããŠãããã©ã¡ãŒã¿ã¯ããžã§ãã®éå§æã«Webã€ã³ã¿ãŒãã§ã€ã¹ã®æ§æã»ã¯ã·ã§ã³ã«èªåçã«è¿œå ããããšããããšã§ãããã®æ©èœã¯ææ°çã§æžããã®ã§ä¿¡é Œã§ããŸãããããã«ã€ããŠã¯èšäºã®åŸåã§è©³ãã説æããŸãã
ãã€ãã©ã€ã³ãžã§ããšããªãŒã¹ã¿ã€ã«ãžã§ãã®éã
- ãžã§ãã®éå§æã«ããžã§ã³ãã³ã¹ã¯ãžã§ããå®è¡ããããã®ãšãŒãžã§ã³ãã«ã€ããŠäœãç¥ããŸããã
- ã¢ã¯ã·ã§ã³ã¯ã1ã€ã®ã°ã«ãŒãŽã£ãŒãªã¹ã¯ãªããã§èª¬æãããŠããŸãã
ãžã§ã³ãã³ã¹å®£èšãã€ãã©ã€ã³ã®ç«ã¡äžã
Jenkins Pipelineã®èµ·åããã»ã¹ã¯ãæ¬¡ã®æé ã§æ§æãããŠããŸãã
- config.xmlãã¡ã€ã«ãããžã§ãã®èª¬æãããŒãããŸã
- ã¿ã¹ã¯ãå®äºããããã«å¥ã®ã¹ã¬ããïŒè»œéããã©ãŒããŒïŒãéå§ãã
- ãã€ãã©ã€ã³ã¹ã¯ãªããã®èªã¿èŸŒã¿
- æ§æããªãŒã®æ§ç¯ãšç¢ºèª
- ãžã§ãæ§æã®æŽæ°
- ãžã§ãã®èª¬æãšã¹ã¯ãªããã§æå®ããããã©ã¡ãŒã¿ãšããããã£ãçµã¿åããã
- ãžã§ãã®èª¬æããã¡ã€ã«ã·ã¹ãã ã«ä¿åãã
- ã°ã«ãŒãŽã£ãŒãªãµã³ãããã¯ã¹ã§ã¹ã¯ãªãããå®è¡ãã
- ãžã§ãå šäœãŸãã¯åäžã®ã¹ãããã«å¯ŸãããšãŒãžã§ã³ãã®èŠæ±

ãã€ãã©ã€ã³ãžã§ããéå§ããããšãJenkinsã¯å¥ã®ã¹ã¬ãããäœæããå®è¡ã®ããã«ãžã§ãããã¥ãŒã«éä¿¡ããã¹ã¯ãªãããããŒãããåŸãã¿ã¹ã¯ãå®äºããããã«å¿ èŠãªãšãŒãžã§ã³ããæ±ºå®ããŸãã
ãã®ã¢ãããŒãããµããŒãããããã«ãç¹å¥ãªJenkinsã¹ã¬ããããŒã«ïŒè»œéãšã°ãŒãã¥ãŒã¿ãŒïŒã䜿çšãããŸãããããããã¹ã¿ãŒã§å®è¡ãããŠããããšãããããŸãããéåžžã®å®è¡è ã®ããŒã«ã«ã¯åœ±é¿ããŸããã

ãã®ããŒã«å ã®ã¹ã¬ããã®æ°ã¯å¶éãããŠããŸããïŒãã®èšäºã®å·çæç¹ïŒã
ãã€ãã©ã€ã³ã®äœæ¥ãã©ã¡ãŒã¿ãããªã¬ãŒãšããã€ãã®ãªãã·ã§ã³ã ãã§ãªã
ãã©ã¡ãŒã¿ã®åŠçã¯ã次ã®åŒã§è¡šãããšãã§ããŸãã

èµ·åæã«è¡šç€ºããããžã§ããã©ã¡ãŒã¿ãããååã®èµ·åã®ãã€ãã©ã€ã³ãã©ã¡ãŒã¿ãæåã«åé€ãããæ¬¡ã«çŸåšã®èµ·åã®ãã€ãã©ã€ã³ã§æå®ããããã©ã¡ãŒã¿ã远å ãããŸããããã«ããããã©ã¡ãŒã¿ãŒããã€ãã©ã€ã³ããåé€ãããå Žåã«ããã©ã¡ãŒã¿ãŒããžã§ãããåé€ã§ããŸãã
ããã¯è£è¿ãã«ã©ã®ããã«æ©èœããŸããïŒ
config.xmlïŒãžã§ãã®æ§æãæ ŒçŽãããã¡ã€ã«ïŒã®äŸãèããŠã¿ãŸãããã
<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@2.35">
<actions>
<org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="pipeline-model-definition@1.5.0"/>
<org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction plugin="pipeline-model-definition@1.5.0">
<jobProperties>
<string>jenkins.model.BuildDiscarderProperty</string>
</jobProperties>
<triggers/>
<parameters>
<string>parameter_3</string>
</parameters>
</org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction>
</actions>
<description></description>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>parameter_1</name>
<description></description>
<defaultValue></defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>parameter_2</name>
<description></description>
<defaultValue></defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>parameter_3</name>
<description></description>
<defaultValue></defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
<jenkins.model.BuildDiscarderProperty>
<strategy class="org.jenkinsci.plugins.BuildRotator.BuildRotator" plugin="buildrotator@1.2">
<daysToKeep>30</daysToKeep>
<numToKeep>10000</numToKeep>
<artifactsDaysToKeep>-1</artifactsDaysToKeep>
<artifactsNumToKeep>-1</artifactsNumToKeep>
</strategy>
</jenkins.model.BuildDiscarderProperty>
<com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@1.28">
<autoRebuild>false</autoRebuild>
<rebuildDisabled>false</rebuildDisabled>
</com.sonyericsson.rebuild.RebuildSettings>
</properties>
<definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.80">
<scm class="hudson.plugins.filesystem_scm.FSSCM" plugin="filesystem_scm@2.1">
<path>/path/to/jenkinsfile/</path>
<clearWorkspace>true</clearWorkspace>
</scm>
<scriptPath>Jenkinsfile</scriptPath>
<lightweight>true</lightweight>
</definition>
<triggers/>
<disabled>false</disabled>
</flow-definition>
ãããã㣠ã»ã¯ã·ã§ã³ã«ã¯ããžã§ãã®èµ·åã«äœ¿çšãããã©ã¡ãŒã¿ãããªã¬ãŒãããã³ãªãã·ã§ã³ãå«ãŸããŠããŸãã远å ã®ã»ã¯ã·ã§ã³DeclarativeJobPropertyTrackerActionã¯ããã€ãã©ã€ã³ã«ã®ã¿èšå®ããããã©ã¡ãŒã¿ãŒãæ ŒçŽããããã«äœ¿çšãããŸãã
ãã©ã¡ãŒã¿ããã€ãã©ã€ã³ããåé€ããããšãJenkinsã¯ãã©ã¡ãŒã¿ããã€ãã©ã€ã³ã§ã®ã¿å®çŸ©ãããŠããããšãèªèãããããDeclarativeJobPropertyTrackerActionãšããããã£ã®äž¡æ¹ãããã©ã¡ãŒã¿ãåé€ãããŸãã
ãã©ã¡ãŒã¿ã远å ãããšãç¶æ³ãéã«ãªãããã©ã¡ãŒã¿ã¯DeclarativeJobPropertyTrackerActionãšããããã£ã«è¿œå ãããŸããããã€ãã©ã€ã³ã®å®è¡æã®ã¿ã§ãã
ãã®ããããã€ãã©ã€ã³ã§ã®ã¿ãã©ã¡ãŒã¿ãèšå®ãããšãæåã®èµ·åæã«ã¯å©çšã§ããªããªããŸãã
ãžã§ã³ãã³ã¹ãã€ãã©ã€ã³å®è¡
Pipelineã¹ã¯ãªãããããŠã³ããŒããããŠã³ã³ãã€ã«ããããšãå®è¡ããã»ã¹ãéå§ãããŸãããããããã®ããã»ã¹ã¯åã«ã°ã«ãŒãŽã£ãŒãªããšãããã ãã§ã¯ãããŸããããžã§ãã®å®è¡æã«å®è¡ãããäž»ãªéãæäœã匷調ããŸãã
ãGroovyã³ãŒã
ã®å®è¡ãã€ãã©ã€ã³ã¹ã¯ãªããã¯åžžã«ãã¹ã¿ãŒã§å®è¡ãããŸããJenkinsã«äžèŠãªè² è·ãããããªãããã«ããããå¿ããŠã¯ãªããŸããããšãŒãžã§ã³ãã®ãã¡ã€ã«ã·ã¹ãã ãŸãã¯ã·ã¹ãã åŒã³åºããšå¯Ÿè©±ããã¹ãããã®ã¿ããšãŒãžã§ã³ãã§å®è¡ãããŸãã

ãã€ãã©ã€ã³ã«ã¯ãHTTPãªã¯ãšã¹ããäœæã§ããåªãããã©ã°ã€ã³ããããŸãããŸããåçããã¡ã€ã«ã«ä¿åããããšãã§ããŸãã
httpRequest url: 'http://localhost:8080/jenkins/api/json?pretty=true', outputFile: 'result.json'
æåã¯ããã®ã³ãŒãããšãŒãžã§ã³ãã§å®å šã«å®è¡ãããšãŒãžã§ã³ãããèŠæ±ãéä¿¡ããŠãå¿çãresult.jsonãã¡ã€ã«ã«ä¿åããå¿ èŠãããããã«æãããå ŽåããããŸãããããããã¹ãŠãéã«çºçãããªã¯ãšã¹ãã¯Jenkinsèªèº«ããå®è¡ããããã¡ã€ã«ã®å 容ãä¿åããããã«ãšãŒãžã§ã³ãã«ã³ããŒãããŸãããã€ãã©ã€ã³ã§ã®å¿çã®è¿œå åŠçãå¿ èŠãªãå Žåã¯ããã®ãããªèŠæ±ãcurlã«çœ®ãæããããšããå§ãããŸãã
sh 'curl "http://localhost:8080/jenkins/api/json?pretty=true" -o "result.json"'
ãã°ãšã¢ãŒãã£ãã¡ã¯ãã®æäœ
ã³ãã³ããå®è¡ããããšãŒãžã§ã³ãã«é¢ä¿ãªãããã°ãšã¢ãŒãã£ãã¡ã¯ãã¯åŠçããããã¹ã¿ãŒãã¡ã€ã«ã·ã¹ãã ã«ãªã¢ã«ã¿ã€ã ã§ä¿åãããŸãã
ã·ãŒã¯ã¬ããïŒè³æ Œæ å ±ïŒããã€ãã©ã€ã³ã§äœ¿çšãããŠããå Žåããã°ãä¿åããåã«ããã¹ã¿ãŒã§ããã«ãã£ã«ã¿ãªã³ã°ãããŸãã

ã¹ãããã®ä¿åïŒãã€ãã©ã€ã³ã®èä¹ æ§ïŒ
Jenkins Pipelineã¯ãç¬ç«ããåå¥ã®ããŒã¹ã§æ§æããããã¹ã¿ãŒãã¯ã©ãã·ã¥ãããšãã«åçŸã§ããã¿ã¹ã¯ãšããŠäœçœ®ä»ããŠããŸãããã ããã¿ã¹ã¯ã®èšå®ã«å¿ããŠãããŸããŸãªè©³çŽ°åºŠã®ã¹ããããã·ãªã¢ã«åãããŠãã£ã¹ã¯ã«ä¿åãããããããã£ã¹ã¯ãžã®è¿œå ã®æžã蟌ã¿ã§ãããæ¯æãå¿ èŠããããŸãã

ãã€ãã©ã€ã³ã®èä¹ æ§ã«å¿ããŠããã€ãã©ã€ã³ã°ã©ãã®ã¹ãããã¯ããžã§ãã®å®è¡ããšã«1ã€ä»¥äžã®ãã¡ã€ã«ã«ä¿åãããŸããããã¥ã¡ã³ãããã®æç²ïŒ
ã¹ããããæ ŒçŽããããã®ã¯ãŒã¯ãããŒãµããŒããã©ã°ã€ã³ïŒFlowNodeïŒã¯ãFlowNodeStorageã¯ã©ã¹ãšãã®SimpleXStreamFlowNodeStorageããã³BulkFlowNodeStorageå®è£ ã䜿çšããŸãã
- FlowNodeStorageã¯ãã¡ã¢ãªå ãã£ãã·ã¥ã䜿çšããŠãã£ã¹ã¯æžã蟌ã¿ãéçŽããŸãããããã¡ã¯å®è¡æã«èªåçã«æžã蟌ãŸããŸããéåžžãããã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããããFlowNodeãä¿åããŠããããã«ãã£ã¹ã¯ã«æžã蟌ãŸãããšã¯éããªãããšã«æ³šæããŠãã ããã
- SimpleXStreamFlowNodeStorageã¯ãFlowNodeããšã«1ã€ã®å°ããªXMLãã¡ã€ã«ã䜿çšããŸããããŒãã«ã¯ãœãããªãã¡ã¬ã³ã¹ã®ã¡ã¢ãªå ãã£ãã·ã¥ã䜿çšããŸãããããã«ãããæåã«FlowNodeããã©ããŒã¹ãããšãã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸãã
- BulkFlowNodeStorageã¯ããã¹ãŠã®FlowNodeãå«ã1ã€ã®å€§ããªXMLãã¡ã€ã«ã䜿çšããŸãããã®ã¯ã©ã¹ã¯ãæžã蟌ã¿é »åºŠãã¯ããã«å°ãªãPERFORMANCE_OPTIMIZED掻æ§ã¢ãŒãã§äœ¿çšãããŸãã1ã€ã®å€§ããªã¹ããªãŒãã³ã°æžã蟌ã¿ã¯ãäžé£ã®å°ããªã¬ã³ãŒããããé«éã§ãããOSã®è² è·ãæå°éã«æããŠãã¹ãŠã®å°ããªãã¡ã€ã«ã管çãããããããã¯äžè¬ã«ã¯ããã«å¹ççã§ãã
å
ã®
Storage: in the workflow-support plugin, see the 'FlowNodeStorage' class and the SimpleXStreamFlowNodeStorage and BulkFlowNodeStorage implementations.
- FlowNodeStorage uses in-memory caching to consolidate disk writes. Automatic flushing is implemented at execution time. Generally, you won't need to worry about this, but be aware that saving a FlowNode does not guarantee it is immediately persisted to disk.
- The SimpleXStreamFlowNodeStorage uses a single small XML file for every FlowNode â although we use a soft-reference in-memory cache for the nodes, this generates much worse performance the first time we iterate through the FlowNodes (or when)
- The BulkFlowNodeStorage uses a single larger XML file with all the FlowNodes in it. This is used in the PERFORMANCE_OPTIMIZED durability mode, which writes much less often. It is generally much more efficient because a single large streaming write is faster than a bunch of small writes, and it minimizes the system load of managing all the tiny files.
ä¿åãããã¹ãããã¯ã次ã®ãã£ã¬ã¯ããªã«ãããŸãã
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/workflow/
ãµã³ãã«ãã¡ã€ã«ïŒ
<?xml version='1.1' encoding='UTF-8'?>
<Tag plugin="workflow-support@3.5">
<node class="cps.n.StepStartNode" plugin="workflow-cps@2.82">
<parentIds>
<string>4</string>
</parentIds>
<id>5</id>
<descriptorId>org.jenkinsci.plugins.workflow.support.steps.StageStep</descriptorId>
</node>
<actions>
<s.a.LogStorageAction/>
<cps.a.ArgumentsActionImpl plugin="workflow-cps@2.82">
<arguments>
<entry>
<string>name</string>
<string>Declarative: Checkout SCM</string>
</entry>
</arguments>
<isUnmodifiedBySanitization>true</isUnmodifiedBySanitization>
</cps.a.ArgumentsActionImpl>
<wf.a.TimingAction plugin="workflow-api@2.40">
<startTime>1600855071994</startTime>
</wf.a.TimingAction>
</actions>
</Tag>
çµæ
ãã®è³æãé¢çœãããã€ãã©ã€ã³ãšã¯äœãããã€ãã©ã€ã³ãå éšããã©ã®ããã«æ©èœããããããããçè§£ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸããããã§ã質åãããå Žåã¯ã以äžã§å ±æããŠãã ãããåãã§ãçãããŸãã
èšäºã®åŸåã§ã¯ããžã§ã³ãã³ã¹ãã€ãã©ã€ã³ã®åé¡ãèŠã€ããŠã¿ã¹ã¯ãã¹ããŒãã¢ããããã®ã«åœ¹ç«ã€åã ã®ã±ãŒã¹ã«ã€ããŠæ€èšããŸããåæèµ·åã®åé¡ã解決ããæ¹æ³ãåŠã³ãåç¶å¯èœæ§ã®ãªãã·ã§ã³ã確èªããJenkinsããããã¡ã€ãªã³ã°ããå¿ èŠãããçç±ã«ã€ããŠèª¬æããŸãã