问题描述
在使用Jenkins时,遇到了一个问题。他们使用Groovy脚本来读取构建队列的状态。然后他们添加了Azure AD插件,该插件需要一个具有hudson.model.Hudson.Administer
权限的帐户来运行脚本。他们使用了一个技术账户,但问题是任何人都可以使用这个登录账户进行交互,并成为Jenkins管理员。用户想知道是否有可能启用这个账户,但限制其在Jenkins上的交互登录。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
如果您目前通过脚本控制台运行此代码,可能会遇到沙箱中的RejectedAccessException,这就是为什么您需要管理员访问权限来运行此代码的原因,以及为什么需要管理员访问权限来使用脚本控制台的原因。
如果您将此代码放入一个共享库中,该代码将变为可信任的,您将不再需要管理员访问权限来运行代码,也不再需要脚本控制台。您只需要一个可以调用共享库的作业,如果需要,您可以限制对文件夹或作业的访问权限。
以下是将代码放入共享库的步骤:
1. 创建一个名为shared-library
的文件夹。
2. 在该文件夹中创建一个名为vars
的子文件夹。
3. 在vars
文件夹中创建一个名为readBuildQueueState.groovy
的文件,并将您的代码复制到该文件中。
4. 将shared-library
文件夹添加到Jenkins的共享库配置中。
5. 在您的Jenkins作业中,使用@Library
注释引用共享库,并调用readBuildQueueState
函数。
下面是一个示例readBuildQueueState.groovy
文件的内容:
def call() {
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()
}
在上面的示例中,我们将代码放入了一个名为readBuildQueueState.groovy
的文件中,并将其放入了一个名为shared-library
的共享库中。然后,在Jenkins作业中,我们使用@Library
注释引用了共享库,并调用了readBuildQueueState
函数。
方案2
使用脚本或工具来管理用户登录Jenkins的权限可能会增加复杂性,并且需要确保权限设置正确。
另一种方法是使用脚本或工具来控制用户登录Jenkins的权限。您可以使用Jenkins提供的一些插件或编写自己的脚本来实现这一点。以下是一种可能的方法:
1. 安装并配置Jenkins的安全插件,如Matrix Authorization Strategy Plugin或Role-based Authorization Strategy Plugin。
2. 在插件的配置中,为技术账户分配适当的权限,如只允许访问特定的作业或文件夹。
3. 禁用其他用户的交互登录权限,只允许他们通过其他方式(如API)与Jenkins进行交互。
请注意,这种方法可能会增加Jenkins的配置复杂性,并且需要确保权限设置正确。您可能需要在实施之前进行一些测试,并确保只有授权的用户可以访问Jenkins的敏感操作。