我有一个用于构建工件的 Jenkins 多分支管道,并且有用于master
, *-dev
etc.
我想在每个分支的基础上启用基于项目的安全性,即只允许开发人员运行*-dev
构建的分支作业而不是任何其他作业,因为这样做会产生不良影响。
我知道有基于项目的安全性,但我没有看到每个分支。这存在吗?我们在更新 Jenkins 方面落后了,目前正在运行 Jenkins2.46.1
.
否则我想我可能必须有一个单独的上游作业来调用下游作业的正确分支,并使下游工件作业无法由有权限的开发人员运行。 (这听起来有点矫枉过正)。
或者有什么方法可以在分支的 Jenkinsfile 中完成此操作?
这是一些Jenkinsfile
groovy 会让你接近你想要的:
// return the user id that caused this build; else empty string
@NonCPS
def user_id_cause() {
def CAUSE = currentBuild.rawBuild.getCause(
hudson.model.Cause.UserIdCause.class
);
return CAUSE ? CAUSE.getUserId() : "";
}
// return all groups to which the given user id belongs
@NonCPS
def groups(USER_ID) {
return Jenkins.instance.securityRealm.loadUserByUsername(USER_ID).authorities.collect{ it.toString() };
}
...
env.USER_ID_CAUSE = user_id_cause();
if (!env.BRANCH_NAME.endsWith('-dev')) {
if (env.USER_ID_CAUSE) {
if ('jenkins_admins' in groups(env.USER_ID_CAUSE)) {
echo("INFO: user id `${env.USER_ID_CAUSE}` is in the group `jenkins_admins`.");
} else {
currentBuild.result = 'ABORTED';
error("user id `${env.USER_ID_CAUSE}` is not in the group `jenkins_admins`.");
}
}
}
Caveats:
- 这些技巧在很大程度上依赖于需要 Jenkins 管理员“进程内脚本批准”的 API 函数。
- 上面的例子假设存在
jenkins_admins
特权用户所属的组 --- 您的用户/组的情况可能非常不同。
- 一般来说,处理从 Jenkins API 函数返回的对象应该在
@NonCPS
- 带注释的函数 --- 你有风险java.io.NotSerializableException
否则。
参考:
- https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md
- http://javadoc.jenkins-ci.org/hudson/model/Cause.UserCause.html http://javadoc.jenkins-ci.org/hudson/model/Cause.UserCause.html
- http://javadoc.jenkins-ci.org/hudson/model/Run.html#getCause-java.lang.Class- http://javadoc.jenkins-ci.org/hudson/model/Run.html#getCause-java.lang.Class-
- http://javadoc.jenkins.io/hudson/security/SecurityRealm.html#loadUserByUsername-java.lang.String- http://javadoc.jenkins.io/hudson/security/SecurityRealm.html#loadUserByUsername-java.lang.String-
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)