Jenkins 如何跨阶段重用先前创建的工作区
我面临一个问题,在我的管道中定义了两个阶段,它们都在同一个节点上运行,需要在同一个工作区中运行 这些阶段中的第一个阶段最初在我的主节点上运行,但在定义的步骤即将结束时,必须将一些文件解压缩到另一个节点上 然后,第二阶段只需要在我的主程序上继续,并且依赖于从第一阶段安装的一些模块 以下是我要更好地解释的管道:Jenkins 如何跨阶段重用先前创建的工作区,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我面临一个问题,在我的管道中定义了两个阶段,它们都在同一个节点上运行,需要在同一个工作区中运行 这些阶段中的第一个阶段最初在我的主节点上运行,但在定义的步骤即将结束时,必须将一些文件解压缩到另一个节点上 然后,第二阶段只需要在我的主程序上继续,并且依赖于从第一阶段安装的一些模块 以下是我要更好地解释的管道: #!棒极了 管道{ 代理{label'master'} 舞台{ stage('Build'){//1.在/var/lib/jenkins/workspace/_Pipelines\u IAC
#!棒极了
管道{
代理{label'master'}
舞台{
stage('Build'){//1.在/var/lib/jenkins/workspace/_Pipelines\u IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ中运行
台阶{
“嘘”
npm安装
凉亭安装
吞咽集暂存节点环境
吞咽准备暂存文件
狼吞虎咽的网页包
'''
隐藏内容包括:“dist/**”,名称:“builtSources”
隐藏内容包括:'config/***',名称:'appConfig'
节点(“量角器”){//2.在/var/jenkins/workspace/_Pipelines\u IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ中的vncentos7上运行
目录(“/opt/foo/deploy/”){
取消“建筑资源”
取消设置“appConfig”
}
}
}
}
阶段(“单元测试”){
代理{label'master'}//3.在/var/lib/jenkins/workspace/\u Pipelines\u IACT-Jenkinsfile中的master上运行-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
台阶{
平行的(
“茉莉花”:{
sh“吞咽业力测试ci”
},
“摩卡”:{
sh“大口摩卡测试”
}
)
}
}
}
}
如您所见,我在每个stage\node的开始处添加了注释,用于显示我看到的分配工作空间的jenkins输出
我面临的问题是,单元测试阶段失败了,因为它试图使用一些找不到的节点模块。这些都存在于创建的第一个工作区中,这是我希望此阶段继续使用的工作区,因此不要使用新的“@2”后缀工作区
有没有办法告诉Jenkins在管道中保留以前创建的工作区
编辑
我猜,因为我在下一个阶段再次指定了代理{label:'master'}
,这就是要创建新工作区的情况?我应该改用节点
方法吗?这会允许使用相同的工作区吗
实际上,我已经尝试在单元测试阶段的每个并行步骤周围使用node('master'){…}
,但是这些仍然使用@2后缀工作区,而不是原始工作区
我看到其他线程讨论了如何避免重复使用同一个工作区,因为您可能会遇到文件锁问题。他们建议在步骤之间归档\n取消归档工作区
我还看到过一些方法,可以将工作区路径存储在变量中,稍后再使用,这对我的情况来说很好,但我没有找到任何声明性语法示例,只有groovy示例
编辑2
我现在尝试了几种方法,包括将分配的工作区从第一阶段保存到变量中,并在后面的阶段在ws(…)
指令中使用:
管道{
代理{label'master'}
舞台{
阶段(‘构建’){
台阶{
剧本{
def workspace=pwd()
}
“嘘”
npm安装
凉亭安装
吞咽集暂存节点环境
吞咽准备暂存文件
狼吞虎咽的网页包
'''
隐藏内容包括:“dist/**”,名称:“builtSources”
隐藏内容包括:'config/***',名称:'appConfig'
节点(‘量角器’){
目录(“/opt/foo/deploy/”){
取消“建筑资源”
取消设置“appConfig”
}
}
}
}
阶段(“单元测试”){
台阶{
平行的(
“茉莉花”:{
节点(“主节点”){
ws(“${workspace}”){
sh“吞咽业力测试ci”
}
}
},
“摩卡”:{
节点(“主节点”){
ws(“${workspace}”){
sh“大口摩卡测试”
}
}
}
)
}
职位{
成功{
sh“吞咽联合收割机覆盖报告”
sh“大口喝干净的lcov”
publishHTML(目标:[
allowMissing:false,
alwaysLinkToLastBuild:false,
基帕尔:错,
reportDir:'测试/覆盖',
报告文件:“index.html”,
reportName:“测试覆盖率报告”
])
}
}
}
}
}
我确实尝试过从单元测试阶段删除第二个代理声明,但该阶段仍然保留在我的量角器节点上,这是我不希望它做的。按照这里的答案\注释,我在每个并行步骤周围使用了节点块,并使用了ws块,如您所见
该阶段失败了,我从日志中可以看出,它没有使用从第一阶段分配的工作区(没有@后缀):
它甚至可以用@2作为双后缀,所以我不确定它现在在做什么。使用节点语法可以解决这个问题
为了确定,我将使用dir作用域自行设置工作区指定自定义工作区。 从管道语法:“ws:Allocate workspace”
。这是否有效?不确定它是否适合您的用例,但此示例脚本显示了如何在不同的阶段和容器之间共享相同的节点/工作区: 此外,如果您正在为特定阶段运行Docker代理,同时在顶层指定代理{label'whatever'},则可以确保此阶段将使用与其余阶段相同的节点和工作区
[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
ws("/usr/local/jenkins/jobs/custom_workspace") {
stage . . .
stage . . .
}
pipeline {
agent {
label 'whatever'
}
stages {
stage('build') {
steps {
sh "./build-artifact.sh"
}
}
stage('test in docker') {
agent {
docker {
image 'ubuntu:16.04'
reuseNode true
}
}
steps {
sh "./run-tests-in-docker.sh"
}
}
}
}
// Basic usage:
def extWorkspace = exwsAllocate diskPoolId: 'diskpool1'
node ('linux') {
exws (extWorkspace) {
scm checkout
sh 'mvn clean install -DskipTests'
}
}
node ('test') {
exws (extWorkspace) {
sh 'mvn test'
}
}
pipeline {
agent none
environment {
WIN_WORKSPACE = ""
MAC_WORKSPACE = ""
}
stages {
stage("Build") {
parallel {
stage("Build on Windows") {
agent {
label "windows"
}
steps {
script {
WIN_WORKSPACE = WORKSPACE
}
// steps...
}
}
stage("Build on macOS") {
agent {
label "macos"
}
steps {
script {
MAC_WORKSPACE = WORKSPACE
}
// steps...
}
}
}
}
stage("Deploy") {
parallel {
stage("Deploy on Windows") {
agent {
label "windows"
}
steps {
dir(WIN_WORKSPACE) {
// steps...
}
}
}
stage("Deploy on macOS") {
agent {
label "macos"
}
steps {
dir(MAC_WORKSPACE) {
// steps...
}
}
}
}
}
}
}
#!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') { // 3. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
parallel {
stage("Unit Tests@") {
agent {label 'master'}
stages {
stage("Jasmine") {
steps {
sh 'gulp karma-tests-ci'
}
}
stage(Mocha") {
steps {
sh 'gulp mocha-tests'
}
}
}
}
}
}
}
}
pipeline {
agent none // <- the difference is here
stages {
stage('prep') {
agent { docker { image 'yourdockerimage' }}
steps {
sh 'pwd' // same workspace, without @2
}
}
stage('build') {
agent { label 'master' }
steps {
sh 'pwd' // same workspace, without @2
}
}
}
}
pipeline {
agent { label 'master' } // <- specify the global agent
stages {
stage('prep') {
agent { docker { image 'yourdockerimage' }} // <- do not ask to reuse the node/workspace
steps {
sh 'pwd' // different workspace, with @2 appended
}
}
stage('build') {
// no agent specified, use global agent
steps {
sh 'pwd' // same workspace, without @2
}
}
stage('publish') {
agent { docker { image 'yourdockerimage' reuseNode true }}
steps {
sh 'echo "published"' // same workspace, without @2
}
}
}
}