查看原文
其他

极狐GitLab CI/CD 变量黑魔法你知道多少?(上)

小马哥 极狐GitLab开发者 2022-05-14

小马哥

极狐GitLab DevOps 技术布道师,点击上方关注极狐GitLab 开发者订阅号,获取更多 DevOps 理念与实践。


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


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


极狐GitLab

预定义变量


顾名思义,预定义变量就是极狐GitLab 已经提前定义好,无须声明即可进行全局使用的环境变量。极狐GitLab 有多达 140 个预定义(截止到 14.3-pre 版本)的环境变量,而且是随着版本的迭代在增加的。这儿[1]可以查看所有变量的详细内容。


这些环境变量大体分为四类:


  • 通用类型(占绝大部分)

  • 针对 Merge Request Pipeline 的

  • 针对外部 Pull Request Pipeline 的

  • 针对 Kubernetes 的

下面会挑一些使用频率比较高的进行解析和演示。

commit 相关

变量描述
CI_BUILDS_DIR执行构建时的顶层目录
CI_COMMIT_AUTHORcommit 中的提交者信息,格式为 Name <email>
CI_COMMIT_BRANCHcommit 中的分支信息,在分支流水线中可用,但是在 MR 流水线中不可用
CI_COMMIT_MESSAGE完整的 commit 信息
CI_COMMIT_SHAcommit 的哈希值
CI_COMMIT_SHORT_SHAcommit 的哈希短值(前八个字符)
CI_COMMIT_REF_NAME构建项目的分支或标签
CI_COMMIT_TIMESTAMP以 ISO 8601 的格式输出 commit 的时间戳信息

可以触发一个 Job 直接进行测试,诸如在 .gitlab-ci.yaml 文件中加入下述内容

after_script: - echo "The value of CI_BUILDS_DIR is $CI_BUILDS_DIR" - echo "The value of CI_COMMIT_AUTHOR is $CI_COMMIT_AUTHOR" - echo "The value of CI_COMMIT_BRANCH is $CI_COMMIT_BRANCH" - echo "The value of CI_COMMIT_MESSAGE is $CI_COMMIT_MESSAGE" - echo "The value of CI_COMMIT_SHA is $CI_COMMIT_SHA" - echo "The value of CI_COMMIT_SHORT_SHA is $CI_COMMIT_SHORT_SHA" - echo "The value of CI_COMMIT_REF_NAME is $CI_COMMIT_REF_NAME" - echo "The value of CI_COMMIT_TITLE is $CI_COMMIT_TITLE" - echo "The value of CI_COMMIT_TIMESTAMP is $CI_COMMIT_TIMESTAMP"
可以查看构建结果


Job 相关

变量描述
CI_JOB_IDjob 的 ID,极狐GitLab 实例内唯一
CI_JOB_IMAGEjob 运行时所在的容器镜像名称
CI_JOB_JWT一个 RS256 JSON web token,用来和支持 JWT 的第三方系统做权限验证
CI_JOB_NAMEjob 的名称
CI_JOB_STAGEjob 所在的 stage 名称
CI_JOB_STATUSjob 的执行状态,为 successfailedcanceled
CI_JOB_URLjob 详细信息的 URL
CI_JOB_STARTED_ATjob 的起始 UTC 时间

可以触发一个 Job 直接进行测试,诸如在 .gitlab-ci.yaml 文件中加入下述内容

after_script: - echo "The value of CI_JOB_ID is $CI_JOB_ID" - echo "The value of CI_JOB_IMAGE is $CI_JOB_IMAGE" - echo "The value of CI_JOB_JWT is $CI_JOB_JWT" - echo "The value of CI_JOB_NAME is $CI_JOB_NAME" - echo "The value of CI_JOB_STAGE is $CI_JOB_STAGE" - echo "The value of CI_JOB_STATUS is $CI_JOB_STATUS" - echo "The value of CI_COMMIT_REF_NAME is $CI_COMMIT_REF_NAME" - echo "The value of CI_JOB_URL is $CI_JOB_URL" - echo "The value of CI_JOB_STARTED_AT is $CI_JOB_STARTED_AT"
可以查看构建结果


Pipeline 相关

变量描述
CI_PIPELINE_SOURCE触发 Pipeline 的事件,诸如 pushschedulemerge_request
CI_PIPELINE_URLPipeline 详细信息的 URL
CI_PIPELINE_ID当前 Pipeline 在极狐GitLab 实例级别的 ID,是实例内唯一
CI_PIPELINE_IID当前 Pipeline 在当前项目内的 ID,是项目内唯一
CI_PIPELINE_TRIGGERED如果 Job 被触发则为 true
CI_PIPELINE_CREATED_AT
Pipeline 创建时的 UTC 时间

可以触发一个 Job 直接进行测试,诸如在 .gitlab-ci.yaml 文件中加入下述内容


after_script:  - echo "The value of CI_PIPELINE_SOURCE is $CI_PIPELINE_SOURCE"  - echo "The value of CI_PIPELINE_URL is $CI_PIPELINE_URL"  - echo "The value of CI_PIPELINE_ID is $CI_PIPELINE_ID"  - echo "The value of CI_PIPELINE_IID is $CI_PIPELINE_IID"  - echo "The value of CI_PIPELINE_TRIGGERED is $CI_PIPELINE_TRIGGERED"  - echo "The value of CI_PIPELINE_CREATED_AT is $CI_PIPELINE_CREATED_AT"
可以查看构建结果

镜像仓库有关

变量描述
CI_REGISTRY_IMAGE项目的镜像仓库地址
CI_REGISTRY_PASSWORD将镜像推送至镜像仓库时的密码
CI_REGISTRY_USER将镜像推送至镜像仓库时的用户名
CI_REGISTRY
极狐GitLab 实例的镜像仓库地址(如果启用了)

可以触发一个 Job 直接进行测试,诸如在 .gitlab-ci.yaml 文件中加入下述内容

after_script: - echo "The value of CI_REGISTRY_IMAGE is $CI_REGISTRY_IMAGE" - echo "The value of CI_REGISTRY_PASSWORD is $CI_REGISTRY_PASSWORD" - echo "The value of CI_REGISTRY_USER is $CI_REGISTRY_USER" - echo "The value of CI_REGISTRY is $CI_REGISTRY"
可以查看构建结果


如果使用极狐GitLab 的镜像仓库功能,则会构建镜像并推送至镜像仓库时会频繁用到上述几个参数,使用示例如下

build:  stage: build  script:    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA


CI_REGISTRY_IMAGE 和 CI_REGISTRY 的却别就是一个是项目级别的镜像仓库,一个是实例级别的镜像仓库。另外,至于 CI_REGISTRY_USER 的值是 gitlab-ci-token 而不是用户登陆极狐GitLab 的用户名,这个且听后面文章对于镜像仓库具体使用时的分解。


还有很多其他的预定义变量,大家可以在打开下面引用链接的地址直接查看,但是每个变量的用法都是类似的,因为是预定义,所以可以在 CI/CD Pipeline 中像上面的 Demo 一样直接使用,而无需先定义,再使用。


当然,预定义是无法满足全部场景的 CI/CD 的,因此极狐GitLab 也支持自定义变量,敬请期待极狐GitLab CI/CD 变量黑魔法你知道多少?(下)


引用链接

  1. https://docs.gitlab.com/ee/ci/variables/predefined_variables.html


关于极狐(GitLab)

极狐(GitLab) 以“核心开放”为原则,面向中国市场,提供开箱即用的开放式一体化安全DevOps平台——极狐GitLab。通过业界领先的优先级管理、安全、风险和合规性功能,实现产品、开发、QA、安全和运维团队间的高效协同,加速和优化企业软件开发生命周期。极狐GitLab由极狐信息技术(湖北)有限公司在国内独立运营,提供中国本地化功能和支持服务。极狐(GitLab)公司以“中外合资3.0”模式创立,公司投资方包括GitLab Inc.、红杉宽带跨境数字产业基金,以及高成资本。


关注本公众号可以获取更多关于 DevOps 相关的技术实践分享。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存