#!/bin/bash # Переменные для Azure DevOps AZURE_ORG="your_azure_org" AZURE_FEED="your_feed_name" AZURE_PROJECT="your_project_name" AZURE_PAT="your_azure_devops_pat" # Personal Access Token # Переменные для GitLab GITLAB_REGISTRY_URL="https://gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/nuget" GITLAB_PAT="your_gitlab_pat" # Путь к временной директории для хранения пакетов TEMP_DIR="./nuget_temp" mkdir -p $TEMP_DIR # Функция для скачивания пакетов из Azure DevOps download_packages_from_azure() { echo "Скачивание пакетов из Azure DevOps..." # Запрос списка пакетов packages=$(curl -s -u ":$AZURE_PAT" \ "https://dev.azure.com/$AZURE_ORG/$AZURE_PROJECT/_apis/packaging/feeds/$AZURE_FEED/packages?api-version=5.0-preview.1" \ | jq -r '.value[] | "\(.name) \(.versions[0].version)"') # Скачивание каждого пакета while read -r package; do name=$(echo $package | awk '{print $1}') version=$(echo $package | awk '{print $2}') echo "Скачивание $name версии $version..." curl -s -u ":$AZURE_PAT" \ -L "https://pkgs.dev.azure.com/$AZURE_ORG/$AZURE_PROJECT/_apis/packaging/feeds/$AZURE_FEED/nuget/packages/$name/versions/$version/content?api-version=5.0-preview.1" \ -o "$TEMP_DIR/$name.$version.nupkg" done <<< "$packages" } # Функция для проверки наличия пакета в GitLab is_package_in_gitlab() { local package_name=$1 local package_version=$2 # Запрос на наличие пакета в GitLab response=$(curl -s --header "PRIVATE-TOKEN: $GITLAB_PAT" \ "$GITLAB_REGISTRY_URL?package_name=$package_name&package_version=$package_version") # Если пакет существует, response будет содержать данные if [[ $response == *"$package_name"* ]] && [[ $response == *"$package_version"* ]]; then return 0 # Пакет существует else return 1 # Пакета нет fi } # Функция для публикации пакетов в GitLab Package Registry upload_packages_to_gitlab() { echo "Загрузка пакетов в GitLab Package Registry..." for package_path in $TEMP_DIR/*.nupkg; do package_name=$(basename "$package_path" | awk -F. '{print $1}') package_version=$(basename "$package_path" | awk -F. '{print $2}') # Проверяем наличие пакета if is_package_in_gitlab "$package_name" "$package_version"; then echo "Пакет $package_name версии $package_version уже существует в GitLab, пропускаем..." continue fi echo "Загрузка $package_name версии $package_version в GitLab..." curl --request PUT \ --header "PRIVATE-TOKEN: $GITLAB_PAT" \ --header "Content-Type: application/octet-stream" \ --data-binary @"$package_path" \ "$GITLAB_REGISTRY_URL" done } # Запуск функций download_packages_from_azure upload_packages_to_gitlab # Очистка временной директории rm -rf $TEMP_DIR echo "Синхронизация завершена."