0

我正在尝试将我们的 CI 流程从 JobDSL 迁移到多分支管道设置。作为第一步,我决定将管道委托回现有作业(传递所需的参数)我的管道如下所示(伪代码)

stage('setup')
node('cotroller') {
  ...
}


stage('test') {
  parallel {
    'web' : {build job 'web-test' ..params...},
    'API' : {build job 'api-test' ..params...}
  }
}

stage('build') { 
  parallel {
    'web' : {build job 'web-build' ..params...},
    'API' : {build job 'api-build' ..params...}
  }
}

stage('publish') {
  node('controller'){
    sh './gradlew publishArtifacts'
  }
}

但是,我在最后一个“发布”阶段遇到了问题。当它启动 gradle 目标时,它正确地重用了“设置”阶段的工作区,但似乎在原始结帐的“持久”子文件夹中执行(即,设置阶段的过去执行/mnt/jenkins/workspace/<branchname>/<random_hash>/但最后一个 gradle 目标执行在诸如/mnt/jenkins/workspace/<branchname>/<random_hash>@tmp/durable-<hash>/script.sh) 的文件夹中,这会导致 gradlew not found 错误

我尝试过使用 directory('/...'){...} ,但这似乎并没有解决问题...任何帮助或指导将不胜感激!

4

2 回答 2

1

保存设置路径

您可以尝试从setup阶段保存工作目录,例如:

stage('setup')
node('cotroller') {
  def setupPath = pwd()
  ...
}


stage('test') {
  parallel {
    'web' : {build job 'web-test' ..params...},
    'API' : {build job 'api-test' ..params...}
  }
}

stage('build') { 
  parallel {
    'web' : {build job 'web-build' ..params...},
    'API' : {build job 'api-build' ..params...}
  }
}

stage('publish') {
  node('controller'){
    dir("${setupPath}") {
      sh './gradlew publishArtifacts'
    }
  }
}

使用全局工具配置

根据Jenkins pipeliens 教程,推荐的方法是在 Jenkins 中配置 Gradle 安装路径,将其Global Tool configuration命名为任何名称(例如“ Gradle”),然后在您的管道中使用它,如下所示:

...

stage('publish') {
  node('controller'){
    def gradleHome = tool 'Gradle'        
    sh "${gradleHome}/bin/gradlew publishArtifacts'
  }
}
于 2016-10-03T07:41:53.530 回答
0

groovy 语法对我不起作用。不得不将其更改为:

stage('test') {
    parallel (
        'web' : {build 'web-test' ..params...},
        'API' : {build 'api-test' ..params...}
    )
}
于 2017-02-15T12:01:04.750 回答