Jenkins 管道多分支问题在并行作业后重用节点类型
Jenkins pipeline multibranch issue reusing node type after parallel jobs
我正在尝试将我们的 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'
}
}
但是我在最后 'publish' 阶段遇到了问题。当它启动 gradle 目标时,它正确地重用了 'setup' 阶段的工作区,但似乎在原始结帐的 'durable' 子文件夹中执行(即设置阶段的过去在 /mnt/jenkins/workspace/<branchname>/<random_hash>/
中执行,但是最后一个 gradle 目标在诸如 /mnt/jenkins/workspace/<branchname>/<random_hash>@tmp/durable-<hash>/script.sh
的文件夹中执行)这会导致 gradlew not found 错误
我试过使用目录('/...'){...},但这似乎没有解决问题...任何帮助或指导将不胜感激!
正在保存设置路径
您可以尝试保存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 tutorial,推荐的方法是在 Jenkin 的 Global Tool configuration
中配置 Gradle 安装路径,任意命名(例如“Gradle
”)和然后像这样在您的管道中使用它:
...
stage('publish') {
node('controller'){
def gradleHome = tool 'Gradle'
sh "${gradleHome}/bin/gradlew publishArtifacts'
}
}
groovy 语法对我不起作用。必须将其更改为:
stage('test') {
parallel (
'web' : {build 'web-test' ..params...},
'API' : {build 'api-test' ..params...}
)
}
我正在尝试将我们的 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'
}
}
但是我在最后 'publish' 阶段遇到了问题。当它启动 gradle 目标时,它正确地重用了 'setup' 阶段的工作区,但似乎在原始结帐的 'durable' 子文件夹中执行(即设置阶段的过去在 /mnt/jenkins/workspace/<branchname>/<random_hash>/
中执行,但是最后一个 gradle 目标在诸如 /mnt/jenkins/workspace/<branchname>/<random_hash>@tmp/durable-<hash>/script.sh
的文件夹中执行)这会导致 gradlew not found 错误
我试过使用目录('/...'){...},但这似乎没有解决问题...任何帮助或指导将不胜感激!
正在保存设置路径
您可以尝试保存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 tutorial,推荐的方法是在 Jenkin 的 Global Tool configuration
中配置 Gradle 安装路径,任意命名(例如“Gradle
”)和然后像这样在您的管道中使用它:
...
stage('publish') {
node('controller'){
def gradleHome = tool 'Gradle'
sh "${gradleHome}/bin/gradlew publishArtifacts'
}
}
groovy 语法对我不起作用。必须将其更改为:
stage('test') {
parallel (
'web' : {build 'web-test' ..params...},
'API' : {build 'api-test' ..params...}
)
}