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') _
来自詹金斯文件。仍然需要批准。
没有想法
我完全没有想法。通常应该信任共享管道,所以我真的不明白为什么他仍然要求批准这些外部调用......或者我在我的共享库的实现中做错了什么?