GitLab Runner

GitLab Runner 是一个应用,它和GitLab CI/CD 一起工作在pipeline流水任务里。

可以选择安装一个自主管理的GitLab-Runner,出于安全和性能原因,您应该将 GitLab Runner 安装在与托管 GitLab 实例的机器不同的机器上,当你独立出来GitLab Runner,你可以使用在不同的操作系统或工具,如Kubernetes,Docker

GitLab Runner 是开源的,用 Go 编写。它可以作为单个二进制文件运行;不需要特定语言的要求。

您可以在几个不同的受支持操作系统上安装 GitLab Runner。其他操作系统也可以工作,只要您可以在它们上编译 Go 二进制文件。

GitLab Runner 也可以在 Docker 容器内运行或部署到 Kubernetes 集群中。

扩展GitLab Runner

当您的组织规模扩大到拥有一批 Runner 时,您应该计划如何监控和调整这些跑步者的表现

GitLab Runner 版本

出于兼容性原因,GitLab Runner 应该与 GitLab 主要和次要版本保持同步。如果版本异常功能可能不可用,或者无法正常工作。

注册Runner

安装应用程序后,您可以注册个人Runner。 Runners 是运行来自 GitLab 的 CI/CD 作业的代理。

当注册Runner,应该设置Runner与GitLab实例之间的通信。

Runners 通常在您安装 GitLab Runner 的同一台机器上处理作业。但是,您也可以在容器、Kubernetes 集群或云中的自动缩放实例中让运行程序处理作业。

Executors

当注册一个Runner,需要选择一个Executors,Executors决定每个任务运行的环境。

For example:

  • 如果你想你的CI/CD任务去运行PowerShell命令,你可以在 Windows 服务器上安装 GitLab Runner,然后注册一个使用 shell 执行器的运行器。
  • 如果您希望 CI/CD 作业在自定义 Docker 容器中运行命令,您可以在 Linux 服务器上安装 GitLab Runner 并注册一个使用 Docker 执行器的运行器。

这些只是可能的配置中的一小部分。您可以在虚拟机上安装 GitLab Runner,并让它使用另一个虚拟机作为执行程序。

当您在 Docker 容器中安装 GitLab Runner 并选择 Docker 执行器来运行您的作业时,它有时被称为“Docker-in-Docker”配置。

谁有权访问 GitLab UI 中的Runner

在注册Runner之前,您应该确定 GitLab 中的每个人是否都应该有权访问它,或者是否要将其限制为特定的 GitLab 组或项目。

根据您想要访问的人,共有三种类型的Runner:

注册运行程序时,您为 GitLab 实例、组或项目指定令牌。这就是Runner如何知道它可用于哪些项目的方式。

Tags

当注册GitLab Runner,可以对它增加标签。

当一个CI/CD任务运行,通过查看分配的标签来知道要使用哪个Runner

例如:如果Runner有ruby标签,可以将此代码添加到项目的.gitlab-ci.yaml文件中

  1. job:
  2. tags:
  3. - ruby

当Job运行时,它使用该Runner带有ruby的标签。

配置Runner

可以通过编辑 config.toml 文件来配置运行器。这是在Runner安装过程中安装的文件。

在此文件中,可以编辑特定Runner或所有Runner的设置。

以指定日志记录和缓存等设置。您可以设置并发、内存、CPU 限制等。

监控Runner

可以使用 Prometheus 来监控您的Runner。您可以查看当前运行的作业数量以及运行者使用的 CPU 数量等信息。

使用Runner来运行你的Job

在为您的项目配置运行程序并使其可用后,您的 CI/CD 作业可以使用该运行程序。

在 .gitlab-ci.yml 文件中指定运行器的名称或其标签。然后,当您提交到存储库时,管道运行,运行程序的执行程序处理命令。

特征功能

GitLab Runner 拥有以下功能

  • 同时运行多个Job
  • 对多个服务器(甚至每个项目)使用多个令牌。
  • 限制每个令牌的并发作业数。
  • Job可以被运行
    • 本地化
    • 使用Docker容器
    • 使用 Docker 容器并通过 SSH 执行作业。
    • 在不同的云和虚拟化管理程序上使用具有自动伸缩功能的 Docker 容器。
    • 连接到远程 SSH 服务器。
  • 用 Go 编写并作为单个二进制文件发布,没有任何其他要求。
  • 支持 Bash、PowerShell Core 和 Windows PowerShell。
  • 适用于 GNU/Linux、macOS 和 Windows(几乎可以在任何可以运行 Docker 的地方)。
  • 允许自定义作业运行环境。
  • 无需重新启动即可自动重新加载配置。
  • 易于使用的设置,支持 Docker、Docker-SSH、Parallels 或 SSH 运行环境。
  • 启用 Docker 容器的缓存。
  • 易于安装为 GNU/Linux、macOS 和 Windows 的服务。
  • 嵌入 Prometheus 指标 HTTP 服务器。
  • 监控 Prometheus 指标和其他特定于工作的数据并将其传递给 GitLab。

安装GitLab Runner

在Docker容器中运行Runner,GitLab Runner Docker 镜像(基于 Ubuntu 或 Alpine Linux)被设计为标准 gitlab-runner 命令的包装器,就像 GitLab Runner 直接安装在主机上一样。

安装 Docker 镜像并启动容器

开始之前确保Docker服务己经安装在机器上。

要在 Docker 容器中运行 gitlab-runner,需要确保容器重启时配置不会丢失。为此,有两个选项,如下所述。

  1. 如果您使用的是 session_server,您还需要通过在 docker run 命令中添加 -p 8093:8093 来公开端口 8093。
  2. 如果要使用 Docker Machine 执行器进行自动缩放功能,还需要挂载 Docker Machine 存储路径:/root/.docker/machine:
    • 通过添加 -v /srv/gitlab-runner/docker-machine-config:/root/.docker/machine 进行系统卷挂载
    • 通过为 Docker 命名卷添加 -v docker-machine-config: /root/.docker/machine

此设置将 Docker 守护程序的完全控制权委托给每个 GitLab Runner 容器。效果是,如果您在同时运行其他有效负载的 Docker 守护程序中运行 GitLab Runner,隔离保证会中断。

通过本地系统卷组挂载去启动Runner容器

  1. docker run -d --name gitlab-runner --restart always \
  2. -v /Users/fansihong/gitlabRunner/config:/etc/gitlab-runner \
  3. -v /Users/fansihong/.docker/run/docker.sock:/var/run/docker.sock \
  4. gitlab/gitlabe-runner

如不指定gitlab-runner镜像版本,默认会去拉取最新(latest)版本的Tag。

注册一个 Runner

注册 Runner 者是将Runner与一个或多个 GitLab 实例绑定的过程。

可以注册多个Runner在同一台主机上,只需要重复 register 命令即可,每个Runner都有各自的配置文件。

  1. 注册Runner之前,确定Runner和GitLab实例,分别运行在不同的机器上。
  2. 选择一个token令牌
    • 对于一个共享的GitLab Runner,用管理员身份跳转到Menu —> Admin —> Runners。
    • 对于一个组内的GitLab Runner, 跳转到Settings —> CI/CD 并且展开Runner部份。
    • 对于指定项目的Runner,跳转到Settings —> CI/CD 并且展开Runner部份。

Docker

在Docker容器下使用,并且结果文件会被写入到挂载的物理卷组上面。

  1. # 进入gitlab-runner容器内
  2. docker exec -it gitlab-runner /bin/bash
  3. # 注册一个runner到指定项目里
  4. gitlab-runner register \
  5. --non-interactive \
  6. --url "https://gitlab.com/" \
  7. --registration-token "PROJECT_REGISTRATION_TOKEN" \
  8. --executor "docker" \
  9. --docker-image alpine:latest \
  10. --description "docker-runner" \
  11. --maintenance-note "Free-form maintainer notes about this runner" \
  12. --tag-list "docker,aws" \
  13. --run-untagged="true" \
  14. --locked="false" \
  15. --access-level="not_protected"