Shell 执行器

Shell 执行器是在安装极狐GitLab Runner 的机器上本地执行构建的简单的执行器。它支持所有可以安装 Runner 的系统。 这意味着可以使用为 Bash、PowerShell Core、Windows PowerShell 和 Windows Batch(废弃)所生成的脚本。

note 确保在极狐GitLab Runner 使用 shell 执行器的机器上满足常见先决条件

以特权用户身份运行脚本

如果 --user 添加到 gitlab-runner run 命令,脚本能够以非特权用户的身份运行。只有 Bash 支持这个功能。

源项目检出到: <working-directory>/builds/<short-token>/<concurrent-id>/<namespace>/<project-name>

项目缓存存储在 <working-directory>/cache/<namespace>/<project-name>

其中:

  • <working-directory> 是传递到 gitlab-runner run 命令或运行 Runner 的当前目录时的 --working-directory 的值。
  • <short-token> Runner 令牌的简写版本(前 8 个字母)。
  • <concurrent-id> 是一个特别的数字,标识在项目的上下文中特定 Runner 上的本地作业 ID(可通过 CI_CONCURRENT_PROJECT_ID 预定义变量访问)。
  • <namespace> 是极狐GitLab 上存储项目的命名空间。
  • <project-name> 是存储在极狐GitLab 上的项目的名称。

如果您想覆盖 <working-directory>/builds<working-directory/cache, 请指定 config.toml[[runners]] 部分下的 builds_dircache_dir 选项。

以非特权用户身份运行脚本

如果极狐GitLab Runner 从官方 .deb.rpm 安装包安装在 Linux 上,如果能够找到,安装器会试着使用 gitlab_ci_multi_runner 用户;如果未找到,它会创建 gitlab-runner 用户并使用。

系统会以 gitlab-runnergitlab_ci_multi_runner 用户的身份执行所有 Shell 构建。

在一些测试场景中,您的构建或许需要访问一些特权资源,例如 Docker Engine 或 VirtualBox。这种情况下,您需要向各自的组中添加 gitlab-runner 用户:

usermod -aG docker gitlab-runner
usermod -aG vboxusers gitlab-runner

选择您的 Shell

极狐GitLab Runner 支持特定 Shell。如果您想选择 Shell,请在您的 config.toml 文件中进行指定。例如:

...
[[runners]]
  name = "shell executor runner"
  executor = "shell"
  shell = "powershell"
...

安全

一般情况下,用 Shell 执行器运行测试是不安全的。可以使用用户的权限(gitlab-runner)运行作业并且作业可以从其他运行在这个服务器上的项目”偷取”代码。 请只在您信任和拥有的服务器上运行构建。

停止和关闭进程

Shell 执行器为每个新进程中的作业启动脚本。 在 UNIX 系统上,它将主进程设置为进程组

极狐GitLab Runner 遇到如下情况会停止进程:

  • 作业超时的时候。
  • 取消作业的时候。

极狐GitLab 13.0 及更早版本

在 UNIX 系统中,gitlab-runner 向进程发送 SIGKILL 以关闭进程, 因为子进程属于同一个进程组,同样要给它们发送信号。 对于 Windows 系统,需要日发送 taskkill /F /T

极狐GitLab 13.1 及更早版本

在 UNIX 系统中,gitlab-runner 向进程及其子进程发送 SIGTERM, 并且 10 分钟后发送 SIGKILL。这允许优雅关闭进程。 Windows 系统中没有与 SIGTERM 对等的信号,所以需要发送两次关闭信号。 10 分钟后发送第二个关闭信号。

在 UNIX 系统中,gitlab-runnerSIGTERM 发送到进程及其子进程,并在 10 分钟后发送 SIGKILL。这允许优雅关闭进程。 Windows 系统中没有与 SIGTERM 对等的信号,所以需要发送两次 Kill 信号。10 分钟后发送第二个信号。