如何在CentOS 7上安装和配置Concourse CI

・23 分钟阅读

介绍

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

Concourse组件,
  • ATC是Concourse的主要组成部分。它负责运行Web UI和API ,它还负责所有管道调度,
  • TSA是定制的内置SSH服务器,它负责使用ATC安全登记员工,
  • Workers 运行两种不同的服务:
    1. Garden是一个容器运行时,它是一个在worker上远程安排容器的接口,
    2. Baggageclaim 是缓存和工件管理服务器,
  • Fly是一个命令行界面,用于与ATC交互以配置Concourse Pipelines。

前提条件

  • CentOS 7服务器实例,
  • sudo用户 ,

确保会所有出现的192.0.2.1ci,example,com 替换为实际的公共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

METHOD列中找到以下行并会peerident的值分别更改为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

创建一个新的PostgreSQL用户来安装CI 。

 
createuser concourse

 

注意:默认的PostgreSQL用户可用于数据库身份验证,但是,建议使用专用用户在生产设置中验证。

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

 
psql

 

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


ALTER USER concourse WITH ENCRYPTED password 'DBPassword';

重要:使用强密码替换DBPassword ,请记录密码,因为在教程后面将要求它。

创建一个新的数据库数据库。


CREATE DATABASE concourse OWNER concourse;

退出psql shell 。

 
q

 

从当前postgres用户切换到sudo用户。

 
exit

 

下载并安装Concourse CI

下载最新版本的Concourse并会它存储在/usr/bin中,以便直接执行,最新版本的Concourse和Fly二进制文件可以在Concourse下载页面 ,新版本非常频繁,用最新版本的新链接替换下面的链接。


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的ATC接口的命令行接口,Fly可用于多种平台,如Linux,Windows和macOS 。

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


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

检查Concourse和Fly是否正常运行,检查它版本。


concourse -version
fly -version

生成和设置RSA密钥

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

要使Concourse工作,必须至少生成三对密钥,要加密会话数据,请生成session_signing_key ,TSA还会使用此密钥签署它对ATC所做的请求,要保护,服务器,请生成一个tsa_host_key 。 最后,为每个worker生成一个

创建一个新目录来存储与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

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 http://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 。


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=http://192.0.2.1:8080

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

类似地,为worker创建环境文件。


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服务器在独立的环境中运行。


sudo adduser --system concourse

在文件的Concourse目录Give给Concourse用户所有权。


sudo chown -R concourse:concourse /opt/concourse

为Concourse Web服务创建新的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

保存并关闭文件,为Concourse worker服务创建新的服务文件。


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

要使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

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


[user@vultr ~]$ 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

正在与服务器建立连接

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

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


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

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

输出将如下所示。


[user@vultr ~]$ fly -t my-ci login -c http://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反向代理

通过网络用户界面发送的登录和其他信息不安全,连接未加密,可以设置Nginx反向代理,让我们加密免费SSL 。

安装nginx web服务器和Certbot这是让我们加密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

注释

要从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/ 目录会存储为fullchain.pem证书,私钥会存储为privkey.pem

让我们加密证书在90天内到期,因此建议使用cronjobs设置证书的自动续订,Cron是一个用来运行周期性任务的系统服务。

打开cron作业文件。

 
sudo crontab -e

 

在文件的末尾添加以下行。


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

上面的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 http://localhost:8080;
 proxy_read_timeout 90;

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

注:会ci.example.com替换为实际域名。

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


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

保存文件,并且重新启动Concourse Web,worker和Nginx Web服务器:


sudo systemctl restart concourse-worker concourse-web nginx

现在,使用SSL加密可以保护发送到浏览器和从浏览器发送的所有数据。

Zuoxiaojuan profile image