Post

Azure DevOps Process Migration Guide (Microsoft Process Migrator)

Azure DevOps Process Migration Guide (Microsoft Process Migrator)

Using Microsoft Process Migrator

This guide shows you how to migrate Azure DevOps process templates (work item types, states, fields, rules, layouts) from one organization to another using the official Microsoft Process Migrator tool.


Table of Contents

  1. What Gets Migrated
  2. Prerequisites
  3. Installation
  4. Configuration
  5. Running the Migration
  6. Verification

What Gets Migrated

Process Templates

  • Process template structure and inheritance
  • Process descriptions and metadata

Work Item Types

  • Custom work item types
  • Inherited work item types (Bug, Task, etc.)
  • Work item type colors and icons

States & Workflows

  • All workflow states (New, Active, Resolved, Closed, custom states)
  • State transitions and rules
  • State categories (Proposed, InProgress, Completed, Removed)

Fields

  • Custom fields (collection-level)
  • Field configurations per work item type
  • Field types (Text, Number, Identity, Picklist, etc.)
  • Field default values

Rules

  • Work item rules and validations
  • Field rules
  • Conditional rules

Form Layouts

  • Work item form structure
  • Field groupings
  • Page layouts
  • Control configurations

Behaviors

  • Backlog behaviors (Stories, Epics, Features, Tasks)
  • Custom behaviors
  • Behavior associations with work item types

Picklists

  • Picklist definitions
  • Picklist values
  • Picklist associations with fields

What Is NOT Migrated

  • Actual work items (data)
  • Work item history
  • Attachments
  • Pipelines
  • Repositories
  • Boards configuration
  • Teams and permissions
  • Test results

Note: For work items migration, use additional tools like nkdAgility Migration Tools or Microsoft WiMigrator.

The upstream Microsoft Process Migrator repo only calls Azure DevOps process APIs (templates, WIT definitions, fields, rules, layouts) and does not migrate any of the items above. These exclusions are not spelled out in that repo’s README, so rely on this list and, if needed, validate by exporting and reviewing output/exported-process.json.


Prerequisites

1. Node.js and NPM

Check if installed:

1
2
node --version  # Should be v8.11.2 or higher
npm --version

2. Personal Access Tokens (PATs)

You need PATs for both source and target organizations.

Create PAT for Source Organization:

  1. Go to: https://dev.azure.com/{YOUR_SOURCE_ORG}
  2. Click your profile settings (top right)

Image

  1. Click “Personal access tokens”

Image

  1. Click ”+ New Token” Image

  2. Settings:
    • Name: Process-Migration-Source
    • Organization: Your source organization
    • Expiration: 30 days (or as needed)
  3. Click “Create”

Image

  1. COPY THE TOKEN (you can’t see it again!)

Create PAT for Target Organization:

Repeat the same steps for your target organization.

Info: you can create one PAT for both target and source organization

Image

⚠️ IMPORTANT: Keep your PATs secure! Never commit them to version control.


Installation

Default: Install Globally via NPM (Node.js)

1
2
3
4
5
# Install globally
sudo npm install process-migrator -g

# Verify installation
process-migrator --version

Alternative: Clone from GitHub

1
2
3
4
5
6
7
8
9
10
11
12
13
# Clone the repository
cd ~
git clone https://github.com/microsoft/process-migrator.git
cd process-migrator

# Install dependencies
npm install

# Build the project
npm run build

# Verify build
ls -la build/nodejs/nodejs/Main.js

Configuration

Important: The migrator always runs on a single process. You must supply sourceProcessName; it will export/import only that process. It will not merge or move all processes automatically, and omitting the name will fail. Name conflicts: Import will fail if the target already has a process with the same name. Set targetProcessName to a unique value or rename/remove the existing target process before running.

Create Configuration File

Create a file named migration-config.json:

1
nano migration-config.json

Paste this template:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    "sourceAccountUrl": "https://dev.azure.com/YOUR_SOURCE_ORG",
    "sourceAccountToken": "YOUR_SOURCE_PAT_TOKEN",
    "targetAccountUrl": "https://dev.azure.com/YOUR_TARGET_ORG",
    "targetAccountToken": "YOUR_TARGET_PAT_TOKEN",
    "sourceProcessName": "YOUR_SOURCE_PROCESS_NAME",
    "targetProcessName": "YOUR_TARGET_PROCESS_NAME",
    "options": {
        "processFilename": "output/exported-process.json",
        "logLevel": "information",
        "logFilename": "output/processMigrator.log",
        "overwritePicklist": true,
        "continueOnRuleImportFailure": true,
        "skipImportFormContributions": false
    }
}

Configuration Parameters Explained:

ParameterRequiredDescriptionExample
sourceAccountUrlYes (export/migrate)Source organization URLhttps://dev.azure.com/MySourceOrg
sourceAccountTokenYes (export/migrate)Source PAT tokenYour PAT token
targetAccountUrlYes (import/migrate)Target organization URLhttps://dev.azure.com/MyTargetOrg
targetAccountTokenYes (import/migrate)Target PAT tokenYour PAT token
sourceProcessNameYes (export/migrate)Process name to exportMy Custom Agile
targetProcessNameOptionalOverride process name in targetMy Custom Agile - Migrated

Options Explained:

OptionDefaultDescription
processFilenameoutput/process.jsonFile to save/read exported process
logLevelinformationLog level: verbose, information, warning, error
logFilenameoutput/processMigrator.logLog file path
overwritePicklistfalseOverwrite picklists if they exist in target
continueOnRuleImportFailurefalseContinue if rule import fails (e.g., identity not found)
skipImportFormContributionsfalseSkip custom form controls (use if extensions not available)

Before Running the Migration (Testing Only)

Create test inherited process, custom fields, states, and work item types

Inherited Process with new work item type

Image

New Custom Field Created

Image

New state for the test work item type

Image

Running the Migration

Export from source and import to target in one command:

1
2
3
4
5
6
# If cloned from GitHub
cd ~/process-migrator
node build/nodejs/nodejs/Main.js --mode=migrate --config=migration-config.json

# If installed globally
process-migrator --mode=migrate --config=migration-config.json

Image

This will:

  1. Export process from source organization
  2. Save to output/exported-process.json
  3. Import process to target organization
  4. Complete in ~20-60 seconds

Name conflict behavior: If the target already has a process with the same name, import stops during pre-validation and nothing is created. The log shows errors like:

1
2
[ERROR] ... Pre-Import validation failed. No artifacts were created on target process
[ERROR] ... Process import validation failed. Process with same name already exists on

Image

Set targetProcessName to a unique value or rename/remove the existing target process before migrating.


Method 2: Step-by-Step Migration

For more control, do export and import separately:

Step 1: Export from Source

1
process-migrator --mode=export --config=migration-config.json

Output:

1
2
3
[INFORMATION] Export process started.
[INFORMATION] Export process completed.
[INFORMATION] Export completed successfully to 'output/exported-process.json'.

Image

Step 2: Review Exported Data (Optional)

1
2
3
4
5
6
# View exported process using cat or any editor 
cat output/exported-process.json | jq . | less

# Check work item types
cat output/exported-process.json | jq '.workItemTypes[] | {name, id}'

you will find the custom work item types created

Image

1
2
# Check states
cat output/exported-process.json | jq '.states[] | {workItemTypeRefName, states: [.states[].name]}'

You will find the custom work item states created

Image

Step 3: Import to Target

1
node build/nodejs/nodejs/Main.js --mode=import --config=migration-config.json

Output:

1
2
[INFORMATION] Process import started.
[INFORMATION] Process import completed successfully.

Verification

1. Check Migration Logs

1
2
3
4
5
6
7
8
# View the log file
cat output/processMigrator.log

# Check for errors
grep ERROR output/processMigrator.log

# Check for warnings
grep WARNING output/processMigrator.log

2. Review Exported Data

1
2
3
4
5
6
# View exported process using cat or any editor 
cat output/exported-process.json | jq . | less

# Check work item types
cat output/exported-process.json | jq '.workItemTypes[] | {name, id}'

you will find the custom work item types created

Image

1
2
# Check states
cat output/exported-process.json | jq '.states[] | {workItemTypeRefName, states: [.states[].name]}'

You will find the custom work item states created

Image

3. Verify in Target Organization

Open in browser:

1
https://dev.azure.com/YOUR_TARGET_ORG/_settings/process

Look for your migrated process in the list.

Image

or Check Process Exists:

1
2
# Using curl
curl -s -u :YOUR_TARGET_PAT "https://dev.azure.com/YOUR_TARGET_ORG/_apis/work/processes?api-version=7.1" | jq '.value[] | select(.name | contains("YOUR_PROCESS_NAME"))'

Check Work Item Types:

1
2
3
4
5
# Get process ID from previous step
PROCESS_ID="your-process-id"

# Check work item types
curl -s -u :YOUR_TARGET_PAT "https://dev.azure.com/YOUR_TARGET_ORG/_apis/work/processes/$PROCESS_ID/workItemTypes?api-version=7.1" | jq '.value[] | {name, referenceName, customization}'

4. Use Verification Script

Create a verification script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
# verify-migration.sh

TARGET_ORG="https://dev.azure.com/YOUR_TARGET_ORG"
TARGET_PAT="YOUR_TARGET_PAT"
PROCESS_NAME="YOUR_MIGRATED_PROCESS_NAME"

echo "Verifying process migration..."

# Check if process exists
PROCESS_INFO=$(curl -s -u :$TARGET_PAT "$TARGET_ORG/_apis/work/processes?api-version=7.1" | jq ".value[] | select(.name == \"$PROCESS_NAME\")")

if [ -z "$PROCESS_INFO" ]; then
    echo "Process not found"
    exit 1
fi

PROCESS_ID=$(echo "$PROCESS_INFO" | jq -r '.typeId')
echo "Process found: $PROCESS_NAME"
echo " ID: $PROCESS_ID"

# Check work item types
WIT_COUNT=$(curl -s -u :$TARGET_PAT "$TARGET_ORG/_apis/work/processes/$PROCESS_ID/workItemTypes?api-version=7.1" | jq '.value | length')
echo "Work item types: $WIT_COUNT"

echo ""
echo "Migration verified successfully!"

REST API Documentation


Migration Checklist

Use this checklist for your migration:

Pre-Migration

  • Node.js installed (v8.11.2+)
  • Repository cloned and built
  • Source PAT created with correct permissions
  • Target PAT created with correct permissions
  • Source process name identified
  • Configuration file created
  • Test migration in non-production environment

Migration

  • Run export (or migrate mode)
  • Check for errors in console output
  • Review exported-process.json (optional)
  • Run import (if using step-by-step)
  • Check migration logs

Post-Migration

  • Verify process exists in target
  • Check work item types are present
  • Verify states and workflows
  • Check custom fields
  • Test form layouts
  • Update target project to use new process
  • Test creating work items
  • Document any manual adjustments needed
  • Revoke migration PATs

Success Criteria

Your migration is successful when:

Process appears in target organization

All custom work item types are present

States and workflows are correct

Custom fields exist and are configured

Form layouts match source

No errors in migration log

Can create work items using the new process


License

Microsoft Process Migrator is licensed under the MIT License.


Credits

  • Tool: Microsoft Process Migrator
  • Repository: https://github.com/microsoft/process-migrator
  • Maintainers: Microsoft and community contributors

This post is licensed under CC BY 4.0 by the author.