【问题标题】:Generating Artifactory build-info from Maven invocation从 Maven 调用生成 Artifactory 构建信息
【发布时间】: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


    【解决方案1】:

    您可以使用maven build using Artifactory Jenkins plugin 而不是运行 maven,然后使用通用上传 DSL 上传文件。

    更多使用示例,您可以查看 JFrog jenkins-pipeline-examples

    【讨论】:

    • 如果我只使用 Artifactoy Jenkins 插件,工件将不会附加任何唯一时间戳,因为它在存储库规范中定义:
    • (f/[jiraKey]/)[orgPath]/[module]/[baseRev](- [folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext] 这与 Maven 标准布局相同,但它将所有内容都放在一个命名的文件夹中,就像功能一样分支(如 f/ISSUE-1234)。
    • maven-metadata.xml 看起来像这样,所以看起来没有根据布局解析: f.ISSUE-1234.se.mycompanyfire2.0.0-SNAPSHOT2.0.0-SNAPSHOT2.0.0-SNAPSHOT20170127101515
    • 似乎完全忽略了存储库布局。如果我不得不在 Artifactory Jenkins 插件的部署器属性中“某处”再次描述它,那真的很烦人(但我找不到那个选项)。
    • 我注意到,一旦我使用自定义布局,它也不会将唯一时间戳(即使选择了选项)附加到文件名。出于好奇,我更改了自定义 repo 布局模式,使其看起来像 Maven 2 布局。而且它仍然不会附加时间戳。看起来 Jenkins Artifactory 插件必须以某种方式配置为使用该布局,并且它不是从配置为使用该布局的存储库本身推断出来的。
    【解决方案2】:

    这是旧的,但我现在正在做类似的事情并且遇到了问题。

    您是否尝试过使用Maven CI firendly versions?我只是在为一个项目尝试这个,他们看起来很有希望。

    在我的情况下,我默认修订为我的版本(例如 1.0.0)和更改列表为“-SNAPSHOT”。 pom 版本设置为 ${rivision}${changelist},因此我的本地构建会生成常规的 SNAPSHOT 构建,但在 jenkins 中,我可以构建并将更改列表设置为“.${timestamp}”。

    类似的东西应该适合你。

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 2020-02-14
      • 2021-09-28
      • 2017-04-30
      • 2015-05-03
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多