如何在 Ubuntu 16.04 上安装 Concourse CI

介绍

Concourse CI是一个现代化、可扩展的连续集成系统,旨在用可复制、可声明的语法自动化测试管道,基于早期CI系统的成功,Concourse旨在简化管道管理,并消除雪花服务器,以便测试服务器与其处理的代码一样受管制。

在本教程中,我们将展示如何在Ubuntu 16.04服务器上安装Concourse CI。我们将配置一个PostgreSQL数据库以作为后端使用,下载并安装Concourse二进制,然后配置Web和工人流程,使我们能够构建和执行连续集成管道。

前提条件

要完成本指南,您将需要一个 Ubuntu 16.04 服务器,至少具有 1 GB 的 RAM . 配置一个非根源的sudo用户和防火墙,如在 Ubuntu 16.04 初始服务器设置指南中所述。

安装和配置PostgreSQL

在我们下载 Concourse CI 二进制文件之前,我们应该在我们的服务器上设置一个 PostgreSQL 实例。

首先,更新本地包索引以更新可用的文件的本地视图,然后从 Ubuntu 的默认存储库中安装postgresqlpostgresql-contrib包:

1sudo apt-get update
2sudo apt-get install postgresql postgresql-contrib

一旦安装了数据库软件,我们将创建一个名为concourse的专用PostgreSQL用户来管理数据库系统中的Concourse资产。

1sudo -u postgres createuser concourse

默认情况下,Concourse 试图连接到名为atc的数据库。Concourse 将其主要的 Web 和 API 枢纽称为ATC,意思是空中交通控制。我们可以创建此数据库并将所有权分配给concourse数据库用户,以提供适当的访问权限:

1sudo -u postgres createdb --owner=concourse atc

有了我们的数据库,我们现在已经准备好下载和安装 Concourse CI 二进制。

下载并安装 Concourse CI Executables

Concourse 在其网站和 GitHub 上提供 Linux 平台的编译执行程序的链接。

最容易找到它们的地方是 Concourse CI 下载页面。在 Downloads 部分,在 ** Concourse Binaries** 部分下,右键单击并复制 ** Linux** 平台下载的链接位置。

在您的服务器上,切换到‘/tmp’目录,然后使用‘curl’下载您复制的链接:

1cd /tmp
2curl -LO copied_URL_for_concourse_binary

接下来,我们将下载最新的飞行命令行客户端. 返回 Concourse CI下载页面,在 下载 部分,在 ** 飞行二进制** 部分,右键单击并复制 ** Linux** 平台下载的链接位置。

在您的服务器上,下载复制的链接到 /tmp 再次与 curl:

1cd /tmp
2curl -LO copied_URL_for_fly_binary

如果下载请求导致错误,文件将包含一个HTTP错误消息,而不是一个二进制程序。

1file *linux_amd64 | grep executable
1[secondary_label Output]
2concourse_linux_amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3f24eae5da950594d8d1aaea7631bc20883afba3, not stripped
3fly_linux_amd64:       ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

上面的输出表明,这些文件是可执行的。我们可以将可执行的权限添加到文件中,删除_linux_amd64字符串,然后通过键入将其移动到/usr/local/bin目录:

1chmod +x concourse* fly*
2sudo mv concourse* /usr/local/bin/concourse
3sudo mv fly* /usr/local/bin/fly

询问每个程序的版本将作为一个小检查,以确保一切正常运行:

1cd ~
2concourse --version
3fly --version
1[secondary_label Output]
23.0.1
33.0.1

现在我们的二进制已经在位,我们可以开始配置 Concourse。

创建 Concourse CI 配置资产

接下来,我们可以开始组装 Concourse 将使用的配置和密钥。

在我们开始之前,创建一个配置目录,在那里我们可以保留所有相关文件:

1sudo mkdir /etc/concourse

现在我们可以生成加密密钥并创建定义我们 Concourse 配置的文件。

创建关键文件

Concourse 由几个相关组件组成,所有这些组件都需要能够安全地相互通信。

ATC是处理 Web 和 API 请求和协调管道的主要枢纽。 Workers管理集装箱来执行管道中定义的 CI/CD 任务。

尽管我们将在一个服务器上运行所有这些组件,但工人和TSA预计将安全地通信,以满足这一期望,我们将创建三组密钥:

  • TSA 组件的密钥对
  • worker 的密钥对* 会话签名密钥对用于签署用户会话的代币和 TSA 到 ATC 通信

由于这些在每个组件启动时会自动使用,我们需要创建这些密钥而无需密码,我们可以通过键入在 `/etc/concourse’ 目录中创建每个密钥对:

1sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/tsa_host_key
2sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/worker_key
3sudo ssh-keygen -t rsa -q -N '' -f /etc/concourse/session_signing_key

如果我们检查了 concourse 目录,我们可以看到三个公共和三个私人密钥现在可用:

1ls -l /etc/concourse
1[secondary_label Output]
2total 24
3-rw------- 1 root root 1679 May 11 17:19 session_signing_key
4-rw-r--r-- 1 root root 394 May 11 17:19 session_signing_key.pub
5-rw------- 1 root root 1679 May 11 17:19 tsa_host_key
6-rw-r--r-- 1 root root 394 May 11 17:19 tsa_host_key.pub
7-rw------- 1 root root 1675 May 11 17:19 worker_key
8-rw-r--r-- 1 root root 394 May 11 17:19 worker_key.pub

TSA将通过检查授权密钥文件来决定哪些工人被授权连接到系统,我们需要预先将授权密钥文件与我们生成的工人的公共密钥,以便它能够成功连接。

由于这是我们唯一的员工,我们可以简单地复制文件:

1sudo cp /etc/concourse/worker_key.pub /etc/concourse/authorized_worker_keys

现在我们有关键文件和授权工人的初始文件,我们可以创建定义我们Concourse配置的文件。

创建环境配置文件

Concourse 二进制不会本地读取配置文件,但是,它可以从进程开始时传输的环境变量中获取配置值。

在一段时间内,我们将创建systemd单元文件来定义和管理我们的Concourse服务。单元文件可以从文件中读取环境变量,并在开始时将其传输到进程中。

创建并打开Web过程的文件,键入:

1sudo nano /etc/concourse/web_environment

内部,我们将定义 ATC 和 TSA 组件所需的环境变量,每个变量都以CONCOURSE_开始。

首先,我们将定义一些不需要修改的静态值,这些变量将定义私人 TSA 和会话密钥的位置,定义授权工人的文件和 PostgreSQL 接口的位置:

1[label /etc/concourse/web_environment]
2# These values can be used as-is
3CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
4CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
5CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
6CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql

接下来,我们将设置一些变量,需要更改以匹配您的环境. CONCOURSE_EXTERNAL_URL定义服务将绑定的IP地址和端口. 将此设置为服务器的公共IP地址和端口8080.

我们还将为团队设置用户名和密码,该团队作为 Concourse 管理组。您可以在这里选择您想要的用户名和密码。您可以随时通过修改这些值并重新启动服务来更改管理员凭证:

 1[label /etc/concourse/web_environment]
 2# These values can be used as-is
 3CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
 4CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
 5CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
 6CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql
 7
 8# Change these values to match your environment
 9CONCOURSE_BASIC_AUTH_USERNAME=sammy
10CONCOURSE_BASIC_AUTH_PASSWORD=theshark
11CONCOURSE_EXTERNAL_URL=http://servers_public_IP:8080

保存并关闭文件,当你完成。

接下来,为工人过程创建一个环境文件:

1sudo nano /etc/concourse/worker_environment

内部,我们将定义工人私钥的位置,TSA的公共钥匙,以及工人将其文件存储的目录。

1[label /etc/concourse/worker_environment]
2# These values can be used as-is
3CONCOURSE_WORK_DIR=/var/lib/concourse
4CONCOURSE_TSA_WORKER_PRIVATE_KEY=/etc/concourse/worker_key
5CONCOURSE_TSA_PUBLIC_KEY=/etc/concourse/tsa_host_key.pub
6CONCOURSE_TSA_HOST=127.0.0.1:2222

保存并关闭文件,当你完成。

创建专用系统用户并调整权限

在我们继续前,我们应该创建一个专门的Linux用户来运行ConcourseWeb流程,这将使我们能够启动具有有限特权的面向Web的服务。

由于 PostgreSQL 通过默认方式处理身份验证,所以用户名必须与我们之前创建的 PostgreSQL 用户名匹配,创建一个名为concourse的系统用户和组,键入:

1sudo adduser --system --group concourse

我们可以通过键入以下方式赋予新用户对/etc/concourse目录及其内容的所有权:

1sudo chown -R concourse:concourse /etc/concourse

环境文件包含一些敏感数据,例如 CI 服务器的管理用户名和密码。 调整环境文件的权限,以便普通用户无法读取或修改这些文件中的值:

1sudo chmod 600 /etc/concourse/*_environment

我们的配置资产现在由竞赛系统用户拥有,其他用户的特权有限。

创建 Web 和 Workers 流程的 Systemd 单元文件

我们现在准备定义将启动和管理应用程序流程的Concourse CI单元文件,我们将为处理TSA和ATC组件的Web流程创建一个文件,以及处理管道任务的容器的工人流程创建一个文件。

创建 Concourse Web Unit 文件

首先,在 /etc/systemd/system 文件中创建一个 concourse-web.service 文件:

1sudo nano /etc/systemd/system/concourse-web.service

内部,粘贴下列内容:

 1[label /etc/systemd/system/concourse-web.service]
 2[Unit]
 3Description=Concourse CI web process (ATC and TSA)
 4After=postgresql.service
 5
 6[Service]
 7User=concourse
 8Restart=on-failure
 9EnvironmentFile=/etc/concourse/web_environment
10ExecStart=/usr/local/bin/concourse web
11
12[Install]
13WantedBy=multi-user.target

文件的第一个部分设置了Web过程的单元描述,并表示该单元在决定订单时应该在PostgreSQL单元之后启动。

我们将将服务运行为我们之前配置的concourse用户,并告诉systemd如果它失败,自动重新启动服务,如果过程因内存限制或类似问题而死亡,这可能有用。

[安装]部分告诉系统d如何将单元连接到系统启动顺序,如果我们将服务配置为启动时启动。

保存并关闭文件,当你完成。

创建竞赛工人单位文件

接下来,打开类似的文件来定义工人过程:

1sudo nano /etc/systemd/system/concourse-worker.service

内部,粘贴下列内容:

 1[label /etc/systemd/system/concourse-worker.service]
 2[Unit]
 3Description=Concourse CI worker process
 4After=concourse-web.service
 5
 6[Service]
 7User=root
 8Restart=on-failure
 9EnvironmentFile=/etc/concourse/worker_environment
10ExecStart=/usr/local/bin/concourse worker
11
12[Install]
13WantedBy=multi-user.target

该单元的功能与竞赛网单元类似。这次,我们告诉系统在启动竞赛网流程后启动工人流程。该工人流程作为用户而不是竞赛运行,因为它需要集装箱管理的行政权限。

保存并关闭文件,当你完成。

调整防火墙并启动服务

有了我们的单元文件,我们现在可以通过防火墙允许访问并启动服务。

Web过程会听取端口8080上的连接,所以我们需要在ufw防火墙中打开该端口的访问:

1sudo ufw allow 8080

工人流程所使用的容器需要转发访问,以便他们能够正确地访问互联网并解决DNS查询。

1sudo ufw default allow routed

我们现在可以通过键入开始我们的服务:

1sudo systemctl start concourse-web concourse-worker

我们可以通过键入检查两种服务是否正确启动:

1sudo systemctl status concourse-web concourse-worker
 1[secondary_label Output]
 2 concourse-web.service - Concourse CI web process (ATC and TSA)
 3   Loaded: loaded (/etc/systemd/system/concourse-web.service; disabled; vendor preset: enabled)
 4   Active: active (running) since Thu 2017-05-11 20:18:16 UTC; 1min 40s ago
 5 Main PID: 9954 (concourse)
 6    Tasks: 7
 7   Memory: 100.0M
 8      CPU: 2.058s
 9   CGroup: /system.slice/concourse-web.service
10           └─9954 /usr/local/bin/concourse web
11
12May 11 20:19:51 testatc concourse[9954]: {"timestamp":"1494533991.818562269","source":"tsa","message":"tsa.connection.keepalive","log_level":1,"data":{"remote":"127.0.0.1:48764","session":"1","type":"keepalive"}}
13. . .
14
15 concourse-worker.service - Concourse CI worker process
16   Loaded: loaded (/etc/systemd/system/concourse-worker.service; disabled; vendor preset: enabled)
17   Active: active (running) since Thu 2017-05-11 20:18:16 UTC; 1min 39s ago
18 Main PID: 9960 (concourse)
19    Tasks: 9
20   Memory: 619.6M
21      CPU: 20.353s
22   CGroup: /system.slice/concourse-worker.service
23           └─9960 /usr/local/bin/concourse worker
24
25May 11 20:19:12 testatc concourse[9960]: {"timestamp":"1494533952.909682751","source":"tsa","message":"tsa.connection.channel.forward-worker.heartbeat.start","log_level":1,"data":{"remote":"127.0.0.1:48764","session":"1.1.1.7","worker-address":"127.0.0.1:38993","worker-platform":"linux","worker-tags":""}}
26. . .

检查两种服务都读活跃(运行),并确保日志行不包含任何明显的错误,特别注意Web服务,以确保日志行不表示连接到数据库的问题。

如果服务成功启动,请启用它们,以便每次服务器启动时启动:

1sudo systemctl enable concourse-web concourse-worker

检查访问在命令行和通过Web接口

现在 Concourse 服务正在运行,我们应该检查我们是否有访问权。

控制在命令线上的访问

首先,让我们检查我们是否可以使用飞行命令行客户端访问 Concourse 服务。

我们必须使用我们在/etc/concourse/web_environment文件中配置的管理用户名和密码登录,使用login子命令. 一个单一的fly二进制可以用来联系和管理多个Concourse服务器,所以命令使用一个名为targets的概念作为不同的服务器的代名词。

1fly -t local login -c http://127.0.0.1:8080

您将被提示为团队的用户名和密码,我们将其设置在web_environments文件中。 输入您的身份证后,应该显示目标保存:

1[secondary_label Output]
2logging in to team 'main'
3
4username: sammy
5password: 
6
7target saved

这表明我们能够成功登录,而我们在这里,让我们检查工人流程能够通过键入成功登录TSA组件:

1fly -t local workers
1[secondary_label Output]
2name containers platform tags team state version
3concourse-server 0 linux none none running 1.0

飞行命令用于配置管道并管理Concourse CI服务. 飞行帮助命令提供有关额外命令的信息。

通过 Web 接口进行访问控制

接下来,检查网页访问,访问您的服务器的IP地址,然后在网页浏览器中:8080:

1http://servers_public_IP:8080

您应该能够访问首页 Concourse CI:

Concourse CI initial screen

从这里,您可以选择将命令下载到您的本地计算机作为命令行客户端,单击与您的平台相符的图像。这允许您管理您的CI环境而无需登录服务器。在首次登录时,请记住提供服务器的公共IP地址而不是127.0.0.1

如果您点击右上角的 login 链接,您可以登录 Web 接口. 首先,您将被要求选择您的团队。

Concourse CI select main team

在下一页,您将被要求输入您的凭证。

<$>[warning] 警告 :Concourse CI提供的 Web 界面和 API 网关默认不加密,因此您的用户名和密码将以简单的文本形式提交给服务器。如果您计划使用此安装用于评估目的以外的任何目的,请在登录之前使用 SSL 保护 Web 界面。

输入您在web_environment文件中配置的凭证后,您将登录并返回默认的位置接口:

Concourse CI select main team

一旦你将你的管道配置提交到服务器中,这个屏幕将被一个接口取代,你可以监控你的管道活动。

结论

在本指南中,我们安装了 PostgreSQL 和 Concourse 二进制,设置了加密密钥,并配置了 Concourse 和网络访问。

如前所述,在您使用 Concourse 进行实际工作之前,重要的是使用 SSL 保护 Web 和 API 网关。 遵循我们在 设置 Concourse CI 用 Nginx 的 SSL 反向代理程序上的指南,在与服务器进行远程互动之前配置安全访问您的服务器。

要了解如何使用添加管道到您的 Concourse 服务器,请参阅 Concourse 文档中的你好世界示例(https://concourse.ci/hello-world.html)。

Published At
Categories with 技术
comments powered by Disqus