CODECHINA CI/CD 变量
环境变量是一个动态命名的值,它可以影响正在运行的进程在操作系统上的行为方式。
环境变量是进程在其中运行的环境的一部分。 例如,正在运行的进程可以查询TEMP
环境变量的值以发现合适的位置来存储临时文件,或者为可以在不同脚本中重用的数据库定义URL
。
变量对于在 CODECHINA CI/CD 中自定义流水线任务很有用。 使用变量时,不必对值进行硬编码。
预定义的 CI/CD 变量
CODECHINA CI/CD 具有一组默认的预定义变量 ,你可以使用它们而无需任何其他说明。 你可以调用问题编号、用户名、分支名称、流水线和提交 ID 等。
CODECHINA 为 Runner 的本地环境提供了预定义的变量。
CODECHINA 读取.codechina-ci.yml
文件,并将信息发送到 runner,在此处公开变量。 然后 runner 运行脚本命令。
使用预定义的 CI/CD 变量
你可以选择现有的预定义变量之一,以由 Runner 输出。
本示例说明如何使用预定义变量CI_JOB_STAGE
输出流水线任务的 stage。
在你的.codechina-ci.yml
文件中,从脚本中调用变量。 确保使用正确的语法 。
test_variable:
stage: test
script:
- echo $CI_JOB_STAGE
在这种情况下, runner 输出流水线任务test_variable
的stage
,即test
:
自定义 CI/CD 变量
当需要特定的自定义环境变量时,可以在 UI、API 或直接在.codechina-ci.yml
文件中进行设置 。
每当流水线运行时,Runner 就会使用这些变量。 你还可以手动覆盖特定流水线的变量值。
变量有两种类型:Variable 和 File 。 你无法在.codechina-ci.yml
文件中设置类型,但可以在 UI 和 API 中进行设置。
.codechina-ci.yml
创建自定义变量
在 在.codechina-ci.yml
文件中创建自定义env_var
,在variables
下定义变量/值对:
variables:
TEST: "HELLO WORLD"
然后,你可以在脚本中调用其值:
script:
- echo "$TEST"
有关更多详细信息,请参见.codechina-ci.yml
定义的变量 。
在界面创建自定义变量
在用户界面中,你可以添加或更新自定义环境变量:
-
转到项目的设置> DevOps,然后展开 变量部分。
-
单击添加变量按钮。 在 添加变量 模式中,填写详细信息:
-
键 :必须是一行,没有空格,只能使用字母、数字或
_
。 - 值 :无限制。
-
类型:
文件
or变量
。 -
环境范围 :
全部
或特定环境。 - 保护变量 (可选):如果选中,则该变量将仅在在受保护的分支或标签上运行的流水线中可用。
- 隐藏变量 (可选):如果选中,则变量的值将在流水线任务日志中被隐藏。 如果该值不满足隐藏要求,则变量将无法保存。
-
键 :必须是一行,没有空格,只能使用字母、数字或
创建变量后,你可以通过点击 编辑按钮。
设置变量后,请从.codechina-ci.yml
文件中调用它:
test_variable:
stage: test
script:
- echo $CI_JOB_STAGE # calls a predefined variable
- echo $TEST # calls a custom variable of type `env_var`
- echo $GREETING # calls a custom variable of type `file` that contains the path to the temp file
- cat $GREETING # the temp file itself contains the variable value
输出将是:
变量类型的自定义环境变量
对于类型为Variable 的变量 ,Runner 会创建一个环境变量,该环境变量将键用作名称,并将值用作值。
有一些这种类型的预定义变量 ,可以进一步验证。 它们在你在 UI 中添加或更新变量时出现。
文件类型的自定义环境变量
对于文件类型的变量,Runner 创建一个环境变量,该环境变量使用键作为名称。 对于该值,Runner 将变量值写入临时文件并使用此路径。
你可以使用诸如AWS CLI和kubectl
类的工具通过使用文件 类型变量来自定义配置。
过去,常见的模式是读取 CI 变量的值,将其保存在文件中,然后在脚本中使用新创建的文件:
# Read certificate stored in $KUBE_CA_PEM variable and save it in a new file
echo "$KUBE_CA_PEM" > "$(pwd)/kube.ca.pem"
# Pass the newly created file to kubectl
kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$(pwd)/kube.ca.pem"
代替此,你可以使用文件类型变量。 例如,如果你具有以下变量:
- 类型为Variable :
KUBE_URL
变量 ,其值为https://example.com
。 - 类型为File :
KUBE_CA_PEM
变量,其值为证书。
你可以从.codechina-ci.yml
调用它们,如下所示:
kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
屏蔽自定义变量
可以屏蔽变量,以便将变量的值隐藏在流水线任务日志中。
要屏蔽变量:
- 转到设置> DevOps 。
- 展开变量部分。
- 在你要保护的变量旁边,点击编辑 。
- 选择掩码变量复选框。
- 点击 更新变量。
Masked variable requirements
变量的值必须:
- 在一行中。
- 至少要包含 8 个字符。
- 不是预定义或自定义环境变量。
- 仅由 Base64 字母(RFC4648)中的字符组成,
@
和:
也是有效值。
你不能屏蔽不满足这些要求的变量。
保护自定义变量
变量可以被保护。 受保护的变量将安全地传递到仅在受保护的分支或受保护的标签上运行的流水线。 其他流水线不获取受保护的变量。
要保护变量:
- 转到设置> DevOps 。
- 展开变量部分。
- 在你要保护的变量旁边,点击编辑 。
- 选择保护变量复选框。
- Click 更新变量。
该变量可用于所有后续流水线。 受保护的变量只能由拥有维护者权限的项目成员更新或查看。
由 GitLab 验证的自定义变量
UI 中列出了一些变量,因此你可以更快地选择它们。 GitLab 会验证这些变量的值,以确保它们的格式正确。
| 变量 | 允许值 |
| --- | --- | --- |
| AWS_ACCESS_KEY_ID
| 20 个字符:字母,数字 |
| AWS_DEFAULT_REGION
| 任何 |
| AWS_SECRET_ACCESS_KEY
| 40 个字符:字母,数字,特殊字符 |
注意:存储凭据时,会涉及安全性。 例如,如果你使用的是 AWS 密钥,请遵循其最佳做法 。
流水线任务脚本中环境变量的语法
所有变量都在构建环境中设置为环境变量,并且可以使用用于访问此类变量的常规方法来访问它们。 在大多数情况下, bash
或sh
用于执行流水线任务脚本。
要访问环境变量,请使用 Runner shell的语法。
Shell | 用法 |
---|---|
bash/sh | $variable |
PowerShell |
$env:variable (主要)或$variable
|
Windows 批处理 | %variable% |
Bash
要在bash 中访问环境变量,请在变量名前加上( $
):
job_name:
script:
- echo $CI_JOB_ID
PowerShell
要访问Windows PowerShell环境中的环境变量,请在变量名前加上( $env:
)。还可以通过在变量名称前加上( $
)来访问它们。
job_name:
script:
- echo $env:CI_JOB_ID
- echo $CI_JOB_ID
- echo $env:PATH
在某些情况下,环境变量可能需要用引号引起来才能正确扩展:
job_name:
script:
- D:\\qislsf\\apache-ant-1.10.5\\bin\\ant.bat "-DsosposDailyUsr=$env:SOSPOS_DAILY_USR" portal_test
Windows 批处理
要访问Windows Batch 中的环境变量,请用( %
)包围变量:
job_name:
script:
- echo %CI_JOB_ID%
列出所有环境变量
你还可以使用 Bash 中的export
命令或 PowerShell 中的dir env:
命令列出所有环境变量。 请注意,这还将在流水线任务日志中公开你设置的所有变量的值:
job_name:
script:
- export
# - 'dir env:' # use this for PowerShell
示例值:
export CI_JOB_ID="50"
export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
export CI_COMMIT_SHORT_SHA="1ecfd275"
export CI_COMMIT_REF_NAME="master"
export CI_REPOSITORY_URL="https://gitlab-ci-token:abcde-1234ABCD5678ef@example.com/gitlab-org/gitlab-foss.git"
export CI_COMMIT_TAG="1.0.0"
export CI_JOB_NAME="spec:other"
export CI_JOB_STAGE="test"
export CI_JOB_MANUAL="true"
export CI_JOB_TRIGGERED="true"
export CI_JOB_TOKEN="abcde-1234ABCD5678ef"
export CI_PIPELINE_ID="1000"
export CI_PIPELINE_IID="10"
export CI_PAGES_DOMAIN="gitlab.io"
export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab-foss"
export CI_PROJECT_ID="34"
export CI_PROJECT_DIR="/builds/gitlab-org/gitlab-foss"
export CI_PROJECT_NAME="gitlab-foss"
export CI_PROJECT_TITLE="GitLab FOSS"
export CI_PROJECT_NAMESPACE="gitlab-org"
export CI_PROJECT_ROOT_NAMESPACE="gitlab-org"
export CI_PROJECT_PATH="gitlab-org/gitlab-foss"
export CI_PROJECT_URL="https://example.com/gitlab-org/gitlab-foss"
export CI_REGISTRY="registry.example.com"
export CI_REGISTRY_IMAGE="registry.example.com/gitlab-org/gitlab-foss"
export CI_REGISTRY_USER="gitlab-ci-token"
export CI_REGISTRY_PASSWORD="longalfanumstring"
export CI_RUNNER_ID="10"
export CI_RUNNER_DESCRIPTION="my runner"
export CI_RUNNER_TAGS="docker, linux"
export CI_SERVER="yes"
export CI_SERVER_URL="https://example.com"
export CI_SERVER_HOST="example.com"
export CI_SERVER_PORT="443"
export CI_SERVER_PROTOCOL="https"
export CI_SERVER_NAME="GitLab"
export CI_SERVER_REVISION="70606bf"
export CI_SERVER_VERSION="8.9.0"
export CI_SERVER_VERSION_MAJOR="8"
export CI_SERVER_VERSION_MINOR="9"
export CI_SERVER_VERSION_PATCH="0"
export GITLAB_USER_EMAIL="user@example.com"
export GITLAB_USER_ID="42"
.codechina-ci.yml
定义的变量
你可以将在构建环境中设置的变量添加到.codechina-ci.yml
。 这些变量保存在仓库中,它们旨在存储非敏感项目配置,例如RAILS_ENV
或DATABASE_URL
。
例如,如果将变量全局设置为下方(而不是在流水线任务内部),它将在所有已执行的命令和脚本中使用:
variables:
DATABASE_URL: "postgres://postgres@postgres/my_database"
变量可以在全局级别定义,也可以在流水线任务级别定义。 要在流水线任务中关闭全局定义的变量,请定义一个空哈希:
job_name:
variables: {}
你可以在变量定义内使用其他变量(或使用$$
对其进行转义):
variables:
LS_CMD: 'ls $FLAGS $$TMP_DIR'
FLAGS: '-al'
script:
- 'eval $LS_CMD' # will execute 'ls -al $TMP_DIR'
组级环境变量
你可以定义在流水线环境中设置的每个项目或每个组的变量。 组级变量存储在仓库之外(不在.codechina-ci.yml
),并安全地传递到 CODECHINA Runner,这使它们在流水线运行期间可用。
组级变量可以通过以下方式添加:
- 导航到组的设置> DevOps页面。
- 在 变量部分中输入变量类型,键和值。 子组的任何变量将被递归继承。
设置它们后,它们将可用于所有后续流水线。 可以通过以下方式在项目中查看任何组级用户定义的变量:
- 导航到项目的设置> DevOps页面。
- 展开变量部分。
实例级 CI/CD 环境变量
实例变量非常有用,因为不再需要为所有项目重复手动输入相同的凭据。 实例级变量可用于实例上的所有项目和组。
注意:实例级变量的最大数量为 25。
你可以通过 UI 或 API 定义实例级变量。
要添加实例级变量:
-
导航到管理区域的设置> DevOps,然后展开 变量部分。
-
单击添加变量按钮,然后填写详细信息:
-
键 :必须为一行,只能使用字母,数字或
_
(下划线),且不能有空格。 - 值 :允许 10000 个字符。
-
类型:
File
o或Variable
。 - 保护变量 (可选):如果选中,则该变量将仅在在受保护的分支或标签上运行的流水线中可用。
- 屏蔽变量 (可选):如果选中,则变量的值将不会显示在流水线任务日志中。 如果该值不满足屏蔽要求,则不会保存该变量。
-
键 :必须为一行,只能使用字母,数字或
创建变量后,你可以通过点击 编辑按钮来更新任何详细信息。
启用或禁用实例级 CI/CD 变量的 UI 界面
实例级 CI/CD 变量的 UI 界面正在开发中,但可用于生产环境。 它部署在默认情况下启用的功能标志的后面。 有权访问 GitLab Rails 控制台的 GitLab 管理员可以选择为你的实例禁用它。
禁用它:
Feature.disable(:instance_variables_ui)
要启用它:
Feature.enable(:instance_variables_ui)
继承环境变量
你可以从相关流水线任务中继承环境变量。
该功能利用了artifacts:reports:dotenv
报告功能。
带有dependencies
关键字的示例。
build:
stage: build
script:
- echo "BUILD_VERSION=hello" >> build.env
artifacts:
reports:
dotenv: build.env
deploy:
stage: deploy
script:
- echo $BUILD_VERSION # => hello
dependencies:
- build
带needs
关键字的示例:
build:
stage: build
script:
- echo "BUILD_VERSION=hello" >> build.env
artifacts:
reports:
dotenv: build.env
deploy:
stage: deploy
script:
- echo $BUILD_VERSION # => hello
needs:
- job: build
artifacts: true
环境变量的优先级
不同类型的变量可以优先于其他变量,具体取决于它们的定义位置。
变量的优先顺序为(从最高到最低):
- 触发器变量, 计划的流水线变量和手动流水线运行变量 。
- 项目级 变量 或受保护变量。
- 组织级 变量或受保护变量。
- 继承环境变量。
- YAML定义的 流水线任务级变量。
- YAML定义的 全局变量。
- 部署变量。
- 预定义环境变量。
例如,如果你定义:
-
API_TOKEN=secure
作为项目变量。 -
API_TOKEN=yaml
在你的.codechina-ci.yml
。
API_TOKEN
将采用secure
值,因为项目变量优先于.codechina-ci.yml
中定义的变量。
不支持的变量
变量名称受用于执行脚本的底层 shell 的限制 (请参阅 可用的 shell )。 每个shell都有自己唯一的一组保留变量名。 你还需要记住环境变量的范围以确保在希望使用它的范围内定义变量。
高级使用
限制环境变量的环境范围
你可以通过定义变量可用于的环境来限制变量的环境范围。
部署环境变量
负责部署配置的集成可以定义在构建环境中设置的自己的变量。 这些变量仅为部署流水线任务定义。 请查阅所用集成的文档,以了解它们定义了哪些变量。
Auto DevOps 环境变量
你可以配置Auto DevOps,以将 CI 变量传递给正在运行的应用程序,方法是在变量的键之前添加K8S_SECRET_
。
然后,这些前缀变量将在运行的应用程序容器上用作环境变量。
警告:由于当前 Auto DevOps 脚本环境的限制,当前不支持具有多行值的变量。
通过手动运行流水线覆盖变量
你可以通过手动运行流水线来覆盖当前变量的值。
例如,假设你添加了一个名为$TEST
的自定义变量,并且想在手动流水线中覆盖它。
导航到项目的DevOps > 流水线 ,然后单击运行 流水线 。 选择要为其运行流水线的分支,然后在 UI 中添加变量及其值:
runner 将覆盖先前设置的值,并将自定义值用于此特定流水线。
CI/CD 变量表达式
使用变量表达式来限制将更改推送到 CODECHINA 之后在流水线中创建的流水线任务。
在.codechina-ci.yml
,变量表达式可同时用于以下两种情况:
-
rules
,这是推荐的方法,以及 -
only
和except
,它们是不推荐使用的候选对象。
与变量和触发的流水线变量结合使用时,这特别有用。
deploy:
script: cap staging deploy
environment: staging
only:
variables:
- $RELEASE == "staging"
- $STAGING
在创建流水线之前,将对提供的每个表达式进行求值。
如果only
使用时variables
任何条件评估为 true,则会创建一个新流水线任务。 如果在使用except
任何表达式的结果为 true,则不会创建流水线任务。
这遵循only
/ except
策略的常规规则。
CI/CD 变量表达式的语法
你可以在下面找到受支持的语法参考:
-
使用字符串进行相等匹配
例子:
$VARIABLE == "some value"
$VARIABLE != "some value"
你可以使用等于运算符
==
或!=
将变量内容与字符串进行比较。 我们支持双引号和单引号来定义字符串值,因此同时支持$VARIABLE == "some value"
和$VARIABLE == 'some value'
。"some value" == $VARIABLE
也正确。 -
检查未定义的值
例子:
$VARIABLE == null
$VARIABLE != null
有时,你可能想检查是否定义了变量。 为此,你可以将变量与
null
关键字进行比较,例如$VARIABLE == null
。 如果在使用==
时未定义变量,则该表达式的值为 true;如果使用!=
则该表达式的值为 false。 -
检查空变量
例子:
$VARIABLE == ""
$VARIABLE != ""
如果要检查变量是否已定义但为空,则可以将其与空字符串(例如
$VAR == ''
或非空字符串$VARIABLE != ""
。 -
比较两个变量
例子:
$VARIABLE_1 == $VARIABLE_2
$VARIABLE_1 != $VARIABLE_2
可以比较两个变量。 这将比较这些变量的值。
-
可变状态检查
例子:
$STAGING
如果只想在存在某个变量时创建流水线任务,这意味着它是已定义且非空的,则可以简单地使用变量名作为表达式,例如
$STAGING
。 如果$STAGING
变量已定义且不为空,则表达式将求值为真。$STAGING
值必须是长度大于零的字符串。 仅包含空格字符的变量不是空变量。 -
模式匹配
例子:
-
=~
:如果模式匹配则为真。 例如:$VARIABLE =~ /^content.*/
-
!~
:如果模式不匹配,则为 true。 例如:$VARIABLE_1 !~ /^content.*/
与正则表达式匹配的变量模式使用RE2 正则表达式语法 。 如果满足以下条件,则表达式的计算结果为
true
:- 使用
=~
时找到匹配项。 - 当使用火柴都没有发现
!~
模式匹配默认情况下区分大小写。 使用
i
标志修饰符,例如/pattern/i
,使模式不区分大小写。 -
-
合取/析取
例子:
$VARIABLE1 =~ /^content.*/ && $VARIABLE2 == "something"
$VARIABLE1 =~ /^content.*/ && $VARIABLE2 =~ /thing$/ && $VARIABLE3
$VARIABLE1 =~ /^content.*/ || $VARIABLE2 =~ /thing$/ && $VARIABLE3
可以使用
&&
或||
加入多个条件 。 任何在其他情况下受支持的语法都可以在合并或不合并语句中使用。 运算符的优先级遵循Ruby 2.5 标准 ,因此&&
在||
之前进行评估 。
在变量中存储正则表达式
可以将正则表达式存储在变量中,以用于模式匹配:
variables:
STAGINGRELS: '/staging0|staging1/'
deploy_staging:
script: do.sh deploy staging
environment: staging
rules:
- if: '$RELEASE =~ $STAGINGRELS'
注意:可用的正则表达式语法受到限制。
如果需要,你可以使用测试流水线来确定正则表达式是否可以在变量中工作。 下面的示例直接从变量内部测试^mast.*
正则表达式:
variables:
MYSTRING: 'master'
MYREGEX: '/^mast.*/'
testdirect:
script: /bin/true
rules:
- if: '$MYSTRING =~ /^mast.*/'
testvariable:
script: /bin/true
rules:
- if: '$MYSTRING =~ $MYREGEX'
调试日志
警告:启用调试跟踪可能会严重影响安全性。 输出将包含所有变量和其他任何秘密的内容! 输出将上传到 CODECHINA 服务器,并在流水线任务日志中显示!
默认情况下,Runner 隐藏处理流水线任务时所执行操作的大多数细节。 此行为使流水线任务日志简短,并防止机密信息泄露到日志中,除非你的脚本将其写入屏幕。
如果一项工作没有按预期进行,则可能使问题难以调查。 在这种情况下,你可以在.codechina-ci.yml
启用调试跟踪。此功能启用 shell 的执行日志,从而产生详细的流水线任务日志,其中列出了所有已运行的命令,已设置的变量等。
在启用此功能之前,你应确保流水线任务仅对团队成员可见。 你还应该清除所有生成的流水线任务日志,然后才能再次显示它们。
要启用调试日志(跟踪),请将CI_DEBUG_TRACE
变量设置为true
:
job_name:
variables:
CI_DEBUG_TRACE: "true"
将CI_DEBUG_TRACE
设置为true
示例截断输出:
...
export CI_SERVER_TLS_CA_FILE="/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE"
if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then echo $'\''\x1b[32;1mFetching changes...\x1b[0;m'\''
$'\''cd'\'' "/builds/gitlab-examples/ci-debug-trace"
$'\''git'\'' "config" "fetch.recurseSubmodules" "false"
$'\''rm'\'' "-f" ".git/index.lock"
$'\''git'\'' "clean" "-ffdx"
$'\''git'\'' "reset" "--hard"
$'\''git'\'' "remote" "set-url" "origin" "https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@example.com/gitlab-examples/ci-debug-trace.git"
$'\''git'\'' "fetch" "origin" "--prune" "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/lds"
++ CI_BUILDS_DIR=/builds
++ export CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
++ CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
++ export CI_CONCURRENT_ID=87
++ CI_CONCURRENT_ID=87
++ export CI_CONCURRENT_PROJECT_ID=0
++ CI_CONCURRENT_PROJECT_ID=0
++ export CI_SERVER=yes
++ CI_SERVER=yes
++ mkdir -p /builds/gitlab-examples/ci-debug-trace.tmp
++ echo -n '-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----'
++ export CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
++ CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
++ export CI_PIPELINE_ID=52666
++ CI_PIPELINE_ID=52666
++ export CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
++ CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
++ export CI_JOB_ID=7046507
++ CI_JOB_ID=7046507
++ export CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
++ CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
++ export CI_JOB_TOKEN=[MASKED]
++ CI_JOB_TOKEN=[MASKED]
++ export CI_BUILD_ID=379424655
++ CI_BUILD_ID=379424655
++ export CI_BUILD_TOKEN=[MASKED]
++ CI_BUILD_TOKEN=[MASKED]
++ export CI_REGISTRY_USER=gitlab-ci-token
++ CI_REGISTRY_USER=gitlab-ci-token
++ export CI_REGISTRY_PASSWORD=[MASKED]
++ CI_REGISTRY_PASSWORD=[MASKED]
++ export CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
++ CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
++ export CI_JOB_NAME=debug_trace
++ CI_JOB_NAME=debug_trace
++ export CI_JOB_STAGE=test
++ CI_JOB_STAGE=test
++ export CI_NODE_TOTAL=1
++ CI_NODE_TOTAL=1
++ export CI_BUILD_NAME=debug_trace
++ CI_BUILD_NAME=debug_trace
++ export CI_BUILD_STAGE=test
++ CI_BUILD_STAGE=test
++ export CI=true
++ CI=true
++ export GITLAB_CI=true
++ GITLAB_CI=true
++ export CI_SERVER_URL=https://gitlab.com:3000
++ CI_SERVER_URL=https://gitlab.com:3000
++ export CI_SERVER_HOST=gitlab.com
++ CI_SERVER_HOST=gitlab.com
++ export CI_SERVER_PORT=3000
++ CI_SERVER_PORT=3000
++ export CI_SERVER_PROTOCOL=https
++ CI_SERVER_PROTOCOL=https
++ export CI_SERVER_NAME=GitLab
++ CI_SERVER_NAME=GitLab
++ export CI_SERVER_VERSION=12.6.0-pre
++ CI_SERVER_VERSION=12.6.0-pre
++ export CI_SERVER_VERSION_MAJOR=12
++ CI_SERVER_VERSION_MAJOR=12
++ export CI_SERVER_VERSION_MINOR=6
++ CI_SERVER_VERSION_MINOR=6
++ export CI_SERVER_VERSION_PATCH=0
++ CI_SERVER_VERSION_PATCH=0
++ export CI_SERVER_REVISION=f4cc00ae823
++ CI_SERVER_REVISION=f4cc00ae823
++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ export CI_PROJECT_ID=17893
++ CI_PROJECT_ID=17893
++ export CI_PROJECT_NAME=ci-debug-trace
++ CI_PROJECT_NAME=ci-debug-trace
++ export CI_PROJECT_TITLE='GitLab FOSS'
++ CI_PROJECT_TITLE='GitLab FOSS'
++ export CI_PROJECT_PATH=gitlab-examples/ci-debug-trace
++ CI_PROJECT_PATH=gitlab-examples/ci-debug-trace
++ export CI_PROJECT_PATH_SLUG=gitlab-examples-ci-debug-trace
++ CI_PROJECT_PATH_SLUG=gitlab-examples-ci-debug-trace
++ export CI_PROJECT_NAMESPACE=gitlab-examples
++ CI_PROJECT_NAMESPACE=gitlab-examples
++ export CI_PROJECT_ROOT_NAMESPACE=gitlab-examples
++ CI_PROJECT_ROOT_NAMESPACE=gitlab-examples
++ export CI_PROJECT_URL=https://gitlab.com/gitlab-examples/ci-debug-trace
++ CI_PROJECT_URL=https://gitlab.com/gitlab-examples/ci-debug-trace
++ export CI_PROJECT_VISIBILITY=public
++ CI_PROJECT_VISIBILITY=public
++ export CI_PROJECT_REPOSITORY_LANGUAGES=
++ CI_PROJECT_REPOSITORY_LANGUAGES=
++ export CI_DEFAULT_BRANCH=master
++ CI_DEFAULT_BRANCH=master
++ export CI_REGISTRY=registry.gitlab.com
++ CI_REGISTRY=registry.gitlab.com
++ export CI_API_V4_URL=https://gitlab.com/api/v4
++ CI_API_V4_URL=https://gitlab.com/api/v4
++ export CI_PIPELINE_IID=123
++ CI_PIPELINE_IID=123
++ export CI_PIPELINE_SOURCE=web
++ CI_PIPELINE_SOURCE=web
++ export CI_CONFIG_PATH=.codechina-ci.yml
++ CI_CONFIG_PATH=..codechina-ci.yml
++ export CI_COMMIT_SHA=dd648b2e48ce6518303b0bb580b2ee32fadaf045
++ CI_COMMIT_SHA=dd648b2e48ce6518303b0bb580b2ee32fadaf045
++ export CI_COMMIT_SHORT_SHA=dd648b2e
++ CI_COMMIT_SHORT_SHA=dd648b2e
++ export CI_COMMIT_BEFORE_SHA=0000000000000000000000000000000000000000
++ CI_COMMIT_BEFORE_SHA=0000000000000000000000000000000000000000
++ export CI_COMMIT_REF_NAME=master
++ CI_COMMIT_REF_NAME=master
++ export CI_COMMIT_REF_SLUG=master
++ CI_COMMIT_REF_SLUG=master
++ export CI_COMMIT_MESSAGE=s/CI/Runner
++ CI_COMMIT_MESSAGE=s/CI/Runner
++ export CI_COMMIT_TITLE=s/CI/Runner
++ CI_COMMIT_TITLE=s/CI/Runner
++ export CI_COMMIT_DESCRIPTION=
++ CI_COMMIT_DESCRIPTION=
++ export CI_COMMIT_REF_PROTECTED=true
++ CI_COMMIT_REF_PROTECTED=true
++ export CI_BUILD_REF=dd648b2e48ce6518303b0bb580b2ee32fadaf045
++ CI_BUILD_REF=dd648b2e48ce6518303b0bb580b2ee32fadaf045
++ export CI_BUILD_BEFORE_SHA=0000000000000000000000000000000000000000
++ CI_BUILD_BEFORE_SHA=0000000000000000000000000000000000000000
++ export CI_BUILD_REF_NAME=master
++ CI_BUILD_REF_NAME=master
++ export CI_BUILD_REF_SLUG=master
++ CI_BUILD_REF_SLUG=master
++ export CI_RUNNER_ID=1337
++ CI_RUNNER_ID=1337
++ export CI_RUNNER_DESCRIPTION=shared-runners-manager-4.gitlab.com
++ CI_RUNNER_DESCRIPTION=shared-runners-manager-4.gitlab.com
++ export 'CI_RUNNER_TAGS=gce, east-c, shared, docker, linux, ruby, mysql, postgres, mongo, git-annex'
++ CI_RUNNER_TAGS='gce, east-c, shared, docker, linux, ruby, mysql, postgres, mongo, git-annex'
++ export CI_DEBUG_TRACE=true
++ CI_DEBUG_TRACE=true
++ export GITLAB_USER_ID=42
++ GITLAB_USER_ID=42
++ export GITLAB_USER_EMAIL=user@example.com
++ GITLAB_USER_EMAIL=user@example.com
++ export GITLAB_USER_LOGIN=root
++ GITLAB_USER_LOGIN=root
++ export 'GITLAB_USER_NAME=User'
++ GITLAB_USER_NAME='User'
++ export CI_DISPOSABLE_ENVIRONMENT=true
++ CI_DISPOSABLE_ENVIRONMENT=true
++ export CI_RUNNER_VERSION=12.5.0
++ CI_RUNNER_VERSION=12.5.0
++ export CI_RUNNER_REVISION=577f813d
++ CI_RUNNER_REVISION=577f813d
++ export CI_RUNNER_EXECUTABLE_ARCH=linux/amd64
++ CI_RUNNER_EXECUTABLE_ARCH=linux/amd64
++ export VERY_SECURE_VARIABLE=imaverysecurevariable
++ VERY_SECURE_VARIABLE=imaverysecurevariable
...