ekso migrate devops pulls work items, comments, attachments, links, and iterations from Azure DevOps (and on-prem Azure DevOps Server / TFS) into your Ekso tenant. Two commands — collect and apply. Read Migrate overview and Before you start first.
What gets imported
Authoring fidelity preserved — every comment, every change is attributed to the original DevOps identity (matched by email).
What does NOT get imported
- Revision history. Each work item has full edit history in DevOps; v1 imports only the current state. Re-evaluate if a customer needs SOX/audit migration.
- State transition rules. The migrator snapshots the current state of each item; transition rules don’t transfer.
- Build & release pipelines. Out of scope.
- Repos / Git history. Out of scope — work items only.
- Test plans / suites / runs. Test management is out of scope for v1.
- Boards & queries (saved WIQL). Re-author on the Ekso side.
- Service identities (
[Project]\Project Collection Build Service, etc.) are filtered at collect — they’re not real users.
Before you start
Pre-flight checklist on top of the general one:- An Azure DevOps organisation (
https://dev.azure.com/<your-org>). - A Personal Access Token (PAT) with Work Items (Read) + Identity (Read) scopes.
devops block to your migration.config.json:
EKSO_MIGRATE_DEVOPS_PAT for CI use cases.
The organisation field is the segment after dev.azure.com/ in your DevOps URL. For on-prem Azure DevOps Server, use the full base URL — see the on-prem section below.
Step 1 — list projects
Step 2 — collect
--project for multiple. Sample run:
--no-attachments— skip downloads.--no-comments— skip discussion.--resume— pick up where a killed collect left off.
Step 3 — dry-run apply
Step 4 — apply for real
--resume.
Identity resolution for DevOps
DevOps identities have email —--user-strategy match-or-create is reliable.
Service identities ([Project]\Project Collection Build Service, [Acme]\Project Collection Service Accounts, etc.) are filtered out at collect time — they aren’t real users and don’t pollute your Ekso user list. There’s a regression test pinning this.
Read Identity resolution.
Custom fields for DevOps
DevOps fields useReference Name identifiers like Microsoft.VSTS.Scheduling.StoryPoints or Custom.<Name>:
Iterations, Area Paths, Work Item Types
Cycles attach to a board on the Ekso side. Pass
--board <BOARD_ID> if the tenant has more than one board.
On-prem Azure DevOps Server (TFS)
The same CLI works against on-prem Azure DevOps Server / TFS — point theorganisation at the full base URL of your collection:
Iron rule — WIQL chunking and 429 retry
WIQL queries return up to 200 work-item IDs per call (Azure cap). The migrator paginates by chunking IDs client-side at 200. TheWorkItemTrackingHttpClient.GetWorkItemsAsync call also caps at 200 IDs per request — chunked the same way.
DevOps rate-limit responses surface as VssServiceResponseException with HttpStatusCode==429. The CLI catches this, honours Retry-After, and backs off up to 6 attempts (~64 s of accumulated backoff). Past 6 attempts, exit code is 7.
Binary footprint note
The DevOps adapter bundles the official Microsoft TFS SDK (Microsoft.TeamFoundationServer.Client + Microsoft.VisualStudio.Services.Client), adding ~30 MB to the standalone Ekso CLI binary. This is the bundled trade-off — single binary, no plugin install. If binary size becomes a constraint, the v2 roadmap includes a plugin model that makes DevOps separately installable.
Troubleshooting DevOps-specific issues
See Troubleshooting for the full per-source error table.
Why migrate to Ekso
Azure DevOps centralises work items, repos, builds, and tests; Ekso focuses on the work-item layer with financial intelligence and AI primitives DevOps doesn’t model. See Ekso vs Azure DevOps for the broader comparison.Where to next
- Command reference — full flag surface.
- Identity resolution —
--user-strategydeep-dive. - Field mapping — DevOps reference names.
- Troubleshooting — exit codes and recovery.