Введение
Настройка непрерывной интеграции и автоматизация конвейеров тестирования с помощью компонуемого декларативного синтаксиса Concourse CI. По сравнению с остальными системами для настройки непрерывной интеграции, команда Concourse вкладывают все усилия, чтобы упростить управление конвейером непрерывной интеграции.
В предыдущих инструкциях рассматривали скачивание и настройку Concourse на сервер Ubuntu 22.04 и обезопасили наш web-интерфейс при помощи SSL от центра сертификации Let’s Encrypt.
В этой инструкции рассмотрим, использование Concourse для запуска тестов в автоматическом режиме, а также изменения будут фиксироваться в нашем репозитории.
Рассмотрим настройку конвейера непрерывной интеграции с использованием приложения «hello world», при помощи кода Hapi.js, созданного на web-фреймворке Node.js для обеспечения процесса синхронизации кода со сборкой и тестированием. Добавим определения CI в сам репозиторий продукта. Воспользуемся терминалом и утилитой “fly” для запуска конвейера в Concourse. В конце, добавим изменения в наш репозиторий, чтобы сохранять их и реализовать тесты в рабочем процессе CI.
Подготовка к работе
Перед началом работы, необходимо запустить сервер на базе Ubuntu/Debian/CentOS, оперативная память должна составлять не менее 1 GB.
Настройте права для пользователя на выполнение с помощью sudo.
Скачайте и установите утилиту Concourse из официального сайта или из GitHub и web-сервер Nginx установленный при помощи пакетного менеджера. Необходимо настроить сертификат безопасности TLS/SSL, настроить обратный proxy-сервер для web-интерфейса Concourse.
Необходимо получить доменное имя, указывающее на наш сервер Concourse.
Воспользуйтесь следующими инструкциями для правильной настройки:
- Установка и настройка сервера с обычным пользователем;
- Установка Concourse CI;
- Установка и настройка Nginx;
- Настройка безопасности Concourse CI с помощью SSL;
- Настройка безопасности Nginx.
В этой инструкции весь процесс работы рассматривается на рабочем компьютере с заранее установленной Ubuntu Linux. По этой причине следует удостовериться, что установлены разные утилиты для редактирования текстовых файлов, которые удобны вам в использовании.
Также вам потребуется утилита Git на локальном компьютере и для правильной настройки воспользуйтесь нашей инструкцией.
Когда убедились, что сервер Concourse работает и на локальном компьютере имеются все инструменты для работы с текстовыми файлами и установлен Git, приступим к основной задаче нашей инструкции.
Использование Fly в командной строке
Необходимо убедиться, что на основном сервере установлен Concourse Worker и Fly (для управления конвейером с помощью командной строки).
При повседневной работе с Concourse CI удобнее установить fly на рабочий компьютер, в котором установлены ежедневные инструменты для работы с разработкой разных продуктов.
Для получения актуальной версии fly, необходимо открыть web-интерфейс Concourse CI установленный на сервере:
https://server_url
После авторизации в сервере, в нижней правой части экрана можно скачать fly выбрав свою систему на рабочем месте:

Нажимаем на иконку нашей локальной системы и скачиваем в удобную нам директорию, в нашем случае это Загрузки.
Linux и MacOS
Если на вашем основном рабочем месте установлен Linux или устройство работающее на MacOS, выполните следующие действия для установки и запуска Fly:
chmod +x /root/fly
Далее необходимо добавить утилиту fly в окружение “PATH” для запуска в терминале:
install /root/fly /usr/local/bin
Запустим утилиту fly и получим информацию о версии:
fly –version
Получим результат, который совпадает с версией из web-интерфейса:
7.9.0
Windows
Если основная система на рабочем месте Windows, необходимо запустить PowerShell и добавить директорию bin:
PS C:\Пользователи\Serverspace> mkdir bin
Необходимо скопировать скачанную утилиту fly.exe в директорию bin:
PS C:\Пользователи\Serverspace> mv .\Загрузки\fly.exe .\bin\
Проведём проверку на актуальность профиля, выполнив команду:
PS C:\Пользователи\Serverspace> Test-Path $profile
При получении результата True, актуальный профиль имеется в системе.
При получении результата False, необходимо создать новый профиль:
PS C:\Пользователи\Serverspace> New-Item -path $profile -type file -force
В результате получим:
Каталог: C:\Пользователи\Serverspace\Документы\WindowsPowerShell
Mode LastWriteTime Length Name
---- ------------- --------- ----
-a---- 31.01.2023 18:05 0 Microsoft.PowerShell_profile.ps1
Откроем созданный файл профиля утилиты для редактирования текстов Notepad:
PS C:\Users\Serverspace> notepad.exe $profile
Откроется новое окно редактора текстовых файлов и добавим в окружение PATH и укажем путь до файла:
$env:path += ";C:\Пользователи\Serverspace\bin"
Сохраним файл и выполним выход.
Запустим чтение пути из $profile:
PS C:\Пользователи\Serverspace> . $profile
Далее выполним команду для проверки версии скачанного файла fly:
PS C:\Пользователи\Serverspace> fly.exe –version
В результате получим:
7.9.0
При выполнении команд из Windows, вам необходимо изменять каждую команду fly (в этой инструкции) на fly.exe.
Авторизация с помощью командной строки
После успешного запуска fly, необходимо войти на установленный Concourse, в каждом сервере может использоваться несколько “target”, с помощью которых можно идентифицировать необходимый конвейер в системе и в нём выполнять команды.
В этой инструкции рассмотрим tutorial в целевом названии системы Concourse:
fly -t tutorial login -c https://concourse_server_url
Необходимо заполнить логин и пароль из конфигурационного файла /etc/concourse/web_environment нашего сервера.
В результате получим:
logging in to team 'main'
username: serverspace
password:
target saved
Если авторизация выполнена успешно появиться файл .flyrc в домашнем каталоге.
Проверим создание “tutorial” в .flyrc:
fly -t tutorial sync
В результате получим:
version 7.9.0 already matches; skipping
Разветвление и клонирование репозитория
После настройки fly, необходимо настроить репозиторий для использования конвейеров Concourse.
В web-браузере откроем ссылку на репозиторий, которым воспользуемся в нашей инструкции.
В Concourse необходимо добавить конвейер непрерывной интеграции в основной ветке репозитория.

В терминале перейдём в директорию пользователя. Сделаем копию репозитория на нашем рабочем компьютере, для этого воспользуемся следующими командами утилиты git для клонирования и перейдём в новую ветку:
cd
git clone https://github.com/githubUser/hello_hapi
cd hello_hapi
git checkout -b pipeline
После выполнения команд получим следующую строку:
Switched to a new branch 'pipeline'
Мы выполнили переключение на новую ветку.
Настройка непрерывной интеграции для приложения
Определим наши файлы, которые связаны с репозиторием проекта. Тем самым обеспечим синхронизацию работы непрерывной интеграции с тестируемым кодом.
Тестовый набор находится в директории test. В нём находится три теста. Сценарий тестов находится в package.json, который хранит элемент test в объекте scripts.
Необходимо создать директорию с названием ci и в нём определить две подпапки с названиями tasks и scripts и в них разместим файлы непрерывной интеграции продукта.
Выполним следующую команду:
mkdir -p ci/{tasks,scripts}
Добавление конвейера
В директории ci создадим файл с названием pipeline.yml, в котором укажем наши конфигурационные настройки:
vim ci/pipeline.yml
После создания конфигурационного файла для основного конвейера, необходимо добавить в него нашу конфигурацию.
Определение для кэша NPM
Добавим следующую конфигурацию:
---
resource_types:
- name: npm-cache
type: docker-image
source:
repository: ymedlop/npm-cache-resource
tag: latest
Процессы, отделяющиеся от данных непрерывной интеграции, обрабатываются в Concourse и извлекают информацию о статусе абстракции и они преобразуются в ресурсы.
Ресурсы — являются данными источников для использования Concourse при получении или отправления информации.
Строка resource_types будет определять новые типы ресурсов, которых можно будет реализовать в своем конвейере.
Определение и кэширование репозитория
Добавим следующий кусок кода в pipeline.yml для определения фактического ресурса для конвейера:
resources:
- name: hello_hapi
type: git
source: &repo-source
uri: https://github.com/githubUser/hello_hapi
branch: master
- name: dependency-cache
type: npm-cache
source:
<<: *repo-source
paths:
- package.json
В первом из ресурсов определяется наша ветка из репозитория. Source определяет привязку YAML для названия repo-source.
В первом ресурсе представлена наша ветка репозитория из GitHub.
Второй ресурс определяет “cache-dependency”, с помощью которого воспользуемся типом ресурса «npm-cache» и определяем для выполнения загрузки необходимых зависимостей проекта.
За строкой “source” следует<<: *repo-source используется для перенаправления и расширения элементов. В конце запишем “paths”, которая ссылается ранее скачанный пакет package.json.
Тестирование зависимостей
Определим фактические процессы непрерывной интеграции, используя задания Concourse. В конце конфигурации pipeline.yml добавим следующий кусок кода не удаляя предыдущие строки кода:
jobs:
- name: install_dependencies
plan:
- get: hello_hapi
trigger: true
- get: dependency-cache
- name: run_tests
plan:
- get: hello_hapi
trigger: true
passed: [install_dependencies]
- get: dependency-cache
passed: [install_dependencies]
- task: run_the_test_suite
file: hello_hapi/ci/tasks/run_tests.yml
Код будет реализовывать два задания. Каждое задание хранит в себе название и план. В плане хранятся такие элементы, как “получение” и “задание”. Первый из операторов get получает данные из репозитория и присваивает значение true для параметра trigger.
Второй Get (dependency-cache) включает в себе определенный ресурс, для загрузки и кэширования необходимых зависимостей Node.js в проекте.
Get оператору необходимо оценивать требования из package.json и исходя из этого оператор производит загрузку данных.
Также в коде имеется оператор “passed”, который присваивает оператору get те элементы, прошедшие предыдущие шаги с успешным результатом, чтобы связать воедино конвейерные процессы.
В конце всех операторов формируется строка со ссылкой на “run_tests.yml”, для извлечения и выполнения тестирования. В следующем шаге рассмотрим создание этого файла.
Создание тестовых заданий
Процесс извлечения задач поможет вам сделать определение конвейера кратким и удобным для чтения.
Необходимо создать новый конфигурационный файл в директории ci/tasks с названием run_tests.yml:
vim ci/tasks/run_tests.yml
Для передачи тестовой задач необходимо заполнить строку с платформой согласно с нашей системой в котором производится процесс работы разработчика, также указываем образ, которые может определить любой ввод или вывод для использования в задаче. В конце указываем путь до запускаемого файла.
Добавьте следующий кусок кода для настройки задачи на тестирование:
---
platform: linux
image_resource:
type: docker-image
source:
repository: node
tag: latest
inputs:
- name: hello_hapi
- name: dependency-cache
run:
path: hello_hapi/ci/scripts/run_tests.sh
Файл run_tests.yml содержит в себе задачи, которые будут выполняться в Linux. Concourse удовлетворяет вышеописанные строки кода без дополнительных настроек.
Необходимо указать образ, для использования “worker” при запуске задач. Однако у нас будет возможность создавать личные типы образов и использовать их. Чаще всего используется наиболее известный образ Docker.
Так как наш репозиторий состоит из приложения Node.js, выберем образ “node” во время запуска наших тестов, ибо в нём имеются все необходимые инструменты.
Для Concourse можно определить вход и выход для задач, чтобы указать ресурсы, с помощью которых можно получить доступ к артефактам, которые они будут создавать.
Ресурсы должны соответствовать входным данным, извлеченным ранее на уровне «job».В результате этого все эти ресурсы становятся доступными для среды задачи в виде директории верхнего уровня, которой можно управлять во время выполнения задачи.
В данной инструкции рассматриваем приложение, который находится в ранее скачанном каталоге hello_hapi. Зависимости Node.js сохранены в директории dependency-cache.
На этапе запуска скрипта со сценарием иногда требуется перемещение файлов или директорий в ожидаемое место, который указан в скрипте и размещение артефактов в выходных местах в конце задач.
В сценарии указана команда которую необходимо выполнить. Каждая задача хранит в себе одну команду с аргументом, поэтому создадим скрипт на bash для запуска команд. Но, часто в задаче указывается путь до файла со сценарием команды. В нашем случае мы указываем путь до скрипта в директории hello_hapi, который располагается в hello_hapi/ci/scripts/run_tests.sh.
В следующем шаге рассмотрим создание скриптового файла.
Необходимо сохранить и выполнить выход.
Создание скриптового файла
Теперь необходимо создать скриптовый файл запускающий наши тесты. Потребуется внести изменения с помощью текстового редактора.
touch ci/scripts/run_tests.sh
vim ci/scripts/run_tests.sh
В данном скрипте будут данные для среды тестирования и перемещения элементов в нужную директорию. Далее запустятся тесты из определенных репозиториев и запустится npm test.
Воспользуйтесь следующим кодом для выполнения запуска тестов:
#!/usr/bin/env bash
set -e -u -x
mv dependency-cache/node_modules hello_hapi
cd hello_hapi && npm test
Выполним выход с сохранением использовав :wq!
Прежде всего обозначается путь до командного интерпретатора для запуска команд из этого файла. Установим параметры по умолчанию для остановки скрипта при обнаружении ошибок и в переменных. Тем самым сценарий выполняется безопасным путем и получаем хорошую видимость отладки.
Mv (move) выполняет перемещение зависимостей кэшов из node_modules в домашнюю директорию hello_hapi.
Далее переходим в домашнюю директорию проекта и выполним npm test.
Когда записали код в файле, необходимо сохранить и выполнить выход.
Необходимо назначить права на запуск run_tests.sh из директории ci/scripts:
chmod +x ci/scripts/run_tests.sh
После назначения прав наш конвейер готов к запуску.
Запуск конвейера в Concourse
Перед тем как объединить ветку конвейера в основную и экспортировать ее на GitHub, мы должны продолжить и загрузить конвейер в Concourse. Также обрабатывается наш репозиторий для обнаружения изменений и запускается процедура непрерывной интеграции при обнаружении.
Необходимо вручную запустить конвейер используя команды ранее скачанной утилиты fly.
Укажем цель через параметр -t, добавим конвейер и после параметра -p вводим название и с помощью -c указывает на файл откуда будут извлекаться данные нашего конвейера:
fly -t tutorial set-pipeline -p hello_hapi -c ci/pipeline.yml
Соглашаемся с запуском:

После успешного добавления конвейера, он находится на паузе. Возобновления работы происходить через Web-интерфейс или выполнив команду:
fly -t tutorial unpause-pipeline -p hello_hapi

Также в Web-интерфейсе можно воспользоваться кнопкой для запуска конвейера.

Фиксирование изменений в Git
После запуска процесса непрерывной интеграции, необходимо добавить изменения в нашем репозитории Git.
Добавление директории ci в git:
git add ci
Необходимо выполнить проверку статуса добавленных файлов:
git status

Зафиксируем изменения и воспользуемся командой:
git commit -m 'First commit for our project'
Необходимо объединить наши ветки переключив на основную ветку.
git checkout master
git merge pipeline
Необходимо закрепить внесенные нами изменения в наш репозиторий:
git push origin master
Стоит отметить о том, что после сохранения всех изменений, необходимо запустить тест через одну минуту.
Просмотр запуска тестов
Вернувшись в Web-интерфейс необходимо запустить новый тест нажав на кнопку +:

Первые два теста обозначены желтым цветом, так как не взаимодействовали с Git репозиторием. После добавление новых тестов можно нажать на задачу (tasks) и увидеть результаты тестов.

Если нажать на надпись hello_hapi, можно вернуться в исходное состояние конвейера и посмотреть результат запуска конвейера:

Желтые квадраты вокруг задачи означает, что выполняется запуск новой задачи:

Выводы
В данной инструкции мы рассмотрели:
- Настройку утилиты fly;
- Клонирование репозитория из Git;
- Создание сценария для конвейера;
- Создание сценария для тестов;
- Запуск конвейера;
- Внесение изменений в наш репозиторий;
- Запуск тестов;