Help us learn about your current experience with the documentation. Take the survey.

脚本与作业日志故障排查

脚本中使用 : 时出现 Syntax is incorrect

如果在脚本中使用冒号(:),GitLab 可能会输出:

  • Syntax is incorrect
  • script 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: production

YAML 解析器会将 : 视为 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
  • 添加值为 ansiTERM CI/CD 变量

after_script 部分执行过早停止且 $CI_JOB_STATUS 值不正确

在 GitLab Runner 16.9.0 至 16.11.0 中: