首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jenkins角色策略插件,如果没有正确的组,则限制用户构建-- Jenkins文件

Jenkins角色策略插件,如果没有正确的组,则限制用户构建-- Jenkins文件
EN

Stack Overflow用户
提问于 2021-07-28 07:17:20
回答 1查看 572关注 0票数 0

我们有两个环境,qadev,它被配置为Jenkinsfile中的参数。插件基于角色的授权策略被启用,并且有两组用户,qadev (与环境相同)。这里的问题是,qa用户可以开始使用dev环境构建作业。我们有办法限制这种行为吗?下面是一个简单的例子:

代码语言:javascript
运行
复制
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"}
        } 
      }                     
    }
  }

一个例子是不真实的,也许不起作用,但我希望能理解我想要实现的目标。

这方面的文档不是很好,在网上也找不到更多的例子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-28 09:08:21

与其在启动后阻止(或失败)执行,不如使用不同的方法,防止未经授权的用户使用不相关的参数(在本例中为dev环境)启动构建。

为此,您可以使用扩展选择参数插件,它使您能够基于groovy脚本的返回值创建一个select列表值(多个或单个select)。

然后可以使用以下脚本:

代码语言:javascript
运行
复制
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

通过这种方式,您可以定义将根据组成员身份添加环境的逻辑,并根据您的需要对其进行调整。构建作业的用户甚至不会看到他不允许构建的环境,您将得到所需的限制。

在使用需求的管道作业中,配置可以简化,如下所示:

代码语言:javascript
运行
复制
 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') {
            ....
        }
    }
}

更新:如果您正在使用基于角色的授权策略,并且希望对角色使用上述解决方案,而不是使用组,则可以使用以下代码(基于参数中的这个剧本 ):

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68555998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档