规则参数的模式匹配 Gitlab CI

Tri*_*cky 8 regex gitlab-ci

我正在尝试利用规则:参数使作业仅在指定用户进行推送时出现在管道中。我不想为每个作业定义用户列表,因此我有以下全局变量:

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)

该解决方案有两个缺点:

  1. 所有人可见的特权用户列表,这些用户对项目具有读取权限

  2. 模式长度限制(未测试)

但目前我还没有看到其他解决方案如何完全不运行该作业。


Man*_*uel 0

文档显示内容匹配正则表达式应如下所示

$VARIABLE =~ /^content.*/

对于您的代码,您需要添加^.*

rules:
 - if '$USER_LIST =~ /^user1.*/'
    when: on_success
 - when: never
Run Code Online (Sandbox Code Playgroud)