介绍
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 的默认存储库安装 postgresql
和 postgresql-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”示例。