"gitlab-runner-build": executable file not found in $PATH

在搭建 gitlab-runner 的过程中,报错如下

1
ERROR: Job failed (system failure): prepare environment: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "gitlab-runner-build": executable file not found in $PATH: unknown (exec.go:57:0s). Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information

因为在 environment扩展了 PATH 而导致 gitlab-runner-helper 中的 PATH 出现了异常。 从而导致 gitlab-runner-build 这个脚本(命令) 无法被找到。

原因分析

在 gitlab 的定义中 environment 的行为有两种 , append(扩展) 或 overwrite(覆盖)。 记住 覆盖 行为就可以了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 这个是错误配置
########
environment = [
    "DDK_HOME=/root/atlas500",
    
		# 这里是整个 Runner 的默认定义, 在 runner-help 调度之前, 所以这里的 $PATH 值为空
    "PATH=$PATH",
    # 因此这里的 PATH 覆盖了以后运行的 runner-help 环境变量
    "PATH=$ATLAS500_CROSS_BIN:$ATLAS500_HOST_BIN:$ATLAS500_DEVICE_CROSS_BIN:$PATH",
  ]

解决方案

为了解决这个问题, 可以使用 pre_build_script ,build 前的执行的初始化脚本。同样可以达到设置环境变量的目录。

由于本身是 脚本 所以, 可以做的事情有很多。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  # environment 的设置都是字面值。 只会被解析一次。
  # `ATLAS500_HOST_BIN=$DDK_HOME/host/bin` 不会扩展为 `ATLAS500_HOST_BIN=/root/atlas500/host/bin`
  # 变量会覆盖 PATH=/path/bin:$PATH。 由于之前 PATH 未定义, 所以结果为 PATH
  environment = [
    # "PATH=$PATH",
    "DDK_HOME=/root/atlas500",
  ]

  # pre_build_script 是一个 shell script
  # """ 多行引号
  pre_build_script = """
    export ATLAS500_HOST_BIN=$DDK_HOME/host/bin
    # ....

    export PATH=$ATLAS500_CROSS_BIN:$ATLAS500_HOST_BIN:$ATLAS500_DEVICE_CROSS_BIN:$PATH
  """