Подключение дополнительного контура Global ERP#
Документ описывает подключение дополнительного контура Global ERP для передачи конфигураций, служебных пакетов и связанных артефактов между контурами. Подключение выполняется через настройку удалённого контура и может использовать разные способы передачи: прямое REST-подключение, репозиторий системы контроля версий или корпоративный реестр артефактов.
Конкретный способ подключения выбирается проектно и зависит от сетевой доступности контуров и принятой схемы поставки. Подробное описание поддерживаемых вариантов подключения приведено в разделе о переносе конфигураций.
В этой инструкции приведён пример подключения через Git. В таком варианте исходный контур отправляет данные в Git-репозиторий, после чего CI/CD-пайплайн выполняет валидацию, установку на целевой контур и возвращает результаты обработки.
Настройка в системе GlobalERP#
Для работы механизма выполните подготовительные действия на исходном и целевом контурах.
Создание технических пользователей#
На каждом контуре создайте отдельную техническую учётную запись для операций выгрузки и загрузки конфигураций.
Откройте приложение
Администратор > Доступ > Пользователи.Создайте пользователя с типом Технический пользователь.
Назначьте пользователю роль с доступом к функционалу менеджера конфигураций.
Для корректной работы в роли настройте права:
Перейдите в карточку роли → закладка Права роли.
В списке бизнес-объектов найдите
Btk_ConfigManagerAvi. Чтобы объект отобразился, отключите фильтр Только объекты, на которые у роли имеются права.Назначьте права:
Чтение, Редактирование, Добавление;
все доступные объектные права.
На закладке Серверные полномочия той же роли предоставьте полный доступ к REST-пакету
Btk_ConfigManagerRestPkg.
Конфигурация исходного контура (отправителя)#
На контуре-отправителе настройте подключение к целевому контуру.
Откройте приложение
Настройки системы > Настройки и сервисы > Управление конфигурацией > Настройки удалённых контуров.Создайте новую запись с параметрами:
Параметр |
Рекомендуемое значение |
Примечание |
|---|---|---|
Код |
|
Уникальный идентификатор |
Наименование |
|
Произвольное, но понятное |
Url |
Адрес Git-репозитория, заканчивающийся на |
Создание репозитория описано далее |
База данных |
Наименование текущей БД |
Обычно совпадает с именем контура |
Пользователь |
Логин технического пользователя в GitLab |
Используется для аутентификации |
Пароль |
Зашифрованное значение пароля |
См. ниже |
Тип передачи |
|
Обязательное значение |
Примечание
Как зашифровать пароль: используйте функцию Сервис > Настройки и сервисы > Дополнительно > Шифрование данных. Полученное значение вставьте в поле Пароль.
Заполните дополнительные характеристики:
URL контура — базовый адрес целевого контура GlobalERP.
Git Email — электронный адрес пользователя Git с доступом к репозиторию.
Наименование целевого контура — должно в точности совпадать с кодом аналогичной настройки
Настройки удалённых контуров, созданной на целевом контуре.
Конфигурация целевого контура (получателя)#
Настройте целевой контур через раздел Настройки удалённых контуров. Создайте запись с отличиями:
Параметр |
Рекомендуемое значение |
|---|---|
Код |
|
Наименование |
|
Url |
Тот же Git-репозиторий, что и на исходном контуре |
Пользователь / Пароль / Тип передачи |
Настроены идентично |
Дополнительные характеристики:
URL контура — базовый адрес исходного контура.
Git Email — тот же email, что и на исходном контуре.
Наименование целевого контура — должно совпадать с кодом настройки на исходном контуре (например,
to-prod).
Важно
Значения Наименование целевого контура на обоих контурах должны быть согласованы — это обеспечивает корректную маршрутизацию в пайплайне.
Настройка среды GitLab#
Оркестрация переноса осуществляется средствами CI/CD в GitLab. Настройте раннер, репозиторий, токен и переменные.
Настройка раннера#
Разверните и зарегистрируйте instance runner в вашем инстансе GitLab.
Убедитесь, что раннер поддерживает Python 3.9+.
Установите необходимые библиотеки Python:
pip3 install pyyaml requests
Назначьте раннеру уникальный тег, например:
config_manager, для привязки задач CI/CD в репозиториях оркестрации.
Подготовка репозитория#
Создайте новый пустой проект в GitLab.
В корне репозитория разместите:
файл конфигурации CI/CD (
.gitlab-ci.yml);файл с исполняемым Python-скриптом (
config_manager.py);набор служебных директорий.
Основной файл пайплайна — .gitlab-ci.yml. Его содержимое задаёт последовательность стадий и операций. В разделе tags каждого job укажите тег, соответствующий настройкам раннера (config_manager).
Файл .gitlab-ci.yml#
stages:
- deploy
variables:
# Авторизационные данные от целевого контура
TARGET_USERNAME: $TARGET_USERNAME
TARGET_PASSWORD: $TARGET_PASSWORD
# Авторизационные данные от исходного контура
ORIGINAL_USERNAME: $ORIGINAL_USERNAME
ORIGINAL_PASSWORD: $ORIGINAL_PASSWORD
# Валидация метаданных на целевом контуре
validate_meta_data:
tags:
- test
stage: deploy
only:
changes:
- "validationMetaData/**/*"
script:
- rm -rf ${REPO_NAME}
- git clone https://oauth2:${PUSH_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git ${REPO_NAME}
- git config --global user.email "config-manager-bot@email.com"
- git config --global user.name "**Config Manager Bot**"
- cd ${REPO_NAME}
- CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
- YAML_FILE=$(echo "$CHANGED_FILES" | (grep '^validationMetaData/.*\.yaml$' || true) | head -1)
- |
if [ -z "$YAML_FILE" ]; then
ZIP_FILE=$(echo "$CHANGED_FILES" | (grep '^validationMetaData/.*\.zip$' || true) | head -1)
if [ -n "$ZIP_FILE" ]; then
UUID=$(basename "$ZIP_FILE" .zip)
YAML_FILE="validationMetaData/${UUID}.yaml"
fi
fi
- |
if [ -z "$YAML_FILE" ] || [ ! -f "$YAML_FILE" ]; then
echo "Error: YAML file not found or missing: $YAML_FILE"
exit 1
fi
- python3 config_manager.py "$YAML_FILE" "${TARGET_USERNAME}" "${TARGET_PASSWORD}"
- cd ..
- rm -rf ${REPO_NAME}
variables:
REPO_NAME: "validate_meta_data_repo"
# Отправка отчёта об валидации метаданных на исходный контур
send_meta_data_report:
tags:
- test
stage: deploy
only:
changes:
- "sendMetaDataReport/**/*"
script:
- rm -rf ${REPO_NAME}
- git clone https://oauth2:${PUSH_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git ${REPO_NAME}
- git config --global user.email "config-manager-bot@email.com"
- git config --global user.name "**Config Manager Bot**"
- cd ${REPO_NAME}
- CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
- YAML_FILE=$(echo "$CHANGED_FILES" | (grep '^sendMetaDataReport/.*\.yaml$' || true) | head -1)
- |
if [ -z "$YAML_FILE" ]; then
ZIP_FILE=$(echo "$CHANGED_FILES" | (grep '^sendMetaDataReport/.*\.zip$' || true) | head -1)
if [ -n "$ZIP_FILE" ]; then
UUID=$(basename "$ZIP_FILE" .zip)
YAML_FILE="sendMetaDataReport/${UUID}.yaml"
fi
fi
- |
if [ -z "$YAML_FILE" ] || [ ! -f "$YAML_FILE" ]; then
echo "Error: YAML file not found or missing: $YAML_FILE"
exit 1
fi
- python3 config_manager.py "$YAML_FILE" "${ORIGINAL_USERNAME}" "${ORIGINAL_PASSWORD}"
- cd ..
- rm -rf ${REPO_NAME}
variables:
REPO_NAME: "install_config_repo"
# Установка конфигурации на целевой контур
install_config:
tags:
- test
stage: deploy
only:
changes:
- "installConfig/**/*"
script:
- rm -rf ${REPO_NAME}
- git clone https://oauth2:${PUSH_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git ${REPO_NAME}
- git config --global user.email "config-manager-bot@email.com"
- git config --global user.name "**Config Manager Bot**"
- cd ${REPO_NAME}
- CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
- YAML_FILE=$(echo "$CHANGED_FILES" | (grep '^installConfig/.*\.yaml$' || true) | head -1)
- |
if [ -z "$YAML_FILE" ]; then
ZIP_FILE=$(echo "$CHANGED_FILES" | (grep '^installConfig/.*\.zip$' || true) | head -1)
if [ -n "$ZIP_FILE" ]; then
UUID=$(basename "$ZIP_FILE" .zip)
YAML_FILE="installConfig/${UUID}.yaml"
fi
fi
- |
if [ -z "$YAML_FILE" ] || [ ! -f "$YAML_FILE" ]; then
echo "Error: YAML file not found or missing: $YAML_FILE"
exit 1
fi
- python3 config_manager.py "$YAML_FILE" "${TARGET_USERNAME}" "${TARGET_PASSWORD}"
- cd ..
- rm -rf ${REPO_NAME}
variables:
REPO_NAME: "install_config_repo"
# Отправка отчёта на исходный контур об установке конфигурации
send_install_report:
tags:
- test
stage: deploy
only:
changes:
- "sendInstallReport/**/*"
script:
- rm -rf ${REPO_NAME}
- git clone https://oauth2:${PUSH_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git ${REPO_NAME}
- git config --global user.email "config-manager-bot@email.com"
- git config --global user.name "**Config Manager Bot**"
- cd ${REPO_NAME}
- CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
- YAML_FILE=$(echo "$CHANGED_FILES" | (grep '^sendInstallReport/.*\.yaml$' || true) | head -1)
- |
if [ -z "$YAML_FILE" ]; then
ZIP_FILE=$(echo "$CHANGED_FILES" | (grep '^sendInstallReport/.*\.zip$' || true) | head -1)
if [ -n "$ZIP_FILE" ]; then
UUID=$(basename "$ZIP_FILE" .zip)
YAML_FILE="sendInstallReport/${UUID}.yaml"
fi
fi
- |
if [ -z "$YAML_FILE" ] || [ ! -f "$YAML_FILE" ]; then
echo "Error: YAML file not found or missing: $YAML_FILE"
exit 1
fi
- python3 config_manager.py "$YAML_FILE" "${ORIGINAL_USERNAME}" "${ORIGINAL_PASSWORD}"
- cd ..
- rm -rf ${REPO_NAME}
variables:
REPO_NAME: "send_install_report_repo"
Скрипт config_manager.py#
import yaml
import sys
import requests
from requests.auth import HTTPBasicAuth
def main():
if len(sys.argv) != 4:
print("Error: Переданы не все параметры, убедитесь в правильности .gitlab-ci.yml")
sys.exit(1)
file_path = sys.argv[1]
username = sys.argv[2]
password = sys.argv[3]
try:
# Читаем YAML файл
with open(file_path, 'r') as file:
yaml_data = yaml.safe_load(file)
# Параметры
link_circuit = yaml_data.get('linkCircuit')
name_base_circuit = yaml_data.get('nameBaseCircuit')
file_name = yaml_data.get('fileName')
uuid = yaml_data.get("sUUID")
id_user = yaml_data.get("idUser")
# POST запрос на контур
response = requests.post(
link_circuit,
data={
'sFileName': file_name,
'sBaseCircuit': name_base_circuit,
'sUUID': uuid,
'idUser': id_user
},
auth=HTTPBasicAuth(username, password)
)
print(f"Response status code: {response.status_code}")
print(f"Response text: {response.text}")
if response.status_code != 200:
sys.exit(1)
except Exception as e:
print(f"Error: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()
Служебные директории#
Создайте в корне репозитория папки:
validationMetaData;sendMetaDataReport;installConfig;sendInstallReport.
Поскольку Git не отслеживает пустые каталоги, поместите в каждую из них пустой файл .gitkeep.
Создание токена доступа#
Для взаимодействия пайплайна с репозиторием создайте токен доступа:
Перейдите в настройки проекта:
Settings > Access Tokens > Add new token.Укажите имя, например:
config_manager_token.Выберите срок действия и область видимости (scope).
Назначьте минимально необходимые права:
read_repository;write_repository;api.
Сохраните токен — он понадобится на следующем шаге.
Настройка переменных CI/CD#
Для безопасной передачи учётных данных в задания пайплайна используйте защищённые переменные. Добавьте их в разделе Settings > CI/CD > Variables. Для каждой переменной:
установите Visibility в значение Masked;
в Flags выберите только Expand variable reference.
Создайте переменные:
Переменная |
Описание |
|---|---|
|
Логин технического пользователя на исходном контуре |
|
Пароль технического пользователя на исходном контуре |
|
Логин технического пользователя на целевом контуре |
|
Пароль технического пользователя на целевом контуре |
|
Токен для работы с репозиторием |
Завершение настройки#
После завершения настройки пользователь инициирует перенос конфигурации в интерфейсе GlobalERP. Система автоматически взаимодействует с GitLab-репозиторием, который последовательно выполняет этапы валидации и установки на удалённых контурах.