Skip to content

feat: add Azure DevOps Server and Services provider - #5744

Open
XnCN wants to merge 7 commits into
Dokploy:canaryfrom
XnCN:feat/azure-devops-provider
Open

XnCN wants to merge 7 commits into
Dokploy:canaryfrom
XnCN:feat/azure-devops-provider

Conversation

@XnCN

@XnCN XnCN commented Oct 22, 2026 •

Copy link
Copy Markdown

What is this PR about?

Adds Azure DevOps as a PAT-authenticated Git source for Applications and Docker Compose, with project/repository/branch discovery and automatically managed push hooks. The REST API 7.0 client preserves Server collection paths and Services organization URLs. Credentials are encrypted at rest, supplied through temporary process environment or SSH stdin, and excluded from clone URLs, logs, persistent Git configuration and service responses.

Source saves preserve deployment status. Leaving Azure rotates the service webhook token; tokens for other providers are preserved. Azure cleanup work is limited to Azure sources or retained Azure hook records. Hook failures retain the saved source and expose retry/cleanup information. Source forms include colored hook-status badges and a shortcut to the selected project's Azure Service Hooks page.

Compose path-only edits enforce provider source permissions and reject traversal/absolute paths. Provider dialogs refresh cached details after saving and preserve edited fields during background refreshes. Clone progress streams to deployment logs with credential masking across chunk boundaries and separate output streams; existing process-output callbacks retain their default behavior.

Migration

0198_azure_devops.sql adds the provider, source fields and retained hook records, and extends three enums. Clean installs and upgrades preserve existing source types and service statuses; no data conversion is required.

Validation

  • Latest validation at cef37f307, after merging upstream canary (e255f6999): fresh frozen-lockfile install on Linux with Node 24.22.1 and pnpm 10.22.0. The complete test suite passed in two non-overlapping runs: 1,576 standard tests plus nine real deployment/monitoring tests in a dedicated Docker-in-Docker daemon, with one existing Railpack test skipped. All workspace typechecks, server build and workspace production build passed. Read-only Biome checked 60 PR files with zero errors/warnings and one unchanged upstream informational finding; whitespace checks passed. The isolated Docker daemon and its volumes were removed. An unchanged upstream remote-stream test timed out in an earlier parallel run; its targeted retry and the final complete sequential run passed. GitHub Pull Request and autofix.ci workflows now trigger, but require upstream maintainer approval for this fork PR; no GitHub jobs have executed yet.
  • Client/authentication, access control, source preservation, credential isolation, clone/build paths, hooks, push filters and watch paths covered by automated tests. Real local HTTPS Git fixtures cover same-collection submodules and rejection of credential forwarding outside the collection.
  • Server: About reports Azure DevOps Server 2022 (AzureDevOpsServer_20221122.1). Real Azure-origin pushes automatically deployed Application and Compose fixtures over a restricted HTTPS tunnel. Two distinct valid PATs were used; replacing the fixture provider PAT preserved hook and deployment operation. Hooks passed create/update, token rotation, disable/delete/reenable and recreation after 404. Matching/nonmatching watch paths passed.
  • Live callback outage test: both fixture callbacks returned 503, Azure retried, and the same notifications succeeded after callback recovery (six attempts). Temporary providers, branches, hooks and services were cleaned up.
  • A separate Server PAT configured with only Code: Read passed discovery, private clone, watch-path diff and hook create/read/update/delete. Existing provider credentials were preserved and temporary resources were removed. Project Service Hooks permissions are required independently of the PAT scope.
  • A final private Server clone using a temporary provider verified live progress before completion, clean origin/configuration and credential-free logs. The existing provider credential was preserved and the temporary provider/clone were removed.
  • Services: discovery, private clone and manual Application/Compose fixtures passed.
  • Live remote clone: the unchanged PR clone implementation successfully checked out the supplied private Azure demo repository on a separate deployment host using SSH-key authentication and native provider/server database lookups. The checkout contained 20 tracked files and its HEAD matched the Azure branch SHA. The temporary provider PAT was encrypted at rest; clone progress reached the deployment log, and neither the PAT nor its Basic-auth encoding remained in the repository Git configuration or logs. Existing running containers were unchanged. Temporary provider, checkout and log artifacts were removed; the remote deployment-server connection was retained. The initial run covered cloning only; subsequent fixture deployments are described below.
  • Live remote submodule/build/deployment: isolated orphan fixture branches in the supplied private Azure repository contain only a tiny HTTP service and a pinned submodule file. The unchanged PR native Application (Dockerfile/Swarm) and Docker Compose deployment services both cloned the fixture with submodules, built images on the SSH deployment host and completed deployments. Running containers served the expected application and submodule content over HTTP; both checkout SHAs matched the pinned commits. Provider PAT storage was encrypted, and Git configuration, deployment logs and container configuration contained neither the PAT nor its Basic-auth encoding. No host ports were published. Test workloads, images, checkouts, logs and temporary panel/provider records were removed; all 34 pre-existing running container IDs and the Swarm service list were unchanged. Fixture branches were retained for review. Initial fixture setup errors (missing gitlink and disabled generated Compose env file) were corrected before the successful final deployments; no Dokploy source changes were needed.
  • Final staged and committed-content privacy/Gitleaks scans found zero matches. Supplied addresses, PATs, keys, private IDs and runtime helpers are excluded from the contribution.

Validation limits

On-premises live acceptance and minimum PAT scope checks used the Server build identified above; they do not certify a separate 2022.1 installation. Live Azure submodule validation used a pinned commit from another fixture branch in the same repository. Cross-repository private submodule access remains unverified because the test PAT could not create a separate repository. Separate-host acceptance covered Dockerfile Applications and docker-compose services; other buildpacks and public domain/TLS routing were outside that run. A controlled HTTP 503 callback outage does not certify every DNS, TLS or network-failure scenario.

Checklist

  • Dedicated branch based on canary.
  • Contribution guidelines read.
  • Locally tested with the validation limits above disclosed.
  • No supplied private addresses, credentials, environment files or runtime helpers included.
  • English user guide prepared separately for Dokploy/website.

Issues related

Closes #1949.

Documentation

The companion website contribution adds apps/docs/content/docs/core/(Git-Sources)/azure-devops.mdx and targets main.

Companion documentation PR: Dokploy/website#209

Comment thread apps/dokploy/server/api/routers/compose.ts Outdated
Comment thread packages/server/src/utils/providers/azure-devops.ts Outdated

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Add Azure DevOps as a Git source

1 participant