【问题标题】:Jenkins Add permissions to jobs using groovyJenkins 使用 groovy 为作业添加权限
【发布时间】:2020-03-31 18:34:31
【问题描述】:

我需要为特定用户添加一些权限(读取、构建、工作区、取消等)以完成很多工作。 我想知道有没有一种方法可以使用 groovy 脚本而不是手动执行。

【问题讨论】:

    标签: groovy jenkins jenkins-cli


    【解决方案1】:

    据我所知,您尝试做的事情是不可能的。

    链接:https://wiki.jenkins-ci.org/display/JENKINS/Matrix-based+security

    如果您想同时将更改应用于多个作业,我建议您使用“配置切片”。

    https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin

    但我不认为权限是配置切片的一部分。

    【讨论】:

    • 所以没有办法使用脚本来做到这一点
    【解决方案2】:

    我尝试了上述解决方案,它们几乎奏效了。我所有的尝试都导致当前的内存权限反映了新设置,但是这些权限没有保存在 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))
    

    【讨论】:

      【解决方案3】:

      您可以使用执行系统常规步骤来运行如下脚本:

      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()}" )
      

      (如果您知道如何在不从其他工作中读取权限对象的情况下获取权限对象,请更新)

      【讨论】:

        【解决方案4】:

        我们不需要创建新的权限对象,只需创建新的 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 文件中获取您需要的已配置权限

        【讨论】:

          【解决方案5】:

          在这里查看脚本:https://github.com/MovingBlocks/GroovyJenkins/blob/master/src/main/groovy/ChangeSecurityPerJob.groovy

          你应该能够把它的一部分拉出来做你想做的事,有点像这样。

          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()
          

          更有趣的部分是如果您需要合并权限。
          您也可以在上面的链接中找到相关示例。

          【讨论】:

            【解决方案6】:

            我的解决方案是以下 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()
                  }
                }
              }
            }
            

            如果您拥有想要在视图下更改权限的作业,它就可以工作。否则,您可以只创建一个包含作业名称的列表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-11
              相关资源
              最近更新 更多