如何限制开发人员的cd权限

gitlab版本号是14.0.4

由于生产环境主机过多,怕开发误操作

希望开发完成ci,由运维来写cd,开发只能调用cd脚本并查看记录,不能修改

现在的思路是开发人员有自己的gitlab runner
单独建一个cd工程,此工程有自己的gitlab runner,只限本工程调用

开发的工程去调用cd工程的发布代码,遇到以下问题:

1.使用include调用cd工程的yml文件
会提示没有 gitlab runner的权限

2.使用trigger调用
也会提示没有 gitlab runner的权限

3.使用curl调用cd工程的api
可以执行成功,但是如果此仓库中多个yml脚本,我只想执行其中一个
curl是没有办法覆盖CI_CONFIG_PATH变量的
代码会写的有一些冗余

你这里所说的gitlab runner 没有权限应该是执行cd的这个人没有权限吧。
如果你要使用include去调用其它仓库的yml文件,那执行pipeline的人至少需要有cd 文件仓库的可读权限。
建议你可以给对应的开发人员cd文件所在仓库的reporter权限,这样他们就能够读取,但是不能修改了。

这里并不是开发人员没有cd文件仓库的可读权限

而是cd仓库绑定了一个gitlab runner,这个runner权限过大,所以只允许cd仓库使用,不允许开发人员随意使用

include的时候,就会提示人员没有runner的权限,pipeline就卡死了

准确地说,cd仓库的yml和关联的高权限runner,只想让开发间接调用,不允许直接修改或直接应用

我梳理一下哈,你的意思是,你们有一个专门存放cd文件的项目,并且在这个项目中注册了一个这个项目专属的runner。
然后在其它项目中通过include调用cd项目中的yml文件,此时执行pipeline的开发人员拥有cd项目的可读权限,但是在执行pipeline时会报错开发人员没有runner的权限。
是我理解的意思吗?

是的~~~~~~~~~~~~

你好,在我理解起来,你这种方式是无法实现的!

因为include其实就是相当于把某一个yml文件的内容添加到当前仓库的.gitlab-ci.yml中。此时相当于你在开发的项目中调用另一个项目专有的runner,此时肯定是调用不到的,因为这个runner只有在它注册的专有项目中可用。

如果你只是想让开发人员无法篡改cd job的脚本配置的话,你完全可以使用一个实例级别的共享的runner就行了。这样就能够正常被调用。

如果使用实例级别的共享的runner,开发人员可以自己写yml直接调用这个runner,有一定的安全风险

或者换一个思路,使用curl调用pipeline
这边就有一个问题

cd工程中就会有成百上千个对的发布yml
比如
project-A.yml
project-B.yml

使用curl命令传入参数时,有办法使用参数快速指定使用哪个yml吗?
我自己测试了CI_CONFIG_PATH,是不起作用的

我的理解是,你这个地方可以直接用变量的方式把需要使用的yml文件名传递进去。可以在.gitlab-ci.yml里定义,也可以在runner的设置里定义对应的变量。

我测试了,14.0.4好像不支持include直接使用变量,后续版本可以了?

是的,14.2版本引入了项目变量、群组变量和实例变量。因此使用14.2及之后版本就可以支持。你可以直接查看对应版本的文档就能看到这部分的内容。

我试了使用 Multi-project pipelines,可以解决你的问题,你cd项目中的cd job设置合适的环境变量,通过不同的项目去触发,应该就可以发布不同的项目了。

1 个赞

跟我前面提到的使用trigger调用有什么区别?

我这边也测试了trigger,会有一个问题
如果在cd工程中不指定runner,就会使用开发自己的runner
如果在cd工程中指定了cd工程自己的runner,就会提示runner没有权限

使用trigger有两种方式,一种叫做父子流水线,应该就是你之前用的;一种就是我上面说的多项目流水线,写法类似于:

trigger-downstream:
  variables:
    ENVIRONMENT: something
  trigger: my/project

这种方式本质上是去触发另一个项目,让流水线在另一个项目中执行。比如说你这里触发的cd文件所在的项目,在这个项目中执行自己的pipeline并使用自己的专属runner,就不存在权限问题。
我自己实测过是可以正常运行的。
你可以再研究一下环境变量怎么关联,实现不同项目的发布。

1 个赞

测试了一下,确实可以,没有多大问题了

另外低版本gitlab不支持include变量的功能,有一种变相的方式可以实现
相当于动态生成gitab-ci.yml文件
参考文档

1 个赞