Jenkins可扩展选择,包含基于用户的用户特定项目角色

时间:2016-02-10 09:43:34

标签: jenkins

我有一种情况,我想在Jenkins参数化构建中更改选项参数的内容。

在我的情况下,我想要一个项目来部署应用程序'Deploy My App'。在构建此项目时,将向用户显示一个选项参数。我想根据用户角色更改此列表的内容。即具有'dev_deploy'角色的人将能够看到开发环境,具有'test_deploy'角色的人将能够看到测试环境等。

我目前正在使用可扩展选择参数插件和基于角色的授权策略插件。

我知道我可以编写一些有问题的脚本来生成选择的列表项。

def result = ["-------"]

def roles=??????

if(roles.get('dev_deploy') {
    //Add dev environments
    result.add('dev1')
    ....
}
if(roles.get('test_deploy') {
    //Add test environments
    result.add('test1')
    ....
}

return result

我无法弄清楚谁能掌握用户角色?

任何人都知道如何做到这一点,或者对问题有不同的解决方案?

非常感谢

3 个答案:

答案 0 :(得分:2)

好的,经过几次搜索后,我遇到了来源(https://github.com/jenkinsci/role-strategy-plugin/tree/master/src/main/java/com/michelin/cio/hudson/plugins/rolestrategy

经过进一步的阅读和一些游戏后,我想出了这个......

import com.michelin.cio.hudson.plugins.rolestrategy.*

def result = ["-- Please Select --"]
def authStrategy = jenkins.model.Jenkins.instance.getAuthorizationStrategy()

if(authStrategy instanceof RoleBasedAuthorizationStrategy){
    def currentUser = jenkins.model.Jenkins.instance.getAuthentication().getName();
    def roleMap= authStrategy.roleMaps.get("globalRoles")

    def sids= roleMap.getSidsForRole("Manage_Dev")
    if(sids != null && sids.contains(currentUser)) {
        result.add("dev1")
        ...
    }

    sids= roleMap.getSidsForRole("Manage_Test")
    if(sids != null && sids.contains(currentUser)) {
        result.add("tst1")
        ...
    }
    ...
}

return result

哪个适合我。当你知道怎么做时很容易!

答案 1 :(得分:1)

我遇到了可以帮助我克服相同问题的代码。我通过使用 Active Choice 插件和 Jenkins 用户角色改进了选择。管理员会有不同的下拉选项,测试人员会有不同的下拉选项。

https://kinoshita.eti.br/2016/04/24/using-active-choices-with-role-strategy-plugin.html

import hudson.model.User
import hudson.model.Hudson
import hudson.security.AuthorizationStrategy
import hudson.security.Permission
import com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy
import com.michelin.cio.hudson.plugins.rolestrategy.RoleMap

AuthorizationStrategy strategy = Hudson.getInstance().getAuthorizationStrategy();

jobs = []
user = User.current()
userId = user.getId()

if (strategy != null && strategy instanceof com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy) {
    roleStrategy = (RoleBasedAuthorizationStrategy) strategy;
    // not very straightforward to get the groups for a given user
    roles = roleStrategy.getGrantedRoles("globalRoles")
    for (entry in roles) {
        role = entry.key
        users = entry.value
        if (role.getName().equals("tester")) {
            if (userId in users) {
                jobs = ["PROJECT_FOR_TESTERS1", "PROJECT_FOR_TESTERS2"]
                break
            }
        } else if (role.getName().equals("admin")) {
            if (userId in users) {
                jobs = ["PROJECT_FOR_ADMINS1", "PROJECT_FOR_ADMINS2"]
                break
            }
        }
    }
}

return jobs

答案 2 :(得分:0)

我不得不对接受的答案稍作调整才能使其正常工作。 见Cannot invoke method getSidsForRole() on null object

import com.michelin.cio.hudson.plugins.rolestrategy.*

        def result = ['-- Please Select --']
        def authStrategy = jenkins.model.Jenkins.instance.getAuthorizationStrategy()

        if(authStrategy instanceof RoleBasedAuthorizationStrategy){
        def currentUser = jenkins.model.Jenkins.instance.getAuthentication().getName();
        def roleMap = authStrategy.getRoleMap(com.synopsys.arc.jenkins.plugins.rolestrategy.RoleType.Global)

        def sids = roleMap.getSidsForRole("develop")
        if(sids != null && sids.contains(currentUser)) {
            result.add('staging')
        }

        sids = roleMap.getSidsForRole("admin")
        if(sids != null && sids.contains(currentUser)) {
            result.add('prod')
        }
      }

      return result