极狐GitLab CI/CD 变量黑魔法之自定义变量

news2024/12/26 11:12:56

极狐GitLab CI/CD 变量是指一系列的环境变量,用来帮助我们控制 CI/CD Job 或 Pipeline 的行为,存储一些可以复用的信息,避免在 .gitlab-ci.yml 中形成硬编码。

极狐GitLab CI/CD 变量分为预定义变量(predefined CI/CD variables) 和 自定义变量(custom variable) 两部分。今天我们来学习自定义变量这部分。

自定义变量


自定义变量,顾名思义就是需要用户自己定义,先定义,后使用的环境变量。

自定义环境变量有三个级别:

  • 极狐GitLab 实例级别(这个需要有管理员权限才能使用)

  • 群组(Group)级别

  • 仓库(Project)级别

不同级别的环境变量限制了其使用生效范围,实例级别的环境变量对整个实例下面的所有仓库都有效,群组级别的对整个群组下面的仓库有效,仓库级别的只对此仓库有效。常用的是群组级别和仓库级别的。下面分别介绍并进行演示。

群组(Group)级别


首先,创建一个群组(Group)级别的环境变量:Group --> Settings --> CI/CD --> Variables --> Add variable,写入对应的 key 和 value 即可,如下图

图片

上述操作创建了一个 key 为 GROUP_VARS,value 为 JiHu-GitLab 的群组(Group)级别的环境变量。

在当前群组(Group)的任意一个仓库(Project)下面用极狐GitLab CI 功能测试一下,将下述内容写入 .gitlab-ci.yml 文件

image: busybox:latest

stages:          
  - test

build:
  stage: test
  script:
    - echo "Group Variable is GROUP_VARS and value is $GROUP_VARS"

触发 CI/CD Pipeline 之后,查看构建结果

图片

可以看到 GROUP_VARS 在群组(Group)的 CI/CD 环境变量中定义了,所以会输出正常的值,如果环境变量没有定义,会出现什么结果呢?

将下述内容写入 .gitlab-ci.yml 文件

image: busybox:latest

stages:          
  - test

build:
  stage: test
  script:
    - echo "Group Variable is GROUP_VARS and value is $GROUP_VARS"
    - echo "Group Variable is NON_GROUP_VARS and value is $NON_GROUP_VARS"

其中 GROUP_VARS 是提前定义了的环境变量,而 NON_GROUP_VARS 是没有经过定义的环境变量。

触发 CI/CD Pipeline 之后,查看构建结果

图片

可以看到 NON_GROUP_VARS 没有提前定义,而且也不是预定义变量,所以值为空。

上述 Demo 是在定义群组(Group)环境变量的群组(Group)内的任意仓库中实现的.说明群组(Group)级别的自定义环境变量对当前群组下面的所有仓库(Project)均有效。

仓库(Project)级别


仓库(Project)级别的环境变量有三种创建方式

  • 通过仓库(Project)内的 .gitlab-ci.yml 文件

  • 通过仓库(Project)的 Settings,这个和群组(Group)的创建类似

  • 通过 API 来创建

下面分别展示三种情况下的自定义环境变量的定义和使用。

使用 .gitlab-ci.yml 创建

在 .gitlab-ci.yml 文件中使用自定义变量,需要通过关键字 variables 先定义环境变量。variables 关键字可以出现在 .gitlab-ci.yml 文件内容的最顶端,这种情况下,自定义变量对当前整个 Pipeline 全局有效,也即意味着所有 Stage,Job 均可以使用;variables 关键字也可以出现在单个 Job 中,此时,自定义环境变量只对当前 Job 有效。测试如下:

variables:
  PROJECT_TEST_VAR: "project_global_var"

image: busybox:latest

stages:          
  - test
  - test1

job:
  stage: test
  variables:
    JOB_TEST_VAR: "job_test_var"
  script:
    - echo "Global Project Variable is PROJECT_TEST_VAR and value is $PROJECT_TEST_VAR"
    - echo "Job Variable is JOB_TEST_VAR and value is $JOB_TEST_VAR"

job1:
  stage: test
  script:
    - echo "Global Project Variable is PROJECT_TEST_VAR and value is $PROJECT_TEST_VAR"
    - echo "Job Variable is JOB_TEST_VAR and value is $JOB_TEST_VAR"

上述代码定义了一个全局的自定义环境变量:PROJECT_TEST_VAR,值为 project_global_var;定义了一个 Job 级别的环境变量:JOB_TEST_VAR,值为 job_test_var。job 的输出如下

图片

可以看到:全局环境变量 PROJECT_TEST_VAR 在 job 中可见可用;job 级别的环境变量 JOB_TEST_VAR 仅在 job 中可见可用,因为是在 job 中定义的。

job1 的输出如下

图片

可以看到:全局环境变量 PROJECT_TEST_VAR 在 job1 中可见可用,job 级别的环境变量 JOB_TEST_VAR 在 job1 中不可见不可用,因为是在 job 中定义的,生效范围仅仅是 job 级别的。

结论:全局的环境变量对于所有 job 可见可用,但是 job 级别的环境变量只对当前 job 可用可见,在其他 job 是不可见不可用的。

通过仓库的 Settings 创建

这一点和前面群组(Group)的使用一样,先创建变量:Project --> Settings --> CI/CD --> Variables --> Add Variable,添加 key 为 PROJECT_VARS,value 为 JiHu-GitLab-Project 的环境变量。使用下述代码进行测试:

image: busybox:latest

stages:          
  - test

job:
  stage: test
  variables:
    JOB_TEST_VAR: "job_test_var"
  script:
    - echo "Project Variable is PROJECT_VARS and value is $PROJECT_VARS"

job1:
  stage: test
  script:
    - echo "Project Variable is PROJECT_VARS and value is $PROJECT_VARS"

查看构建结果

图片

可以看到两个 job 的输出结果是一样。

结论:通过仓库(Project) Settings 创建的环境变量对当前仓库(Project)中所有 Pipeline 所包含的 job 均可见可用。

通过 API 创建

极狐GitLab 提供丰富的 API 用来对环境变量的增、删、改、查进行操作。创建变量的 API 方法如下:

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.cn/api/v4/projects/1/variables" --form "key=NEW_VARIABLE" --form "value=new value"

指定极狐GitLab token 及极狐GitLab 地址:https://gitlab.cn,然后将需要创建的变量以 --form 的形式传入,执行上述命令后,得到如下返回信息

{
  "variable_type":"env_var",
  "key":"xiaomage",
  "value":"Evangelist",
  "protected":false,
  "masked":false,
  "environment_scope":"*"
}

上述信息表明 key 为 xiaomage,value 为 Evangelist 的变量已经创建成功。可以用下面的 API 继续查看当前仓库(Project)里面的现有环境变量

[
  {
    "variable_type":"env_var",
    "key":"PROJECT_VARS",
    "value":"JiHu-GitLab-Project",
    "protected":false,
    "masked":false,
    "environment_scope":"*"
  },
  {
    "variable_type":"env_var",
    "key":"xiaomage",
    "value":"Evangelist",
    "protected":false,
    "masked":false,
    "environment_scope":"*"
  }
]

可以看到当前仓库(Project)有两个变量 PROJECT_VARS、xiaomage。其中 PROJECT_VARS 是通过仓库(Project)Settings 创建的。而 xiaomage 就是用上述 API 创建的。

在仓库(Project)的 CI/CD Variables 下面也可以看到名为 xiaomage 的变量。

图片

大招时刻


相信大家也看到了,极狐GitLab 的环境变量定义手段非常丰富,当然使用也就非常灵活了。下面讲几种大家关心而且常用的环境变量使用小魔法。

变量的覆盖(Override)

自定义的变量是可以在 Pipeline 运行的时候被覆盖的,诸如上述名为 xiaomage,值为 Evangelist 的环境变量。可以在手动运行 Pipeline 的时候覆盖其原来的值。

方法为:Project --> Pipelines --> Run Pipeline,在出现的界面中,修改环境变量的值

图片

然后点击 Run Pipeline,查看构建结果

图片

可以看到值已经从 Evangelist 变成了 JiHu-Evangelist 了 。

变量的遮掩(Mask)

经过遮掩(Mask)的变量,其值在 Pipeline logs 中是不会显示的,这种方法对于将敏感信息存储为环境变量的场景比较常用。如果敏感信息在 Pipeline log 中输出,很容易造成敏感信息的泄漏。

遮掩(Mask)一个变量的方法很简单:仓库(Project) --> CI/CD --> Variables --> Add variable,在出现的选项中勾选 Mask variable

图片

在 Pipeline 的构建 log 中,可以看到值显示 MASKED,而不是真实的值。

图片

变量的传递

DevOps Pipeline 中经常遇到的一个问题就是,变量在不同 Job 间的传递。其实上面极狐GitLab CI/CD 变量的不同定义方法就能满足变量在不同 Job 间的使用。但是极狐GitLab 还有一种能够完成环境变量在不同 Job 间的传递。使用方法如下:

  • 在前面的 Job 中,将环境变量存储在 .env 文件中

  • 用 artifacts:reports:dotenv 关键字将 .env 文件标记为制品

  • 在后续的 Job 中使用关键字 dependencies 或 needs 来使用传递过来的环境变量。

测试代码如下

image: busybox:latest

stages:          
  - build
  - deploy

build:
  stage: build
  script:
    - echo "NAME=xiaomage" >> build.env
    - echo "TITLE=JiHu-Evangelist" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  script:
    - echo "$NAME"  
    - echo "$TITLE"  
  dependencies:

可以查看构建结果

图片

当然,也可以用使用 needs 关键字来完成变量的传递

image: busybox:latest

stages:          
  - build
  - deploy

build:
  stage: build
  script:
    - echo "NAME=xiaomage" >> build.env
    - echo "TITLE=JiHu-Evangelist" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  script:
    - echo "$NAME"  
    - echo "$TITLE"  
  needs:
    - job: build
      artifacts: true

构建结果是一样的

图片

写在最后


极狐GitLab CI/CD 中对于环境变量的定义、使用都是非常灵活的,功能非常强大,而且每个迭代的版本都有新功能推出。能满足多种场景下的 CI/CD Pipeline 构建。欢迎大家体验、使用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图论-并查集

并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图,求最小生成树Kruskal算法和最近公共祖先(LCA)等. 并查集的基本操作主要有: .1.初始化 2.查询find 3.合并union 一般我们都会采用路径压缩 这样…

flex布局,换行的元素上下设置间距

要生成的效果图如下&#xff1a; display:flexflex-direction: row;flex-wrap: wrap;当我们使用弹性盒子布局后&#xff0c;默认元素是没有外边距的&#xff0c;紧挨着样式就有点丑&#xff0c;如果想使换行后&#xff0c;元素的外边距有个距离&#xff0c;可以用如下方法解决…

Apache Flink(十二):Flink集群部署-Flink On Yarn

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

Python学习笔记(四):函数的定义、函数的返回值、None类型、函数说明文档、函数的嵌套调用、局部变量、全局变量、global关键字

目录 一、函数介绍 1. 函数是&#xff1a; 2. 使用函数的好处是&#xff1a; 二、函数的定义&#xff1a; 三、函数的参数 1.传入参数的功能是&#xff1a; 2.函数的传入参数 - 传参定义 3.注意事项&#xff1a; 4.练习&#xff1a;测量体温 四、函数的返回值 1.函数…

Axure元件基本介绍进阶

Axure元件基本介绍进阶 1.Axure元件基本介绍1.在 Axure 中&#xff0c;元件是构建原型的基本构成单元&#xff0c;能够帮助设计师快速创建、重复使用和管理设计元素。以下是 Axure 中元件的基本介绍&#xff1a;1.基本元件&#xff1a; 2.基本元件的使用一.【举例说明】积木&am…

基于 Game Object Conversion 和 SubScene 的 DOTS 开发工作流(干货满满!)

(译前言: Unity DOTS提出了一套全新的开发技术栈, 但目前少有精讲如何结合现有工作流进行开发的资料, 外网 这篇文章 (Game Object Conversion and SubScene) 详细解构了基于 GameObject 和 Subscene 的工作流程和原理, 要求读者对 DOTS/ECS 有基本的了解, 虽然非常之长, 但值得…

8 Buildroot 根文件系统构建

一、根文件系统简介 根文件系统一般也叫做 rootfs&#xff0c;这个是属于 Linux 内核的一部分。 根文件系统首先是一种文件系统&#xff0c;该文件系统不仅具有普通文件系统的存储数据文件的功能&#xff0c;但是相对于普通的文件系统&#xff0c;它的特殊之处在于&#xff0c;…

flutter的ListView和SingleChildScrollView有什么区别?他们的使用场景有什么不一样?

文章目录 简介ListViewSingleChildScrollView使用场景的不同 简介 ListView和SingleChildScrollView都是在Flutter中用于处理滚动内容的组件&#xff0c;但它们有一些关键的区别。 ListView 多个子元素&#xff1a; ListView是一个滚动的可滚动组件&#xff0c;通常用于包含多…

看图识药,python开发实现基于VisionTransformer的119种中草药图像识别系统

中药药材图像识别相关的实践在前面的系列博文中已经有了相应的实践了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff0c;每篇文章的侧重点不同&#xff1a; 《python基于轻量级GhostNet模型开发构建23种常见中草药图像识别系统》 《基于轻量级MnasNet模型开发构建40种常…

HTML中常用表单元素使用(详解!)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中常用表单元素使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留言 …

云基础软件深化合作,云轴科技ZStack与麒麟软件战略签约

12月8日&#xff0c;云轴科技ZStack与麒麟软件战略合作签约仪式在北京举行&#xff0c;双方对过往紧密合作表达了充分肯定&#xff0c;并就进一步联合技术创新、打造重点行业标杆和持续赋能客户达成高度共识。云轴科技创始人&CEO张鑫和麒麟软件高级副总经理谢文征共同见证双…

112. 路径总和(Java)

目录 解法&#xff1a; 官方解法&#xff1a; 方法一&#xff1a;广度优先搜索 思路及算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 方法二&#xff1a;递归 思路及算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给你二叉树的…

【毕业设计】基于STM32的解魔方机器人

1、方案设计 1.采用舵机作为魔方机器人的驱动电机&#xff0c;从舵机的驱动原理可知&#xff1a;舵机运行的速度和控制器的主频没有关系&#xff0c;所以采用单片机和采用更高主频的嵌入式处理器相比在控制效果上没有什么差别。单片机编程过程简单&#xff0c;非常容易上手&am…

c#_sqlserver_三层架构winform学生信息管理及选课系统

基本功能包括管理员登录、注册学生账号、删除学生信息、查找学生信息、发布课程、修改课程、删除课程等。 教师端 登录&#xff1a;管理员登陆&#xff0c;拥有相应账号即可登录&#xff08;后台注册&#xff09;。注册学生账号&#xff1a;管理员可给学生分配学号&#xff0…

Linux Mint编译安装Qemu

文章目录 前言1. 准备Qemu源码包2. 编译安装2.1 首次尝试编译2.2 安装python3-venv2.3 安装sphinx2.4 安装sphinx-rtd-theme2.4 安装ninja2.6 安装编译器 3. 重新编译并安装4. 进行固件仿真4.1 准备固件4.2 Binwalk解析文件4.3 看一下文件结构4.4 安装sasquatch4.5 重新解析文件…

OkHttp: 拦截器和事件监听器

文章目录 1. 拦截器1. 拦截器链2. 实际案例1. 注册为应用拦截器2. 注册为网络拦截器 3. 如何选择用哪种拦截器1. 应用拦截器2. 网络层拦截器3. 重写请求4. 重写响应 4. 可用性 2. 事件监听器1. 请求的生命周期2. EventListener使用案例3. EventListener.Factory4. 调用失败的请…

一、Oracle学习笔记

1.1.1实例的概念实例是一组内存结构和后台进程的集合。oracle适用于大型的应用系统1.1.2实例的构成1.实例中的这部分内存结构叫做系统全局区&#xff08;SGA&#xff09;:存储数据库中的数据、存储数据字典的信息、重做日志、经过解析的SQL代码等一个实例只有一个SGA&#xff1…

QT作业4

实现一个闹钟&#xff0c;当输入时间后&#xff0c;点击启动到达时间后循环播报三遍&#xff0c;便签内容 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTextToSpeech> //文本转语言类 #include <QTimerEvent> //定…

EasyV易知微助力智慧城市未来趋势发展——数字孪生城市

“智慧城市的未来趋势就是数字孪生”——《基于数字孪生的智慧城市》 城市数字化管理、智慧城市和数字孪生城市的发展是相互促进、逐步深化的过程。 城市数字化管理作为起点&#xff0c;奠定了信息化、数据化的基础&#xff1b;而智慧城市则将数字城市管理进一步升级&#xff…

什么是防抖与节流?应用场景举例

防抖节流如何处理防抖与节流 防抖节流防抖例子节流例子Vue Axios全局接口防抖、节流封装实现 小结 防抖 防抖&#xff1a;触发高频事件后n秒内函数只会执行一次&#xff0c;如果n秒内高频事件再次被触发&#xff0c;则重新计算时间 应用场景&#xff1a; 提交按钮、用户注册…