我有一个Jenkins管道设置,我基本上尝试这样做:
Stage 1: Checkout code on Windows
Stage 2: Build Java on Windows
Stage 3: Build C++ on Windows
Stage 4: Checkout code on Linux
Stage 5: Build C++ on Linux
Stage 6: Upload builds
字符串
下面是我的Jenkins管道的 backbone :
pipeline {
agent none
stages {
stage('Windows Checkout') {
agent {
label {
label 'windows'
}
}
steps {
script {
echo 'Pull the code'
}
} // steps
}
stage('Windows Java Build') {
agent{ label 'windows'}
steps {
script {
echo "In Windows Java Build"
}
} // steps
}
stage('Windows C++') {
agent {
label {
label 'windows'
}
}
steps {
echo "In Windows CPP Build"
} // steps
} // stage
stage ('Linux Checkout') {
agent{
node{
label 'RHEL_7'
}
}
steps {
echo "Linux checkout code"
}
} // stage
stage ('Linux Build') {
agent{
node {
label 'RHEL_7'
}
}
steps {
script {
echo "Building linux..."
echo "stash linuxZip"
}
}
}
stage ('Publish Artifacts') {
agent {
label {
label 'windows'
}
}
steps {
echo "Starting the Publish"
script {
echo "unstash linuxZip"
echo "remote copy linux and windows zips"
}
}
}
}
}
型
这些阶段是串行的,并且依赖于在前一个阶段中完成的工作(代码只在Windows中被拉下一次,然后后续阶段处理它)。只要我一次运行一个作业,这就没有问题。
我的问题是:如果我运行多个作业,则每个作业内的阶段之间的连接有时会发生变化。例如,如果我启动作业1,则它开始使用工作区WS。然后,如果我并行启动作业2,则它开始使用工作区WS@2(这部分很好)。然后,如果我中止job1,job2的第2阶段将恢复使用工作区WS而不是WS@2(这一部分我需要修复),这导致它失败,或通过但使用错误的代码分支(默默地做错误的事情)。
我的问题:在流程中,我是否遗漏了一些东西,可以让jenkins在开始时选择一个工作区,为整个工作保留它,并在整个阶段中重用它?请注意,这些都不是并行的(目前),因此如果作业在Linux节点上运行,(并且Windows节点是空闲的),我不希望第二个作业进入并开始弄乱第一个作业已经构建但尚未上传的Windows工作区。另请注意这个docker在这里不起作用,所以reuseNode
参数不可用。
1条答案
按热度按时间vjrehmav1#
每次使用代理声明时,都会创建一个新的工作区。有时它与以前使用的位置一致,但不应依赖于此。
Reuse agent declaration以防止代理和工作区切换。
若要在代理和代理之间传输文件,请使用
stash
和unstash
步骤。