azure - 如何在使用 Azure AD 身份验证的 Jenkins 中读取队列状态?
问题描述
我们有授权模式的 Jenkins 实例和带有令牌的Logged in users can do anything
单个管理员。superuser
我们使用这个 groovy 脚本来查询构建队列:
def builder = new groovy.json.JsonBuilder()
builder {
queueItems(Jenkins.instance.queue.items.collect { obj ->
[
id: obj.id,
name: obj.task.name,
isStuck: obj.stuck,
isBlocked: obj.blocked,
isDisabled: obj.task.disabled,
inQueueSince: obj.inQueueSince,
why: obj.why,
causesDescription: obj.causesDescription,
queueItemUrl: obj.url,
taskUrl: obj.task.url
]
})
}
println builder.toPrettyString()
在我们安装Azure AD 插件之前,这一直很好。当我们这样做时,脚本执行请求会产生错误:
Date: Thu, 01 Aug 2019 15:03:29 GMT
X-Content-Type-Options: nosniff
X-You-Are-Authenticated-As: superuser
X-You-Are-In-Group-Disabled: JENKINS-39402: use -Dhudson.security.AccessDeniedException2.REPORT_GROUP_HEADERS=true or use /whoAmI to diagnose
X-Required-Permission: hudson.model.Hudson.RunScripts
X-Permission-Implied-By: hudson.model.Hudson.Administer
Content-Type: text/html;charset=utf-8
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache,no-store,must-revalidate
X-Hudson-Theme: default
Referrer-Policy: same-origin
X-Hudson: 1.395
X-Jenkins: 2.186
X-Jenkins-Session: 9cf3a1af
X-Hudson-CLI-Port: 50000
X-Jenkins-CLI-Port: 50000
X-Jenkins-CLI2-Port: 50000
X-Frame-Options: sameorigin
Server: Jetty(9.4.z-SNAPSHOT)
Transfer-Encoding: chunked
我们尝试使用域用户来验证此请求,如下所示:
curl -k -X POST -u "USERNAME@DOMAIN:PASSWORD" -d "script=%0A%20%20%20%20def%20builder%20%3D%20new%20groovy.json.JsonBuilder()%0A%0A%09builder%20{%0A%09%20%20queueItems(Jenkins.instance.queue.items.collect%20{%20obj%20-%3E%0A%09%09%20%20%5B%0A%09%09%09id%3A%20obj.id%2C%0A%09%09%09name%3A%20obj.task.name%2C%0A%09%09%09isStuck%3A%20obj.stuck%2C%0A%09%09%09isBlocked%3A%20obj.blocked%2C%0A%09%09%09isDisabled%3A%20obj.task.disabled%2C%0A%09%09%09inQueueSince%3A%20obj.inQueueSince%2C%0A%09%09%09why%3A%20obj.why%2C%0A%09%09%09causesDescription%3A%20obj.causesDescription%2C%0A%09%09%09queueItemUrl%3A%20obj.url%2C%0A%09%09%09taskUrl%3A%20obj.task.url%0A%09%09%20%20%5D%0A%09%20%20%20})%0A%09}%0A%0A%09println%20builder.toPrettyString()" https://jenkinsurl/scriptText
使用 RESTer Chrome 插件可以很好地工作,但我们没有设法使用 CURL 等其他程序使其工作。
我们发现 cookie 存在问题,在发送第一个请求之前无法设置该 cookie。
那么,在这样的 Jenkins 配置中读取作业队列(使用 curl)的正确方法是什么?
我们需要使用现有的 Jenkins 用户令牌而不是 AD auth 来执行该操作,或者使用一些插件来读取队列并返回此数据而无需任何身份验证。
解决方案
目前我只能找到两种解决方法。该问题已在 Jenkins GitHub 上提出。
Jie Shen 在Jenkins 问题页面上提出了以下建议,以帮助确保访问:
在基于 Azure Active Directory 矩阵的安全部分中,您需要在矩阵中有两个用户才能使其能够访问 Jenkins API。自动完成将为您提供一个用户名,如“用户名(对象 ID)”。除此之外,您还需要添加一个用户名,如“用户名(用户 ID)”,并赋予其读取权限。这样,API 的东西应该可以工作了。
此外,确认您的 curl 请求与您的 RESTer Chrome 插件请求的输出相匹配。您的 curl 命令很可能不会生成与 RESTer Chrome 插件相同的输出。
推荐阅读
- xml - 如何在 ATG BCC 中为用户分析创建新选项卡
- c# - WPF 垂直滚动条与文本对齐,而不是与文本框宽度对齐
- vue.js - 为什么不使用 v-model 设置日期时间?
- sql - SQL Filter Select 语句如果出现在任何列中
- html - 导航页脚页眉等标签不做任何事情?
- python - Python Selenium - 按钮未单击
- sql - 如何使用子查询作为黑名单排除查询中的结果
- gnuradio - GnuRadio 将随机值作为参数传递
- c# - 使用 C# 和 ASP.Net 向 DataTable 添加新的不同行并在 GridView 中显示
- azure-stream-analytics - 流分析查询以排除记录