gpt4 book ai didi

jenkins - 如何跨阶段重用以前创建的工作区

转载 作者:行者123 更新时间:2023-12-03 12:12:06 24 4
gpt4 key购买 nike

我面临一个问题,我在管道中定义了两个阶段,这两个阶段都在同一个节点上运行,并且需要在同一个工作区中运行。

这些阶段中的第一个最初在我的主节点上运行,但在定义的步骤结束时必须将一些文件卸载到不同的节点上。

然后第二阶段只需要继续我的主人,并依赖于从第一阶段安装的一些模块。

这是我的管道以更好地解释:

#!groovy
pipeline {
agent { label 'master' }
stages {
stage('Build') { // 1. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
steps {
sh '''
npm install
bower install
gulp set-staging-node-env
gulp prepare-staging-files
gulp webpack
'''
stash includes: 'dist/**/*', name: 'builtSources'
stash includes: 'config/**/*', name: 'appConfig'
node('Protractor') { // 2. Running on vnccentos7 in /var/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
dir('/opt/foo/deploy/') {
unstash 'builtSources'
unstash 'appConfig'
}
}
}
}
stage('Unit Tests') {
agent { label 'master' } // 3. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
steps {
parallel (
"Jasmine": {
sh 'gulp karma-tests-ci'
},
"Mocha": {
sh 'gulp mocha-tests'
}
)
}
}
}
}

如您所见,我在每个阶段\节点的开头添加了注释,用于显示我看到的 jenkins 输出,以了解分配了哪些工作空间。

我面临的问题是单元测试阶段失败,因为它试图使用一些它找不到的节点模块。这些存在于创建的第一个工作区中,这是我希望此阶段继续使用的地方,因此不要使用新的“@2”后缀工作区。

有没有办法告诉 Jenkins 在管道中保留以前创建的工作区?

编辑

我猜是因为我指定了代理 {label:'master'}再次在我的下一个阶段,这是什么情况下要创建一个新的工作区?我应该使用 node取而代之?这会允许使用相同的工作空间吗?

我实际上尝试过使用 node('master'){...}围绕我的单元测试阶段中的每个并行步骤,但这些仍然使用@2 后缀工作区而不是原始工作区。

我已经看到其他线程在谈论您不应该如何重复使用相同的工作区,因为您可能会遇到文件锁定问题。他们建议改为归档\取消归档步骤之间的工作空间。

我还看到了一些方法,您可以将工作区路径存储在一个变量中,稍后再使用它,这对我的情况来说听起来不错,但我还没有找到任何声明性语法示例,只有常规的。

编辑 2

我现在尝试了一些方法,包括将分配的工作空间从第一阶段保存到变量中并在 ws(...) 中使用。后期指令:

pipeline {
agent { label 'master' }
stages {
stage('Build') {
steps {
script {
def workspace = pwd()
}
sh '''
npm install
bower install
gulp set-staging-node-env
gulp prepare-staging-files
gulp webpack
'''
stash includes: 'dist/**/*', name: 'builtSources'
stash includes: 'config/**/*', name: 'appConfig'
node('Protractor') {
dir('/opt/foo/deploy/') {
unstash 'builtSources'
unstash 'appConfig'
}
}
}
}
stage('Unit Tests') {
steps {
parallel (
"Jasmine": {
node('master') {
ws("${workspace}"){
sh 'gulp karma-tests-ci'
}
}
},
"Mocha": {
node('master') {
ws("${workspace}"){
sh 'gulp mocha-tests'
}
}
}
)
}
post {
success {
sh 'gulp combine-coverage-reports'
sh 'gulp clean-lcov'
publishHTML(target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: false,
reportDir: 'test/coverage',
reportFiles: 'index.html',
reportName: 'Test Coverage Report'
])
}
}
}
}
}

我确实尝试从单元测试阶段删除第二个代理声明,但该阶段仍然在我的 protractor 节点上,我不希望它这样做。因此,按照此处的答案\评论,我在每个并行步骤周围使用了节点 block ,并使用了 ws block ,如您所见,

该阶段失败,我可以从日志中看到它没有使用从第一阶段分配的工作空间(没有 @ 后缀):
[Jasmine] Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
[Pipeline] [Jasmine] {
[Pipeline] [Jasmine] ws
[Jasmine] Running in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2@2
[Pipeline] [Jasmine] {
[Pipeline] [Jasmine] sh
[Jasmine] [_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2@2] Running shell script
[Jasmine] + gulp karma-tests-ci
[Jasmine] [08:27:01] No gulpfile found

它甚至带有@2 的双后缀,所以我不确定它现在在做什么。

最佳答案

指定自定义工作区。
从管道语法:“ws:分配工作区”

ws("/usr/local/jenkins/jobs/custom_workspace") {
stage . . .
stage . . .
}

. .这行得通吗?

关于jenkins - 如何跨阶段重用以前创建的工作区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com