Skip to main content

Tool to sync work items and pull requests from Azure DevOps to Asana

Project description

ado-asana-sync

Test and Lint Quality Gate Status Coverage

Release PyPI - Version

Open in Visual Studio Code

This project aims to synchronize work items and pull requests between Azure DevOps (ADO) and Asana. It's currently in development and not ready for use. Breaking changes will occur as needed.

Setup and Configuration

This guide covers everything you need to configure and run the sync tool, either locally for development or via Docker.

Prerequisites

  • Python (if running locally): Install uv to manage dependencies and run the application.
  • Docker (if running via containers): Install Docker and Docker Compose.
  • Azure DevOps (ADO) PAT: A Personal Access Token with read access to Work Items, and Code (Read) access (which is required to sync pull requests).
  • Asana PAT: A Personal Access Token with access to the target workspace and projects.

Configuration

The application requires environment variables and a project mapping file.

1. Environment Variables

Create a .env file in the root directory. You can copy the example file to get started:

cp .env.example .env

Required Variables:

  • ADO_PAT: Your Personal Access Token for Azure DevOps.
  • ADO_URL: The full URL of your Azure DevOps instance (e.g., https://dev.azure.com/your-org).
  • ASANA_TOKEN: Your Personal Access Token for Asana.
  • ASANA_WORKSPACE_NAME: The exact name of your Asana workspace.

Optional Variables:

  • CLOSED_STATES: Comma-separated ADO states considered closed (default: Closed,Removed,Done).
  • THREAD_COUNT: Number of projects to sync in parallel (default: 8).
  • SLEEP_TIME: Seconds to sleep between sync runs (default: 300).
  • SYNC_THRESHOLD: Days to continue syncing closed tasks before unmapping (default: 30).
  • SYNCED_TAG_NAME: Asana tag appended to all synced items (default: synced).
  • LOGLEVEL: Console log level (default: INFO).
  • See .env.example for additional Application Insights telemetry configurations.

2. Project Mapping

The application needs to know which ADO teams map to which Asana projects. Create a projects.json file in the data/ directory:

cp data/projects.json.example data/projects.json

Mapping Structure:

[
  {
    "adoProjectName": "your-ado-project",
    "adoTeamName": "Backend Team",
    "asanaProjectName": "your-asana-project-backend"
  }
]
  • adoProjectName: The name of your Azure DevOps project.
  • adoTeamName: The specific team within the ADO project whose backlog you want to sync.
  • asanaProjectName: The corresponding Asana project name.

Running the Application

You can run the sync tool either locally using uv or via Docker.

Option A: Running Locally (Development)

  1. Install dependencies:
    uv sync
    
  2. Run the application:
    uv run python -m ado_asana_sync.sync
    

Option B: Running via Docker

The repository includes a compose.yml file for easy deployment.

  1. Build and start the container:
    docker compose up --build
    

To run in the background, append -d to the command. The container will automatically pick up your .env file and mount the data/projects.json configuration.

Verifying the Setup

Once running, the application will:

  1. Connect to Azure DevOps and Asana to validate credentials.
  2. Read the data/projects.json mapping.
  3. Begin synchronizing active work items and pull requests based on the mapping.
  4. Output logs indicating the sync progress.

You can verify the first sync by checking your mapped Asana project for newly created tasks with the configured synced tag.

Features

Work Item Synchronization

  • Synchronizes Azure DevOps work items (User Stories, Bugs, Tasks, etc.) to Asana tasks
  • Maintains bidirectional sync for updates, assignments, and status changes
  • Automatic user matching between ADO and Asana based on email addresses
  • Configurable closed states mapping

Pull Request Synchronization

  • Synchronizes active Pull Requests from Azure DevOps to Asana
  • Creates separate reviewer tasks for each assigned reviewer
  • Task titles follow the format: "Pull Request 5: Update readme (Reviewer Name)"
  • Automatic status management:
    • Approved reviews (approve/approve with suggestions) → Close Asana task
    • Other review states (waiting for author, reject, no vote) → Keep task open
    • PR completion/abandonment → Close all reviewer tasks
    • Reviewer removal → Close reviewer's task
  • Handles reviewer additions, removals, and approval resets
  • Syncs PR title changes to Asana task titles

Pull Request Selection Logic

The system follows this logic to determine which PRs to sync:

  1. Repository Discovery: For each configured ADO project, discover all Git repositories
  2. Active PR Filtering: Query only PRs with status="active" (excludes completed/abandoned PRs)
  3. Reviewer Requirements: Only sync PRs that have at least one assigned reviewer
  4. User Matching: Only create tasks for reviewers who have matching Asana accounts (by email)
  5. Deduplication: Prevent duplicate reviewer processing by unique email identifier
  6. Cleanup Processing: Additionally process previously synced PRs that may now be closed/completed

Exclusion Criteria:

  • PRs without reviewers are skipped (logs: "No reviewers found for PR X")
  • Reviewers not found in Asana are skipped (logs: "PR X: reviewer Y not found in Asana")
  • Repositories/projects without Git API access are skipped gracefully

Changelog

See CHANGELOG.md for a detailed history of changes and new features.

Development

Commit message style

This repo uses Conventional Commits to ensure the build numbering is generated correctly

Manual testing

To test the application manually, you can use the following steps:

Work Item Testing

  1. Create new ADO work item and ensure it is synced to Asana.
  2. Rename Asana task and ensure it is reverted back to the ADO name.
  3. Rename ADO task and ensure it is synced to Asana.
  4. Remove Synced tag from item in Asana and ensure it is replaced.
  5. Delete synced tag from Asana workspace and from appdata.json file and ensure it is re-created and assigned to all synced tasks.
  6. Mark Asana task as complete and ensure it is re-opened.
  7. Mark ADO task as complete and ensure it is marked as complete in Asana.
  8. Re-open ADO task and ensure it is re-opened in Asana.

Pull Request Testing

  1. Create new Pull Request in ADO with reviewers and ensure reviewer tasks are created in Asana.
  2. Change the PR title in ADO and ensure the title updates in Asana tasks on next sync.
  3. Add a reviewer to the PR and ensure a new task is created for them.
  4. Remove a reviewer from the PR and ensure their task is closed.
  5. Remove all reviewers from the PR and ensure all tasks are closed.
  6. Approve the PR as a reviewer and ensure the reviewer's task is closed.
  7. Approve with suggestions and ensure the reviewer's task is closed.
  8. Reject or request changes and ensure the reviewer's task remains open.
  9. Reset approval and ensure the reviewer's task is reopened.
  10. Complete/abandon the PR and ensure all reviewer tasks are closed.

Reference

ADO

Asana

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ado_asana_sync-1.26.24.tar.gz (158.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ado_asana_sync-1.26.24-py3-none-any.whl (48.7 kB view details)

Uploaded Python 3

File details

Details for the file ado_asana_sync-1.26.24.tar.gz.

File metadata

  • Download URL: ado_asana_sync-1.26.24.tar.gz
  • Upload date:
  • Size: 158.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ado_asana_sync-1.26.24.tar.gz
Algorithm Hash digest
SHA256 6fc2ca32aef9ed09e88ea4f0eece73ba90aa3610db443ca841c24bd1ee2f5bba
MD5 c3d19eac1d724b415df6b3c0564b2e5e
BLAKE2b-256 fb5436fa6aa34682dac86990aec3be28facf84e2de9cc483c8a15acf4fe5be92

See more details on using hashes here.

Provenance

The following attestation bundles were made for ado_asana_sync-1.26.24.tar.gz:

Publisher: release.yml on danstis/ado-asana-sync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ado_asana_sync-1.26.24-py3-none-any.whl.

File metadata

File hashes

Hashes for ado_asana_sync-1.26.24-py3-none-any.whl
Algorithm Hash digest
SHA256 e3510b5296c071368202fb9970f13badb19f7903901043d575454fe073e3ec03
MD5 0b6875fca821b03846252f44c6b8be3f
BLAKE2b-256 a51c2ef5205ea99f1fbc7829664a42c28af8ed959212b6313d79475f2f2213a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ado_asana_sync-1.26.24-py3-none-any.whl:

Publisher: release.yml on danstis/ado-asana-sync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page