Migrating from Azure Artifacts

This guide helps you migrate from Azure Artifacts (Azure DevOps) to CloudRepo.

Overview

Azure Artifacts is Microsoft’s package management solution integrated with Azure DevOps. Migrating to CloudRepo provides cost savings, simpler pricing, and freedom from vendor lock-in while maintaining full compatibility with your existing tools.

Why Migrate from Azure Artifacts?

Cost Benefits

  • Predictable pricing - Simple per-GB pricing vs complex Azure calculations

  • No egress fees - Azure charges for data transfer

  • Included support - No expensive support contracts

  • Save 70-80% on typical usage patterns

Feature Advantages

  • Platform independent - Not tied to Azure DevOps

  • Better performance - Global CDN included

  • Simpler management - Intuitive interface

  • Multiple formats - Beyond Azure’s supported types

Pre-Migration Assessment

Inventory Your Azure Artifacts

  1. List all feeds:

# Using Azure CLI
az artifacts feed list --organization https://dev.azure.com/yourorg
  1. Document feed types:

    • NuGet feeds

    • npm feeds

    • Maven feeds

    • Python feeds

    • Universal Packages

  2. Check feed sizes:

# Get feed statistics
az artifacts feed show --organization https://dev.azure.com/yourorg --feed your-feed
  1. Export permissions:

    • Document feed permissions

    • List upstream sources

    • Note visibility settings

Feed Mapping

Azure Artifacts to CloudRepo

Feed Type Mapping

Azure Artifacts

CloudRepo Equivalent

NuGet feed

Raw repository (NuGet coming soon)

npm feed

Raw repository (npm coming soon)

Maven feed

Maven repository

Python feed

Python repository

Universal Packages

Raw repository

Migration Steps

Step 1: Create CloudRepo Repositories

For each Azure Artifacts feed, create corresponding CloudRepo repository:

  1. Log into CloudRepo

  2. Create repository with matching type

  3. Configure access permissions

  4. Note repository URLs

Step 2: Export from Azure Artifacts

Maven Packages:

# Download all artifacts from feed
az artifacts universal download \
  --organization https://dev.azure.com/yourorg \
  --feed your-feed \
  --name "*" \
  --version "*" \
  --path ./export

Python Packages:

# List and download Python packages
pip download --index-url https://pkgs.dev.azure.com/yourorg/_packaging/your-feed/pypi/simple/ \
             -r requirements.txt \
             -d ./export

NuGet Packages:

# Download NuGet packages
nuget install packages.config -OutputDirectory ./export \
     -Source https://pkgs.dev.azure.com/yourorg/_packaging/your-feed/nuget/v3/index.json

Step 3: Upload to CloudRepo

Bulk Upload Script:

import os
import requests
from pathlib import Path

def upload_to_cloudrepo(local_dir, repo_url, auth):
    for file_path in Path(local_dir).rglob('*'):
        if file_path.is_file():
            relative_path = file_path.relative_to(local_dir)
            upload_url = f"{repo_url}/{relative_path}"

            with open(file_path, 'rb') as f:
                response = requests.put(
                    upload_url,
                    data=f,
                    auth=auth
                )
                print(f"Uploaded: {relative_path}")

# Usage
upload_to_cloudrepo(
    './export',
    'https://your-org.cloudrepo.io/repository/maven-releases',
    ('username', 'password')
)

Azure DevOps Pipeline Migration

Update Build Pipelines

Original Azure Pipeline:

- task: Maven@3
  inputs:
    mavenPomFile: 'pom.xml'
    publishJUnitResults: true
    mavenFeedAuthentication: 'my-feed'

Updated for CloudRepo:

- task: Maven@3
  inputs:
    mavenPomFile: 'pom.xml'
    publishJUnitResults: true
    mavenOptions: |
      -DrepositoryId=cloudrepo
      -Dusername=$(CLOUDREPO_USERNAME)
      -Dpassword=$(CLOUDREPO_PASSWORD)

Configure Service Connections

  1. In Azure DevOps, go to Project Settings

  2. Create new Service Connection

  3. Choose “Generic” type

  4. Configure CloudRepo credentials

Update Feed URLs

Maven settings.xml:

<!-- Before: Azure Artifacts -->
<repository>
  <id>azure-artifacts</id>
  <url>https://pkgs.dev.azure.com/yourorg/_packaging/your-feed/maven/v1</url>
</repository>

<!-- After: CloudRepo -->
<repository>
  <id>cloudrepo</id>
  <url>https://your-org.cloudrepo.io/repository/maven-releases</url>
</repository>

Python pip.conf:

# Before: Azure Artifacts
[global]
index-url = https://pkgs.dev.azure.com/yourorg/_packaging/your-feed/pypi/simple

# After: CloudRepo
[global]
index-url = https://your-org.cloudrepo.io/repository/pypi/simple

Authentication Migration

From Azure Credentials to CloudRepo

Personal Access Token (PAT) → API Key:

  1. Generate CloudRepo API key

  2. Replace Azure PAT in pipelines

  3. Update credential storage

Azure AD → CloudRepo Users:

  1. Create CloudRepo users for team

  2. Assign appropriate permissions

  3. Share credentials securely

Variable Groups

Update Azure DevOps Variable Groups:

variables:
- group: cloudrepo-credentials
- name: CLOUDREPO_URL
  value: https://your-org.cloudrepo.io
- name: CLOUDREPO_REPO
  value: maven-releases

Upstream Sources Migration

Azure Artifacts upstream sources map to CloudRepo proxy repositories:

  1. Create proxy repository for each upstream

  2. Configure cache settings

  3. Update client configuration to use proxy

Example proxy setup for Maven Central:

  1. Create proxy repository named “maven-central-proxy”

  2. Set upstream URL: https://repo.maven.apache.org/maven2/

  3. Configure cache duration

  4. Use in builds alongside private repository

Universal Packages

Azure Universal Packages require special handling:

  1. Export packages using Azure CLI

  2. Convert to standard format if needed

  3. Upload to CloudRepo Raw repository

  4. Update download scripts with new URLs

# Download from Azure Universal
az artifacts universal download \
  --organization https://dev.azure.com/yourorg \
  --feed your-feed \
  --name my-package \
  --version 1.0.0 \
  --path ./temp

# Upload to CloudRepo Raw
curl -u username:password \
  --upload-file ./temp/my-package-1.0.0.zip \
  https://your-org.cloudrepo.io/repository/raw/packages/my-package-1.0.0.zip

Testing & Validation

Verify Migration Success

  1. Test package downloads:

# Test Maven
mvn dependency:get -DartifactId=your-artifact

# Test Python
pip install your-package --index-url https://your-org.cloudrepo.io/repository/pypi/simple
  1. Run test builds using CloudRepo

  2. Verify all dependencies resolve correctly

  3. Check performance compared to Azure

Rollback Plan

Keep Azure Artifacts active during migration:

  1. Run both in parallel initially

  2. Gradually migrate projects

  3. Monitor for issues

  4. Full cutover after validation

Common Challenges

Feed Views

Azure Artifacts feed views (e.g., @Prerelease, @Release) don’t exist in CloudRepo.

Solution: Use separate repositories: * maven-releases for stable versions * maven-prereleases for pre-release versions

Scoped Registries

npm scoped packages require configuration updates:

# Configure npm for CloudRepo
npm config set @yourscope:registry https://your-org.cloudrepo.io/repository/npm

Symbol Packages

Azure Artifacts symbol server functionality:

Current limitation: CloudRepo doesn’t have built-in symbol server Workaround: Store symbols in Raw repository

Post-Migration

Update Documentation

  1. Update README files with new repository URLs

  2. Document authentication changes

  3. Update onboarding guides

  4. Share with team

Monitor Usage

  • Track download metrics in CloudRepo

  • Compare performance with Azure

  • Monitor cost savings

  • Gather team feedback

Decommission Azure Artifacts

After successful migration:

  1. Archive Azure Artifacts data

  2. Remove feeds (keep backups)

  3. Cancel Azure DevOps subscription if not needed

  4. Document lessons learned

Cost Comparison

Typical savings migrating from Azure Artifacts:

Monthly Cost Comparison

Usage

Azure Artifacts

CloudRepo

Savings

100 GB storage

$150

$79

47%

500 GB storage

$750

$149

80%

1 TB storage

$1,500

$299

80%

Plus additional savings: * No egress charges * No support contract needed * No Azure DevOps license requirements

Support

CloudRepo provides migration assistance:

  • Email: support@cloudrepo.io

  • Migration guide: This document

  • Expert help: Available during migration

  • Response time: Usually within 2 hours

Next Steps

  1. Getting Started - CloudRepo basics

  2. Continuous Integration and Deployment - CI/CD setup

  3. Troubleshooting - Common issues

  4. Contact support@cloudrepo.io for help