Пример Python скрипта для копирования пакетов с одного Nexus репозитория в другой

Обновлено и опубликовано Опубликовано:

Nexus является распространенным решением, позволяющим реализовать сервис репозитория пакетов. У него отсутствует нативное решение для выгрузки и загрузки пакетов из определенного репозитория. Но есть API, используя которое можно реализовать нашу задачу.

Подготовка к работе

Мы будем работать с python3. Установим его. Наши команды будут отличаться в зависимости от дистрибутива Linux.

а) Deb (Debian / Ubuntu / Astra):

apt install python3 python3-pip

б) RPM (Rocky Linux, CentOS):

dnf install python3 python3-pip

Установка выполнена.

Также нам нужен модуль requests для отправки HTTP-запросов. Его можно установить с помощью pip:

pip3 install requests

Наш скрипт мы поместим в отдельный каталог /scripts — создадим его:

mkdir /scripts

Создаем сам скрипт:

touch /scripts/copy_nexus_repo.py

Дадим права на запуск скрипта:

chmod +x /scripts/copy_nexus_repo.py

Мы готовы к созданию скрипта.

Пример кода

Пример содержит строки простого скрипта на питоне, который поможет перенести все пакеты NPM из одного Nexus репозитория в другой:

vi /scripts/copy_nexus_repo.py

  1. #!/usr/bin/env python3
  2. # -*- encoding: utf-8 -*-
  3.  
  4. import requests
  5. import urllib3
  6.  
  7. # Нам нужно отключить проверку сертификата. Чтобы не ругалась консоль, отключаем предупреждения, связанные с невалидными SSL
  8. urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
  9.  
  10. REPO_NAME = "npm-repo-name"
  11.  
  12. OLD_USERNAME = "username_old_nexus"
  13. OLD_PASSWORD = "password_old_nexus"
  14. OLD_BASE_URL = "https://old.dmosk.local/service/rest/v1/components?repository=" + REPO_NAME
  15.  
  16. NEW_USERNAME = "username_new_nexus"
  17. NEW_PASSWORD = "password_new_nexus"
  18. NEW_BASE_URL = "https://new.dmosk.local/service/rest/v1/components?repository=" + REPO_NAME
  19.  
  20. ALL_PACKAGES = []
  21. CONTINUATION_TOKEN = ''
  22.  
  23. while True:
  24.     # Добавляем токен для следующие страницы, если он есть или переходим по базовому урлу
  25.     URL = OLD_BASE_URL + '&continuationToken=' + CONTINUATION_TOKEN if CONTINUATION_TOKEN else OLD_BASE_URL
  26.  
  27.     # Получаем список пакетов с сервера Nexus
  28.     response = requests.get(URL, auth=(OLD_USERNAME, OLD_PASSWORD))
  29.  
  30.     # Завершаем процесс с ошибкой, если сервер вернул код не 200
  31.     if response.status_code != 200:
  32.         print(f"Ошибка запроса. Статус код: {response.status_code}")
  33.         print(response.text)
  34.         break
  35.  
  36.     # Сохраняем в переменную список с пакетами
  37.     DATA = response.json()
  38.  
  39.     # Сохраняем полученные элементы в общий список
  40.     if 'items' in DATA:
  41.         for package_info in DATA['items']:
  42.             ALL_PACKAGES.append({
  43.                 'id': package_info.get('id'),
  44.                 'name': package_info.get('name'),
  45.                 'downloadUrl': package_info['assets'][0].get('downloadUrl'),
  46.                 'path': package_info['assets'][0].get('path'),
  47.             })
  48.  
  49.     # Получаем токен для следующей страницы или пустую строку
  50.     CONTINUATION_TOKEN = DATA.get('continuationToken', '')
  51.  
  52.     # Выходим из цикла, если токена следующией страницы нет
  53.     if not CONTINUATION_TOKEN:
  54.         break
  55.  
  56. # Пройдем по всем пакетам, скачаем их и загрузим в новый репозиторий
  57. for PKG_ARR in ALL_PACKAGES:
  58.     # Скачиваем пакет и сохраняем в буфере
  59.     download_response = requests.get(
  60.         PKG_ARR['downloadUrl'],
  61.         auth=(OLD_USERNAME, OLD_PASSWORD),
  62.         stream=True
  63.     )
  64.  
  65.     # Содержимое файла сохраняем в переменной
  66.     file_content = download_response.content
  67.  
  68.     # Задаем метеданные для аплоада пакета в новый репозиторий
  69.     files_payload = {
  70.         'npm.asset': (PKG_ARR['path'], file_content, 'application/x-tgz')
  71.     }
  72.  
  73.     # Загружаем файл в новый репозиторий
  74.     destination_response = requests.post(
  75.         NEW_BASE_URL,
  76.         auth=(NEW_USERNAME, NEW_PASSWORD),
  77.         files=files_payload,
  78.         verify=False
  79.     )
  80.     destination_response.raise_for_status()

* значения отмеченные желтым необходимо заменить на свои.

Описание скрипта

8 В моем примере будем предполагать, что один из репозиториев не проходит проверку сертификата. В этом случае мы отключим данную проверку.
10 - 18 Переменные для вашей среды. Имя репозитория, для которого нам нужно скопировать пакеты, адрес nexus, данные аутентификации.
20 - 21 Определяем пустые переменные для списка пакетов и специального токена для перехода на новую страницу (Nexus API возвращает результаты постранично).
23 - 54 Nexus API возвращает информацию постранично. В данном блоке мы в цикле проходим по всем страницам и собираем массив данных со списком пакетов и краткой информацией о них. Результат мы фиксируем в списке ALL_PACKAGES.
56 - 80 Финальный блок, в котором мы циклом перебираем все пакеты, скачиваем из, сохраняя в переменной и загружая на новый Nexus, также используя API. Обратите внимание, что мы привели пример ситуации, когда на сервере есть проблема с сертификатом и используется verify=False для отключения проверки. Данная практика не является нормальной, но имеет место быть.
# DevOps
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Нужна бесплатная консультация?

Скрипты

Пример скрипта на Python для копирования пакетов NPM с одного репозитория Nexus в другой

Развертывание caddy прокси в docker с помощью docker-compose

Файл docker-compose для развертывания Nginx Proxy Manager

Пример файла docker-compose для запуска контейнеров с сервером Grafana Loki

Пример файла docker-compose.yml для запуска и настройки Portainer

Пример файла docker-compose для развертывания чат-платформы Matrix Synapse на Linux

Пример скрипта на bash для копирования данных Clickhouse с кластера на кластер

Другие скрипты

Все статьи

Нужен скрипт? Опишите его назначение:





Реклама