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

Jenkins管道在作业之间共享信息,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我们正试图在Jenkins上定义一组作业,这些作业将执行真正具体的操作。JobA1将构建maven项目,而JobA2将构建.NET代码,JobB将其上载到Artifactory,JobC将从Artifactory下载,JobD将部署它。 每个作业都有一组参数,因此我们可以对任何产品(大约100个)重复使用相同的作业 这背后的想法是创建黑匣子,我用一些输入调用一个作业,我总是得到一些输出,两者之间发生的任何事情我都不在乎。另一方面,这允许我们分别改进每项工作,增加所需的复杂性,所有产品都将立即受益

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

这背后的想法是创建黑匣子,我用一些输入调用一个作业,我总是得到一些输出,两者之间发生的任何事情我都不在乎。另一方面,这允许我们分别改进每项工作,增加所需的复杂性,所有产品都将立即受益

我们希望使用Jenkins管道来协调操作的执行。我们将根据每个环境/使用情况设置管道

  • PipelineA将调用JobA1,然后调用JobB以上载到artifactory
  • PipelineB将下载包JobC,然后部署到暂存
  • PipelineC将下载包JobC,然后根据一些内部验证将其部署到生产环境中
我试图从JobA1(POM基本内容,如ArtifactID或Version)中获取一些变量,并将其注入到JobB中,但信息似乎没有被传递。 下载文件时也会发生同样的情况,我称之为JobC,但该文件位于作业工作区中,其他任何人都无法使用,我担心“外部工作区管理器”插件会增加太多的复杂性

除了共享工作空间,还有什么方法可以达到我的目的吗?我知道共享工作区将使同时运行两条管道变得不可能
我是在走正确的道路还是在做一些奇怪的事情?

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

post {
    always {
        build job:'/Folder/JobB',parameters: [string(name: 'BRANCH', value: "${params.BRANCH}")], propagate: false
    }
}
上述生成后操作适用于所有生成结果。类似地,可以在当前生成状态下触发生成后操作。我使用了来自当前构建(JobA)的分支参数作为“JobB”使用的参数(提供作业的确切位置)。请注意,在JobB中应该定义一个类似的参数


此外,为了共享工作区,您可以在作业之间引用和共享工作区。

您可以使用。查看its以实现多个管道共享的库并定义共享的全局变量。

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

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

    stage ('HostJob') {
        build 'HostJob'
        dir('/var/lib/jenkins/jobs/Hostjob/workspace/') {
            sh 'pwd'
            stash includes: '**/build/fiblib-test', name: 'app' 
        }
    }
    
    stage ('TargetJob') {
        dir("/var/lib/jenkins/jobs/TargetJob/workspace/") {
        unstash 'app'
        build 'Targetjob'
    }
    
    通过这种方式,您始终可以将文件/exe/数据从一个作业复制到另一个作业。管道插件中的这个特性比工件更好,因为它只在本地保存数据。工件在构建后被删除(有助于数据管理)

  • 您也可以使用

    <> P>复制工件有两件事要考虑:

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

    b) 构建新作业后,选择“复制工件的权限”→ 允许复制工件的项目:*

    c) 创建生成后操作→ 归档工件→ 要存档的文件:“选择您的文件”

    d) 将所需的工件从主机复制到目标项目。 创建一个构建操作→ 从另一个项目复制工件→ 输入“$Project name-Host Project”,其中生成“例如,最新成功生成”,复制工件“$Host Project folder”,目标目录“$localfolder location”


  • 其思想不是从作业调用作业,而是使用管道来编排“黑匣子”。Groovy管道调用JobA,然后Groovy管道接收输出并调用JobB,依此类推。对于步骤2d),还可以使用管道语法:
    copyArtifacts(projectName:'sourceproject')