Руководство прикладного разработчика#
В данном руководстве прикладного разработчика описана настройка процесса сборки и передачи дистрибутива Solution внешним заказчикам. Весь процесс можно поделить на 5 частей. Для каждой из частей настраивается Jenkins job с подключением своей библиотеки.
Системные требования#
Для работы Jenkins jobs сборки и передачи Solution необходимо:
Наличие проектной области в Jenkins-ci.
Наличие ТУЗ для загрузки компонентов и загрузки Solution в Nexus-cd.
Оформляется в Jenkins в виде credentials c типом
username with password.
Наличие ТУЗ для скачивания сборочных библиотек из Bitbucket.
Оформляется в Jenkins в виде credentials c типом
SSH Username with private key.
Наличие коммунального ТУЗ (на текущий момент) для доступа на сервер подписания дистрибутивов.
Оформляется в Jenkins в виде credentials c типом
username with password.
Наличие зарегистрированного КЭ используемого Solution.
Для Solution, зарегистрированных в банке. Необходим при передаче Solution в банк.
Наличие УЗ для чтения конфигурационных файлов из репозитория.
Оформляется в Jenkins в виде credentials c типом
SSH Username with private key.
Наличие УЗ для загрузки в целевое хранилище дистрибутивов.
Оформляется в Jenkins в виде credentials c типом
username with password.
Наличие УЗ для загрузки в целевое хранилище дистрибутивов типа "репозиторий".
Оформляется в Jenkins в виде credentials c типом
SSH Username with private key.
Допускается использование одинаковых УЗ для нескольких целей одновременно (при совпадении типа).
Подключение и конфигурирование#
Создание Jenkins job сборки Solution#
Solution packer job:
Создать pipeline (New Item → Pipeline).
Перейти в конфигурацию Jenkins job и подключить библиотеку:
В разделе Pipeline в поле Definition выбрать из выпадающего списка
Pipeline script from SCM.Для SCM выбрать
Git.В качестве Repository URL указать
ssh://git@solution-packer.git.Credentials – ID credentials в Jenkins c типом
SSH Username with private key.В поле Script path ввести
packer.groovy.
При первом запуске Jenkins job появятся параметры с описанием. Часть параметров имеют значения по-умолчанию (при необходимости можно переопределить), некоторые необходимо будет заполнить самостоятельно.
Параметры Jenkins Job для заполнения#
COMPONENTS =
GroupId:ArtifactId:Type:Classifier:Versionиспользуемого дистрибутива, для его заполнения необходимо выбрать в Nexus необходимый дистрибутив и справа, в разделе Usage, выбратьApache Buildr.Далее для каждого компонента копировать полученное значение в столбик.
Пример:
'Nexus_PROD:CI02676597_TSK:zip:distrib:D-4.5.0-82-bin' 'Nexus_PROD:CI02676597_TSK:zip:distrib:D-4.5.0-82-cfg'NEXUS_CRED = ID credentials в Jenkins c типом
username with password.ARTIFACT_ID = Solution ARTIFACT_ID.
VERSION = Версия Solution. При желании можно добавить номер сборки в версию с помощью переменной ${BUILD_NUMBER}.
Например,
1.3.0-${BUILD_NUMBER}.JAVA_TOOL = версия JDK, необязательный параметр; если для используемого агента требуется указать JAVA_HOME – можно создать в job как строковый параметр.
EXCLUDE = Файлы, исключаемые из распаковки.
GROOVY_VERSION = используемая версия Groovy.
MAVEN_VERSION = используемая версия Maven.
SOLUTION_COMPONENTS_DIR = имя директории, в которую будут скачиваться компоненты на агенте.
DEPENDENCY_RESOLVER_CONFIGS_DIR = имя директории, в которую будет скачен файл конфигурации для Dependency Resolver.
DEPENDENCY_RESOLVER_DIR = имя директории, в которую будет скачена библиотека Dependency Reslover.
Создание Jenkins job сборки пакета Solution и получения для него цифровой подписи#
Solution publisher job:
Создать pipeline (New Item → Pipeline).
Перейти в конфигурацию Jenkins job и подключить библиотеку:
В разделе Pipeline в поле Definition выбрать из выпадающего списка
Pipeline script from SCM.Для SCM выбрать
Git.В качестве Repository URL указать
ssh://git@solution-packer.git.Credentials – ID credentials в Jenkins c типом
SSH Username with private key.В поле Script path ввести
publisher.groovy.
При первом запуске Jenkins job появятся параметры с описанием. Часть параметров имеют значения по-умолчанию (при необходимости можно переопределить), некоторые необходимо будет заполнить самостоятельно.
Параметры Jenkins Job для заполнения#
COMPONENTS = 'GroupId:ArtifactId:Type:Classifier:Version' дистрибутива, для его заполнения необходимо выбрать в Nexus необходимый дистрибутив и справа, в разделе Usage, выбрать
Apache Buildr. Далее для каждого компонента копировать полученное значение в столбик.Пример:
'Nexus_PROD:CI02676597_TSK:zip:distrib:D-4.5.0-82-bin' 'Nexus_PROD:CI02676597_TSK:zip:distrib:D-4.5.0-82-cfg'NEXUS_CRED = ID credentials в Jenkins c типом
username with password.SBERSIGN_CRED - ID credentials в Jenkins c типом
username with password.ARTIFACT_ID = Solution ARTIFACT_ID.
VERSION = Версия Solution. При желании можно добавить номер сборки в версию с помощью переменной
${BUILD_NUMBER}.Например:
1.3.0-${BUILD_NUMBER}.SOLUTION_DIR = имя директории, в которой будет собираться пакет Solution.
MAVEN_VERSION = используемая версия Maven.
Создание Jenkins job передачи информации о Solution в стороннюю организацию#
Notifier job:
Создать pipeline (New Item → Pipeline).
Перейти в конфигурацию Jenkins job и подключить библиотеку:
В разделе Pipeline в поле Definition выбрать из выпадающего списка
Pipeline script from SCM.Для SCM выбрать
Git.В качестве Repository URL указать
ssh://git@solution-packer.git.Credentials – ID credentials в Jenkins c типом
SSH Username with private key.В поле Script path ввести
notifier.groovy.
При первом запуске Jenkins job появятся параметры с описанием. Часть параметров имеют значения по-умолчанию (при необходимости можно переопределить), некоторые необходимо будет заполнить самостоятельно.
Параметры Jenkins Job для заполнения#
NEXUS_CRED = ID credentials в Jenkins c типом
username with password.ARTIFACT_ID = Solution ARTIFACT_ID.
VERSION = Версия Solution. При желании можно добавить номер сборки в версию с помощью переменной
${BUILD_NUMBER}. Например:1.3.0-${BUILD_NUMBER}.SOLUTION_ID = Зарегистрированный КЭ Solution.
Для Solution, зарегистрированных в банке. Необходим при передаче Solution в банк.
JAVA_TOOL = версия JDK, необязательный параметр; если для используемого агента требуется указать JAVA_HOME – можно создать в job как строковый параметр
MAVEN_VERSION = используемая версия Maven.
Создание Jenkins job пересборки Docker образов, обновления конфигураций и SDK для компонентов Solution#
Solution merger job:
Создать pipeline (New Item → Pipeline).
Перейти в конфигурацию Jenkins job и подключить библиотеку:
В разделе Pipeline в поле Definition выбрать из выпадающего списка
Pipeline script from SCM.Для SCM выбрать
Git.В качестве Repository URL указать
ssh://git@solution-merger.git.Credentials – ID credentials в Jenkins c типом
SSH Username with private key.В поле Script path ввести
merge.groovy.
При первом запуске Jenkins job появятся параметры с описанием. Часть параметров имеют значения по умолчанию (при необходимости можно переопределить), некоторые необходимо будет заполнить самостоятельно.
Параметры Jenkins Job для заполнения#
JENKINS_NODE = Метка агента Jenkins, на котором будет выполняться job.
CONFIG_REPO = Адрес репозитория (SSH ссылка), в котором находится файл конфигурации.
CONFIG_BRANCH = Ветка репозитория с файлом конфигурации, по-умолчанию используется ветка
master.GROUP_ID = GroupId Solution,
mergeкоторого необходимо осуществить.ARTIFACT_ID = ArtifactId Solution,
mergeкоторого необходимо осуществить.VERSION = Версия Solution для merge. При желании можно добавить номер сборки в версию с помощью переменной
${BUILD_NUMBER}.Например:
1.3.0-${BUILD_NUMBER}.EXCLUDE = Файлы, исключаемые из распаковки.
dpmPhaseID = параметр, позволяющий запускать Jenkins job из конвейеров DPM.
SOLUTION_DIR = имя директории, в которую будет скачиваться пакет Solution.
Создание конфигурационного файла#
В репозитории с конфигурацией должен лежать файл merger.yml, заполненный следующим образом:
build_history:
builds:
days: 100 # сколько дней хранить сборки
num: 30 # количество сборок для хранения
tooling: # какие конкретно утилиты использовать из инструментария Jenkins
jdk: openjdk-11.0.11_linux # версия JDK, которую будет использовать Maven для скачивания и загрузки компонентов
maven: Maven 3.6.3 # версия Maven, используемая для скачивания и загрузки архивов
npm: v7.5.0-linux-x64 # версия NPM
groovy: Groovy-3.0.7 # версия Groovy, которой будет объединяться дистрибутив (из owned и party), версия Groovy должна быть 3.x и выше
repositories:
solution:
download: # адрес репозитория и ID credentials в Jenkins для скачивания Solution
url: https://<...>/nexus/content/repositories/Nexus_PROD_OUT/
creds: demoCD
upload: # адрес репозитория и ID credentials в Jenkins для загрузки объединенного Solution
url: https://<...>/nexus/content/repositories/Nexus_PROD_OUT/
creds: demoCD
maven: #
download: # адрес репозитория и ID credentials в Jenkins для загрузки Maven плагинов
url: http://<...>/nexus/content/repositories/central
creds: demoCD
upload: # адрес репозитория и ID credentials в Jenkins для загрузки Maven артефактов (SDK)
url: http://<...>/nexus/content/repositories/efs_release
creds: demoCD
npm: # адрес репозитория и ID credentials в Jenkins для загрузки NPM артефактов (SDK)
url: https://<...>/nexus/content/repositories/some-npm-repo
creds: demoCD
docker:
registry: # адрес репозитория и ID credentials в Jenkins для сборки и загрузки Docker образов
url: https://registry.<...>.ru
creds: 4627c8e5-ab42-4e76-a816-ce2ec6e718fc
# путь для загрузки Docker образов
registry_path: efs-dev/ci01976100/ci02210881_as_efs_devops_pipeline_dev
# маппинг базовых образов
base_image_mapping:
- from: .*some/regex.*
to: registry.<...>.ru/some_path/base_url
- from: .*openjdk11.*
to: registry.<...>.ru/efs/base/rhel7openjdk11:7.6-252.1561619826-86
# маппинг ссылок на образы (применяется, чтобы заменить ссылки на Sidecar)
image_link_mapping:
"mona/agent@sha256:[0-9a-f]{64}" : "mona/agent@sha256:cbd08dc4877d5b1b0cb81fd35b02c482737e12e1860ab6117962eef3075a6aa5"
"supa/client@sha256:[0-9a-f]{64}" : "supa/client@sha256:7c42e54a4d3b3175b4912781fcfcfd0709d7f6bd3169c9f5a8b69ce7cfc75e3f"
️ Указывая ссылки на образы, можно воспользоваться функциональностью подмены путей к образам по регулярному выражению и указать в качестве значения требуемые переменные. Или, если это Sidecar, который находится в другом КЭ и
{{ registry_path }}продукта к нему не подходит, можно вместо{{ registry_path }}указать сразу правильный путь. Например:
image_link_mapping:
"\\$\\{some.custom.registry.path.parameter\\}/<host>/xxx_xxxx/xxxx/some-component-app": "{{ registry }}/{{ registry_path }}/cixxxxxxxx/xxxxxxxx/some-component-app"
"/<host>/yyy_yyyy/yyyy/some-sidecar": "/ciyyyyyyy/yyyyyyy/some-sidecar"
Создание Jenkins job распаковки Solution#
Solution unpacker job:
Создать pipeline (New Item → Pipeline).
Перейти в конфигурацию Jenkins job и подключить библиотеку:
В разделе Pipeline в поле Definition выбрать из выпадающего списка
Pipeline script from SCM.Для SCM выбрать
Git.В качестве Repository URL указать
ssh://git@solution-unpacker.git.Credentials – ID credentials в Jenkins c типом
SSH Username with private key.В поле Script path ввести
unpackSolution.groovy.
При первом запуске Jenkins job появятся параметры с описанием. Часть параметров имеют значения по умолчанию (при необходимости можно переопределить), некоторые необходимо будет заполнить самостоятельно.
Параметры Jenkins Job для заполнения#
JENKINS_NODE = Метка агента Jenkins, на котором будет выполняться job.
CONFIG_REPO = Адрес репозитория (SSH ссылка), в котором находится файл конфигурации.
CONFIG_BRANCH = Ветка репозитория с файлом конфигурации, по-умолчанию используется ветка
master.GROUP_ID = GroupId Solution.
ARTIFACT_ID = ArtifactId Solution.
VERSION = Версия Solution для
merge. При желании можно добавить номер сборки в версию с помощью переменной${BUILD_NUMBER}.Например:
1.3.0-${BUILD_NUMBER}.SOLUTION_DIR = имя директории, в которую будет скачиваться пакет Solution.
Создание конфигурационных файлов#
В репозитории с конфигурацией нужно разместить следующие файлы:
environment.yml– конфигурационный файл, описывающий используемые репозитории и настройки окружения.artifactRenameRules.csv– таблица соответствия координат groupId/artifactId артефактов Solution координатам groupId/artifactId в репозиториях целевого хранилища.
artifactRenameRules.csvнеобязателен для размещения. Он создается и заполняется в процессе работы самой Jenkins job.
Пример заполнения файла environment.yml:
build_history:
days: 100 # сколько дней хранить сборки
num: 3 # сколько сборок хранить
repositories:
central: # адрес репозитория-зеркала central, УЗ по умолчанию - ci
src: http://<...>/nexus/content/repositories/central
creds: demoCD # для репозиториев можно указывать УЗ по отдельности
solution: # адрес репозитория, где лежат Solution
src: https://<...>/nexus/content/repositories/Nexus_PROD_OUT/
cd: # адрес репозитория, куда раскладывать дистрибутивы
src: https://<...>/nexus/content/repositories/Nexus_PROD
gitRepositories: # перечень репозиториев, для загрузки дистрибутивов, состоящих из git-репозиториев
repoId1: # реквизиты для загрузки каждого из репозиториев, взятых из свойства <repoId> pom.xml
src: ssh://git-server/project/repo.git
creds: demoCD_ssh
credentials:
ci: demoCD # УЗ для доступа к Maven-репозиторию, для скачивания плагинов Maven (для взаимодействия с репозиториями)
cd: demoCD # УЗ для загрузки дистрибутивов в Nexus
solution: demoCD # УЗ для загрузки Solution
ssh: demoCD_ssh # УЗ типа SSH, под которой будут пушиться дистрибутивы с репозиторияими
java: # настройка инструментария
jdk: openjdk-11.0.11_linux
maven: Maven 3.6.3
extensions: # Блок для подключения точек расширения (подробнее см. "Инструменты трансформации дистрибутива в процессе распаковки")
При первичной распаковке Solution репозитории, созданные в GitLab/Bitbucket для распаковки дистрибутива Solution, должны быть пустыми. При обновлении Solution (когда в распаковываемых репозиториях уже есть предыдущая версия Solution) очищать репозитории нет необходимости.
Миграция на текущую версию#
Для управления версией программного компонента Delivery Tools необходимо:
Указать непосредственно в Jenkins jobs для каждой из сборочных библиотек
tagнеобходимого релиза. Соответствие тега релизу можно узнать из файла ReleaseNotes.json, находящегося в корне репозитория каждой из библиотек.
После обновления версии, рекомендуется выполнить реконфигурацию: для этого нужно запустить Jenkins jobs без параметров запуска.
Быстрый старт#
Для работы Delivery Tools необходимо:
Создать 5 Jenkins jobs по количеству сборочных библиотек в программном компоненте.
Подключить сборочные библиотеки и запустить Jenkins jobs без параметров.
Заполнить параметры значениями для последующих запусков Jenkins jobs.
Использование программного компонента#
Программный компонент Delivery Tools используется для сборки и передачи дистрибутива Solution внешним заказчикам. Далее дано краткое описание каждой и сборочных библиотек, входящих в Delivery Tools.
Сборка Solution и получения для него цифровой подписи#
Является частью процесса Передачи дистрибутива ППО внешней разработки в Nexus.
Основные этапы:
Сборка Solution из дистрибутивов его компонентов.
Разделение Solution на
owned,partyиvendorчасти.Загрузка этих частей Solution в Nexus.
Результат:
Solution, разделенный на составные
owned,partyиvendorчасти, имеющий classifier'distrib'и расширение'.zip', загружен в Nexus.
Дополнительная информация#
Сборка Solution включает в себя разделение его компонентов на owned, party и vendor части. Этот функционал реализует подключаемая библиотека Dependency Resolver.
Для ее работы нужны переменные окружения, которые при необходимости можно переопределить, добавив в Jenkins job следующие параметры:
DEPENDENCY_RESOLVER_CONFIGS = Ссылка на репозиторий с конфигурациями для библиотеки Dependency Resolver, значение по-умолчанию:
ssh://git@dependency-resolver-configs.git.DEPENDENCY_RESOLVER_CONFIGS_BRANCH = Ветка в репозитории с конфигурациями для библиотеки Dependency Resolver, значение по-умолчанию:
master.DEPENDENCY_RESOLVER_BRANCH = Ветка скриптов библиотеки Dependency Resolver, значение по-умолчанию:
master.
Создание и получение цифровой подписи пакета Solution#
Pipeline является частью процесса Передачи дистрибутива ППО внешней разработки в Nexus.
Основные этапы:
Создание пакета, содержащего составные части Solution.
Получение цифровой подписи для этого пакета.
Загрузка пакета Solution в Nexus.
Загрузка подписей и хешей для пакета Solution в Nexus.
Результат:
Пакет, содержащий составные части Solution, подписанный цифровой подписью, имеющий classifier
'distrib'и расширение'.zip', загружен в Nexus.Архив с подписями и хешами для пакета Solution, имеющий classifier
'distrib'и расширение'.zip', загружен в Nexus.
Передача информации о пакете Solution в стороннюю организацию#
Pipeline является частью процесса Передачи дистрибутива ППО внешней разработки в Nexus.
Основные этапы:
Загрузка архива с подписями и хешами для пакета Solution из Nexus.
Передача данных о пакете Solution в стороннюю организацию.
Результат:
Данные о пакете Solution успешно переданы в стороннюю организацию.
Пересборка Docker образов, обновление конфигураций и SDK для компонентов Solution#
Основные этапы:
Скачивание пакета, содержащего составные части Solution, и
mergeодного архива.Распаковка архива. Выделение компонентов Solution.
Пересборка Docker образов и обновление хэшей в конфигурациях для компонентов Solution.
Обновление SDK в дистрибутивах компонентов.
Перепаковка архива Solution и загрузка его в Nexus.
Результат:
Архив Solution, имеющий classifier
'distrib'и расширение'.zip', загружен в Nexus.
Распаковка Solution#
Основные этапы:
Скачивание архива Solution.
Распаковка архива Solution и загрузка его компонентов в Nexus сторонней организации для последующей их установки.
Результат:
Архив Solution успешно распакован и его компоненты загружены в Nexus сторонней организации. В составе Solution могут быть компоненты следующих типов:
"обычный" дистрибутив, содержит и исполняемый код, и конфигурации.
бинарный дистрибутив, содержит исполняемый код какой-либо подсистемы, и не содержит конфигураций. Такой дистрибутив не может быть установлен на какие-нибудь стенды.
дистрибутив конфигураций, состоит из конфигурации и не содержит исполняемого кода. В таком дистрибутиве обязательно должна быть ссылка на какую-либо версию бинарного дистрибутива.
репозиторий - специальный дистрибутив, состоит из git репозитория, который выгружается не в Maven-хранилище, а в соответствующий целевой git-репозиторий (целевое расположение).
Обычный, бинарный, а также дистрибутив конфигураций при обработке Solution выкладываются в репозиторий дистрибутивов, где их во время установки будут искать утилиты развертывания. Обычный и бинарный дистрибутивы могут содержать внутри себя артефакты, предназначенные для разработки. Такие артефакты загружаются в специальный целевой репозиторий разработки.
Часто встречающиеся проблемы и пути их устранения#
Отсутствие GAV-параметров Solution для заполнения соответствующих параметров Jenkins jobs#
GAV-параметры собираемого Solution следует уточнять у соответствующего Solution-owner.
В переданном дистрибутиве в манифестах не параметризованы пути к образам через переменные и #
В настройках Jenkins job пересборки Docker образов (solution-merger) при указании путей к образам использовать подмену путей по регулярному выражению и указать в качестве значения требуемые переменные. Или, если это Sidecar, который находится в другом КЭ и
{{ registry_path }}продукта к нему не подходит, указать вместо{{ registry_path }}сразу правильный путь. Например:
image_link_mapping:
"\\$\\{some.custom.registry.path.parameter\\}/<host>/xxx_xxxx/xxxx/some-component-app": "{{ registry }}/{{ registry_path }}/cixxxxxxxx/xxxxxxxx/some-component-app"
"/<host>/yyy_yyyy/yyyy/some-sidecar": "/yyyyyyy/yyyyyyy/some-sidecar"