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

  • Flat plan pricing instead of per-operation metering

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 is not on our roadmap)

npm feed

npm repository

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.mycloudrepo.io/repositories/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_API_TOKEN)

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.mycloudrepo.io/repositories/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.mycloudrepo.io/repositories/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.mycloudrepo.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.mycloudrepo.io/repositories/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.mycloudrepo.io/repositories/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://[org-id].mycloudrepo.io/repositories/npm-repo/

# Mint a token against the registry itself, authenticating as a
# dedicated repository user (admin portal: Users -> Create a Repository
# User), then put it in .npmrc as _authToken:
npm token create --registry=https://[org-id].mycloudrepo.io/repositories/npm-repo/

# The interactive `npm login` web flow is not supported, and modern npm
# rejects email-shaped usernames; see the npm repository docs for the
# .npmrc token pattern.

See npm Repositories for complete npm migration setup.

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

  • 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

CloudRepo publishes one flat price per tier. Annual billing is the headline price; monthly billing carries a ~20% premium. Storage, a monthly transfer allowance, unlimited users, and support are all included:

CloudRepo Published Pricing

Tier

Billed annually (eff./mo)

Billed monthly

Storage

Transfer / mo

Starter

$199

$239

50 GB

1 TB

Team

$499

$599

250 GB

3 TB

Business

$799

$959

1 TB

6 TB

Scale

$1,199

$1,439

2 TB

12 TB

We deliberately do not publish a modelled Azure Artifacts total or a savings percentage. Azure Artifacts bills per user and per GB against your Azure DevOps agreement, so any single number would be our guess rather than your bill. Compare this table against your own invoice.

What is not on the CloudRepo side of that invoice:

  • No per-user licence – users are unlimited on every tier

  • No metered egress – every tier carries a transfer allowance, and sustained overage is $120/TB, reach-out-first, rounded down, never a hard stop

  • No separate support contract – support is included on every tier

  • No Azure DevOps licence requirement

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