Вступление
Непрерывная интеграция - это практика разработки программного обеспечения DevOps, которая позволяет разработчикам часто объединять измененный код в общий репозиторий много раз в день. После каждого слияния выполняются автоматические сборки и тесты для выявления проблем в коде. Это позволяет разработчикам быстро находить и устранять ошибки, улучшать качество программного обеспечения и обеспечивать непрерывную доставку программного обеспечения. Переключаться из Concourse туда и обратно очень просто, поскольку он сохраняет всю свою конфигурацию в декларативных файлах, которые можно проверить в системе контроля версий. Он также предоставляет веб-интерфейс пользователя, который отображает информацию о сборке в интерактивном режиме.
Компоненты конкурса.
	- УВД является основным компонентом конкурса. Он отвечает за запуск веб-интерфейса и API. Это также заботится обо всем планировании трубопровода.
- TSA - это пользовательский SSH-сервер. Он отвечает за безопасную регистрацию работника в УВД.
- Кроме того, работники работают две разные службы: 
	
		- Garden - это среда выполнения контейнеров и интерфейс для удаленной организации контейнеров на рабочем месте.
- Baggageclaim - сервер управления кешем и артефактами.
 
- Fly - это интерфейс командной строки, используемый для взаимодействия с диспетчером УВД для настройки конвейерного конвейера.
Предпосылки
Обязательно замените все вхождения 192.0.2.1 и ci.example.com фактический публичный IP-адрес Vultr и реальное доменное имя.
Обновите свою базовую систему, используя руководство Как обновить Ubuntu 16.04 . После обновления системы перейдите к установке PostgreSQL.
Установите и настройте базу данных PostgreSQL
PostgreSQL - это объектно-реляционная база данных. Concourse сохраняет данные конвейера в базе данных PostgreSQL. Добавьте репозиторий PostgreSQL.
echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
Установите сервер базы данных PostgreSQL.
sudo apt -y install postgresql
Запустите сервер PostgreSQL и включите его автоматический запуск во время загрузки.
sudo systemctl start postgresql
sudo systemctl enable postgresql
Измените пароль для пользователя 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.10.0/concourse_linux_amd64 -O /usr/bin/concourse
Аналогичным образом загрузите последнюю версию исполняемого файла fly и сохраните ее в /usr/bin.
sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/fly_linux_amd64 -O /usr/bin/fly
Fly - это интерфейс командной строки, используемый для подключения к ATC API 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 необходимо создать как минимум три пары ключей. Для шифрования данных сеанса создайте session_signing_key. Этот ключ также будет использоваться TSA для подписания запросов, которые он направляет в УВД. Чтобы защитить SSH-сервер TSA, создайте 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опцию после удаления основных опций аутентификации.
После запуска веб-сервера будут отображены следующие выходные данные.
{"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"}}
Остановите сервер на данный момент, поскольку еще несколько вещей должны быть настроены.
Запустите Concorse 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 и рабочий процесс можно легко запустить с помощью приведенных выше команд, для управления сервером рекомендуется использовать Systemd.
Использование службы Systemd для управления приложением обеспечивает автоматический запуск приложения при сбоях и во время загрузки. Сервер Concourse не получает данные из какого-либо файла конфигурации, но может получать доступ к данным из переменных среды. Вместо установки глобальных переменных среды создайте новый файл для хранения переменных среды, а затем передайте переменные в Concourse CI с помощью службы Systemd.
Создайте новый файл среды для 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=http://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 для запуска веб-среды. Это обеспечит работу веб-сервера в изолированной среде.
sudo useradd concourse
Дайте пользователю права владения каталогом файла CI Concourse.
sudo chown -R concourse:concourse /opt/concourse
Создайте новый файл службы systemd для веб-службы Concourse.
sudo nano /etc/systemd/system/concourse-web.service
Заполните файл.
[Unit]
Description=Concourse CI web server
[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.
sudo nano /etc/systemd/system/concourse-worker.service
Заполните файл.
[Unit]
Description=Concourse CI worker process
[Service]
Type=simple
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
Веб-сервис и служба для рабочих теперь могут быть запущены напрямую.
sudo systemctl start concourse-web concourse-worker
Чтобы рабочий и веб-процесс автоматически запускались во время загрузки, выполните следующее.
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.
Подключение к серверу
После запуска сервера доступ к веб-интерфейсу Concourse CI можно получить, открыв http://192.0.2.1:8080 любой браузер. Войдите в систему, используя имя пользователя и пароль, указанные в файле среды.
Чтобы подключиться к серверу с помощью 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-адрес и доступен из-за пределов сети. Двоичный файл Windows или MacOS можно загрузить с сайта загрузки или с веб-интерфейса сервера.
Настройка обратного прокси Nginx
Логины и другая информация, отправляемая через веб-интерфейс на сервер Concourse, не защищены. Соединение не зашифровано. Обратный прокси-сервер Nginx можно настроить с помощью бесплатного шифрования Let's Encrypt.
Установите Nginx.
sudo apt -y install nginx
Запустите Nginx и включите его автоматический запуск во время загрузки.
sudo systemctl start nginx
sudo systemctl enable nginx
Добавьте хранилище Certbot.
sudo add-apt-repository --yes ppa:certbot/certbot
sudo apt-get update
Установите Certbot, который является клиентским приложением для Let's Encrypt CA.
sudo apt -y install certbot
Примечание . Чтобы получить сертификаты от Let's Encrypt CA, домен, для которого должны быть созданы сертификаты, должен быть направлен на сервер. Если нет, внесите необходимые изменения в записи DNS домена и дождитесь распространения DNS, прежде чем снова делать запрос сертификата. Certbot проверяет полномочия домена перед предоставлением сертификатов.
Создайте сертификаты SSL.
sudo certbot certonly --webroot -w /var/www/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 * * * /usr/bin/certbot renew --quiet
Вышеуказанная работа cron будет выполняться каждый день в 5:30. Если срок действия сертификата истекает, он будет автоматически продлен.
Создайте новый виртуальный хост.
sudo nano /etc/nginx/sites-available/concourse
Заполните файл.
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 фактическим доменом.
Активируйте файл конфигурации.
sudo ln -s /etc/nginx/sites-available/concourse /etc/nginx/sites-enabled/concourse
Отредактируйте файл Environment, созданный для конкурса 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.