如何在Ubuntu 16.04上安装Concert CI

Concourse CI是一种现代可扩展的连续集成系统,旨在通过可组合的声明式语法来自动化测试管道。建立早期CI系统的成功,Concourse旨在简化管道管理,消除“雪花”服务器...

介绍

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的默认存储库安装postgresqlpostgresql-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
concourse_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_amd64Postfix,并通过键入以下命令将其移动到/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
3.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
total 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 /广场/ 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。

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

在/ etc /广场/ 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的地址,这将是本地的本地主机。 您可以使用以下值进行修改:

在/ etc /广场/ 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

完成后保存并关闭文件。

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

在开始之前,我们应该创建一个专门的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

在里面粘贴以下内容:

/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

在里面粘贴以下内容:

/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
● 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文件中设置的主队的用户名和密码。 输入凭据后,应显示“目标保存”:

logging in to team 'main'

username: sammy
password: 

target saved

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

fly -t local workers
name              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页面:

大厅CI初始屏幕

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

如果您点击右上角的登录链接,您可以登录到Web界面。 首先,您将被要求选择您的团队。 主要团队是行政组织,默认情况下是唯一可用的选择:

大厅CI选择主要团队

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

警告 :由Concourse CI提供的Web界面和API网关默认情况下不加密,因此您的用户名和密码将作为纯文本提交到服务器。 如果您计划将此安装用于除评估之外的其他任何内容,请在登录之前使用SSL保护Web界面。按照我们关于为Concourse CI设置受SSL保护的Nginx反向代理配置安全访问的说明。

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

大厅CI选择主要团队

一旦您将流水线配置提交给服务器,这个屏幕将被一个可以监视管道活动的界面替换。

结论

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

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

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