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

Nexus vs CloudRepo

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

  1. 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
  1. Document repository types: * Maven (hosted, proxy, group) * PyPI * Raw * Docker (if applicable)

  2. Check repository sizes:

# Check blob store size (Nexus 3.x)
du -sh /path/to/sonatype-work/nexus3/blobs
  1. Export users and roles: * Document current permissions * List all users * Map roles to CloudRepo equivalents

Migration Strategy

Phase 1: Setup CloudRepo

  1. Create CloudRepo account

  2. Create equivalent repositories:

    • Nexus “hosted” → CloudRepo standard repository

    • Nexus “proxy” → CloudRepo proxy repository

    • Nexus “group” → Configure clients to use multiple repositories

  3. Set up users and permissions

Phase 2: Export from Nexus

Option 1: REST API Export (Nexus 3.x)

Export artifacts via REST API
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

Bulk upload script
#!/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

Role Mapping

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

  1. Navigate to Users section

  2. Invite team members

  3. Assign appropriate roles

  4. 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

  1. 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
  1. Test builds: * Run sample builds using CloudRepo * Verify dependency resolution * Test artifact upload

  2. Performance testing: * Measure download speeds * Check upload performance * Compare with Nexus baseline

Rollback Plan

Keep Nexus Running During Migration

  1. Run both systems in parallel initially

  2. Update CI/CD to publish to both

  3. Gradually migrate teams

  4. Decommission Nexus after validation

Quick Rollback Steps

If issues arise:

  1. Update repository URLs back to Nexus

  2. Revert CI/CD configurations

  3. Document issues for resolution

  4. 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

  1. Configure proxy repositories for external dependencies

  2. Set up webhooks for automation

  3. Enable monitoring and alerts

  4. Review and optimize repository structure

Decommissioning Nexus

  1. Archive Nexus data for compliance

  2. Update documentation with CloudRepo URLs

  3. Remove Nexus from infrastructure

  4. 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

  1. Getting Started - CloudRepo basics

  2. Repository Management - Repository setup

  3. Continuous Integration and Deployment - CI/CD configuration

  4. Contact support@cloudrepo.io for migration help