所以,我在这个主题上找到的大多数问题和答案都是针对想要使用相同工作区进行不同运行的人的。(这让我感到困惑,但每次开始工作时我都需要一个干净的石板。剩下的东西只会破坏东西)
我的问题恰恰相反 - 我必须为每次运行创建一个单独的工作区(或者我需要知道如何在不同的运行中创建具有相同名称的文件,这些文件只保留在该运行中,并且可以从 bash 脚本启动管道!)
所以,我的问题是 - 我如何强制 Jenkins 不在不同主机上为两个同时运行的作业使用相同的工作区,或者我可以在“自定义工作区”字段中使用什么变量来完成此操作?
在我回答@Joerg SI 的问题后,我意识到我在说 Joerg S 所说的“不可能发生”的事情正是我所观察到的!Jenkins 在 2 个不同的主机上为 2 个不同的并发作业使用相同的工作区。 这是 Jenkins 管道错误吗?
有关令人眼花缭乱的信息,请参阅下文。
鉴于我在运行期间必须进入和关闭节点的方式,我发现我可以在同一作业的不同主机上启动 2 个不同的构建,并且它们共享工作区目录!由于每个作业都有忙于将文件写入该目录的 shell 脚本,因此这是非常糟糕的。
在jenkins 的自定义工作区中,我们被告知使用自定义工作区,我就是这样设置的
在Jenkins: how to run builds in unique directory我们被告知在上面的自定义工作区字段中使用 ${BUILD_NUMBER} ,所以我尝试的是:
${JENKINS_HOME}/workspace/${ITEM_FULLNAME}/${BUILD_NUMBER}
Run Code Online (Sandbox Code Playgroud)
当我使用它时,所有发生在我身上的事情就是工作区名称是,你猜对了,“${BUILD_NUMBER}”(我什至得到了一个“${BUILD_NUMBER}@2”只是为了很好的衡量!)
我试过 {$BUILD_ID},同样的事情(字面上使用,不替换数字)。
我打开了“允许并发构建”。
我只使用管道。
这里的所有作业,作为正常执行的一部分,导致从属非主控主机重新启动到无法运行 slave.jar 的操作系统(实际上,它根本没有网络访问权限),所以我无法运行该主机上的整个管道。
所有作业都在其中的某处使用以下构造:
tests=Arrays.asList(tests.split("\\r?\n"))
shellerror=231
for( line in tests){
Run Code Online (Sandbox Code Playgroud)
所以让我们调用一个示例作业“foo”,它循环遍历一个列表,如上所述,我想在 2 个不同的主机上运行。该作业的管道开始在 master 上运行(因为需要在节点上运行上面的(测试中的行)!))。然后在主从之间来回,通常是多次。
如果我大约同时在主机 A 和主机 B 上开始这项工作,他们将使用工作区 ${JENKINS_HOME}/workspace/${JOB_NAME},或者在我的情况下使用 /var/lib/jenkins/jenkins/workspace/工作
由于他们将不同的数据写入该目录中具有相同名称的文件,我显然立即完全崩溃了。 …