介绍
Concourse CI是一种现代可扩展的连续集成系统,旨在通过可组合的声明式语法来自动化测试管道。 建立早期CI系统的成功,Concourse的目的是简化管道管理,消除“雪花”服务器,使测试服务器与其处理的代码一样受到监管。
在本教程中,我们将演示如何在Ubuntu 16.04服务器上安装Concourse CI。 我们将配置一个PostgreSQL数据库作为后端,下载和安装Concourse二进制文件,然后配置允许我们构建和执行连续集成管道的Web和工作进程。
先决条件
要完成本指南,您将需要一个至少有1 GB RAM的Ubuntu 16.04服务器。 按照Ubuntu 16.04初始服务器设置指南中所述配置非root用户和防火墙,然后再继续。
安装和配置PostgreSQL
在下载Concourse CI二进制文件之前,我们应该在我们的服务器上设置一个PostgreSQL实例。 大厅将使用PostgreSQL数据库来存储其流水线数据。
首先,更新本地软件包索引以刷新可用文件的本地视图。 然后,从Ubuntu的默认存储库安装postgresql
和postgresql-contrib
软件包:
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
一旦安装了数据库软件,我们将创建一个专门的PostgreSQL用户名为“ concourse
,以管理数据库系统中的Concourse资产。 要创建此用户,我们将使用sudo
作为postgres
系统用户,该用户具有管理员访问数据库系统的权限:
sudo -u postgres createuser concourse
默认情况下,Concourse尝试连接到一个名为atc的数据库。 广场称其主要的网络和API集线器为“空中交通管制”。 我们可以创建此数据库,并将所有权分配给concourse
数据库用户以提供适当的访问权限:
sudo -u postgres createdb --owner=concourse atc
随着我们的数据库到位,我们现在可以下载并安装Concourse CI二进制文件。
下载并安装Concert CI可执行文件
Concourse提供了链接到编译的可执行文件的Linux平台在他们的网站和GitHub。
找到它们的最简单的地方是在Concourse CI下载页面 。 在“ 下载”部分的“ Concourse Binaries”一节中,右键单击并复制Linux平台下载的链接位置。 保持这个页面开放,因为我们将暂时回来。
在您的服务器上,切换到/tmp
,然后使用curl
下载您复制的链接:
cd /tmp
curl -LO copied_URL_for_concourse_binary
接下来,我们将下载最新的fly
命令行客户端。 回到Concourse CI下载页面 ,在“ 下载”部分的“ 飞行二进制”部分下,右键单击并复制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
Postfix,并通过键入以下命令将其移动到/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。
创建大厅CI配置资产
接下来,我们可以开始汇集大会将用于启动的配置和密钥。
在我们开始之前,创建一个配置目录,我们可以保留所有相关的文件:
sudo mkdir /etc/concourse
我们现在可以生成加密密钥并创建定义我们的Concourse配置的文件。
创建密钥文件
大厅由几个相关组件组成,所有组件都需要能够彼此安全地通信。
ATC是处理Web和API请求并协调管道的主要枢纽。 工作人员管理容器以运行管道中定义的CI / CD任务。 TSA是一个定制的SSH服务器,可以安全地向ATC注册工作人员。
即使我们将在单个服务器上运行所有这些组件,工作人员和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
如果我们检查大厅目录,我们可以看到三个公钥和三个私钥现在可用:
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套接字位置:
# 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。
我们还将为main
团队设置用户名和密码,作为大会行政小组。 您可以在此处选择任何用户名和密码。 您可以随时通过修改这些值并重新启动服务来更改管理员凭据:
# 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的地址,这将是本地的本地主机。 您可以使用以下值进行修改:
# 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
完成后保存并关闭文件。
创建专用系统用户和调整权限
在开始之前,我们应该创建一个专门的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
进程创建一个文件。
创建大厅Web单元文件
首先在/etc/systemd/system
文件中创建一个concourse-web.service
文件:
sudo nano /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如何将设备与系统启动顺序相关联。
完成后保存并关闭文件。
创建大厅工作单位文件
接下来,打开一个类似的文件来定义worker
进程:
sudo nano /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
进程使用的容器需要转发访问权限,以便他们可以正确地访问互联网并解决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界面检查访问
现在广场服务正在运行,我们应该检查我们是否可以访问。
在命令行上检查访问
首先,我们来检查一下,我们可以使用fly
命令行客户端访问Concourse服务。
我们必须使用我们在/etc/concourse/web_environment
文件中使用login
子命令配置的管理用户名和密码login
。 单一fly
二进制文件可用于联系和管理多个Concourse服务器,因此该命令使用称为“目标”的概念作为不同服务器的别名。 我们会把我们的目标称为“本地”,登录到当地的Concourse服务器:
fly -t local login -c http://127.0.0.1:8080
系统将提示您输入我们在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界面检查访问
接下来,通过访问您的服务器的IP地址,然后访问网络访问:8080
在Web浏览器中:
http://servers_public_IP:8080
您应该能够访问最初的大厅CI页面:
从这里,您可以通过点击与您的平台对应的图像,将fly
命令作为命令行客户端下载到本地计算机。 这允许您管理您的CI环境,而无需登录到服务器。 请记住在首次登录时提供您的服务器的公共IP地址而不是127.0.0.1
(请阅读下面的加密警告,然后再登录远程)。
如果您点击右上角的登录链接,您可以登录到Web界面。 首先,您将被要求选择您的团队。 主要团队是行政组织,默认情况下是唯一可用的选择:
在下一页,您将被要求输入凭据。
警告 :由Concourse CI提供的Web界面和API网关默认情况下不加密,因此您的用户名和密码将作为纯文本提交到服务器。 如果您计划将此安装用于除评估之外的其他任何内容,请在登录之前使用SSL保护Web界面。按照我们关于为Concourse CI设置受SSL保护的Nginx反向代理配置安全访问的说明。
输入您在web_environment
文件中配置的web_environment
之后,您将被登录并返回到默认占位符界面:
一旦您将流水线配置提交给服务器,这个屏幕将被一个可以监视管道活动的界面替换。
结论
在本指南中,我们安装了PostgreSQL和Concourse二进制文件,设置加密密钥,并配置了Concourse和网络访问。 启动服务后,我们使用fly
命令在本地登录,并访问了Web界面以确认功能。
如前所述,在使用Concourse进行实际工作之前,必须使用SSL来保护网络和API网关。 按照我们的指南, 为Ntalx的Concourse CI设置SSL反向代理,以便在与服务器远程交互之前配置对服务器的安全访问。
要了解如何使用fly
将管道添加到您的Concourse服务器,请查看Concourse文档中的“hello world”示例 。