我们有两个环境,qa和dev,它被配置为Jenkinsfile中的参数。插件基于角色的授权策略被启用,并且有两组用户,qa和dev (与环境相同)。这里的问题是,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"}
}
}
}
}
一个例子是不真实的,也许不起作用,但我希望能理解我想要实现的目标。
这方面的文档不是很好,在网上也找不到更多的例子。
发布于 2021-07-28 09:08:21
与其在启动后阻止(或失败)执行,不如使用不同的方法,防止未经授权的用户使用不相关的参数(在本例中为dev环境)启动构建。
为此,您可以使用扩展选择参数插件,它使您能够基于groovy脚本的返回值创建一个select列表值(多个或单个select)。
然后可以使用以下脚本:
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') {
....
}
}
}
更新:如果您正在使用基于角色的授权策略,并且希望对角色使用上述解决方案,而不是使用组,则可以使用以下代码(基于参数中的这个剧本 ):
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
https://stackoverflow.com/questions/68555998
复制相似问题