【问题标题】:How to prevent Jenkins parallel stages in pipeline to create a new workspace?如何防止管道中的 Jenkins 并行阶段创建新工作区?
【发布时间】:2023-04-02 07:38:01
【问题描述】:

我有一个这样执行的管道:

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

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

我的问题是,当第 3 阶段开始时,它失败了,因为克隆的文件不存在。第 3 阶段创建了一个名为 MyJobName@2 的新工作区,它是空的。看起来问题只是在存在并行阶段时才会发生。

我应该如何解决它?

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    您可以将多个步骤放入一个阶段。然后在 Workspace 上分享步骤。

    如果 stage3 仅用于通过电子邮件发送结果,则应使用存档工件,然后通过电子邮件发送结果。

    【讨论】:

    • 一个阶段的多个步骤可以并行执行吗?
    • 第 3 阶段和第 2 阶段都可以退出第 4 阶段的步骤
    【解决方案2】:

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

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

    【讨论】:

    • 我正在使用声明性管道,所以我没有 node 选项。我将如何配置它?
    • 您确定使用声明式管道吗?我的代码示例可以用于它(Jenkinsfile),所以它应该可以正常工作。
    • 不起作用,它不符合我配置的路径。我试图设置:parallel { stage('Hom') { agent { docker { image "${imageBuild}" args "${dockerArgs}" customWorkspace "/var/jenkins_home/workspace/MyJobName" } }
    【解决方案3】:

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

    主要区别在于我使用声明式管道,在 git clone 之后或多或少地定义了该管道的工作区。这意味着工作区MyJobName(第 2 阶段)和MyJobName@2(第 3 阶段)都包含带有最新提交的 repo。

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

    在第 4 阶段,我需要第 2 阶段和第 3 阶段的结果。但在第 4 阶段,只有工作区 MyJobName 可用,而不是工作区 MyJobName@2

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

    【讨论】:

    • 我不明白。设置这样的 Docker 命令如何导致将文件保留在工作区中?
    • @PatrickSzalapski Docker 参数创建一个卷。此卷为您提供容器生命周期之外的持久目录(仅存在于单个阶段)。这说明清楚了吗?
    【解决方案4】:

    好吧,下面是我的原始答案,但仍然失败。我的安装使用了较旧的 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 更改为目录。


    如果你有一个旧的码头工人应该可以工作的旧答案:

    这是我非常老套的解决方案。我无法阻止 Jenkins 为每个阶段创建不同的管道,所以我的解决方案是:

    1. 在第一阶段,将当前工作空间放入名为myWorkspace 的全局变量中
    2. 对于其他阶段,将步骤中的命令包含在命令dir (myWorkspace) {...}

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-27
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多