我们正在尝试在Jenkins上定义一组将执行特定操作的作业。 JobA1将构建maven项目,而JobA2将构建.NET代码,JobB将其上传到Artifactory,JobC将从Artifactory下载它,JobD将部署它。 每个作业都有一组参数,因此我们可以为任何产品(大约100个)重复使用相同的作业。
这背后的想法是创造黑匣子,我用一些输入来称呼工作,我总是得到一些输出,无论发生什么都是我不在乎的事情。另一方面,这使我们能够分别改进每项工作,增加所需的复杂性,并立即使所有产品受益。
我们希望使用Jenkins Pipeline来协调动作的执行。我们将根据环境/用途建立管道。
我试图从JobA1中获取一些变量(POM基本内容,例如ArtifactID或Version)注入JobB,但信息似乎没有被转移。 下载文件时也是如此,我称之为JobC,但文件位于作业工作区中,对任何其他文件都不可用,我担心"外部工作区管理器"插件增加了太多的复杂性。
有没有办法而不是共享工作空间来实现我的目的?我知道共享工作区将无法同时运行两个管道 我是在走正确的道路还是在做一些奇怪的事情?
答案 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)
有两种方法可以在作业之间共享信息:
您可以使用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,因为它仅在本地保存数据。构建后删除工件(有助于数据管理)。
您也可以使用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来实现多个管道共享和定义共享全局变量的库。