Migrating from Sonatype Nexus
This guide helps you migrate from Sonatype Nexus Repository Manager to CloudRepo.
Overview
Migrating from Nexus to CloudRepo is straightforward due to compatible repository formats and similar concepts. This guide covers Nexus Repository Manager 2.x and 3.x migrations.
Why Migrate from Nexus?
Cost Benefits
Eliminate infrastructure costs - No servers to maintain
Predictable pricing - Simple, transparent monthly plans
No hidden fees - Support included, no egress charges
Reduce operational overhead - Fully managed service
Feature Comparison
Feature |
Nexus OSS |
CloudRepo |
---|---|---|
Managed Service |
✗ Self-hosted |
✓ Fully managed |
High Availability |
✗ Pro only |
✓ Included |
Support |
✗ Pro only |
✓ Included |
Automatic Backups |
✗ Manual setup |
✓ Included |
SSL/TLS |
✗ Manual config |
✓ Automatic |
Pre-Migration Assessment
Inventory Your Nexus Installation
List all repositories:
# Nexus 3.x
curl -u admin:admin123 \
https://nexus.example.com/service/rest/v1/repositories
# Nexus 2.x
curl -u admin:admin123 \
https://nexus.example.com/service/local/repositories
Document repository types: * Maven (hosted, proxy, group) * PyPI * Raw * Docker (if applicable)
Check repository sizes:
# Check blob store size (Nexus 3.x)
du -sh /path/to/sonatype-work/nexus3/blobs
Export users and roles: * Document current permissions * List all users * Map roles to CloudRepo equivalents
Migration Strategy
Phase 1: Setup CloudRepo
Create CloudRepo account
Create equivalent repositories:
Nexus “hosted” → CloudRepo standard repository
Nexus “proxy” → CloudRepo proxy repository
Nexus “group” → Configure clients to use multiple repositories
Set up users and permissions
Phase 2: Export from Nexus
Option 1: REST API Export (Nexus 3.x)
import requests
import json
import os
NEXUS_URL = "https://nexus.example.com"
NEXUS_AUTH = ("admin", "admin123")
def export_repository(repo_name, output_dir):
# Get all assets
continuation_token = None
while True:
url = f"{NEXUS_URL}/service/rest/v1/assets"
params = {"repository": repo_name}
if continuation_token:
params["continuationToken"] = continuation_token
response = requests.get(url, auth=NEXUS_AUTH, params=params)
data = response.json()
for asset in data["items"]:
download_url = asset["downloadUrl"]
path = asset["path"]
# Download artifact
artifact_response = requests.get(download_url, auth=NEXUS_AUTH)
# Save to disk
output_path = os.path.join(output_dir, path)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'wb') as f:
f.write(artifact_response.content)
print(f"Exported: {path}")
continuation_token = data.get("continuationToken")
if not continuation_token:
break
# Export each repository
export_repository("maven-releases", "./export/maven-releases")
Option 2: Direct File System Copy
# Nexus 3.x - Copy from blob store
cp -r /path/to/sonatype-work/nexus3/blobs/default/content ./export/
# Nexus 2.x - Copy from storage
cp -r /path/to/sonatype-work/nexus/storage/* ./export/
Phase 3: Upload to CloudRepo
#!/bin/bash
CLOUDREPO_URL="https://your-org.cloudrepo.io/repository/maven-releases"
CLOUDREPO_USER="your-username"
CLOUDREPO_PASS="your-password"
find ./export -type f -name "*.jar" -o -name "*.pom" | while read file; do
# Calculate relative path
relative_path=${file#./export/}
# Upload to CloudRepo
curl -u "$CLOUDREPO_USER:$CLOUDREPO_PASS" \
--upload-file "$file" \
"$CLOUDREPO_URL/$relative_path"
echo "Uploaded: $relative_path"
done
Repository Type Mapping
Maven Repositories
Nexus Configuration:
<repository>
<id>nexus</id>
<url>https://nexus.example.com/repository/maven-public/</url>
</repository>
CloudRepo Configuration:
<repository>
<id>cloudrepo</id>
<url>https://your-org.cloudrepo.io/repository/maven-releases</url>
</repository>
Python/PyPI Repositories
Nexus pip.conf:
[global]
index-url = https://nexus.example.com/repository/pypi-all/simple
CloudRepo pip.conf:
[global]
index-url = https://your-org.cloudrepo.io/repository/pypi/simple
Raw Repositories
Raw repositories migrate directly - simply upload files maintaining directory structure.
User Migration
Mapping Nexus Roles to CloudRepo
Nexus Role |
CloudRepo Equivalent |
---|---|
nx-admin |
Admin |
nx-developer |
Developer (read/write) |
nx-anonymous |
Public repository access |
nx-deployment |
API key with write access |
Creating Users in CloudRepo
Navigate to Users section
Invite team members
Assign appropriate roles
Configure repository access
CI/CD Migration
Jenkins
Update Maven settings:
<settings>
<servers>
<server>
<id>cloudrepo</id>
<username>${env.CLOUDREPO_USERNAME}</username>
<password>${env.CLOUDREPO_PASSWORD}</password>
</server>
</servers>
</settings>
Update Jenkinsfile:
pipeline {
environment {
CLOUDREPO_CREDS = credentials('cloudrepo-credentials')
}
stages {
stage('Deploy') {
steps {
sh 'mvn deploy -DrepositoryId=cloudrepo'
}
}
}
}
GitHub Actions
- name: Setup CloudRepo
run: |
mkdir -p ~/.m2
echo "<settings>...</settings>" > ~/.m2/settings.xml
- name: Deploy
run: mvn deploy
env:
CLOUDREPO_USERNAME: ${{ secrets.CLOUDREPO_USERNAME }}
CLOUDREPO_PASSWORD: ${{ secrets.CLOUDREPO_PASSWORD }}
Validation
Verify Migration Success
Check artifact counts:
# Count artifacts in Nexus
find ./export -type f | wc -l
# Verify in CloudRepo via API
curl -u username:password \
https://your-org.cloudrepo.io/api/repositories/maven-releases/artifacts
Test builds: * Run sample builds using CloudRepo * Verify dependency resolution * Test artifact upload
Performance testing: * Measure download speeds * Check upload performance * Compare with Nexus baseline
Rollback Plan
Keep Nexus Running During Migration
Run both systems in parallel initially
Update CI/CD to publish to both
Gradually migrate teams
Decommission Nexus after validation
Quick Rollback Steps
If issues arise:
Update repository URLs back to Nexus
Revert CI/CD configurations
Document issues for resolution
Contact CloudRepo support
Common Issues and Solutions
Large Repository Migration
Problem: Timeout during large uploads
Solution: * Break into smaller batches * Use parallel uploads * Consider CloudRepo’s bulk import service
Permission Differences
Problem: Complex Nexus permission model doesn’t map directly
Solution: * Simplify permissions in CloudRepo * Use groups for team access * Document changes for users
Cleanup Policies
Problem: Nexus cleanup policies need recreation
Solution: * CloudRepo handles cleanup differently * Configure retention at repository level * Use snapshot versioning policies
Post-Migration
Optimization
Configure proxy repositories for external dependencies
Set up webhooks for automation
Enable monitoring and alerts
Review and optimize repository structure
Decommissioning Nexus
Archive Nexus data for compliance
Update documentation with CloudRepo URLs
Remove Nexus from infrastructure
Reclaim resources (servers, storage)
Training
Provide CloudRepo documentation to team
Schedule training sessions
Create internal guides specific to your workflow
Support
CloudRepo provides migration support:
Email: support@cloudrepo.io
Documentation: Comprehensive guides
Migration assistance: Available for enterprise customers
Response time: Usually within 2 business hours
Next Steps
Getting Started - CloudRepo basics
Repository Management - Repository setup
Continuous Integration and Deployment - CI/CD configuration
Contact support@cloudrepo.io for migration help