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

时间:2017-03-28 15:32:31

标签: jenkins jenkins-pipeline

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

这背后的想法是创造黑匣子,我用一些输入来称呼工作,我总是得到一些输出,无论发生什么都是我不在乎的事情。另一方面,这使我们能够分别改进每项工作,增加所需的复杂性,并立即使所有产品受益。

我们希望使用Jenkins Pipeline来协调动作的执行。我们将根据环境/用途建立管道。

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

我试图从JobA1中获取一些变量(POM基本内容,例如ArtifactID或Version)注入JobB,但信息似乎没有被转移。 下载文件时也是如此,我称之为JobC,但文件位于作业工作区中,对任何其他文件都不可用,我担心"外部工作区管理器"插件增加了太多的复杂性。

有没有办法而不是共享工作空间来实现我的目的?我知道共享工作区将无法同时运行两个管道 我是在走正确的道路还是在做一些奇怪的事情?

3 个答案:

答案 0 :(得分:2)

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

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

以上帖子构建操作适用于所有构建结果。同样,可以在当前构建状态上触发post构建操作。我已经使用当前版本(JobA)中的BRANCH参数作为参数来使用' JobB' (提供工作的确切位置)。请注意,JobB中应该定义一个类似的参数。

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

答案 1 :(得分:2)

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

  1. 您可以使用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 / data从一个作业复制到另一个作业。管道插件中的此功能优于Artifact,因为它仅在本地保存数据。构建后删除工件(有助于数据管理)。

  2. 您也可以使用Copy Artifact Plugin

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

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

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

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

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

答案 2 :(得分:0)

您可以使用Pipelines shared groovy libraries plugin。看看它的documentation来实现多个管道共享和定义共享全局变量的库。