gpt4 book ai didi

Jenkins 正在重新使用管道工作区,我希望每个构建都有一个独特的工作区

转载 作者:行者123 更新时间:2023-12-04 20:28:15 25 4
gpt4 key购买 nike

所以,我在这个主题上找到的大多数问题和答案都是针对想要使用相同工作区进行不同运行的人的。 (这让我感到困惑,但每次开始工作时我都需要一个干净的石板。剩下的东西只会破坏东西)

我的问题恰恰相反 - 我必须为每次运行创建一个单独的工作区(或者我需要知道如何在不同的运行中创建具有相同名称的文件,这些文件只保留在该运行中,并且可以从 bash 脚本启动管道!)

所以,我的问题是 - 我如何强制 Jenkins 不在不同主机上为两个同时运行的作业使用相同的工作区,或者我可以在“自定义工作区”字段中使用什么变量来完成此操作?

在我回答@Joerg S 的问题后,我意识到我在说 Joerg S 所说的不可能发生的事情正是我所观察到的! Jenkins 在 2 个不同的主机上为 2 个不同的并发作业使用相同的工作空间。 这是 Jenkins 管道错误吗?

有关令人眼花缭乱的信息,请参阅下文。

鉴于我在运行期间必须进出节点的方式,我发现我可以在同一作业的不同主机上启动 2 个不同的构建,并且它们共享工作区目录!由于每个作业都有忙于将文件写入该目录的 shell 脚本,因此这是非常糟糕的。

Custom workspace in jenkins我们被告知使用自定义工作区,我就是这样设置的

Jenkins: how to run builds in unique directories我们被告知在上面的自定义工作区字段中使用 ${BUILD_NUMBER},所以我尝试的是:

 ${JENKINS_HOME}/workspace/${ITEM_FULLNAME}/${BUILD_NUMBER}

当我使用它时,所有发生在我身上的是工作区名称是,你猜对了,“${BUILD_NUMBER}”(我什至得到了一个“${BUILD_NUMBER}@2”只是为了很好的衡量!)

我试过 {$BUILD_ID},同样的事情(字面上使用,不替换数字)。

我打开了“允许并发构建”。

我只使用管道。

这里的所有作业,作为正常执行的一部分,导致从属、非主控主机重新启动到无法运行 slave.jar 的操作系统(实际上,它根本没有网络访问权限),所以我无法运行该主机上的整个管道。

所有作业都在其中的某处使用以下构造:
    tests=Arrays.asList(tests.split("\\r?\n"))
shellerror=231
for( line in tests){

所以让我们调用一个示例作业“foo”,它循环遍历一个列表,如上所述,我想在 2 个不同的主机上运行。该作业的管道开始在 master 上运行(因为上述 用于(测试中的行) 需要在节点上运行!))。然后在主从之间来回,通常是多次。

如果我大约同时在主机 A 和主机 B 上开始这项工作,他们将使用工作区 ${JENKINS_HOME}/workspace/${JOB_NAME},或者在我的情况下使用/var/lib/jenkins/jenkins/workspace/工作

由于他们将不同的数据写入该目录中具有相同名称的文件,我显然立即完全崩溃了。

那么,我如何强制 Jenkins 在每个工作中都使用一个独特的工作空间?

或者是什么???

其他:管道构建步骤版本 2.5.1,Jenkins 2.46.2

我一直在尝试让工作区语句 ('ws') 工作,但这也没有像我预期的那样工作 - 有些文件在我明确命名的工作区中,有些文件仍在“内置”中' 工作区(工作区/)。

我被要求提供代码。我使用的“标准”管道大约有 26K 字节,由大约 590 行组成。所以,我要大大减少。话虽如此:
node("master") { // 1
..... lots of stuff....
} // this matches the "node('master')" above
node(HOST) {
echo "on $HOST, check what os"
if (isUnix())
...some more stuff...
} // end of 'node(HOST)' above
if (isok == 0 ) {
node("master") {
echo "----------------- Running on MASTER 19 $shellerror waiting on boot out of windows ------------"
sleep 120
echo "----------------- Leaving MASTER ------------"
}
}
... lots 'o code ...

node(HOST) {
... etc
} // matches the latest 'node HOST' above
node("master") { // 120
.... code ...
for( line in tests) {
...code...
}
}
... and on and on and on, switching back and forth from one to the other

FWIW,当我尝试使上述使用“ws”以便确定 ws 名称是唯一的时,我只是在(几乎)每个“节点”打开的正下方添加了一个“ws wsname”块,因此它是
node(name) { ws (wsname) { ..stuff that was in node block before... } }

但后来我有两个目录需要检查——“默认”工作区/作业名目录和新的 wsname 目录。

最佳答案

尝试使用 customWorkspace节点通用选项:

pipeline {
agent {
node {
label 'node(s)-defined-label'
customWorkspace "${JENKINS_HOME}/workspace/${JOB_NAME}/${BUILD_NUMBER}"
}
}
stages {
// Your pipeline logic here
}
}

customWorkspace

A string. Run the Pipeline or individual stage this agent is applied to within this custom workspace, rather than the default. It can be either a relative path, in which case the custom workspace will be under the workspace root on the node, or an absolute path.



编辑

因为这不适用于您的复杂管道。也许试试这个愚蠢的解决方案:
def WORKSPACE = "${JENKINS_HOME}/workspace/${JOB_NAME}/${BUILD_NUMBER}"

node(HOST) {
sh(script: "mkdir -p ${WORKSPACE}")
sh(script: "cd ${WORKSPACE}")
//Do stuff here
}

或者如果 dir() 可访问:
def WORKSPACE = "${JENKINS_HOME}/workspace/${JOB_NAME}/${BUILD_NUMBER}"

node(HOST) {
sh(script: "mkdir -p ${WORKSPACE}")
dir(WORKSPACE) {
//Do stuff here
}
}

关于Jenkins 正在重新使用管道工作区,我希望每个构建都有一个独特的工作区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53074503/

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