Jenkins基础:Jenkinsfile使用实例:2: 并行执行的Stage

Jenkins使用Stage作为逻辑功能节点的划分,在Jenkinsfile中,parallel块则可以支持并行任务的执行,结合Stage的使用,可以创建并行执行的流水线任务,这篇文章以具体实例来说明如何进行类似的Jenkinsfile的编写。

示例

前文的示例将流水线分按照功能分为逻辑上的三段:构建(Build) 、测试(Test)、部署(Deploy)。

开始
构建
测试
部署

考虑到实际情况下为了节约持续集成流水线的执行时间,假定实际的构建为三个模块同时进行,后续的测试和部署则是正常方式,结构和顺序如下所示

开始
模块1:构建
模块2:构建
模块3:构建
测试
部署

环境准备

本文使用Easypack的LTS Jenkins 2.167.1版,环境准备请参看

  • https://liumiaocn.blog.csdn.net/article/details/92764938

获取Jenkins-Crumb

使用如下示例代码获取Jenkins-Crumb,为使用API方式生成三个Stage的Pipeline示例作准备。

liumiaocn:jenkins liumiao$ jenkins_host_url=http://localhost:32002
liumiaocn:jenkins liumiao$ user_passwd="root:liumiaocn"
liumiaocn:jenkins liumiao$ jenkins_crumb=`curl -u $user_passwd ${jenkins_host_url}'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' 2>/dev/null`
liumiaocn:jenkins liumiao$ echo $jenkins_crumb
Jenkins-Crumb:83d748ee92512c4dccd589aaa5c55a9a
liumiaocn:jenkins liumiao$

创建Job

使用如下代码示例创建Job

liumiaocn:jenkins liumiao$ ls demo/pipeline/parallel/config.xml
demo/pipeline/parallel/config.xml
liumiaocn:jenkins liumiao$ cat demo/pipeline/parallel/config.xml
<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="[email protected]">
  <actions>
    <org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="[email protected]"/>
  </actions>
  <description>Pipeline Job Sample</description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.plugins.jira.JiraProjectProperty plugin="[email protected]"/>
    <com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="[email protected]">
      <gitLabConnection></gitLabConnection>
    </com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
  </properties>
  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="[email protected]">
  <script>pipeline {
    agent any 

    stages {
        stage('Build') {
            parallel{
                stage('Build:Module1') { 
                    steps { 
                        sh 'echo Build Module1 stage ...' 
                    }
                }
                stage('Build:Module2') { 
                    steps { 
                        sh 'echo Build Module2 stage ...' 
                    }
                }
                stage('Build:Module3') { 
                    steps { 
                        sh 'echo Build Module3 stage ...' 
                    }
                }
            }
        }
        stage('Test'){
            steps {
                sh 'echo Test stage ...' 
            }
        }
        stage('Deploy') {
            steps {
                sh 'echo Deploy stage ...' 
            }
        }
    }
  }</script>
  <sandbox>false</sandbox>
  </definition>
  <triggers/>
  <disabled>false</disabled>
</flow-definition>
liumiaocn:jenkins liumiao$
liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} -H "Content-Type:application/xml"  --data-binary  "@demo/pipeline/parallel/config.xml" ${jenkins_host_url}/createItem?name=pipeline_job_parallel
liumiaocn:jenkins liumiao$ echo $?
0
liumiaocn:jenkins liumiao$

Jenkinsfile说明

本文示例所使用的Jenkinsfile信息如下所示,内容非常简单易读,简单说明如下:

  • pipeline是结构,在其中可以指定agent和stages等相关信息
  • agent用于指定执行job的节点,any为不做限制
  • stages用与设定具体的stage
  • stage为具体的节点,比如本文示例中模拟实际的 Build(构建)、测试(Test)、部署(Deploy)的过程。
  • parallel中可以列出的任务进行并行操作
pipeline {
    agent any 

    stages {
        stage('Build') {
            parallel{
                stage('Build:Module1') { 
                    steps { 
                        sh 'echo Build Module1 stage ...' 
                    }
                }
                stage('Build:Module2') { 
                    steps { 
                        sh 'echo Build Module2 stage ...' 
                    }
                }
                stage('Build:Module3') { 
                    steps { 
                        sh 'echo Build Module3 stage ...' 
                    }
                }
            }
        }
        stage('Test'){
            steps {
                sh 'echo Test stage ...' 
            }
        }
        stage('Deploy') {
            steps {
                sh 'echo Deploy stage ...' 
            }
        }
    }
  }

执行Job

使用如下命令或者直接在Jenkins上点击构建

liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} ${jenkins_host_url}/job/pipeline_job_parallel/build
liumiaocn:jenkins liumiao$ echo $?
0
liumiaocn:jenkins liumiao$

确认执行结果

使用如下命令可以确认相关的执行日志信息

liumiaocn:jenkins liumiao$ curl -u $user_passwd ${jenkins_host_url}/job/pipeline_job_parallel/1/consoleText
Started by user root
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /data/jenkins/workspace/pipeline_job_parallel
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] parallel
[Pipeline] { (Branch: Build:Module1)
[Pipeline] { (Branch: Build:Module2)
[Pipeline] { (Branch: Build:Module3)
[Pipeline] stage
[Pipeline] { (Build:Module1)
[Pipeline] stage
[Pipeline] { (Build:Module2)
[Pipeline] stage
[Pipeline] { (Build:Module3)
[Pipeline] sh
[Pipeline] sh
[Pipeline] sh
+ echo Build Module1 stage ...
Build Module1 stage ...
[Pipeline] }
+ echo Build Module2 stage ...
Build Module2 stage ...
[Pipeline] // stage
[Pipeline] }
[Pipeline] }
[Pipeline] // stage
+ echo Build Module3 stage ...
Build Module3 stage ...
[Pipeline] }
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ echo Test stage ...
Test stage ...
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] sh
+ echo Deploy stage ...
Deploy stage ...
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
liumiaocn:jenkins liumiao$

同时也可以通过Jenkins的BlueOcean插件(Easypack集成)来确认,可以更为清晰地进行可视化结果的展示。
Jenkins基础:Jenkinsfile使用实例:2: 并行执行的Stage_第1张图片

总结

使用parallel即可完成并行方式的需求,在本例中将构建进行拆分成多个并行的模块同时进行,在实际的项目中往往更加复杂,比如共通的依赖部分还需要先进行构建,本文为了介绍流水线中并行任务的执行方式,则可根据需要进行进一步的定制化的整理。

你可能感兴趣的:(#,Jenkins,#,持续构建)