我正在尝试利用规则:参数使作业仅在指定用户进行推送时出现在管道中。我不想为每个作业定义用户列表,因此我有以下全局变量:
variables:
USER_LIST: "user1 user2 user3"
Run Code Online (Sandbox Code Playgroud)
在工作中,我有以下几点:
rules:
- if '$USER_LIST =~ /$GITLAB_USER_LOGIN/'
when: on_success
- when: never
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,因为我怀疑正在使用的正则表达式模式没有被变量替换,并用作$GITLAB_USER_LOGIN搜索字符串。如果我使用显式搜索:
rules:
- if '$USER_LIST =~ /user1/'
when: on_success
- when: never
Run Code Online (Sandbox Code Playgroud)
那么模式就匹配得很好了。
注意:我知道这GITLAB_USER_LOGIN是一个受保护的变量。我也遇到同样的问题GITLAB_USER_EMAIL。
所以问题是,如何将 GITLAB 预定义变量放入将用于模式匹配的字符串中?
小智 6
由于某些(gitlab)原因,我们不能在模式内使用变量。但是我们可以在规则中交换特权用户和当前用户的列表。只需将用户列表转换为正则表达式模式:
.job:
variables:
PRIVILEGED_USERS_PATTERN: '/user1|user2|userN/i'
rules:
- if: $GITLAB_USER_LOGIN =~ $PRIVILEGED_USERS_PATTERN
when: manual
Run Code Online (Sandbox Code Playgroud)
该解决方案有两个缺点:
所有人可见的特权用户列表,这些用户对项目具有读取权限
模式长度限制(未测试)
但目前我还没有看到其他解决方案如何完全不运行该作业。
文档显示内容匹配正则表达式应如下所示:
$VARIABLE =~ /^content.*/
对于您的代码,您需要添加^和.*:
rules:
- if '$USER_LIST =~ /^user1.*/'
when: on_success
- when: never
Run Code Online (Sandbox Code Playgroud)