如何在 DigitalOcean 上使用 GitLab Runner 自动扩展 GitLab 持续部署

介绍

GitLab是软件团队用来管理其完整开发和交付生命周期的开源工具. GitLab提供了一套广泛的功能:问题跟踪、git寄存器、连续集成、集装箱登记、部署和监测。 这些特征都是从地上建立起来的,作为一个单一的应用. 您可以在自己的服务器上主机GitLab,也可以使用GitLab.com,此云服务,开源项目免费获得所有顶级功能.

GitLab 的连续集成/连续交付(CI/CD)功能是建立在部署前测试所有代码的习惯的有效方法。GitLab CI/CD 还可以通过一个额外的工具,GitLab Runner,自动扩展您的构建队列,以避免开发团队试图发布代码的漫长等待时间。

在本指南中,我们将展示如何配置一个高度可扩展的GitLab基础设施,该基础设施可以管理自己的成本,并通过增加和减少可用的服务器容量来自动响应负载。

目标

我们将在DigitalOcean上构建一个可扩展的CI/CD流程,该流程将通过在平台上创建新的服务器来自动响应需求,并在排队位空时摧毁它们。

这些可重复使用的服务器由GitLab Runner流程产生的,在没有工作运行时自动删除,从而为您的团队降低成本和管理负担。

正如我们将在本教程中解释的那样,您可以控制在任何时间创建了多少台机器,以及它们在被摧毁之前保留了多长时间。

我们将使用三个独立的服务器来构建这个项目,所以让我们先谈谈术语:

GitLab : 您所主持的 GitLab 实例或自办实例, 您的代码寄存器存储 。 @GitLab Bastion*:服务器或Droplet是我们配置的核心。 它是用来与 DigitalOcean API 互动的控件实例,用于创建Droplets,并在必要时销毁. 此服务器上没有执行任务 。 *GitLab Runners :您的 _runners_是当需要执行构建队列中的CI/CD任务时由_bastion_服务器在苍蝇上创建的瞬态服务器或滴滴. 这些服务器是可支配的,并且是在您的构建被标记为通过或失败之前执行或测试您的代码的地方. .

GitLab Runners Diagram

通过利用 GitLab 每个组件,CI/CD 流程将使您能够根据需求响应性地扩展,考虑到这些目标,我们准备开始与 GitLab 和 DigitalOcean 建立持续部署。

前提条件

本教程将假设您已经在自己的服务器上或通过托管服务配置了 GitLab,并且您已拥有现有 DigitalOcean 帐户。

要在Ubuntu 16.04 Droplet上设置此功能,您可以使用DigitalOcean单击图像,或遵循我们的指南:`如何在Ubuntu 16.04上安装和配置GitLab(https://andsky.com/tech/tutorials/how-to-install-and-configure-gitlab-on-ubuntu-16-04)。

对于本教程的目的,我们假定您已在这个Dropplet上启用了私人网络,您可以通过遵循我们的指南)实现,但它不是强制性的。

在本教程中,我们将使用在我们的Dropplets上拥有管理权限的非根用户。

第1步:导入JavaScript项目

首先,我们将在现有 GitLab 实例中创建一个新的示例项目,其中包含一个示例 Node.js 应用程序。

GitLab Interface

登录您的 GitLab 实例,点击 plus 图标 ,然后从下载菜单中选择** 新项目** 。

在新项目屏幕上,选择 导入项目 标签,然后单击 ** Repo by URL** 直接从 GitHub 导入我们的示例项目。

将下面的克隆 URL 粘贴到 Git 存储库 URL:

1https://github.com/do-community/hello_hapi.git

这个存储库是一个基本的JavaScript应用程序,用于演示目的,我们不会在生产中运行。

你的新项目现在将在GitLab中,我们可以开始设置我们的CI管道。

步骤2 - 设置基础设施

我们的 GitLab 代码运行器需要特定的配置,因为我们计划编程创建 Droplets 来处理 CI 负载,因为它在增长和缩小。

我们将在本教程中创建两种类型的机器:一个 bastion 实例,该实例控制和生成新机器,以及我们的** runner** 实例,这些实例是由堡垒Droplet生成的临时服务器,以在需要时构建代码。

以下是我们将使用的DigitalOcean产品,以及每个组件用于什么:

我们将会为GitLab Runners创建内存优化的 Dlopplets, 因为它是一个内存密集的过程, 你可以在未来按需要收缩或种出这个 Droplet, 但是我们建议灵活的 Droplet 选项作为出发点 来理解你的管线如何在负荷下运行。 *数字海洋空间(物体存储) - 我们将使用) 将缓存的构件在你的跑道上持续地被创建和摧毁。 这缩短了在CI管线繁忙时设置新跑道所需的时间,并使得新跑道能够接起其他人立即离开的地方. *私有网络 ——我们将为您的bastion Droplet和GitLab跑道建立私有网络,以确保安全代码编译,并减少所需的防火墙配置. .

要开始,我们将创建一个堡垒 Droplet. 创建一个 新 Droplet,然后在 选择图像 下,选择** One-click apps** 选项卡。 从那里,选择** Docker 17.12.0-ce 在 16.04** (请注意,这个版本在写作时是当前的),然后选择最小的 Droplet 尺寸可用,因为我们的堡垒 Droplet 将管理其他 Droplets 创建而不是实际执行测试。

建议您在包含 DigitalOcean Spaces的数据中心创建服务器,以便使用上述对象存储缓存功能。

选择私人网络监控选项,然后单击创建滴滴

我们还需要设置我们将用于缓存的存储空间。 按照[如何创建数字海洋空间和API密钥](https://andsky.com/tech/tutorials/how-to-create-a-digitalocean-space-and-api-key)中的步骤,在与您托管的GitLab实例相同或最近的数据中心创建一个新的空间,以及一个API密钥。

记住这个键,因为我们将在教程中稍后需要它。

现在是时候让我们的CI开始了!

步骤 3 — 配置 GitLab Runner Bastion 服务器

有了新鲜的Droplet,我们现在可以配置GitLab Runner,我们将从GitLab和GitHub存储库安装脚本。

作为最佳实践,请确保检查脚本,以确认您将在运行下面的完整命令之前安装什么。

使用 SSH 连接到 Droplet,进入 /tmp 目录,然后将 官方 GitLab Runner 存储库添加到 Ubuntu 的包管理器:

1cd /tmp
2curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

添加后,安装 GitLab Runner 应用程序:

1sudo apt-get install gitlab-runner

我们还需要安装 Docker Machine ,这是一个额外的Docker工具,有助于在云提供商上自动部署容器:

1curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
2sudo install /tmp/docker-machine /usr/local/bin/docker-machine

完成这些安装后,我们可以继续将我们的GitLab Runner连接到我们的GitLab安装。

步骤 4 – 获取 Runner 注册代币

要将GitLab Runner链接到您的现有GitLab安装,我们需要通过获得一个代币来将您的运行器认证到您的代码存储库来连接这两个实例。

登录您的现有 GitLab 实例作为 admin 用户,然后点击 wrench 图标进入 admin 设置区域。

在屏幕的左侧,移动到 概览 ,并从显示的列表中选择** 跑者** 。

如何为新项目设置共享 Runner部分的Runners页面上,复制第 3 步中显示的代币,并在第 2 步中记下您的 GitLab 实例的公开可用 URL。

步骤 5 — 在 Bastion Droplet 上配置 GitLab

回到你的 SSH 连接与你的堡垒 Droplet,运行以下命令:

1sudo gitlab-runner register

这将启动链接过程,您将被问到一系列问题。

在下一步中,输入前一步中的 GitLab 实例 URL :

1Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com)
2https://example.digitalocean.com

输入您从 GitLab 实例中获得的代币:

1Please enter the gitlab-ci token for this runner
2sample-gitlab-ci-token

请在 GitLab Web 界面中输入一个描述,以帮助您识别它,我们建议为此实例命名一些独特的名称,例如runner-bastion

1Please enter the gitlab-ci description for this runner
2[yourhostname] runner-bastion

如果有必要,您可以输入您将与运行器构建的代码的标签,但我们建议在这个阶段留空。

1Please enter the gitlab-ci tags for this runner (comma separated):
2code-tag

选择你的跑者是否应该能够运行未标记的工作. 此设置允许你选择你的跑者是否应该构建没有标记的存储库,或者需要特定标签。

1Whether to run untagged jobs [true/false]: true

选择这个运行器是否应该在您的项目中共享,或锁定到当前的项目中,这将阻止它构建其他代码,而不是指定的代码。

1Whether to lock Runner to current project [true/false]: false

因为我们将使用Docker创建新的Droplets,我们将在这里选择):

1Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
2docker+machine

您将被问及在没有明确定义一个项目时使用哪个图像,我们将选择一个基本的安全默认:

1Please enter the Docker image (e.g. ruby:2.1):
2alpine:latest

现在你已经完成了核心堡垒运行器的配置! 在此时刻,它应该出现在你的GitLab管理设置的GitLab Runner页面中,我们访问了它来获取代币。

如果您在这些步骤中遇到任何问题,GitLab Runner 文档(https://docs.gitlab.com/runner/register/index.html)包含解决问题的选项。

第6步:配置Docker缓存和Docker机器

为了在构建队列忙碌时加快 Droplet 创建,我们将利用 Docker 的缓存工具在 Bastion Droplet 上存储您在 DigitalOcean Spaces 上常用的容器的图像。

要做到这一点,请使用以下命令在您的 SSH 壳上升级 Docker Machine:

1curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && sudo install /tmp/docker-machine /usr/local/bin/docker-machine

随着Docker Machine的升级,我们可以继续为GitLab Runner设置我们的访问代币。

第7步:收集数字海洋凭证

现在我们需要创建GitLab Runner将使用的身份证来使用您的DigitalOcean帐户创建新的Dropplets。

访问您的DigitalOcean(Dashboard)(https://cloud.digitalocean.com)并点击 API . 在下一个屏幕上,搜索** 个人访问代币** ,然后点击** 生成新代币** 。

给新代币一个你会识别的名称,例如GitLab Runner Access,并确保读写范围都启用,因为我们需要Droplet来创建新的机器,而无需人为干预。

将代币复制到安全的地方,因为我们将在下一步使用它. 您无法再次检索此代币而无需再生它,所以请确保它被安全存储。

第8步:编辑 GitLab Runner 配置文件

为了将所有这些组件结合起来,我们需要完成配置我们的堡垒Droplet以与您的DigitalOcean帐户进行通信。

在你的 SSH 连接到你的堡垒 Droplet 中,使用你最喜欢的文本编辑器,如 nano,打开 GitLab Runner 配置文件进行编辑:

1nano /etc/gitlab-runner/config.toml

此配置文件负责您的 CI 设置使用的规则,以根据需求扩展。

 1[label /etc/gitlab-runner/config.toml]
 2concurrent = 50   # All registered Runners can run up to 50 concurrent builds
 3
 4[[runners]]
 5  url = "https://example.digitalocean.com"
 6  token = "existinggitlabtoken"             # Note this is different from the registration token used by `gitlab-runner register`
 7  name = "example-runner"
 8  executor = "docker+machine"        # This Runner is using the 'docker+machine' executor
 9  limit = 10                         # This Runner can execute up to 10 builds (created machines)
10  [runners.docker]
11    image = "alpine:latest"               # Our secure image
12  [runners.machine]
13    IdleCount = 1                    # The amount of idle machines we require for CI if build queue is empty
14    IdleTime = 600                   # Each machine can be idle for up to 600 seconds, then destroyed
15    MachineName = "gitlab-runner-autoscale-%s"    # Each machine will have a unique name ('%s' is required and generates a random number)
16    MachineDriver = "digitalocean"   # Docker Machine is using the 'digitalocean' driver
17    MachineOptions = [
18        "digitalocean-image=coreos-stable", # The DigitalOcean system image to use by default
19        "digitalocean-ssh-user=core", # The default SSH user
20        "digitalocean-access-token=DO_ACCESS_TOKEN", # Access token from Step 7
21        "digitalocean-region=nyc3", # The data center to spawn runners in
22        "digitalocean-size=1gb", # The size (and price category) of your spawned runners
23        "digitalocean-private-networking" # Enable private networking on runners
24    ]
25  [runners.cache]
26    Type = "s3"   # The Runner is using a distributed cache with the S3-compatible Spaces service
27    ServerAddress = "nyc3.spaces.digitaloceanspaces.com"
28    AccessKey = "YOUR_SPACES_KEY"
29    SecretKey = "YOUR_SPACES_SECRET"
30    BucketName = "your_bucket_name"
31    Insecure = true # We do not have a SSL certificate, as we are only running locally

一旦你添加了新的行,根据你的设置定制访问代码、区域和Droplet大小。 为此教程的目的,我们使用了最小的Droplet大小为1GB,并在NYC3创建了我们的Droplets。

您还需要自定义缓存组件,并从基础设施配置步骤输入您的空间的服务器地址,访问密钥,秘密密密钥和您创建的空间的名称。

完成后,重新启动 GitLab Runner 以确保正在使用的配置:

1gitlab-runner restart

如果您想了解更多有关所有可用的选项,包括高峰时间,您可以阅读 GitLab 的先进文档

第9步:测试你的GitLab Runner

在此时,我们的GitLab Runner堡垒Droplet已配置并可根据需求创建DigitalOceanDroplets,因为CI队列填充,我们将需要测试它以确保它通过前往您的GitLab实例和我们在步骤1中导入的项目来工作。

要触发构建,请通过点击它来编辑readme.md文件,然后点击edit**,并将任何相关的测试文本添加到文件中,然后点击Commit changes**

现在将自动启动构建,可以在左侧导航中找到项目的 CI/CD 选项。

在您的 DigitalOcean 帐户中,您将看到 GitLab Runner 自动创建的一些 Droplets 以构建此更改。

恭喜您!您的 CI 管道可扩展到云端,现在可以管理自身的资源使用量。指定空闲时间后,机器应自动销毁,但我们建议手动验证,以确保您不会意外收费。

解决问题

在某些情况下,GitLab可能会报告跑者无法到达,因此不会执行任何操作,包括部署新跑者,您可以通过停止GitLab Runner,然后在调试模式中重新启动此问题:

1gitlab-runner stop
2gitlab-runner --debug start

输出应该引发错误,这将有助于确定哪个配置导致问题。

如果您的配置创建了太多的机器,并且您希望同时删除它们,您可以运行此命令来摧毁它们:

1docker-machine rm $(docker-machine ls -q)

有关更多故障排除步骤和其他配置选项,请参阅 GitLab 的文档

结论

您已成功地使用 GitLab Runner 和 Docker 设置了自动化的 CI/CD 管道,从这里开始,您可以使用 Docker Registry 配置更高级别的缓存,以优化性能,或探索用于特定 GitLab 代码运行器的标记代码构建的使用。

有关GitLab Runner的更多信息,请参阅详细的文档(https://docs.gitlab.com/runner/),或了解更多信息,您可以阅读GitLab的博客文章系列(https://docs.gitlab.com/ee/ci/)关于如何最大限度地利用您的连续集成管道。

_本文还出现在 GitLab 博客

Published At
Categories with 技术
comments powered by Disqus