【问题标题】:How to avoid a Conan SSL user authentication error with Jenkins Artifactory plugin?如何使用 Jenkins Artifactory 插件避免柯南 SSL 用户身份验证错误?
【发布时间】:2018-05-28 16:48:06
【问题描述】:

我的公司是 Conan、Artifactory 和 Jenkins 的新手,但几个月前我们设置了一些测试管道脚本,并利用 Jenkins Artifactory 插件将一些 Conan 包发布到我们的 Artifactory 服务器。这些脚本现在因 SSL 认证失败而失败。

我们正在使用以下软件包:

  • Jenkins v2.121
  • Jenkins Artifactory 插件 v2.16.1
  • Artifactory Pro v5.10.3
  • 柯南 v1.3.3

当涉及到 Artifactory 配置时,我们的管道脚本中的“打包和发布”阶段与此类似:

stage('Package and Publish') {
    def artifactory_name = "MyCompanyArtifactory"
    def artifactory_repo = "conan-local"

    def server = Artifactory.server artifactory_name
    def client = Artifactory.newConanClient()
    def serverName = client.remote.add server: server, repo: artifactory_repo

    client.run(command: "export-pkg . ci-user/stable -s os=Linux -s arch=x86_64 -s build_type=Debug")
    client.run(command: "export-pkg . ci-user/stable -s os=Linux -s arch=x86_64 -s build_type=Release")
    String myCmd = "upload MyLib/* --all -r ${serverName} --confirm"
    def bInfo = client.run(command: myCmd)
    //server.publishBuildInfo bInfo
}

这段代码曾经运行过,但我相信当我们的 IT 部门将 Artifactory 切换到 HTTPS 访问时它停止运行了。现在,Jenkins 在尝试为我们的 repo 设置 Conan 用户时出错:

[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Package and Publish)
[Pipeline] getArtifactoryServer
[Pipeline] initConanClient
[shared-mylib] $ sh -c 'conan config set log.trace_file=\"/home/builduser/jenkins/workspace/shared-mylib@tmp/conan.tmp261537390058591873/conan_log.log\" '
[Pipeline] conanAddRemote
[shared-mylib] $ sh -c "conan remote add b519966f-f612-4094-b3ea-453a017cf793 https://artifactory.mycompany.com/artifactory/api/conan/conan-local "
WARN: Remotes registry file missing, creating default one in /home/builduser/jenkins/workspace/shared-rtplib@tmp/conan.tmp261537390058591873/.conan/registry.txt
[Pipeline] conanAddUser
Adding conan user 'ci-user', server 'b519966f-f612-4094-b3ea-453a017cf793'
[shared-mylib] $ sh -c ********
ERROR: HTTPSConnectionPool(host='artifactory.mycompany.com', port=443): Max retries exceeded with url: /artifactory/api/conan/conan-local/v1/users/authenticate (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)'),))

此行为不限于 Jenkins 访问;当普通用户尝试访问 Artifactory Conan 存储库时也会发生这种情况,但我们可以通过添加带有 Verify_SSL 为 False 的远程存储库(在以下命令的末尾)来绕过它:

conan remote add myco-conan-local https://artifactory.mycompany.com/artifactory/api/conan/conan-local False

我相信Conan 文档表明我们有两个选择:

  • 通过conan remote 命令禁用 SSL 验证(上图)
  • 将服务器 crt 文件附加到 conan 主目录中的 cacert.pem 文件中。

不幸的是,当涉及到 Jenkins 流水线脚本时,我无法弄清楚如何完成这两种解决方案。所以我的问题:

  1. 有没有办法在 Jenkins 流水线脚本中使用 client.remote.add 命令(或类似命令)禁用 SSL 验证?
  2. 有没有办法通过 Jenkins 管道脚本包含必要的服务器证书(以便它自动添加到工作区特定的柯南主目录)?

选项#1 可能是更简单的短期解决方案的首选,但我也想了解选项#2 是如何完成的。

感谢阅读。

【问题讨论】:

    标签: ssl jenkins artifactory conan


    【解决方案1】:

    命令:

    $ conan remote add <remote-name> <remote-url> False -f
    

    强制覆盖现有的 &lt;remote-name&gt; 设置 verifyHttps=False

    虽然插件 DSL 不包含该参数的接口,但它允许执行任意命令,因此您可以执行以下操作:

    node {
        def server = Artifactory.server "artifactory"
        def client = Artifactory.newConanClient()
        def serverName = client.remote.add server: server, repo: "conan-local" 
    
        stage("Setremotehttp"){
            String command = "remote add ${serverName} http://localhost:8081/artifactory/api/conan/conan-local False -f"          
            client.run(command: command)
        }
        stage("Search"){
            String command = "search zlib -r=${serverName}"          
            client.run(command: command) 
        } 
    }
    

    需要remote的url,有点重复,不过我测试过,可以,所以可以作为解决方法。

    【讨论】:

    • 不幸的是,这对我不起作用。 client.remote.add 行在幕后同时执行 conan remote addconan user 命令,而失败的是 conan user 调用。所以新的remote add ... False -f 命令永远不会被执行。
    • 您是否尝试过像我在Setremotehttp 阶段那样跳过client.remote.add 调用并直接执行“远程添加”,然后再调用user &lt;youruser&gt; -p &lt;yourenv-var-password&gt; -r=myremote
    • 是的,完全避开client.remote.add 这一行并使用client.run 手动发出命令是成功的。柯南在构建日志文件中到处抱怨未经验证的 HTTPS 请求,但我想这是可以理解的。而且:这个解决方案意味着我们必须将 Artifactory 用户凭据放入 Jenkinsfiles 中。密码是加密的,但它仍然不是一个理想的解决方案。将此问题标记为已回答,但我想我也会继续追求证书解决方案。这似乎是首选路径。
    • 它是底层的“请求”库,抱怨未经验证的调用,而不是柯南,我不确定它是否可以被禁用。是的,当然,首选的解决方案应该是使用 https,而不是禁用它,所以请尝试使用不同的证书替代方案(如 docs.conan.io/en/latest/reference/config_files/…),如果需要,请在此处或在 github 问题中再次询问。
    • 它对我有用
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2022-06-10
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多