如何在Ubuntu16.04上安装ConcourseCI

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

在本教程中,我们将演示如何在 Ubuntu 16.04 服务器上安装 Concourse CI。 我们将配置一个 PostgreSQL 数据库用作后端,下载并安装 Concourse 二进制文件,然后配置允许我们构建和执行持续集成管道的 Web 和工作进程。

先决条件

要完成本指南,您需要一台至少具有 1 GB RAM 的 Ubuntu 16.04 服务器。 在继续之前,按照 Ubuntu 16.04 初始服务器设置指南 中的说明配置非 root sudo 用户和防火墙。

安装和配置 PostgreSQL

在我们下载 Concourse CI 二进制文件之前,我们应该在我们的服务器上设置一个 PostgreSQL 实例。 Concourse 将使用 PostgreSQL 数据库来存储其管道数据。

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

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

安装数据库软件后,我们将创建一个名为 concourse 的专用 PostgreSQL 用户来管理数据库系统中的 Concourse 资产。 要创建此用户,我们将使用 sudo 作为 postgres 系统用户,该用户对数据库系统具有管理员访问权限:

sudo -u postgres createuser concourse

默认情况下,Concourse 会尝试连接到名为 atc 的数据库。 Concourse 将其主要的网络和 API 中心称为“ATC”,即“空中交通管制”。 我们可以创建此数据库并将所有权分配给 concourse 数据库用户以提供适当的访问权限:

sudo -u postgres createdb --owner=concourse atc

有了我们的数据库,我们现在就可以下载和安装 Concourse CI 二进制文件了。

下载并安装 Concourse CI 可执行文件

Concourse 在其网站和 GitHub 上都提供了指向 Linux 平台的已编译可执行文件的链接。

最容易找到它们的地方是 Concourse CI 下载页面。 在 Downloads 部分的 Concourse Binaries 部分下,右键单击并复制 Linux 平台下载的链接位置。 保持此页面打开,因为我们将立即返回。

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

cd /tmp
curl -LO copied_URL_for_concourse_binary

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

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

cd /tmp
curl -LO copied_URL_for_fly_binary

如果下载请求导致错误,文件将包含 HTTP 错误消息而不是二进制程序。 通过键入以下内容检查文件是否实际上是二进制可执行文件:

file *linux_amd64 | grep executable
Outputconcourse_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
fly_linux_amd64:       ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

上面的输出表明文件是可执行文件。 我们可以为文件添加可执行权限,删除 _linux_amd64 后缀,然后通过键入以下命令将它们移动到 /usr/local/bin 目录:

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

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

cd ~
concourse --version
fly --version
Output3.0.1
3.0.1

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

创建 Concourse CI 配置资产

接下来,我们可以开始整理 Concourse 将用于启动的配置和密钥。

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

sudo mkdir /etc/concourse

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

创建密钥文件

Concourse 由一些相关的组件组成,它们都需要能够彼此安全地通信。

ATC 是处理 Web 和 API 请求并协调管道的主要枢纽。 Workers 管理容器以运行管道中定义的 CI/CD 任务。 TSA 是一个自定义 SSH 服务器,可以安全地向 ATC 注册工作人员。

即使我们将在单个服务器上运行所有这些组件,worker 和 TSA 也希望能够安全地通信。 为了满足这个期望,我们将创建三组密钥:

  • TSA 组件的密钥对
  • 工人的密钥对
  • 会话签名密钥对,用于对用户会话和 TSA 到 ATC 通信的令牌进行签名

由于这些将在每个组件启动时自动使用,因此我们需要在没有密码的情况下创建这些密钥。 我们可以通过键入以下命令在 /etc/concourse 目录中创建每个密钥对:

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

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

ls -l /etc/concourse
Outputtotal 24
-rw------- 1 root root 1679 May 11 17:19 session_signing_key
-rw-r--r-- 1 root root  394 May 11 17:19 session_signing_key.pub
-rw------- 1 root root 1679 May 11 17:19 tsa_host_key
-rw-r--r-- 1 root root  394 May 11 17:19 tsa_host_key.pub
-rw------- 1 root root 1675 May 11 17:19 worker_key
-rw-r--r-- 1 root root  394 May 11 17:19 worker_key.pub

TSA 将通过检查授权密钥文件来决定授权哪些工作人员连接到系统。 我们需要使用我们生成的工作人员的公钥预先填充授权密钥文件,以便它可以成功连接。

由于这是我们唯一的工作人员,我们可以将文件复制过来:

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

现在我们有了授权工作人员的密钥文件和初始文件,我们可以创建将定义我们的 Concourse 配置的文件。

创建环境配置文件

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

稍后,我们将创建 systemd 单元文件来定义和管理我们的 Concourse 服务。 单元文件可以从文件中读取环境变量,并在进程启动时将它们传递给进程。 我们将创建一个文件来定义 Concourse web 进程的变量,它启动 ATC 和 TSA 组件,以及另一个文件用于 Concourse worker 进程。

通过键入以下内容为 web 进程创建并打开一个文件:

sudo nano /etc/concourse/web_environment

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

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

/etc/concourse/web_environment

# These values can be used as-is
CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql

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

我们还将为作为 Concourse 管理组的 main 团队设置用户名和密码。 您可以在此处选择您喜欢的任何用户名和密码。 您可以随时通过修改这些值并重新启动服务来更改管理员凭据:

/etc/concourse/web_environment

# These values can be used as-is
CONCOURSE_SESSION_SIGNING_KEY=/etc/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/etc/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/etc/concourse/authorized_worker_keys
CONCOURSE_POSTGRES_SOCKET=/var/run/postgresql

# Change these values to match your environment
CONCOURSE_BASIC_AUTH_USERNAME=sammy
CONCOURSE_BASIC_AUTH_PASSWORD=theshark
CONCOURSE_EXTERNAL_URL=http://servers_public_IP:8080

完成后保存并关闭文件。

接下来,为worker进程创建环境文件:

sudo nano /etc/concourse/worker_environment

在内部,我们将定义工作人员的私钥、TSA 的公钥以及工作人员存储其文件的目录的位置。 我们还将设置可以访问 TSA 的地址,在我们的例子中是 localhost。 您可以不加修改地使用以下值:

/etc/concourse/worker_environment

# These values can be used as-is
CONCOURSE_WORK_DIR=/var/lib/concourse
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/etc/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/etc/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1:2222

完成后保存并关闭文件。

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

在我们继续之前,我们应该创建一个专用的 Linux 用户来运行 Concourse web 进程。 这将允许我们以有限的权限启动面向 Web 的服务。

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

sudo adduser --system --group concourse

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

sudo chown -R concourse:concourse /etc/concourse

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

sudo chmod 600 /etc/concourse/*_environment

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

为 Web 和工作进程创建 Systemd 单元文件

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

创建 Concourse Web 单元文件

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

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

在里面,粘贴以下内容:

/etc/systemd/system/concourse-web.service

[Unit]
Description=Concourse CI web process (ATC and TSA)
After=postgresql.service

[Service]
User=concourse
Restart=on-failure
EnvironmentFile=/etc/concourse/web_environment
ExecStart=/usr/local/bin/concourse web

[Install]
WantedBy=multi-user.target

文件的第一部分设置 web 进程的单元描述,并指示在决定订购时该单元应在 PostgreSQL 单元之后启动。

[Service] 部分定义了服务的运行方式。 我们将以我们之前配置的 concourse 用户身份运行服务,并告诉 systemd 如果服务失败自动重启服务,这在进程因内存限制或类似问题而死时很有用。 我们加载我们之前定义的 web_environment 文件来建立环境,我们通过调用 concourse web 来启动实际进程。

[Install] 部分告诉 systemd 如果我们将服务配置为在启动时启动,如何将单元绑定到系统启动顺序。

完成后保存并关闭文件。

创建 Concourse Worker 单元文件

接下来,打开一个类似的文件来定义worker进程:

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

在里面,粘贴以下内容:

/etc/systemd/system/concourse-worker.service

[Unit]
Description=Concourse CI worker process
After=concourse-web.service

[Service]
User=root
Restart=on-failure
EnvironmentFile=/etc/concourse/worker_environment
ExecStart=/usr/local/bin/concourse worker

[Install]
WantedBy=multi-user.target

该单元的功能类似于 concourse-web 单元。 这一次,我们告诉系统在 Concourse web 进程启动后启动 worker 进程。 worker 进程以 root 用户而不是 concourse 用户身份运行,因为它需要容器管理的管理权限。 我们加载 worker_environment 文件并使用 concourse worker 命令启动进程。

完成后保存并关闭文件。

调整防火墙并启动服务

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

web 进程将监听端口 8080 上的连接,因此我们需要在 ufw 防火墙中打开对该端口的访问:

sudo ufw allow 8080

worker 进程使用的容器需要转发访问,以便它们能够正确访问 Internet 并解析 DNS 查询。 我们可以通过键入以下内容来启用它:

sudo ufw default allow routed

我们现在可以通过键入以下内容来启动我们的服务:

sudo systemctl start concourse-web concourse-worker

我们可以通过键入以下内容来检查这两个服务是否已正确启动:

sudo systemctl status concourse-web concourse-worker
Output● concourse-web.service - Concourse CI web process (ATC and TSA)
   Loaded: loaded (/etc/systemd/system/concourse-web.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-05-11 20:18:16 UTC; 1min 40s ago
 Main PID: 9954 (concourse)
    Tasks: 7
   Memory: 100.0M
      CPU: 2.058s
   CGroup: /system.slice/concourse-web.service
           └─9954 /usr/local/bin/concourse web

May 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"}}
. . .

● concourse-worker.service - Concourse CI worker process
   Loaded: loaded (/etc/systemd/system/concourse-worker.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-05-11 20:18:16 UTC; 1min 39s ago
 Main PID: 9960 (concourse)
    Tasks: 9
   Memory: 619.6M
      CPU: 20.353s
   CGroup: /system.slice/concourse-worker.service
           └─9960 /usr/local/bin/concourse worker

May 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":""}}
. . .

检查两个服务是否都读取“活动(运行)”并且日志行不包含任何明显的错误。 请特别注意 web 服务,以确保日志行没有指示连接到数据库的问题。

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

sudo systemctl enable concourse-web concourse-worker

通过命令行和 Web 界面检查访问

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

在命令行上检查访问

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

我们必须使用 login 子命令在 /etc/concourse/web_environment 文件中配置的管理用户名和密码登录。 单个 fly 二进制文件可用于联系和管理多个 Concourse 服务器,因此该命令使用称为“目标”的概念作为不同服务器的别名。 我们将调用我们的目标“本地”来登录本地 Concourse 服务器:

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

系统将提示您输入 main 团队的用户名和密码,我们在 web_environments 文件中设置。 输入您的凭据后,应显示“目标已保存”:

Outputlogging in to team 'main'

username: sammy
password: 

target saved

这表明我们能够成功登录。 当我们在这里时,让我们通过键入以下内容来验证工作进程是否能够成功注册到 TSA 组件:

fly -t local workers
Outputname              containers  platform  tags  team  state    version
concourse-server  0           linux     none  none  running  1.0

fly 命令用于配置管道和管理 Concourse CI 服务。 fly help 命令提供有关附加命令的信息。

通过 Web 界面检查访问

接下来,通过在 Web 浏览器中访问服务器的 IP 地址和 :8080 来检查 Web 访问:

http://servers_public_IP:8080

您应该能够访问初始的 Concourse CI 页面:

从这里,您可以选择通过单击与您的平台对应的图像,将 fly 命令作为命令行客户端下载到本地计算机。 这使您无需登录服务器即可管理 CI 环境。 首次使用 fly 登录时,请记住提供服务器的公共 IP 地址,而不是 127.0.0.1(远程登录前请阅读下面有关加密的警告)。

点击右上角的【X20X】登录【X29X】链接,即可登录网页界面。 首先,您将被要求选择您的团队。 main 团队是管理组,默认情况下是唯一可用的选择:

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

警告:Concourse CI提供的Web界面和API网关默认没有加密,所以你的用户名和密码会以明文形式提交给服务器。 如果您计划将此安装用于评估目的以外的任何用途,请在登录前使用 SSL 保护 Web 界面。 按照我们关于 为 Concourse CI 设置受 SSL 保护的 Nginx 反向代理的说明来配置安全访问。


输入您在 web_environment 文件中配置的凭据后,您将登录并返回默认占位符界面:

使用 fly 将管道配置提交到服务器后,此屏幕将替换为可以监视管道活动的界面。

结论

在本指南中,我们安装了 PostgreSQL 和 Concourse 二进制文件,设置了加密密钥,并配置了 Concourse 和网络访问。 启动服务后,我们使用 fly 命令在本地登录并访问 Web 界面以确认功能。

如前所述,在您使用 Concourse 进行实际工作之前,使用 SSL 保护 Web 和 API 网关非常重要。 按照我们的指南 使用 Nginx 为 Concourse CI 设置 SSL 反向代理,以在与服务器进行远程交互之前配置对服务器的安全访问。

要了解如何使用 fly 将管道添加到您的 Concourse 服务器,请查看 Concourse 文档 中的 “hello world”示例。