怎样在 CentOS 7 上安装和配置 Concourse CI

介绍

持续集成是一种 DevOps 软件开发实践,它使开发人员能够每天多次频繁地将修改后的代码合并到共享存储库中。 每次合并后,都会执行自动构建和测试以检测代码中的问题。 它使开发人员能够快速找到并解决错误,以提高软件质量并提供软件的持续交付。 从 Concourse 来回切换非常容易,因为它将所有配置保存在声明文件中,可以检查到版本控制。 它还提供了一个 Web 用户界面,以交互方式显示构建信息。

大厅组件。

  • 空中交通管制 是Concourse的主要组成部分。 它负责运行 Web UI 和 API。 它还负责所有管道调度。
  • 运输安全管理局 是一个定制的 SSH 服务器。 它负责向 ATC 安全地注册工人。
  • 工人 进一步运行两种不同的服务:
    1. 花园 是一个容器运行时和一个接口,用于在 worker 上远程编排容器。
    2. 行李认领 是一个缓存和工件管理服务器。
  • 是一个命令行界面,用于与 ATC 交互以配置大厅管道。

先决条件

  • Vultr CentOS 7 服务器实例。
  • 一个 sudo 用户。

确保替换所有出现的 192.0.2.1ci.example.com 使用您的实际 Vultr 公共 IP 地址和实际域名。

使用指南怎样更新 CentOS 7 更新您的基本系统。更新系统后,继续安装 PostgreSQL。

安装和配置 PostgreSQL 数据库

PostgreSQL 是一个对象关系数据库系统。 Concourse 将其管道数据存储到 PostgreSQL 数据库中。 添加 PostgreSQL 存储库。

sudo rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm

安装 PostgreSQL 数据库服务器。

sudo yum -y install postgresql96-server postgresql96-contrib

初始化数据库。

sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb

initdb 创建一个新的 PostgreSQL 数据库集群,它是由单个服务器实例管理的数据库集合。 编辑 pg_hba.conf 文件以启用基于 MD5 的身份验证。

sudo nano /var/lib/pgsql/9.6/data/pg_hba.conf

找到以下几行并更改值 peerident 在里面 METHOD 列到 trustmd5, 分别。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

更新后,配置应如下所示。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

启动 PostgreSQL 服务器并使其在启动时自动启动。

sudo systemctl start postgresql-9.6
sudo systemctl enable postgresql-9.6

更改默认 PostgreSQL 用户的密码。

sudo passwd postgres

以 PostgreSQL 用户身份登录:

sudo su - postgres

为 Concourse CI 创建一个新的 PostgreSQL 用户。

createuser concourse

笔记: 默认的 PostgreSQL 用户可用于数据库的认证,但建议在生产设置中使用专用用户进行 Concourse 数据库的认证。

PostgreSQL 提供了一个 shell 来运行数据库查询。 运行以下命令切换到 PostgreSQL shell:

psql

为新创建的 Concourse 数据库用户设置密码。

ALTER USER concourse WITH ENCRYPTED password 'DBPassword';

重要的: 代替 DBPassword 使用强密码。 记下密码,因为本教程稍后将需要该密码。

为 Concourse 创建一个新数据库。

CREATE DATABASE concourse OWNER concourse;

Exit 这 psql 壳。

q

切换到 sudo 来自当前 postgres 用户的用户。

exit

下载并安装 Concourse CI

下载最新版本的 Concourse 可执行文件并将其存储在 /usr/bin 这样就可以直接执行了。 最新版本的 Concourse 和 Fly 二进制文件可以在 大厅下载页面. 新版本非常频繁。 将下面的链接替换为最新版本的新链接。

sudo wget https://github.com/concourse/concourse/releases/download/v3.4.1/concourse_linux_amd64 -O /usr/bin/concourse

同样,下载最新版本的 fly 可执行文件并将其存储在 /usr/bin.

sudo wget https://github.com/concourse/concourse/releases/download/v3.4.1/fly_linux_amd64 -O /usr/bin/fly

Fly 是连接 Concourse CI 的 ATC API 的命令行接口。 Fly 可用于多个平台,例如 Linux、Windows 和 MacOS。

为下载的文件分配执行权限 concoursefly 二进制文件。

sudo chmod +x /usr/bin/concourse /usr/bin/fly

检查 Concourse 和 Fly 的版本是否正常工作。

concourse -version
fly -version

生成和设置 RSA 密钥

RSA 密钥对提供了一种加密 Concourse 组件之间通信的方法。

要使 Concourse 工作,必须至少生成三对密钥。 为了加密会话数据,生成一个 session_signing_key. TSA 还将使用此密钥来签署它向 ATC 提出的请求。 要保护 TSA SSH 服务器,请生成一个 tsa_host_key. 最后,生成一个 worker_key 为了 每个 工人。

创建一个新目录来存储与 Concourse CI 相关的密钥和配置。

sudo mkdir /opt/concourse

生成所需的密钥。

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

通过将其内容复制到 authorized_worker_keys 文件:

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

出发大厅

Concourse 提供了两个需要启动的独立组件,web 和 worker。 启动 Concourse 网络。

sudo concourse web 
  --basic-auth-username admin 
  --basic-auth-password StrongPass 
  --session-signing-key /opt/concourse/session_signing_key 
  --tsa-host-key /opt/concourse/tsa_host_key 
  --tsa-authorized-keys /opt/concourse/authorized_worker_keys 
  --postgres-user=concourse 
  --postgres-password=DBPassword 
  --postgres-database=concourse 
  --external-url https://192.0.2.1:8080

更改用户名和密码 basic-auth 如果需要。 确保密钥文件的路径正确,并确保在 PostgreSQL 数据库配置中提供了正确的用户名和密码值。

笔记: ATC 会监听默认端口 8080 并且 TSA 将侦听端口 2222. 如果不需要身份验证,请通过 --no-really-i-dont-want-any-auth 删除基本身份验证选项后的选项。

Web 服务器启动后,应显示以下输出。

{"timestamp":"1503657859.661247969","source":"tsa","message":"tsa.listening","log_level":1,"data":{}}
{"timestamp":"1503657859.666907549","source":"atc","message":"atc.listening","log_level":1,"data":{"debug":"127.0.0.1:8079","http":"0.0.0.0:8080"}}

暂时停止服务器,因为还有一些事情还必须设置。

启动 Concourse CI Worker。

sudo concourse worker 
  --work-dir /opt/concourse/worker 
  --tsa-host 127.0.0.1 
  --tsa-public-key /opt/concourse/tsa_host_key.pub 
  --tsa-worker-private-key /opt/concourse/worker_key

上面的命令将假设 TSA 在本地主机上运行并监听默认端口 2222.

虽然使用上述命令可以轻松启动 Concourse web 和 worker,但建议使用 Systemd 来管理服务器。

配置环境和 Systemd 服务

使用 Systemd 服务管理应用程序可确保应用程序在出现故障和启动时自动启动。 Concourse 服务器不从任何配置文件中获取数据,但它可以从环境变量中访问数据。 不是设置全局环境变量,而是创建一个新文件来存储环境变量,然后使用 Systemd 服务将变量传递给 Concourse CI。

为 Concourse web 创建一个新的环境文件。

sudo nano /opt/concourse/web.env

填充文件。

CONCOURSE_SESSION_SIGNING_KEY=/opt/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/opt/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/opt/concourse/authorized_worker_keys

CONCOURSE_POSTGRES_USER=concourse
CONCOURSE_POSTGRES_PASSWORD=DBPassword
CONCOURSE_POSTGRES_DATABASE=concourse

CONCOURSE_BASIC_AUTH_USERNAME=admin
CONCOURSE_BASIC_AUTH_PASSWORD=StrongPass
CONCOURSE_EXTERNAL_URL=https://192.0.2.1:8080

更改用户名和密码 BASIC_AUTH 如果需要。 确保密钥文件的路径正确,并确保在 PostgreSQL 数据库配置中提供了正确的用户名和密码值。

同样,为工作人员创建一个环境文件。

sudo nano /opt/concourse/worker.env

填充文件。

CONCOURSE_WORK_DIR=/opt/concourse/worker
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/opt/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/opt/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1

由于环境文件包含用户名和密码,请更改其权限,使其无法被其他用户访问。

sudo chmod 600 /opt/concourse/*.env

现在为 Concourse 创建一个新用户来运行 web 环境。 这将确保 Web 服务器在隔离的环境中运行。

sudo adduser --system concourse

授予 concourse 用户对 Concourse CI 文件目录的所有权。

sudo chown -R concourse:concourse /opt/concourse

为 Concourse 网络服务创建一个新的 systemd 服务文件。

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

填充文件。

[Unit]
Description=Concourse CI web server
After=postgresql-9.6.service

[Service]
Type=simple
User=concourse
Group=concourse
Restart=on-failure
EnvironmentFile=/opt/concourse/web.env
ExecStart=/usr/bin/concourse web
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_web

[Install]
WantedBy=multi-user.target

Save 和 close 文件。 为 Concourse 工作者服务创建一个新的服务文件。

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

填充文件。

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

[Service]
Type=simple
User=root
Group=root
Restart=on-failure
EnvironmentFile=/opt/concourse/worker.env
ExecStart=/usr/bin/concourse worker
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_worker

[Install]
WantedBy=multi-user.target

现在可以通过运行以下命令直接启动 web 和 worker 服务:

sudo systemctl start concourse-web concourse-worker

要使工作进程和 Web 进程在启动时自动启动,请运行:

sudo systemctl enable concourse-worker concourse-web

要检查服务的状态,请运行:

sudo systemctl status concourse-worker concourse-web

如果服务没有启动,或者在 FAILED 状态,从缓存中删除 /tmp 目录。

sudo rm -rf /tmp/*

重新启动服务。

sudo systemctl restart concourse-worker concourse-web

请注意,这次服务已正确启动。 验证服务状态时的输出应该是相似的。

[[email protected] ~]$ sudo systemctl status concourse-worker concourse-web
● concourse-worker.service - Concourse CI worker process
   Loaded: loaded (/etc/systemd/system/concourse-worker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
 Main PID: 3037 (concourse)
   CGroup: /system.slice/concourse-worker.service
           └─3037 /usr/bin/concourse worker

Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.934722900","source":"tsa","message":"t...""}}
Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.941227913","source":"guardian","messag...0"}}
...

● concourse-web.service - Concourse CI web server
   Loaded: loaded (/etc/systemd/system/concourse-web.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
 Main PID: 3036 (concourse)
   CGroup: /system.slice/concourse-web.service
           └─3036 /usr/bin/concourse web

Aug 26 07:27:57 vultr.guest concourse_web[3036]: {"timestamp":"1503732477.925554752","source":"tsa","message":"tsa...ve"}}
Aug 26 07:28:02 vultr.guest concourse_web[3036]: {"timestamp":"1503732482.925430775","source":"tsa","message":"tsa...ve"}}
...
Hint: Some lines were ellipsized, use -l to show in full.

调整防火墙以允许运行 ATS 的端口 8080 和运行 TSA 的端口 2222。

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

连接到服务器

服务器启动后,可以通过以下方式访问 Concourse CI 的 Web 界面 https://192.0.2.1:8080 在任何浏览器中。 使用环境文件中提供的用户名和密码登录。

要使用 Fly 连接到服务器,请运行:

fly -t my-ci login -c https://192.0.2.1:8080

上述命令用于初始登录服务器。 -t 用于提供目标名称。 代替 my-ci 具有任何所需的目标名称。 上面的命令会登录到默认团队 main. 它将询问环境文件中提供的用户名和密码。

输出将如下所示。

[[email protected] ~]$ fly -t my-ci login -c https://192.0.2.1:8080
logging in to team 'main'

username: admin
password:

target saved

目标登录将保存一天。 在那之后,它将过期。

立即注销。

fly -t my-ci logout

fly 可用于登录网络外的服务器,但前提是该服务器具有公共 IP 地址并且可以从网络外访问。 可以从下载站点或服务器的 Web UI 下载 Windows 或 MacOS 二进制文件。

设置 Nginx 反向代理

通过 Web UI 发送到 Concourse 服务器的登录信息和其他信息是不安全的。 连接未加密。 可以使用 Let’s Encrypt 免费 SSL 设置 Nginx 反向代理。

安装 Nginx Web 服务器和 Certbot,它是 Let’s Encrypt CA 的客户端应用程序。

sudo yum -y install certbot-nginx nginx

启动并启用 Nginx 在启动时自动启动:

sudo systemctl start nginx
sudo systemctl enable nginx

在请求证书之前,必须通过防火墙启用端口 80 和 443,或标准 HTTP 和 HTTPS 服务。 Certbot 会在颁发证书之前检查域权限。

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

端口 8080 不再需要允许通过防火墙,因为 Concourse 现在将在标准 HTTPS 端口上运行。 删除防火墙条目以允许端口 8080。

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

笔记

要从 Let’s Encrypt CA 获取证书,要为其生成证书的域必须指向服务器。 如果没有,请对域的 DNS 记录进行必要的更改,并在再次发出证书请求之前等待 DNS 传播。 Certbot 在提供证书之前检查域授权。

生成 SSL 证书。

sudo certbot certonly --webroot -w /usr/share/nginx/html -d ci.example.com

生成的证书很可能存储在 /etc/letsencrypt/live/ci.example.com/ 目录。 SSL 证书将存储为 fullchain.pem 并且私钥将存储为 privkey.pem.

Let’s Encrypt 证书在 90 天后到期,因此建议使用 cronjobs 设置证书的自动续订。 Cron 是一个系统服务,用于运行周期性任务。

打开 cron 作业文件。

sudo crontab -e

在文件末尾添加以下行。

30 5 * * 1 /usr/bin/certbot renew --quiet

上述 cron 作业将在每周一凌晨 5:30 运行。 如果证书到期,它将自动更新。

创建一个新的虚拟主机。

sudo nano /etc/nginx/conf.d/concourse-ssl.conf

填充文件。

server {
    listen 80;
    server_name ci.example.com;
    return 301 https://$host$request_uri;
}
server {

    listen 443;
    server_name ci.example.com;

    ssl_certificate           /etc/letsencrypt/live/ci.example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/ci.example.com/privkey.pem;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log    /var/log/nginx/concourse.access.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_pass          https://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      https://localhost:8080 https://ci.example.com;
    }
  }

笔记: 代替 ci.example.com 与实际域。

编辑为 concourse Web 创建的环境文件。

sudo nano /opt/concourse/web.env

更改值 CONCOURSE_EXTERNAL_URL 并在文件末尾再添加两行。

CONCOURSE_EXTERNAL_URL=https://ci.example.com
CONCOURSE_BIND_IP=127.0.0.1
CONCOURSE_BIND_PORT=8080

Save 文件并重新启动 Concourse Web、Worker 和 Nginx Web 服务器:

sudo systemctl restart concourse-worker concourse-web nginx

所有发送到浏览器和从浏览器发送的数据现在都使用 SSL 加密进行保护。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com