1. 变量的高级用法

1.1 环境变量的优先级

变量的优先级顺序(从最高到最低):

  1. 触发变量或计划的管道变量
  2. 项目级变量
  3. 组级变量
  4. YAML 中定义的作业级变量
  5. YAML 中定义的全局变量
  6. 预定义的环境变量

//定义全局和作业变量

  1. variables:
  2. CI_REGISTRY: harbor1.xiodi.cn
  3. test_variable:
  4. stage: test
  5. tags:
  6. - host20133-docker
  7. variables:
  8. CI_REGISTRY: harbor2.xiodi.cn
  9. script:
  10. - echo $CI_REGISTRY

//再分别创建组级变量、项目级变量,计划的管道变量进行测试

1.2 受保护和隐藏变量

  • 受保护:该变量只能运用于受保护的分支或tag
  • 隐藏:可以在作业日志中隐藏该值,但必须符合一定的正则表达式要求

隐藏必须符合的正则表达式规则:

  • 必须在一行
  • 只能包含 Base64字母(RFC4648)中的字符
  • 在 GitLab 12.2 以上的版本, @: 也是有效的值
  • 必须至少包含8个字符
  • 不能使用变量

[info] Base64 参考:https://zh.wikipedia.org/wiki/Base64 ,其实就是 A-Z,a-z,0-9,另外两个两个字符根据操作系统的不同而不同。

(1) 受保护

5.3 变量的高级使用 - 图1

  1. test_variable:
  2. stage: test
  3. tags:
  4. - host20133-docker
  5. script:
  6. - echo $PROJECT_TEST

(2) 隐藏

5.3 变量的高级使用 - 图2

  1. test_variable:
  2. stage: test
  3. tags:
  4. - host20133-docker
  5. script:
  6. - echo $HARBOR_PW

1.3 环境变量表达式

在 .gitlab-ci.yml 中,可以将变量表达式与策略一起使用。通过这种方法,可以将代码推送到 GitLab 之后限制将在管道中创建哪些作业。

  1. variables:
  2. RELEASE: staging
  3. test:
  4. tags:
  5. - host20133-docker
  6. script:
  7. - echo "project deploy"
  8. only:
  9. variables:
  10. - $RELEASE == "project"
  11. deploy:
  12. tags:
  13. - host20133-docker
  14. script: echo "staging deploy"
  15. only:
  16. variables:
  17. - $RELEASE

(1)支持的语法

使用字符串进行相等匹配

  1. $VARIABLE == "some value"
  2. $VARIABLE != "some value" //在GitLab 11.11中引入
  3. "some value" == $VARIABLE //这种写法也是正确的

检查未定义的值

  1. $VARIABLE == null
  2. $VARIABLE != null //在GitLab 11.11中引入

检查空变量

  1. $VARIABLE == ""
  2. $VARIABLE != "" //在GitLab 11.11中引入

[info]检查空变量,指的是,已经定义该变量,但是值为空。

比较两个变量

  1. $VARIABLE_1 == $VARIABLE_2
  2. $VARIABLE_1 != $VARIABLE_2 //在GitLab 11.11中引入

可变状态检查

  1. $STAGING //直接使用变量名作为表达式

[info] 可变状态检查,如果变量值包含空格字符,它不是空变量。

模式匹配

  1. $VARIABLE =~ /^content.*/
  2. $VARIABLE_1 !~ /^content.*/ //在GitLab 11.11中引入,未找到匹配项,则为真

运算符,GitLab 12.0引入

  1. $VARIABLE1 =~ /^content.*/ && $VARIABLE2 == "something"
  2. $VARIABLE1 =~ /^content.*/ && $VARIABLE2 =~ /thing$/ && $VARIABLE3
  3. $VARIABLE1 =~ /^content.*/ || $VARIABLE2 =~ /thing$/ && $VARIABLE3

运算符优先级遵循 Ruby 2.5:https://ruby-doc.org/core-2.5.0/doc/syntax/precedence_rdoc.html