介绍
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 的默认存储库中安装postgresql
和postgresql-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:
从这里,您可以选择将飞
命令下载到您的本地计算机作为命令行客户端,单击与您的平台相符的图像。这允许您管理您的CI环境而无需登录服务器。在首次登录飞
时,请记住提供服务器的公共IP地址而不是127.0.0.1
。
如果您点击右上角的 login 链接,您可以登录 Web 接口. 首先,您将被要求选择您的团队。
在下一页,您将被要求输入您的凭证。
<$>[warning] 警告 :Concourse CI提供的 Web 界面和 API 网关默认不加密,因此您的用户名和密码将以简单的文本形式提交给服务器。如果您计划使用此安装用于评估目的以外的任何目的,请在登录之前使用 SSL 保护 Web 界面。
输入您在web_environment
文件中配置的凭证后,您将登录并返回默认的位置接口:
一旦你将你的管道配置提交到服务器中,这个屏幕将被一个接口取代,你可以监控你的管道活动。
结论
在本指南中,我们安装了 PostgreSQL 和 Concourse 二进制,设置了加密密钥,并配置了 Concourse 和网络访问。
如前所述,在您使用 Concourse 进行实际工作之前,重要的是使用 SSL 保护 Web 和 API 网关。 遵循我们在 设置 Concourse CI 用 Nginx 的 SSL 反向代理程序上的指南,在与服务器进行远程互动之前配置安全访问您的服务器。
要了解如何使用飞
添加管道到您的 Concourse 服务器,请参阅 Concourse 文档中的你好世界
示例(https://concourse.ci/hello-world.html)。