总体目标:
我目前正在寻找一种合理的方法来处理(短期)功能分支的Maven SNAPSHOT工件的自动CI构建。所有制作的工件都应该具有可追溯性(JIRA => Git => Jenkins build => Artifactory中的Artifact + build-info)。
当前设置:
Jenkins负责构建所有涉及项目的主分支,这些分支由Web挂钩触发,并且没有针对功能分支的CI构建。
在合并到master之后,我们有很多破坏的构建。 我同意你的意见,PR创建者有责任确保分支编译和(集成)测试通过和受让人的责任拉动分支并在合并之前在本地测试所有内容掌握,但不幸的是现实是不同的。 此外,众所周知,SNAPSHOT版本不可复制,如果两个开发人员使用相同的版本号,他们将覆盖彼此的工件。
我们使用Artifactory Professional 4.7.5作为存储库管理器。
目标设置:
我设置了一个Jenkins 2实例并在GitHub Enterprise中设置了一个可以通过GitHub组织文件夹插件轻松扫描的组织。所有作业配置都已移至Jenkinsfiles。每当推送功能分支时,它将触发构建,结果将在GitHub Enterprise Web GUI中可见。尽管如此,这并没有解决功能分支的SNAPSHOT没有彼此隔离的问题。
我做了一些研究,发现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插件没有执行构建,是否可以生成元数据。
另外,如果您认为我的方法与单独的功能分支存储库首先不是一个好的解决方案,请告诉我。
答案 0 :(得分:2)
您可以执行maven build using Artifactory Jenkins plugin而不是运行maven,然后使用通用上传DSL上传文件。
有关更多用法示例,您可以查看JFrog jenkins-pipeline-examples。
答案 1 :(得分:0)
这很老,但是我现在正在做类似的事情,遇到了问题。
您是否尝试过使用Maven CI firendly versions?我只是在为一个项目尝试这样做,他们看起来很有希望。
在我的情况下,我默认修订到我的版本(例如1.0.0),并将更改列表更改为“ -SNAPSHOT”。 pom版本设置为$ {rivision} $ {changelist},因此我的本地版本会生成常规的SNAPSHOT版本,但是在jenkins中,我可以生成并将更改列表设置为“。$ {timestamp}”。
类似的东西应该对您有用。