news
Serverspace в «Рейтинге провайдеров IaaS Enterprise 2023» от Market.CNews
KI
25 февраля 2023
Обновлено 24 июля 2023

Настройка конвейера непрерывной интеграции с Concourse CI в Ubuntu 20/22

CentOS Debian Git Linux Nginx node.js Ubuntu

Введение

Настройка непрерывной интеграции и автоматизация конвейеров тестирования с помощью компонуемого декларативного синтаксиса 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.
Воспользуйтесь следующими инструкциями для правильной настройки:

В этой инструкции весь процесс работы рассматривается на рабочем компьютере с заранее установленной Ubuntu Linux. По этой причине следует удостовериться, что установлены разные утилиты для редактирования текстовых файлов, которые удобны вам в использовании.
Также вам потребуется утилита Git на локальном компьютере и для правильной настройки воспользуйтесь нашей инструкцией.

Когда убедились, что сервер Concourse работает и на локальном компьютере имеются все инструменты для работы с текстовыми файлами и установлен Git, приступим к основной задаче нашей инструкции.

Использование Fly в командной строке

Необходимо убедиться, что на основном сервере установлен Concourse Worker и Fly (для управления конвейером с помощью командной строки).

При повседневной работе с Concourse CI удобнее установить fly на рабочий компьютер, в котором установлены ежедневные инструменты для работы с разработкой разных продуктов.
Для получения актуальной версии fly, необходимо открыть web-интерфейс Concourse CI установленный на сервере:

https://server_url

После авторизации в сервере, в нижней правой части экрана можно скачать fly выбрав свою систему на рабочем месте:

Версия Fly и ссылка на файлы
Рисунок 1 – Версия 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 необходимо добавить конвейер непрерывной интеграции в основной ветке репозитория.

2
Рисунок 2 – Репозиторий hello_hapi

В терминале перейдём в директорию пользователя. Сделаем копию репозитория на нашем рабочем компьютере, для этого воспользуемся следующими командами утилиты 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

Соглашаемся с запуском:

Запуск конвейера
Рисунок 3 – Запуск конвейера

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

fly -t tutorial unpause-pipeline -p hello_hapi
Конвейер hello_hapi
Рисунок 4 – Конвейер hello_hapi

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

5
Рисунок 5 – Кнопка запуска конвейера

Фиксирование изменений в Git

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

git add ci

Необходимо выполнить проверку статуса добавленных файлов:

git status
Проверка статуса
Рисунок 6 – Проверка статуса

Зафиксируем изменения и воспользуемся командой:

git commit -m 'First commit for our project'

Необходимо объединить наши ветки переключив на основную ветку.

git checkout master

git merge pipeline

Необходимо закрепить внесенные нами изменения в наш репозиторий:

git push origin master

Стоит отметить о том, что после сохранения всех изменений, необходимо запустить тест через одну минуту.

Просмотр запуска тестов

Вернувшись в Web-интерфейс необходимо запустить новый тест нажав на кнопку +:

Запуск нового теста
Рисунок 7 – Запуск нового теста

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

Успешный запуск теста
Рисунок 8 – Успешный запуск теста

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

Статус конвейера
Рисунок 9 – Статус конвейера

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

Запуск новой задачи
Рисунок 10 – Запуск новой задачи

Выводы

В данной инструкции мы рассмотрели:

  • Настройку утилиты fly;
  • Клонирование репозитория из Git;
  • Создание сценария для конвейера;
  • Создание сценария для тестов;
  • Запуск конвейера;
  • Внесение изменений в наш репозиторий;
  • Запуск тестов;
Оценка:
4 из 5
Аverage rating : 4.4
Оценок: 5
191028 Санкт-Петербург Литейный пр., д. 26, Лит. А
+7 (812) 403-06-99
700 300
ООО «ИТГЛОБАЛКОМ ЛАБС»
700 300

Вам также может быть интересно...