【问题标题】:How does Jenkins Artifactory Plugin communicates resolver credentials to Gradle?Jenkins Artifactory Plugin 如何将解析器凭据传递给 Gradle?
【发布时间】:2015-07-31 16:08:39
【问题描述】:

使用 Jenkins Artifactory 插件和 Gradle,我能够成功部署到我的 Artifactory 实例。但是,我无法使用输入到 Jenkins 配置中的凭据来解析来自同一存储库的工件。

这里是build.gradle,直接来自 Artifactory 中 Artifactory 的“生成构建脚本”功能。

apply plugin: 'java'

sourceCompatibility = 1.5
version = '1.0'
buildscript {
    repositories {
        maven {
            url 'http://artifactory.myorg.com:8081/artifactory/plugins-release'
            credentials {
                username = "${artifactory_user}"
                password = "${artifactory_password}"
            }
        }

    }
    dependencies {
        //Check for the latest version here: http://plugins.gradle.org/plugin/com.jfrog.artifactory
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.3"
    }
}

allprojects {
    apply plugin: "com.jfrog.artifactory"
}

artifactory {
    contextUrl = "${artifactory_contextUrl}"   //The base Artifactory URL if not overridden by the publisher/resolver
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true

        }
    }
    resolve {
        repository {
            repoKey = 'libs-release'
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true

        }
    }
}


dependencies {
    compile group: "com.myorg", name: "internal-library", version: '1.0'

    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Jenkins 上的作业配置:

Jenkins Artifactory 插件配置:

错误:

FAILURE: Build failed with an exception.

* Where:
Build file '/var/lib/jenkins/jobs/deleteme/workspace/build.gradle' line: 10

* What went wrong:
A problem occurred evaluating root project 'untitled2'.
> Could not find property 'artifactory_user' on Credentials [username: null].

在本地,解析工件有效(artifactory_user 等已解决,因为我在本地 ~/.gradle/gradle.properties 中配置了它们)。但是,构建失败,因为未定义 artifactory_user。当然,我可以配置一个gradle.properties 供 Jenkins 使用(这很有效),但是这个 supposed 是如何工作的?看来 Jenkins Artifactory Plugin Gradle 集成应该以某种方式传达解析器凭据。有没有办法做到这一点,而无需在 Jenkins 的两个地方复制凭据?

【问题讨论】:

    标签: jenkins gradle artifactory


    【解决方案1】:

    tl;dr username = "${project.getProperty('artifactory.publish.username')}"

    注意:我还没有在 Jenkins 机器上测试过这个

    Jenkins artifactory 插件的 gradle 集成似乎做了两件事

    • 使用 [gradle init script] 注入工件配置
    • 提供构建和工件配置信息

    两者都涉及将文件写入临时文件夹(即 Linux 上的 /tmp)。如果您可以访问构建服务器,您的临时文件夹中可能会有很多 buildInfo\d{19}.propertiesinit-artifactory\d{19}gradle 文件。

    查看其中一个 buildInfo 文件会发现解析和发布凭据分别存储在 artifactory.resolve.usernameartifactory.publish.username 中。

    尝试设置和尝试直接使用${artifactory.publish.username} 在我的本地机器上不起作用;我认为这与 gradle 在设置之前尝试访问该属性有关。但project.getProperty 方法有效。

    buildscript {
        repositories {
            maven {
                url 'http://artifactory.myorg.com:8081/artifactory/plugins-release'
                credentials {
                    username = "${project.getProperty('artifactory.resolve.username')}"
                    password = "${project.getProperty('artifactory.resolve.password')}"
                }
            }
        }
    }
    
    artifactory {
        publish {
            contextUrl = "${project.getProperty('artifactory.publish.contextUrl')}"
            repository {
                repoKey = 'libs-release-local'
                username = "${project.getProperty('artifactory.publish.username')}"
                password = "${project.getProperty('artifactory.publish.password')}"
                maven = true
    
            }
        }
        resolve {
            repository {
                contextUrl = "${project.getProperty('artifactory.resolve.contextUrl')}"
                repoKey = 'libs-release'
                username = "${project.getProperty('artifactory.resolve.username')}"
                password = "${project.getProperty('artifactory.resolve.password')}"
                maven = true
    
            }
        }
    }
    

    您必须相应地更新您的本地~/.gradle/gradle.properties

    artifactory.publish.contextUrl=<artifactory-url>
    artifactory.publish.username=<username>
    artifactory.publish.password=<password>
    artifactory.resolve.contextUrl=<artifactory-url>
    artifactory.resolve.username=<username>
    artifactory.resolve.password=<password>
    

    【讨论】:

    • 很棒的信息和观察结果......不幸的是它不适用于 Jenkins。您提到的 buildinfo 文件包含工件“buildinfo”任务的 输出,然后将其上传到工件。这些属性名称在构建任务期间似乎不可用,仍然不确定它们在何处或如何被注入。进一步研究代码,查看构建脚本中的github.com/JFrogDev/build-infogithub.com/JFrogDev/jenkins-artifactory-plugin 和 printlns。现在手动设置~jenkins/.gradle/gradle.properties 的解决方法工作正常。
    • 更正我上一条评论,buildInfo 确实读入属性。实际上,您可以简单地省略在 build.info 中为 publishresolve 指定 usernamepassword,正如您提到的那样设置 gradle.properties,这样就可以了。唯一剩下的是 buildscript 部分中的插件 repo,这里似乎有一个 catch22 与当前实现,属性由 buildInfo 插件设置,但加载 buildinfo 插件需要这些属性。
    【解决方案2】:

    我也在用这个撞墙...我自己尝试了所有组合,唯一似乎有效的组合是将 gradle.properties 添加到 jenkins 服务器。

    最后我最终没有使用 jenkins alltogether 的 artifactory gradle 插件。而是将它添加到 build.gradle 并简单地从 Jenkins Server gradle 插件调用 artifactoryPublish。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2019-02-02
      • 1970-01-01
      • 2016-09-23
      • 2022-01-06
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多