Jenkins 管道在作业之间共享信息

sic*_*ear 6 jenkins jenkins-pipeline

我们正在尝试在 Jenkins 上定义一组将执行真正特定操作的作业。JobA1将构建maven项目,JobA2将构建.NET代码,JobB将其上传到Artifactory,JobC将从Artifactory下载它,JobD将部署它。每个作业都会有一组参数,因此我们可以对任何产品(大约 100 个)重复使用相同的作业。

这背后的想法是创建黑匣子,我调用一个带有一些输入的作业,并且我总是得到一些输出,无论之间发生什么,我都不关心。另一方面,这使我们能够单独改进每项工作,增加所需的复杂性,所有产品都会立即受益。

我们希望使用 Jenkins Pipeline 来编排操作的执行。我们将为每个环境/用途建立一个管道。

  • PipelineA将调用JobA1,然后调用JobB上传到artifactory。
  • PipelineB 将下载包 JobC,然后部署到 staging。
  • PipelineC 将下载包 JobC,然后根据一些内部验证部署到生产环境。

我尝试从 JobA1 中获取一些变量(POM 基本内容,例如 ArtifactID 或 Version)注入到 JobB 但信息似乎没有被传输。下载文件时也会发生同样的情况,我调用 JobC 但该文件位于作业工作区中,无法用于任何其他工作区,而且我担心“外部工作区管理器”插件会增加太多复杂性。

除了共享工作空间之外,还有什么方法可以实现我的目的吗?我知道共享工作区将导致无法同时运行两个管道我是否遵循正确的路径或者我在做什么奇怪的事情?

小智 7

在作业之间共享信息有两种方法:

\n\n
    \n
  1. 您可以使用stash/unstash在单个管道中的多个作业之间共享文件/数据。

    \n\n
    stage (\'HostJob\') {\n    build \'HostJob\'\n    dir(\'/var/lib/jenkins/jobs/Hostjob/workspace/\') {\n        sh \'pwd\'\n        stash includes: \'**/build/fiblib-test\', name: \'app\' \n    }\n}\n\nstage (\'TargetJob\') {\n    dir("/var/lib/jenkins/jobs/TargetJob/workspace/") {\n    unstash \'app\'\n    build \'Targetjob\'\n}\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    通过这种方式,您始终可以将文件/exe/数据从一个作业复制到另一个作业。管道插件中的此功能比 Artifact 更好,因为它仅在本地保存数据。该工件在构建后被删除(有助于数据管理)。

  2. \n
  3. 您还可以使用复制工件插件

    \n\n

    复制工件需要考虑两件事:

    \n\n

    a) 将工件归档到宿主项目中并分配权限。

    \n\n

    b) 构建新作业后,选择“复制工件的权限”\xc2\xa0\xe2\x86\x92 项目以允许复制工件:*

    \n\n

    c) 创建构建后操作 \xe2\x86\x92 归档工件\xc2\xa0\xe2\x86\x92 要归档的文件:“选择您的文件”

    \n\n

    d) 将所需的工件从主机复制到目标项目。\n创建生成操作 \xe2\x86\x92 从另一个项目复制工件\xc2\xa0\xe2\x86\x92 输入 \' $Project name - Host project\' ,其中构建\'例如最新成功构建\',要复制的工件\'$主机项目文件夹\',目标目录\'$localfolder位置\'。

  4. \n
\n


小智 3

您问题的第一部分(在作业之间传递变量)请使用以下命令作为构建后部分:

post {
    always {
        build job:'/Folder/JobB',parameters: [string(name: 'BRANCH', value: "${params.BRANCH}")], propagate: false
    }
}
Run Code Online (Sandbox Code Playgroud)

上述构建后操作适用于所有构建结果。同样,构建后操作可以在当前构建状态下触发。我已使用当前构建(JobA)中的 BRANCH 参数作为“JobB”使用的参数(提供作业的确切位置)。请注意,JobB 中应该定义类似的参数。

此外,为了共享工作区,您可以参考此链接并在作业之间共享工作区。

  • 这个想法不是从作业中调用作业,而是使用管道来编排“黑匣子”。Groovy Pipeline 调用 JobA,然后 Groovy pipeline 接收输出并调用 JobB 等等。 (2认同)