使用多个上游作业的版本参数化Jenkins作业

时间:2013-05-07 13:33:13

标签: jenkins continuous-delivery build-pipeline go-cd

我需要创建一个构建管道,它由多个相互依赖的项目组成。这是一个简化的插图:

SVN A --> build A --\
                    |
SVN B --> build B --|
                    |
SVN C ----------------> build C

管道应该工作,以便在将更改提交到任何项目的SVN存储库时,该项目将自动构建。此外,在构建A或B之后,它会触发C的构建。

每个构建产生具有唯一版本号(“X.Y.BuildNumber”)的二进制文件,并且C必须获得A和B的版本号作为参数,以便可以使用这些版本构建C。 C应默认使用A和B的最新成功构建,但也应该可以使用较旧版本的A或B手动触发C(例如,如果我们要部署其中一个项目的旧版本)。 / p>

创建像这样的管道可以在Go开箱即用,但我公司认为它过于昂贵。 (更新2014-02-27:Go不是开源和免费的!)所以现在我试图找出如何使用Jenkins实现相同的功能,但尚未找到方法。我只找到了在Jenkins中创建简单的线性和菱形管道的说明,但没有找到有多个独立上游项目的管道。

2 个答案:

答案 0 :(得分:1)

可以使用Copy Artifact Plugin将版本号从上游作业传递到下游作业。将版本号写入上游作业中的文件,将其归档,然后使用该插件在下游作业中读取它。在插件配置中选择触发此项目的上游构建使用“上次成功构建”作为后备选项。

有关详细信息,请参阅Interdependent Build Pipelines with Jenkins

答案 1 :(得分:0)

我们使用build-pipeline-plugin来做类似的事情,我们做的是提供一个groovy脚本来存储要传递给下游项目的运行时构建信息:

有点冗长,因为我们包含下游构建的SVN信息:

import hudson.model.*
def thr = Thread.currentThread()
def build = thr?.executable

def workspace = build.getWorkspace()

def ant = new AntBuilder() 
ant.exec(executable: "svn", outputproperty: "output", dir: workspace){ 
    arg(line: "info") 
}
svnInfo = ant.project.getProperty("output")
print svnInfo 

def pattern = /Last\s+Changed\s+Author:\s+(\w+)/ 
def matcher = (svnInfo =~ pattern)
def user = matcher[0][1]

def langs = new XmlParser().parseText(build.getParent().getWorkspace().child('pom.xml').readToString())
def appVer = langs.properties.release.text()
def artifactId = langs.artifactId.text()

def params = [
new StringParameterValue('PL_SVN_REVISION', build.getEnvVars()['SVN_REVISION']),
new StringParameterValue('PL_BUILD_NUMBER', build.getEnvVars()['BUILD_NUMBER']),
new StringParameterValue('PL_APP_NAME', 'FooApp'),
new StringParameterValue('PL_COMMITTER_NAME',user ),
new StringParameterValue('PL_APP_VERSION',appVer),
new StringParameterValue('PL_ARTIFACT_ID',artifactId) 
]
build.addAction(new ParametersAction(params))

然后在下游构建中,它们应该是这样的:

示例1,设置构建名称输入:

#${BUILD_NUMBER} - ${ENV,var="PL_APP_NAME"} - ${ENV,var="PL_APP_VERSION"} - ${ENV,var="PL_SVN_REVISION"}

示例2,调用Ant 目标输入:

deploy
  -Denvironment=ONT-base
  -DWAR-LOCATION=%war-repo%/%PL_APP_NAME%/%PL_BUILD_NUMBER%-%PL_SVN_REVISION%/
  -DWAR-NAME=%PL_ARTIFACT_ID%-%PL_APP_VERSION%.%PL_BUILD_NUMBER%-%PL_SVN_REVISION%.war

注意,在多个上游项目中重用下游项目时,因为有outstanding bug with variables not being passed down correctly