【发布时间】:2017-01-25 15:28:22
【问题描述】:
总体目标:
我目前正在寻找一种合理的方法来处理(短期)功能分支的 Maven SNAPSHOT 工件的自动 CI 构建。所有生成的工件都应该有可追溯性(JIRA => Git => Jenkins build => Artifact + build-info in Artifactory)。
当前设置:
Jenkins 负责构建所有相关项目的主分支,这些项目由网络挂钩触发,并且没有为功能分支构建 CI。
在合并到 master 之后,我们有很多损坏的构建。 我同意你的观点,PR 创建者有责任确保分支编译并且(集成)测试通过并且受让人有责任在合并之前拉动分支并在本地测试所有内容大师可惜现实不一样。 此外,众所周知,SNAPSHOT 版本是不可复制的,如果两个开发人员使用相同的版本号,他们将覆盖彼此的工件。
我们使用 Artifactory Professional 4.7.5 作为存储库管理器。
目标设置:
我设置了一个 Jenkins 2 实例并在 GitHub Enterprise 中设置了一个组织,该组织可以通过 GitHub 组织文件夹插件轻松扫描。所有作业配置已移至 Jenkinsfiles。每当推送功能分支时,它都会触发构建,结果将在 GitHub Enterprise Web GUI 中可见。尽管如此,这并不能解决特征分支的快照没有相互隔离的问题。
我做了一些研究,发现 maven-branch-extension 绑定到 Maven 构建的 deploy 阶段。我设置了一个具有自定义布局的新功能分支存储库,并且可以通过调用 sh 'mvn clean deploy -Pfeature -Dgit.branch=${env.BRANCH_NAME} 将工件成功部署到该存储库(git.branch 参数是必需的,因为我们在使用 Jenkins 管道 scm 步骤时处于分离的 HEAD 状态,因此使用插件无法推断分支名称)。
问题:
我们没有得到使用Jenkins Artifactory plugin 时生成的构建信息。 Jenkins Artifactory 插件绑定到 install 阶段,因此 maven-branch-extension 不会启动。
我尝试在构建阶段之后添加一个单独的步骤:
stage('Publish build-info') {
def artifactoryServer = Artifactory.server('myrepo.mycompany.se')
def buildInfo = Artifactory.newBuildInfo()
buildInfo.env.capture = true
buildInfo.env.collect()
def target = (env.BRANCH_NAME != 'master') ? "myproject-snapshot-feature-local/${env.BRANCH_NAME}/" : "myproject-snapshot-local/"
def uploadSpec = """{
"files": [{
"pattern": "target/(.*).(jar|war|ear)",
"target": "${target}",
"recursive": "false",
"regexp": "true"
}]
}"""
artifactoryServer.upload(uploadSpec)
artifactoryServer.publishBuildInfo(buildInfo)
}
这会将一些构建信息发布到 Artifactory,但它也会再次上传工件。
我想知道如果没有 Jenkins Artifactory 插件执行构建,是否可以生成元数据。
另外,如果您认为我使用单独的功能分支存储库的方法首先不是一个好的解决方案,请告诉我。
【问题讨论】:
标签: jenkins artifactory continuous-delivery