Вступ
Передумови
Встановіть та налаштуйте базу даних PostgreSQL
Завантажте та встановіть Concourse CI
Створення та налаштування ключів RSA
Початковий зал
Налаштуйте середовище та службу Systemd
Підключення до Сервера
Налаштування зворотного проксі Nginx
Вступ
Безперервна інтеграція — це практика розробки програмного забезпечення DevOps, яка дозволяє розробникам часто об’єднувати змінений код у спільне сховище багато разів на день. Після кожного злиття виконуються автоматичні збірки та тестування для виявлення проблем у коді. Це дозволяє розробникам швидко знаходити та усувати помилки, щоб покращити якість програмного забезпечення та забезпечити безперервну доставку програмного забезпечення. Перемикатися з Concourse туди і назад дуже легко, оскільки він зберігає всю свою конфігурацію в декларативних файлах, які можна перевірити в системі контролю версій. Він також забезпечує веб-інтерфейс користувача, який відображає інформацію про збірку в інтерактивному режимі.
Компоненти залу.
- ATC є основним компонентом Concourse. Він відповідає за запуск веб-інтерфейсу та API. Він також піклується про все планування конвеєра.
- TSA — це спеціально створений SSH-сервер. Він відповідає за безпечну реєстрацію працівника в ATC.
- Workers також управляє двома різними службами:
- Garden — це середовище виконання контейнера та інтерфейс для віддаленого керування контейнерами на робочому.
- Baggageclaim — це сервер керування кешом та артефактами.
- Fly — це інтерфейс командного рядка, який використовується для взаємодії з ATC для налаштування конвеєрів Concourse.
Передумови
- Примірник сервера Vultr CentOS 7.
- Користувач sudo .
Обов’язково замініть усі випадки 192.0.2.1
та ci.example.com
на вашу фактичну публічну IP-адресу Vultr та фактичне доменне ім’я.
Оновіть свою базову систему за допомогою посібника Як оновити 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
Знайдіть наступні рядки та змініть значення peer
та ident
у METHOD
стовпці на trust
та md5
, відповідно.
# 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 для Concourse CI.
createuser concourse
Примітка . Користувача PostgreSQL за замовчуванням можна використовувати для аутентифікації бази даних, але рекомендується використовувати спеціального користувача для автентифікації бази даних Concourse у виробничих налаштуваннях.
PostgreSQL надає оболонку для виконання запитів до бази даних. Перейдіть до оболонки PostgreSQL, виконавши:
psql
Встановіть пароль для щойно створеного користувача бази даних Concourse.
ALTER USER concourse WITH ENCRYPTED password 'DBPassword';
Важливо : замініть DBPassword
надійним паролем. Запишіть пароль, оскільки він знадобиться пізніше в підручнику.
Створіть нову базу даних для Concourse.
CREATE DATABASE concourse OWNER concourse;
Вийдіть з psql
оболонки.
\q
Перейдіть до користувача sudo з поточного користувача postgres.
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 — це інтерфейс командного рядка для підключення до API ATC Concourse CI. Fly доступний для кількох платформ, таких як Linux, Windows і MacOS.
Призначте дозвіл на виконання завантаженим concourse
і fly
двійковим файлам.
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 надає два окремих компонента, які потрібно запустити, веб і робочий файл. Запустіть веб-сайт 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
параметр після видалення основних параметрів аутентифікації.
Once the web server is started, the following output should be displayed.
{"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"}}
Stop the server for now, as a few more things still must be setup.
Start the 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
The above command will assume that the TSA is running on localhost and listening to the default port 2222
.
Though the Concourse web and worker can be started easily using the commands above, it is recommended to use Systemd to manage the server.
Using Systemd service for managing the application ensures that the application is automatically started on failures and at boot time. The Concourse server does not take data from any configuration file, but it can access the data from environment variables. Instead of setting global environment variables, create a new file to store the environment variables and then pass the variables to the Concourse CI using the Systemd service.
Create a new environment file for Concourse web.
sudo nano /opt/concourse/web.env
Populate the file.
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
Change the username and password of the BASIC_AUTH
if desired. Make sure that the path to the key files are correct and make sure that the correct value for username and password in the PostgreSQL database configuration is provided.
Similarly, create an environment file for the worker.
sudo nano /opt/concourse/worker.env
Populate the file.
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
As the environment files contain username and passwords, change its permissions so that it cannot be accessed by other users.
sudo chmod 600 /opt/concourse/*.env
Now create a new user for Concourse to run the web environment. This will ensure that the web server is running in an isolated environment.
sudo adduser --system concourse
Give the concourse user ownership over Concourse CI file's directory.
sudo chown -R concourse:concourse /opt/concourse
Create a new systemd service file for the Concourse web service.
sudo nano /etc/systemd/system/concourse-web.service
Populate the file.
[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 and close the file. Create a new service file for the Concourse worker service.
sudo nano /etc/systemd/system/concourse-worker.service
Populate the file.
[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
The web and worker service can now be started directly by running:
sudo systemctl start concourse-web concourse-worker
To enable the worker and web process to automatically start at boot time, run:
sudo systemctl enable concourse-worker concourse-web
To check the status of services, run:
sudo systemctl status concourse-worker concourse-web
If the service is not started, or in the FAILED
state, remove the cache from the /tmp
directory.
sudo rm -rf /tmp/*
Restart the services.
sudo systemctl restart concourse-worker concourse-web
Notice that this time the services have started correctly. The output upon verifying the status of the services should be simil.
[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.
Adjust your firewall to allow port 8080, on which ATS is running and port 2222, on which TSA is running.
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload
Connecting to the Server
Once the server is started, the web interface of the Concourse CI can be accessed by going to http://192.0.2.1:8080
in any browser. Log in using the username and password provided in the environment file.
To connect to the server using Fly, run:
fly -t my-ci login -c http://192.0.2.1:8080
The above command is used for initial login to the server. -t
is used to provide a target name. replace my-ci
with any desired target name. The above command will log in to the default team main
. It will ask for the username and password provided in the environment file.
The output will look like the following.
[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-адресу та доступний із-за меж мережі. Двійковий файл Windows або MacOS можна завантажити з сайту завантаження або з веб-інтерфейсу сервера.
Налаштування зворотного проксі Nginx
Імена для входу та інша інформація, надіслана через веб-інтерфейс на сервер Concourse, не захищені. З'єднання не зашифроване. Зворотний проксі-сервер Nginx можна налаштувати за допомогою безкоштовного SSL Let's Encrypt.
Встановіть веб-сервер Nginx і 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
Примітка
To obtain certificates from Let's Encrypt CA, the domain for which the certificates are to be generated must be pointed towards the server. If not, make the necessary changes to the DNS records of the domain and wait for the DNS to propagate before making the certificate request again. Certbot checks the domain authority before providing the certificates.
Згенеруйте сертифікати 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 http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://ci.example.com;
}
}
Примітка . Замініть ci.example.com
на фактичний домен.
Відредагуйте файл середовища, створений для Concours 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
Збережіть файл і перезапустіть веб-сервер Concourse Web, Worker і Nginx:
sudo systemctl restart concourse-worker concourse-web nginx
Усі дані, що надсилаються до та з браузера, тепер захищені за допомогою шифрування SSL.