GitLab 变量的介绍与使用

小丫11个月前技术文章774

环境变量是一个动态命名的值,它可以影响正在运行的进程在操作系统上的行为方式。

一、环境变量分类

在 GitLab CI/CD 中,环境变量分为两部分:

  • 预定义环境变量

  • 自定义环境变量

1.1 预定义环境变量

GitLab CI/CD 具有一组默认的环境变量,您可以不需要任何定义,就可直接使用,比如问题编号,用户名,分支名称,管道和提交ID等。

预定义变量参考:https://docs.gitlab.com/12.10/ee/ci/variables/predefined_variables.html

1.2 自定义环境变量

在 GitLab 11.11 中引入

GitLab 支持两种类型的变量:

  • 变量类型

  • 文件类型

二、变量使用

2.1 使用预定义的环境变量

//示例

stages:
  - dump
  - build
  - deploy

tools:dump:
  stage: dump
  script:
    - echo $CI_BUILD_TAG 
    - echo $CI_BUILD_REF_NAME 
    - echo $CI_BUILD_NAME 
    - echo $CI_BUILD_TRIGGERED

2.2 创建一个自定义环境变量

创建自定义环境变量有两种方式:

  • .gitlab-ci.yml

  • gitlab UI 页面

    • 项目变量

    • 组变量

(1)通过 UI 定义

组变量:  组页面 -> 设置 -> CI/CD -> 变量


项目变量:设置 -> CI/CD -> 变量

(2) .gitlab-ci.yml 中定义


在 .gitlab-ci.yml 中定义变量,可以在两个地方,全局和job中


variables:
  TEST: "HELLO WORLD"
job1:
  variables:
    TEST2: "HELLO WORLD2"


2.3 变量使用示例


//gitlab-ci.yml


variables:
  MAVEN_REPOS: maven-repos-volume
  PROJECT_NAME:service_web 
  PROJECT_GROUP_NAME: wms
  WAR_PATH: web-server 
  PROJECT_TARGET: $PROJECT_NAME-target-$CI_COMMIT_REF_NAME-$CI_PIPELINE_ID #runner服务器存放打包后代码路径变量定义
  ALI_DOCKER_IMAGE_TAG: $ALI_REGISTRY/xteapp-$PROJECT_GROUP_NAME- $PROJECT_NAME:$CI_BUILD_REF_NAME #build镜像标签名称

stages:
  - dump
  - build
  - deploy

tools:dump:
  stage: dump
  script:
    - echo $CI_BUILD_TAG 
    - echo $CI_BUILD_REF_NAME 
    - echo $CI_BUILD_NAME 
    - echo $CI_BUILD_TRIGGERED 
    - echo $REGISTRY
    - echo $PROJECT_TARGET

三、变量的高级用法

3.1 环境变量的优先级

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

  1. 触发变量或计划的管道变量

  2. 项目级变量

  3. 组级变量

  4. YAML 中定义的作业级变量

  5. YAML 中定义的全局变量

  6. 预定义的环境变量

//定义全局和作业变量

variables:
  CI_REGISTRY: harbor1.xiodi.cn

test_variable:
  stage: test
  tags:
    - host20133-docker
  variables:
    CI_REGISTRY: harbor2.xiodi.cn
  script:
    - echo $CI_REGISTRY

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

3.2 受保护和隐藏变量

  • 受保护:该变量只能运用于受保护的分支或tag

  • 隐藏:可以在作业日志中隐藏该值,但必须符合一定的正则表达式要求

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

  • 必须在一行

  • 只能包含 Base64字母(RFC4648)中的字符

  • 在 GitLab 12.2 以上的版本, @: 也是有效的值

  • 必须至少包含8个字符

  • 不能使用变量

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

(1) 受保护
test_variable:
  stage: test
  tags:
    - host20133-docker
  script:
    - echo $PROJECT_TEST
(2) 隐藏
test_variable:
  stage: test
  tags:
    - host20133-docker
  script:
    - echo $HARBOR_PW

3.3 环境变量表达式

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

variables:
  RELEASE: staging

test:
  tags:
    - host20133-docker
  script:
    - echo "project deploy"
  only:
    variables:
      - $RELEASE == "project"

deploy:
  tags:
    - host20133-docker
  script: echo "staging deploy"
  only:
    variables:
      - $RELEASE
(1)支持的语法

使用字符串进行相等匹配

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

检查未定义的值

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

检查空变量

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

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

比较两个变量

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

可变状态检查

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

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

模式匹配

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

运算符,GitLab 12.0引入

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

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


相关文章

Ranger中Solr审计日志配置修改

Ranger中Solr审计日志配置修改

1、获取solr 中的rangeraudits的配置#查看其中的配置及 solrctl instancedir --list#获取配置 solrctl instancedir --get rang...

Hudi集成Spark

Hudi集成Spark

环境准备安装Spark1)Hudi支持的Spark版本HudiSupported Spark 3 version0.12.x3.3.x,3.2.x,3.1.x0.11.x3.2.x(default b...

大数据集群二次开发及调优使用指导(一)-HDFS

1.   典型业务调优涉及HDFS的相关业务一般可以分为IO密集型业务,计算密集型业务,低延迟业务,高吞吐量业务1.1     低延迟业务计...

impala:大数据交互查询

impala:大数据交互查询

一、简介        Cloudera公司推出,提供对HDFS、HBase数据的高性能、低延迟的交互式SQL查询功能。基于Hive,使用与Apache Hive相同的元数据,使用内存计算,兼顾数据仓...

大数据基础之HDFS入门

大数据基础之HDFS入门

一、NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。二、NameNode的工作特点Namenode始终在内存中保存meteda...

k8s删除Terminating状态的命名空间

问题描述Kubernetes中namespace有两种常见的状态,即Active和Terminating状态,其中Terminating状态一般会比较少见,当对应的命名空间下还存在运行的资源,但该命名...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。