Jenkins管道平行阶段略有差异

时间:2017-12-20 07:39:17

标签: jenkins groovy jenkins-pipeline

我有一个Jenkins管道作业,会触发一组节点做类似的事情。

代码如下所示。

#!groovy
pipeline {
  agent none
  stages {
    stage('Build') {
      parallel {
        stage('Server01') {
          agent {
            label 'Server01'
          }
          steps {
            sh 'do-something-01 --name Server01'
            sh 'do-something-02 --name Server01'
            sh 'do-something-03 --name Server01'
            sh 'do-something-04 --name Server01'
          }
        }
        stage('Server02') {
          agent {
            label 'Server02'
          }
          steps {
            sh 'do-something-01 --name Server02'
            sh 'do-something-02 --name Server02'
            sh 'do-something-03 --name Server02'
            sh 'do-something-04 --name Server02'
          }
        }
        stage('Server03') {
          agent {
            label 'Server03'
          }
          steps {
            sh 'do-something-01 --name Server03'
            sh 'do-something-02 --name Server03'
            sh 'do-something-03 --name Server03'
            sh 'do-something-04 --name Server03'
          }
        }
      }
    }
  }
}

我想遵循DRY代码原则。

我可以将特定步骤包装到函数中并使用参数来更改函数行为吗?我对groovy不熟悉

如下所示

#!groovy
pipeline {
  agent none
  stages {
    stage('Build') {
      parallel {
        stage('Server01') {
          agent {
            label 'Server01'
          }
          steps {
            // function is defined in somewhere
            function('Server01')
          }
        }
        stage('Server02') {
          agent {
            label 'Server02'
          }
          steps {
            function('Server02')
          }
        }
        stage('Server03') {
          agent {
            label 'Server03'
          }
          steps {
            function('Server03')
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

如果您想保留声明性管道,则需要将function('Server01')添加为var并将其用作库。请参阅此Extending Shared Libraries

如果您准备从声明性转换为脚本化管道,那么您可以灵活地在Jenkins文件中定义函数。

以下是Scripted管道示例

stage ('Build') {
  function('Server01')
}

def function(serverName) {
  node {
      sh 'do-something --name serverName'
  }
}