【问题标题】:Jenkins role strategy plugin and restrict user to build if not in proper group -- Jenkins fileJenkins 角色策略插件,如果不在适当的组中,则限制用户构建 - Jenkins 文件
【发布时间】:2021-10-03 22:26:38
【问题描述】:

我们有两个环境,qadev,在 Jenkinsfile 中配置为参数。插件Role-based Authorization Strategy开启,有两组用户,qadev(同环境)。这里的问题是 qa 用户可以开始使用 dev 环境构建作业。我们有什么方法可以限制这种行为吗? 这是一个简单的例子:

pipeline {
    agent any 
     
    choice(name: 'environment', choices: ['dev', 'qa']

    stages {    
        stage('test') { 
            script {
              if (params.environment == 'dev' && env.BUILD_USER_ID not in env.BUILD_USER_GROUPS) {echo "User ${env.BUILD_USER_ID} can not start build on DEV enviroment"}
              else if (params.environment == 'qa' && env.BUILD_USER_ID not in env.BUILD_USER_GROUPS) {echo "User ${env.BUILD_USER_ID} can not start build on QA enviroment"}
              else {echo "You can run job, You are in proper group for this enviroment"}
        } 
      }                     
    }
  }

一个例子是不真实的,也许不起作用,但我希望能理解我想要完成的事情。

附:这方面的文档不太好,在网上也找不到更多示例。

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-plugins devops


    【解决方案1】:

    您可以使用不同的方法来阻止未经授权的用户使用不相关的参数(在本例中为开发环境)启动构建,而不是阻止(或失败)执行。
    为此,您可以使用 Extended Choice Parameter 插件,它使您能够根据 groovy 脚本的返回值创建选择列表值(多选或单选)。
    然后你可以使用以下脚本:

    def buildUserGroup = ["group1","group 2","group3"]
    def environments = ['qa']  // This default value will be available to everyone
    
    // All the groups that the current logged in user is a member of
    def currentUserGroups = hudson.model.User.current().getAuthorities() 
    if (currentUserGroups.any{ buildUserGroup.contains(it) }) {
        environments.add("dev")  // Add relevant environments according to groups
    }
    return environments
    

    这样,您可以定义将根据组成员身份添加环境并根据您的需要进行调整的逻辑。构建作业的用户甚至不会看到他不允许构建的环境,您将获得所需的限制。
    在使用您的要求的管道作业中,可以简化配置,如下所示:

     pipeline {
        agent any
        parameters {
            extendedChoice(name: 'environment', type: 'PT_SINGLE_SELECT', description: 'Environment type', visibleItemCount: 10,
                    groovyScript:"return hudson.model.User.current().getAuthorities().contains('dev') ? ['dev','qa'] : ['qa']")
        }
        stages {
            stage('test') {
                ....
            }
        }
    }
    

    更新: 如果您正在使用基于角色的授权策略并希望将上述解决方案与角色而不是组一起使用,您可以使用以下代码(基于参数中的this script

    def environments = ['qa']  // This default value will be available to everyone
    
    def userID = hudson.model.User.current().id  // The current user it
    def authStrategy = jenkins.model.Jenkins.instance.getAuthorizationStrategy()
    def permissions = authStrategy.roleMaps.inject([:]){map, it -> map + it.value.grantedRoles}
    
    // Validate current user is in the 'dev' role
    if (permissions.any{it.key.name == 'dev' && it.value.contains(userID)}) {
        environments.add("dev")  // Add relevant environments according to groups
    }
    return environments
    

    【讨论】:

    • 它无法正常工作。当开发用户使用参数启动作业时,它只有 qa 选项
    • Noam Helmer Plus,第二个代码必须在参数内 {}
    • @Savke 我在我们的小组中对其进行了测试,效果很好。您可以转到 Manage Jenkins -> Script Console 并运行 println hudson.model.User.current().getAuthorities() 以查看所有组的列表并确保您使用正确的字符串。关于{} 你是什么意思?这是一个声明性语法,应该位于parameters 部分中,我将更新答案以强调这一点。
    • 您是否尝试使用组或角色?这是完全不同的......
    • @Savke 我用角色解决方案更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多