Jenkins role strategy plugin and restrict user to build if if not in proper group -- Jenkins 文件

Jenkins role strategy plugin and restrict user to build if not in proper group -- Jenkins file

我们有两个环境,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"}
        } 
      }                     
    }
  }

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

P.S。这方面的文档不是很好,也无法在网上找到更多示例。

您可以使用不同的方法来防止未经授权的用户使用不相关的参数(在本例中为开发环境)启动构建,而不是在开始后阻止(或失败)执行。
为此,您可以使用 Extended Choice Parameter 插件,它使您能够基于 return 值创建一个 select 列表值(多个或单个 select) 26=]脚本。
然后你可以使用下面的脚本:

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