2

TLDR;

如何以jenkins非交互方式进行配置,以便人们可以使用我的共享库,而无需我点击进程内脚本的批准按钮

很长的故事...

我在 Jenkins 中创建了一个共享库,看起来像这样(简化版):

def call(body) {
    // evaluate the body block, and collect configuration into the object
    def pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()

    pipeline { stages { stage { steps { script {
        pipelineParams.test()
    }
}

这样用户就可以像这样调用我的库:

@Library('my-shared-library@master') _
MyPipeline {
    test = {
        sh "./gradlew test"
    }
}

该库也在jenkins/configure下配置。

麻烦的是詹金斯总是要求签名的过程中脚本批准

签名:staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods invokeMethod java.lang.Object java.lang.String java.lang.Object

但是在文档中它说共享库应该是可信的:https ://jenkins.io/doc/book/pipeline/shared-libraries/#global-shared-libraries ...

这是我尝试过的:

1. 完全禁用进程内脚本审批

这似乎是不可能的:请参阅如何禁用 Jenkins 管道构建的安全检查并打开jenkins票证:https ://issues.jenkins-ci.org/browse/JENKINS-28178

2.使用Configuration As Code预先配置jenkins,允许这种特定方式

这目前还不可能......工作似乎已经基本准备就绪,但截至今天仍需要合并到 master 中:https ://github.com/jenkinsci/script-security-plugin/pull/250

3. 在 jenkins/scriptApproval 上 GET 和 POST

我使用浏览器调试器查看进行了哪些调用。页面上的 GET 为我提供了正确的 ID,然后一个 POST 就足够了,但是由于两个请求是分开发出的,ID 之间发生了变化,我收到了 404 错误...

import requests
id = [line for line in requests.get("http://localhost:8080/scriptApproval/").text.strip().split() if 'makeStaplerProxy' in line][0].split("'")[1]
postUrl = "http://localhost:8080" + id + "/approveSignature"
print(postUrl)
r = requests.post(postUrl)
print(r.status_code)

会给:

http://localhost:8080/$stapler/bound/8488d0c2-9fce-4091-8b9f-747ae0016421/approveSignature
404

4. 隐式加载库

我隐式加载库,并删除了

@Library('my-shared-library@master') _

来自詹金斯文件。仍然需要批准。

没有想法

我完全没有想法。通常应该信任共享管道,所以我真的不明白为什么他仍然要求批准这些外部调用......或者我在我的共享库的实现中做错了什么?

4

0 回答 0