如何防止Jenkins并行阶段在管道中创建新的工作区?

时间:2019-02-14 20:34:09

标签: jenkins jenkins-pipeline

我有一个以这种方式执行的管道:

Stage 1  -----> Stage 2  ----> Stage4
clone repo  |   exec           email   
            |                  results
            --> Stage 3
                exec

第1阶段,第2阶段和第3阶段都在docker映像中执行,它们都共享工作区的网络目录。

我的问题是,第3阶段启动时会失败,因为克隆的文件不存在。第3阶段创建了一个名为MyJobName@2的新工作空间,它是空的。

我该如何解决? 并行启动Stage 3时,jenkins compl

4 个答案:

答案 0 :(得分:0)

您可以将多个步骤划分为一个阶段。然后,这些步骤将在Workspace上共享。

如果只有stage3可以通过电子邮件发送结果,则应使用存档工件,然后通过电子邮件发送结果。

答案 1 :(得分:0)

您可以分别设置每个阶段的工作空间,因此在您的示例中,阶段2和4将共享相同的工作空间。对于第3阶段,您必须设置一个不同的customWorkspace 代码如下:

        stage('Pipeline Test')
        {
                stage('Test')
                {
                    agent
                    {
                        node
                        {
                            customWorkspace 'workspace/justATest'
                        }
                    }
                    steps
                    {
                      //everything is executed in the workspace declared above
                    }

答案 2 :(得分:0)

好吧,以下是我的原始答案,但仍然失败。我的安装使用的是较旧的Docker版本,并且总是收到错误消息:

Docker version is older than 17.12, working directory will be /var/jenkins_home/workspace/ICP-bdm-Revisao not /var/jenkins_home/workspace/ICP-bdm-Revisao@2

我认为问题已经解决,但是当我开始使用更多并行阶段时,问题又回来了。

此问题要求3个解决方案失败

  • dir(myWorkspace){...}
  • ws(myWorkspace){...}
  • 节点{customWorkspace myWorkspace}

我更棘手的解决方案是在执行每个shell命令之前,将每个命令更改为使用绝对路径,或更改为cd到目录。


如果您有较新的泊坞窗,旧答案应该起作用:这是我非常棘手的解决方案。我无法阻止詹金斯为每个阶段创建不同的管道,所以我的解决方案是:

  1. 在第一阶段,将当前工作空间放置在名为myWorkspace的全局变量中
  2. 对于其他每个阶段,请将命令括在命令dir (myWorkspace) {...}

答案 3 :(得分:0)

我遇到了类似的问题。我有一个Jenkinsfile,其中each stage runs in its own containter和某些阶段并行运行。

主要区别在于,我使用了声明性管道,在git克隆之后为其定义了工作空间。这意味着工作空间MyJobName(阶段2)和MyJobName@2(阶段3)都包含具有最新提交的仓库。

这基本上已经解决了您所说的问题,但是我还需要更多。

在阶段4中,我需要阶段2和阶段3的结果。但是在阶段4中,只有工作空间MyJobName可用,而没有工作空间MyJobName@2

为此,我使用了caching data for containers技巧。