Help us learn about your current experience with the documentation. Take the survey.
脚本与作业日志故障排查
脚本中使用 : 时出现 Syntax is incorrect
如果在脚本中使用冒号(:),GitLab 可能会输出:
Syntax is incorrectscript config should be a string or a nested array of strings up to 10 levels deep
例如,如果在使用 cURL 命令时包含 "PRIVATE-TOKEN: ${PRIVATE_TOKEN}":
pages-job:
stage: deploy
script:
- curl --header 'PRIVATE-TOKEN: ${PRIVATE_TOKEN}' "https://gitlab.example.com/api/v4/projects"
environment: productionYAML 解析器会将 : 视为 YAML 关键字,从而输出 Syntax is incorrect 错误。
若要在包含冒号的命令中使用,应将整个命令用单引号包裹。你可能需要将现有的单引号(')改为双引号("):
pages-job:
stage: deploy
script:
- 'curl --header "PRIVATE-TOKEN: ${PRIVATE_TOKEN}" "https://gitlab.example.com/api/v4/projects"'
environment: production使用 && 时作业未失败
如果在单个脚本行中使用 && 组合两个命令,即使其中一个命令失败,作业也可能返回成功状态。例如:
job-does-not-fail:
script:
- invalid-command xyz && invalid-command abc
- echo $?
- echo "作业本应已失败,但此行却意外执行了。"&& 操作符即使在两个命令都失败的情况下也会返回退出码 0,作业继续运行。若要强制脚本在任何命令失败时退出,可将整行用括号包裹:
job-fails:
script:
- (invalid-command xyz && invalid-command abc)
- echo "作业已失败,此行不会被执行。"折叠的 YAML 多行块标量未保留多行命令
如果使用 - > 折叠的 YAML 多行块标量拆分长命令,额外的缩进会导致行被处理为单独的命令。
例如:
script:
- >
RESULT=$(curl --silent
--header
"Authorization: Bearer $CI_JOB_TOKEN"
"${CI_API_V4_URL}/job"
)这会因缩进而失败,因为换行被保留了:
$ RESULT=$(curl --silent # 折叠的多行命令
curl: 未指定 URL!
curl: 请尝试 'curl --help' 或 'curl --manual' 获取更多信息
/bin/bash: 第 149 行: --header: 未找到命令
/bin/bash: 第 150 行: https://gitlab.example.com/api/v4/job: 没有该文件或目录可通过以下方式解决:
-
移除额外缩进:
script: - > RESULT=$(curl --silent --header "Authorization: Bearer $CI_JOB_TOKEN" "${CI_API_V4_URL}/job" ) -
修改脚本以处理额外的换行,例如使用 shell 行延续符:
script: - > RESULT=$(curl --silent \ --header \ "Authorization: Bearer $CI_JOB_TOKEN" \ "${CI_API_V4_URL}/job")
作业日志输出格式不符预期或包含意外字符
有时,依赖 TERM 环境变量进行着色或格式的工具,其作业日志显示不正确。例如,使用 mypy 命令时:
GitLab Runner 以非交互模式运行容器的 shell,因此 shell 的 TERM 环境变量被设为 dumb。要修复此类工具的格式,可:
- 在运行命令前添加一行脚本,设置 shell 环境中的
TERM=ansi。 - 添加值为
ansi的TERMCI/CD 变量。
after_script 部分执行过早停止且 $CI_JOB_STATUS 值不正确
在 GitLab Runner 16.9.0 至 16.11.0 中:
after_script部分的执行有时过早停止。- 预定义变量
$CI_JOB_STATUS的状态 在作业取消时被错误地设为failed。