Concourse CI – это современная масштабируемая система непрерывной интеграции, предназначенная для автоматизации конвейеров тестирования. Учитывая преимущества предыдущих систем CI, Concourse стремится упростить управление конвейерами и исключить схему снежинки, чтобы управлять сервером тестирования было так же просто, как кодом, который он обрабатывает.
Данное руководство поможет установить Concourse CI на сервер Ubuntu 16.04 с бэкэндом PostgreSQL.
Требования
- Сервер Ubuntu 16.04.
- 1 Гб RAM.
- Пользователь с доступом к sudo.
- Настроенный брандмауэр.
Все необходимые инструкции можно найти в этом мануале.
1: Установка и настройка PostgreSQL
Прежде чем приступить к установке Concourse CI, нужно настроить на сервере СУБД PostgreSQL, которая будет хранить данные Concourse.
Обновите индекс пакетов, а затем загрузите пакеты postgresql и postgresql-contrib из стандартного репозитория Ubuntu.
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 называются ATC (расшифровывается как air traffic control). Создайте эту базу данных и передайте права на неё пользователю concourse:
sudo -u postgres createdb --owner=concourse atc
Теперь можно переходить к установке бинарных файлов Concourse CI.
2: Загрузка и установка Concourse CI
Concourse предоставляет ссылки на скомпилированные исполняемые файлы для платформы Linux на своем сайте и на GitHub.
Проще всего их найти на официальном сайте проекта. В разделе Concourse Binaries откройте Downloads, найдите пакет для Linux, щелкните правой кнопкой мыши и скопируйте ссылку. Пока что не закрывайте страницу.
На сервере откройте каталог /tmp и загрузите пакет с помощью curl.
cd /tmp
curl -LO URL_на_бинарные_файлы_concourse
Затем нужно загрузить последнюю версию клиента командной строки fly. Вернитесь на сайт Concourse в раздел Downloads, в разделе Fly Binaries найдите пакет для Linux и скопируйте ссылку на него.
Вернитесь на сервер и загрузите пакет в каталог /tmp:
cd /tmp
curl -LO URL_на_бинарные_файлы_fly
Если запрос на загрузку привел к ошибке, вместо бинарной программы файлы будут содержать сообщение об ошибке 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_amd64 и переместите их в /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
3: Конфигурации Concourse CI
Теперь нужно подготовить конфигурации и ключи, которые Concourse CI будет использовать для запуска.
Создайте каталог для конфигурации:
sudo mkdir /etc/concourse
Теперь нужно сгенерировать ключи шифрования и создать конфигурационные файлы Concourse.
Генерирование ключей
Concourse состоит из нескольких компонентов, которые должны иметь возможность взаимодействовать друг с другом.
ATC – это главный концентратор, который обрабатывает веб-запросы, API и конвейеры. Воркеры (workers) управляют контейнерами для выполнения задач 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 будет определять авторизованные воркеры путем проверки файла authorized_worker_keys. Добавьте в этот файл открытые ключи воркера, чтобы он мог подключаться.
Поскольку в данной настройке есть только один воркер, можно просто скопировать файл открытого ключа.
sudo cp /etc/concourse/worker_key.pub /etc/concourse/authorized_worker_keys
Создание конфигурационных файлов среды
Concourse не читает конфигурационный файл. Однако он может принимать значения конфигурации, исходя их переменных среды, переданных при запуске процесса.
Позже нужно будет создать unit-файлы systemd, чтобы определить сервисы Concourse и управлять ими. Эти файлы могут читать переменные среды из файла и передавать их процессу при его запуске.
Создайте файл, который определяет переменные процесса web (отвечает за запуск ATC и TSA) и worker.
Начнем с файла для процесса web:
sudo nano /etc/concourse/web_environment
В нем нужно определить переменные среды, необходимые компонентам ATC и TSA. Каждая переменная начинается с CONCOURSE_.
Для начала нужно установить постоянные значения, которые не будут меняться. Эти переменные будут определять местоположение закрытых ключей TSA и сессий, файла authorized_worker_keys и сокета PostgreSQL:
# 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, которая является администратором Concourse. Выберите любое имя пользователя и пароль. Вы сможете изменить учетные данные администратора в любой момент; для этого достаточно отредактировать файл и перезапустить сервис.
# 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=8host
CONCOURSE_BASIC_AUTH_PASSWORD=8hostblog
CONCOURSE_EXTERNAL_URL=http://servers_public_IP:8080
Сохраните и закройте файл.
Создайте файл среды для процесса worker:
sudo nano /etc/concourse/worker_environment
В этом файле нужно указать местонахождение закрытого ключа воркера, открытого ключа TSA и каталога, в котором воркер будет хранить свои файлы. Также нужно указать адрес, по которому можно получить доступ к TSA (в данном случае это localhost). Вы можете использовать приведенные ниже значения без изменений:
# 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 для процесса 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
4: Создание unit-файлов для Concourse CI
Теперь нужно создать unit-файл для процесса web, который отвечает за работу TSA и ATC, и worker, который обрабатывает задачи конвейеров.
Unit-файл для процесса web
Создайте файл concourse-web.service в /etc/systemd/system:
sudo nano /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 понять порядок запуска сервисов (если этот сервис нужно добавить в автозагрузку).
Сохраните и закройте файл.
Unit-файл для процесса worker
Создайте файл:
sudo nano /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
Этот unit-файл работает так же, как предыдущий. Он запускает процесс worker после процесса web. Процесс worker запускается как пользователь root, а не concourse, потому что ему нужны привилегии администратора для управления контейнерами. Для определения среды используется файл worker_environment, а для запуска процесса – команда concourse worker.
Сохраните и закройте файл.
5: Настройка брандмауэра и запуск сервисов
Процесс 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":""}}
. . .
В выводе должна быть строка «active (running)», а в разделе логов не должно быть ошибок. Уделите особое внимание сервису web: его логи не должны содержать сообщений об ошибках подключения к БД.
Если сервисы запущены успешно, добавьте их в автозагрузку:
sudo systemctl enable concourse-web concourse-worker
6: Проверка доступа
Теперь нужно убедиться, что вы можете получить доступ к сервисам Concourse.
Проверка доступа через командную строку
Для начала убедитесь, что можете получить доступ к сервису Concourse с помощью клиента командной строки fly.
Авторизуйтесь с помощью команды login, используя имя пользователя и пароль администратора, которые указаны в файле /etc/concourse/web_environment. Один клиент fly может взаимодействовать с несколькими серверами Concourse; в качестве алиасов для различных серверов команда использует так называемые цели (targets). В данном случае нужно использовать цель local, чтобы подключиться к локальному серверу Concourse.
fly -t local login -c http://127.0.0.1:8080
Укажите имя пользователя и пароль группы main (из файла web_environments). После этого вы увидите:
logging in to team 'main'
username: 8host
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 предоставляет справку.
Доступ через веб-интерфейс
Затем проверьте доступ к серверу, посетив IP-адрес и порт 8080 в веб-браузере:
http://servers_public_IP:8080
Вы должны увидеть приветственную страницу Concourse:
no pipelines configured
first, download the CLO tools […]
Здесь вы можете загрузить fly как клиент командной строки на локальный компьютер (для этого кликните по соответствующей платформе). Так вы сможете управлять средой CI. При первом подключении с помощью fly нужно указать внешний IP-адрес сервера, а не 127.0.0.1 (прочитайте предупреждение о шифровании (ниже), прежде чем войти в систему удаленно).
Если вы нажмете ссылку login в верхнем правом углу, вы можете войти в веб-интерфейс. Во-первых, будет предложено выбрать группу. Группа main является единственным доступным вариантом по умолчанию.
Затем интерфейс запросит учетные данные.
Предупреждение: Веб-интерфейс и шлюз API, предоставляемые Concourse CI, по умолчанию не шифруются, поэтому ваше имя пользователя и пароль будут отправлены на сервер в виде обычного текста. Если вы планируете использовать эту установку на постоянной основе, защитите веб-интерфейс с помощью SSL перед входом в систему. Следуйте нашим инструкциям по настройке прокси-сервера Nginx с поддержкой SSL для Concourse CI.
После этого вы получите доступ к интерфейсу.
Заключение
Этот мануал научил вас устанавливать PostgreSQL и бинарные файлы Concourse, генерировать ключи, настраивать сетевой доступ Concourse и пользоваться клиентом командной строки fly.
Прежде чем использовать Concourse в разработке, настройте шифрование шлюзов с помощью SSL.
Читайте также: SSL-шифрование Concourse CI с помощью Nginx в Ubuntu 16.04
Больше информации о fly можно найти в документации Concourse.