我需要为特定用户添加一些权限(读取、构建、工作区、取消等)以完成很多工作。我想知道有没有一种方法可以使用 groovy 脚本而不是手动进行。
6 回答
据我所知,您尝试做的事情是不可能的。
链接:https ://wiki.jenkins-ci.org/display/JENKINS/Matrix-based+security
如果您想同时将更改应用于多个作业,我建议您使用“配置切片”。
https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin
但我不认为权限是配置切片的一部分。
我尝试了上述解决方案,它们几乎奏效了。我所有的尝试都导致当前的内存权限反映了新设置,但是这些权限没有保存在 config.xml 中,所以当 Jenkins 重新启动时,权限丢失了。在 Andrew Hura 的解决方案的基础上,我想出了这段代码,它可以在重新启动时工作:
AbstractProject proj = Hudson.instance.getItem("my_job")
AuthorizationMatrixProperty authProperty = proj.getProperty(hudson.security.AuthorizationMatrixProperty)
authProperty.add("hudson.model.Item.Build:DEV")
Map<Permission, Set<String>> permissionMap = authProperty.getGrantedPermissions()
proj.removeProperty(hudson.security.AuthorizationMatrixProperty)
proj.addProperty(new AuthorizationMatrixProperty(permissionMap))
您可以使用执行系统常规步骤来运行脚本,例如:
import hudson.security.AuthorizationMatrixProperty
def jobWithPermissionsYouWant = "template-job-name"
def jobToAddPermissions = "job-to-update-name"
def jen = Jenkins.getInstance();
def templateJob = jen.getItem(jobWithPermissionsYouWant);
//get permissions from another job (use it as permissions template)
def autTemplate = templateJob.getProperty(AuthorizationMatrixProperty.class)
def permissionSetToAdd = autTemplate.getGrantedPermissions()
//get the authorization matrix property of the job you want to update
def jobToUpdate = jen.getItem(jobToAddPermissions);
def autToUpdate = jobToUpdate.getProperty(AuthorizationMatrixProperty.class)
def currPermissionSet = autToUpdate.getGrantedPermissions()
//for each permission in the template job, add permission to the job you want to update
permissionSetToAdd.each{
autToUpdate.add(it.key, "your.email@here.com")
}
println("the permissions after update: ${autToUpdate.getGrantedPermissions()}" )
(如果您知道如何在不从其他工作中读取权限对象的情况下获取权限对象,请更新)
你应该能够把它的一部分拉出来做你想做的事,有点像这样。
AbstractProject proj = Hudson.instance.getItem("YourJob")
AuthorizationMatrixProperty authProperty = proj.getProperty(AuthorizationMatrixProperty.class)
Map<Permission,Set<String>> newPermissions = new HashMap<Permission, Set<String>>()
newPermissions.put(Item.BUILD, users)
proj.addProperty(new AuthorizationMatrixProperty(newPermissions))
proj.save()
更有趣的部分是如果您需要合并权限。
您也可以在上面的链接中找到示例。
我们不需要创建新的权限对象,只需创建新的 hudson.security.AuthorizationMatrixProperty:
Jenkins.instance.getItem("JobName")
.removeProperty(hudson.security.AuthorizationMatrixProperty)
Jenkins.instance.getItem("JobName")
.addProperty(new hudson.security.AuthorizationMatrixProperty())
Jenkins.instance.getItem("JobName")
.getProperty(hudson.security.AuthorizationMatrixProperty)
.add("hudson.model.Item.Build:DEV")
其中“hudson.model.Item.Build:DEV”是一个权限字符串,您可以从 xml 文件中获取您需要的配置权限
我的解决方案是以下 groovy 脚本:
import hudson.model.*
import jenkins.security.*
import hudson.security.*
def jobNames = []
hudson.model.Hudson.instance.getView('VIEW_NAME').items.each() {
jobNames.add(it.fullDisplayName)
}
def userIDs = ['user1_ID','user2_ID', 'user3_ID']
// For each project
for(item in Hudson.instance.items) {
for(jobName in jobNames){
if(item.name.equalsIgnoreCase(jobName))
{
println(item.name)
for(userID in userIDs){
User user = User.getOrCreateByIdOrFullName(userID)
String sID = user.getId() ;
def authorizationMatrixProperty = item.getProperty(AuthorizationMatrixProperty.class)
authorizationMatrixProperty?.add(hudson.model.Item.CANCEL, sID)
authorizationMatrixProperty?.add(Item.WORKSPACE, sID);
authorizationMatrixProperty?.add(Item.BUILD, sID);
authorizationMatrixProperty?.add(Run.DELETE, sID);
authorizationMatrixProperty?.add(Run.UPDATE, sID);
authorizationMatrixProperty?.add(Item.CONFIGURE, sID);
authorizationMatrixProperty?.add(Item.DELETE, sID);
authorizationMatrixProperty?.add(Item.READ, sID);
authorizationMatrixProperty?.add(com.cloudbees.plugins.credentials.CredentialsProvider.VIEW, sID);
item.addProperty(authorizationMatrixProperty)
item.save()
}
}
}
}
如果您拥有要在视图下更改权限的作业,它就可以工作。否则,您可以只创建一个包含作业名称的列表。