我需要创建一个构建管道,它由多个相互依赖的项目组成。这是一个简化的插图:
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中创建简单的线性和菱形管道的说明,但没有找到有多个独立上游项目的管道。
答案 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。