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
List all feeds:
# Using Azure CLI
az artifacts feed list --organization https://dev.azure.com/yourorg
Document feed types:
NuGet feeds
npm feeds
Maven feeds
Python feeds
Universal Packages
Check feed sizes:
# Get feed statistics
az artifacts feed show --organization https://dev.azure.com/yourorg --feed your-feed
Export permissions:
Document feed permissions
List upstream sources
Note visibility settings
Feed Mapping
Azure Artifacts to CloudRepo
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:
Log into CloudRepo
Create repository with matching type
Configure access permissions
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
In Azure DevOps, go to Project Settings
Create new Service Connection
Choose “Generic” type
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:
Generate CloudRepo API key
Replace Azure PAT in pipelines
Update credential storage
Azure AD → CloudRepo Users:
Create CloudRepo users for team
Assign appropriate permissions
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:
Create proxy repository for each upstream
Configure cache settings
Update client configuration to use proxy
Example proxy setup for Maven Central:
Create proxy repository named “maven-central-proxy”
Set upstream URL: https://repo.maven.apache.org/maven2/
Configure cache duration
Use in builds alongside private repository
Universal Packages
Azure Universal Packages require special handling:
Export packages using Azure CLI
Convert to standard format if needed
Upload to CloudRepo Raw repository
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
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
Run test builds using CloudRepo
Verify all dependencies resolve correctly
Check performance compared to Azure
Rollback Plan
Keep Azure Artifacts active during migration:
Run both in parallel initially
Gradually migrate projects
Monitor for issues
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
Update README files with new repository URLs
Document authentication changes
Update onboarding guides
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:
Archive Azure Artifacts data
Remove feeds (keep backups)
Cancel Azure DevOps subscription if not needed
Document lessons learned
Cost Comparison
Typical savings migrating from Azure Artifacts:
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
Getting Started - CloudRepo basics
Continuous Integration and Deployment - CI/CD setup
Troubleshooting - Common issues
Contact support@cloudrepo.io for help