Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.
To integrate with Azure DevOps, you need an Azure DevOps user with Basic access level on the necessary Azure DevOps organization and View permissions for this node permission for the project. We recommend that this user be a designated shared bot user, as env zero will perform actions as this user on the project/repository.If you do not have the correct permissions, ask an administrator or a different user with those permissions to create the template.
Prerequisites
Before creating an Azure DevOps template, you need an Azure DevOps VCS connection configured in your organization. To set one up, go to Organization Settings > VCS and create a new Azure DevOps connection.Learn more: Managing VCS Connections
Microsoft Entra ID authentication
Microsoft is retiring Azure DevOps OAuth apps in 2026. env zero connects to Azure DevOps through Microsoft Entra ID instead.New Azure DevOps connections use Microsoft Entra ID by default. Connections created before the change use Azure DevOps OAuth until you switch them.
Microsoft Entra ID supports work or school accounts only. Personal Microsoft accounts, such as outlook.com or live.com accounts, cannot authorize a connection.
Switch an existing connection
Required permission: Edit Organization Settings.
1
Find connections that need to switch
Go to Organization Settings > VCS. Azure DevOps connections that still use Azure DevOps OAuth show an exclamation mark next to the provider logo. In the Configure VCS Connection window, the Deployment card shows a Needs attention tag.
2
Open the connection details
Open the connection and click Edit. The method the connection uses is tagged In use.
3
Select Microsoft Entra ID
Select Microsoft Entra ID (recommended) and click Grant Access.
4
Sign in as the same user
Sign in with the Azure DevOps user who created the connection. If you sign in as a different user, env zero shows “Sign in as <USER> to switch this connection.” and the connection does not change.Microsoft can sign you in with the account your browser is already signed in to. If that is a different user, retry from a private browser window.
5
Finish the switch
After the sign-in, env zero shows “Switched to Microsoft Entra ID.” Click Done.
The connection keeps its ID, so templates, environments, and webhooks that use it keep working. The previous Azure DevOps OAuth credentials are replaced.
Admin consent
If your Microsoft Entra tenant does not let users consent to apps, the sign-in fails with “Your Microsoft Entra administrator must grant consent to env0 before you can connect Azure DevOps.”A tenant administrator grants consent once for the whole tenant. Send them this link:
The administrator signs in, reviews the permissions, and clicks Accept. env zero then shows “Microsoft Entra admin consent was granted to env0. You can close this tab.” After that, retry the switch.The link requests these Azure DevOps permissions:
Permission
Used for
vso.code
Read repositories and code
vso.code_status
Report commit and pull request statuses
vso.notification_write
Manage service hooks for webhooks
vso.threads_full
Comment on pull requests
offline_access
Keep the connection authorized without signing in again
Reauthorization
If env zero does not use a Microsoft Entra ID connection for 90 days, Microsoft expires its authorization, and actions that use the connection fail. To authorize it again, open the connection, select Microsoft Entra ID (recommended), and click Grant Access with the same user.
The connection keeps using Azure DevOps OAuth, and env zero can’t guarantee it keeps working. Microsoft scheduled Azure DevOps OAuth for removal in 2026 and can stop it on its own schedule. When that happens, templates and environments that use the connection stop working until you switch.
Can I switch using a different Azure DevOps user?
No. Sign in as the user who created the connection. To use a different user, create a new connection and update your templates to use it.
Why is the sign-in rejected when I use the right user?
env zero matches the user by the Azure DevOps display name saved when the connection was created. If that user changed their display name since, the switch is rejected. Change the display name back to the one shown in the error, or contact env zero support.
Why does the connection still show the mark after I switched?
If env zero shows “Connection status not refreshed”, the switch worked but the connection still shows its old method. Click Grant Access again with the same user.
What if my administrator blocks the sign-in?
Your tenant requires admin consent. Send your Microsoft Entra administrator the admin consent link.
New Template
1
Create Template
Click ADD A NEW TEMPLATE on the top right in the Templates screen. Pick your template type, enter a name for the template, and click NEXT.
2
Select Azure DevOps
Click on the Azure DevOps button.
3
Select VCS Connection
Select a pre-configured Azure DevOps VCS connection from the dropdown. If no connection exists, click Add VCS Connection to create one.
4
Select Repository
Pick the repository from the list of accessible Azure DevOps projects.
5
Configure Source
If you would like to pull the code from a specific revision or branch, enter that in the Branch field. Leaving this field empty will use your default branch, which is usually “master”/“main”.Enter the folder your IaC files are located in under the IaC type folder. If your IaC files are in the root of the repository, leave this empty.
6
Configure Variables
Click NEXT to proceed to the variables section. Add environment and Terraform variables that you’d like to be used during deployment, and then click NEXT to go to the final “Projects” section.
7
Assign Projects
Pick the projects that you’d like to have access to deploy this template, and then click DONE to create the template.
Troubleshoot
Can’t find your repository? Verify that the VCS connection has access to the necessary Azure DevOps organization/project. You can check the available repositories in Organization Settings > VCS by selecting the relevant connection.
Azure DevOps old domain name URLsRepositories using the old domain name URLs are not supported, i.e., if the URL for your git repository is in the format of <organization-name>.visualstudio... an environment won’t be created.For more information about old domain name URLs and how to resolve the issue, read here.
Existing Template
If you would like to integrate an existing template with Azure DevOps:
From the Templates screen, click on Settings for the appropriate template you would like to integrate with Azure DevOps.
Click on the VCS step. From there you can click on the Azure DevOps button, and integrate with Azure DevOps as you would for a new template.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"env zero docs","colors":{"primary":"#000000","light":"#D2F740"},"logo":{"light":"https://mintcdn.com/envzero-b61043c8/GWfARhdHeVhvtQPk/logo/logo-light-mode.svg?fit=max\u0026auto=format\u0026n=GWfARhdHeVhvtQPk\u0026q=85\u0026s=6349fff9147169f2120c89694f47cbc0","dark":"https://mintcdn.com/envzero-b61043c8/GWfARhdHeVhvtQPk/logo/logo-dark-mode.svg?fit=max\u0026auto=format\u0026n=GWfARhdHeVhvtQPk\u0026q=85\u0026s=3017a6fc552076ce1aa60a773f7cab5c"},"favicon":"https://mintcdn.com/envzero-b61043c8/tSDpnsOW7stD0Hxu/favicon.svg?fit=max\u0026auto=format\u0026n=tSDpnsOW7stD0Hxu\u0026q=85\u0026s=e7c3f9cd1d8663c44ed8c059f5c4e2cb","icons":{"library":"lucide"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"envzero-b61043c8","hasAudioNarration":false,"actualSubdomain":"envzero-b61043c8","customDomains":["docs.envzero.com"],"gitSource":{"type":"github","owner":"env0","repo":"env-zero-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af58ddd04140d5ce9d60696","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"API reference","count":385},{"language":"default","tag":"Guides","count":218},{"language":"default","tag":"Changelog","count":122},{"language":"default","tag":"Configuration","count":57},{"language":"default","tag":"Cloud Compass","count":46},{"language":"default","tag":"ACCESS \u0026 IDENTITY","count":43},{"language":"default","tag":"Environments","count":40},{"language":"default","tag":"2023","count":36},{"language":"default","tag":"ENVIRONMENTS \u0026 DEPLOYMENTS","count":32},{"language":"default","tag":"2024","count":28}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"docs-styles.css","content":"#page-context-menu{button {\n\t\tborder-radius: 0px;\n\t\tbackground-color: light-dark(#D2F740, #0C0C0B);\n\t\tcolor: light-dark(#000000, #FFFFFF);\n\t}\n\n\t:hover {\n\t\tbackground-color: light-dark(#B8E500, #3A3A38);\n\t\tcolor: light-dark(#000000, #FFFFFF);\n\t}\n\n\t:active {\n\t\tbackground-color: light-dark(#ADDC06, #4D4E4B);\n\t\tcolor: light-dark(#000000, #FFFFFF);\n\t}}.tryit-button{border-radius:0px;background-color:light-dark(#D2F740, #0C0C0B);color:light-dark(#000000, #FFFFFF);:hover {\n\t\tbackground-color: light-dark(#B8E500, #3A3A38);\n\t\tcolor: light-dark(#000000, #FFFFFF);\n\t}\n\n\t:active {\n\t\tbackground-color: light-dark(#ADDC06, #4D4E4B);\n\t\tcolor: light-dark(#000000, #FFFFFF);\n\t}\n\n\tsvg {\n\t\tbackground-color: light-dark(#000000, #FFFFFF);\n\t}}.card{border-radius:0px;border-style:dashed}.accordion-group{border-radius:0px;border-style:dashed}#footer{display:none}.link{color:light-dark(black, white)!important;border-bottom-color:light-dark(#ADDC06, #D2F740)}"}],"page":{"pagePath":"guides/admin-guide/templates/azure-devops-integration","slug":"/guides/admin-guide/templates/azure-devops-integration","pageMetadata":{"title":"Azure DevOps integration","slug":"azure-devops-integration","description":"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.","keywords":["azure devops","ADO","VCS","version control","SCM","azure repos","git integration","azure devops integration","microsoft entra id","entra","admin consent"],"href":"/guides/admin-guide/templates/azure-devops-integration"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,CodeBlock,Heading,Info,Step,Steps,Table,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`To integrate with Azure DevOps, you need an Azure DevOps user with `,_jsx(_components.code,{children:`Basic`}),` access level on the necessary Azure DevOps organization and `,_jsx(_components.code,{children:`View permissions for this node`}),` permission for the project. We recommend that this user be a designated shared bot user, as env zero will perform actions as this user on the project/repository.`]}),_jsx(_components.p,{children:`If you do not have the correct permissions, ask an administrator or a different user with those permissions to create the template.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.p,{children:[`Before creating an Azure DevOps `,_jsx(_components.a,{href:`/guides/admin-guide/templates`,children:`template`}),`, you need an Azure DevOps VCS connection configured in your organization. To set one up, go to `,_jsx(_components.strong,{children:`Organization Settings > VCS`}),` and create a new Azure DevOps connection.`]}),`\n`,_jsxs(_components.p,{children:[`Learn more: `,_jsx(_components.a,{href:`/guides/admin-guide/manage-vcs#centralized-management`,children:`Managing VCS Connections`})]}),`\n`,_jsx(Heading,{level:`2`,id:`microsoft-entra-id-authentication`,children:`Microsoft Entra ID authentication`}),`\n`,_jsxs(_components.p,{children:[`Microsoft is `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/azure-devops-oauth`,children:`retiring Azure DevOps OAuth apps`}),` in 2026. env zero connects to Azure DevOps through Microsoft Entra ID instead.`]}),`\n`,_jsx(_components.p,{children:`New Azure DevOps connections use Microsoft Entra ID by default. Connections created before the change use Azure DevOps OAuth until you switch them.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Microsoft Entra ID supports work or school accounts only. Personal Microsoft accounts, such as `,_jsx(_components.code,{children:`outlook.com`}),` or `,_jsx(_components.code,{children:`live.com`}),` accounts, cannot authorize a connection.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`switch-an-existing-connection`,children:`Switch an existing connection`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Required permission:`}),` Edit Organization Settings.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Find connections that need to switch`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Organization Settings > VCS`}),`. Azure DevOps connections that still use Azure DevOps OAuth show an exclamation mark next to the provider logo. In the `,_jsx(_components.strong,{children:`Configure VCS Connection`}),` window, the `,_jsx(_components.strong,{children:`Deployment`}),` card shows a `,_jsx(_components.strong,{children:`Needs attention`}),` tag.`]})}),_jsx(Step,{title:`Open the connection details`,children:_jsxs(_components.p,{children:[`Open the connection and click `,_jsx(_components.strong,{children:`Edit`}),`. The method the connection uses is tagged `,_jsx(_components.strong,{children:`In use`}),`.`]})}),_jsx(Step,{title:`Select Microsoft Entra ID`,children:_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Microsoft Entra ID (recommended)`}),` and click `,_jsx(_components.strong,{children:`Grant Access`}),`.`]})}),_jsxs(Step,{title:`Sign in as the same user`,children:[_jsxs(_components.p,{children:[`Sign in with the Azure DevOps user who created the connection. If you sign in as a different user, env zero shows “Sign in as `,_jsx(_components.code,{children:`\u003cUSER>`}),` to switch this connection.” and the connection does not change.`]}),_jsx(_components.p,{children:`Microsoft can sign you in with the account your browser is already signed in to. If that is a different user, retry from a private browser window.`})]}),_jsx(Step,{title:`Finish the switch`,children:_jsxs(_components.p,{children:[`After the sign-in, env zero shows “Switched to Microsoft Entra ID.” Click `,_jsx(_components.strong,{children:`Done`}),`.`]})})]}),`\n`,_jsx(_components.p,{children:`The connection keeps its ID, so templates, environments, and webhooks that use it keep working. The previous Azure DevOps OAuth credentials are replaced.`}),`\n`,_jsx(Heading,{level:`3`,id:`admin-consent`,children:`Admin consent`}),`\n`,_jsx(_components.p,{children:`If your Microsoft Entra tenant does not let users consent to apps, the sign-in fails with “Your Microsoft Entra administrator must grant consent to env0 before you can connect Azure DevOps.”`}),`\n`,_jsx(_components.p,{children:`A tenant administrator grants consent once for the whole tenant. Send them this link:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`https://login.microsoftonline.com/organizations/v2.0/adminconsent?client_id=ace5b564-6a75-4df7-9309-9bd93f0969a4\u0026scope=499b84ac-1321-427f-aa17-267ca6975798/vso.code%20499b84ac-1321-427f-aa17-267ca6975798/vso.code_status%20499b84ac-1321-427f-aa17-267ca6975798/vso.notification_write%20499b84ac-1321-427f-aa17-267ca6975798/vso.threads_full%20offline_access\u0026redirect_uri=https://webhooks.api.env0.com/vcs-authorize/oauth/redirect`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The administrator signs in, reviews the permissions, and clicks `,_jsx(_components.strong,{children:`Accept`}),`. env zero then shows “Microsoft Entra admin consent was granted to env0. You can close this tab.” After that, retry the switch.`]}),`\n`,_jsx(_components.p,{children:`The link requests these Azure DevOps permissions:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vso.code`})}),_jsx(_components.td,{children:`Read repositories and code`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vso.code_status`})}),_jsx(_components.td,{children:`Report commit and pull request statuses`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vso.notification_write`})}),_jsx(_components.td,{children:`Manage service hooks for webhooks`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vso.threads_full`})}),_jsx(_components.td,{children:`Comment on pull requests`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`offline_access`})}),_jsx(_components.td,{children:`Keep the connection authorized without signing in again`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`reauthorization`,children:`Reauthorization`}),`\n`,_jsxs(_components.p,{children:[`If env zero does not use a Microsoft Entra ID connection for 90 days, Microsoft expires its authorization, and actions that use the connection fail. To authorize it again, open the connection, select `,_jsx(_components.strong,{children:`Microsoft Entra ID (recommended)`}),`, and click `,_jsx(_components.strong,{children:`Grant Access`}),` with the same user.`]}),`\n`,_jsx(Heading,{level:`3`,id:`faq`,children:`FAQ`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Why is my connection marked?`,id:`why-is-my-connection-marked`,children:_jsxs(_components.p,{children:[`The connection uses Azure DevOps OAuth, which Microsoft is retiring. `,_jsx(_components.a,{href:`#switch-an-existing-connection`,children:`Switch it to Microsoft Entra ID`}),`.`]})}),_jsx(Accordion,{title:`What happens if I don't switch?`,id:`what-happens-if-i-dont-switch`,children:_jsxs(_components.p,{children:[`The connection keeps using Azure DevOps OAuth, and env zero can’t guarantee it keeps working. Microsoft `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/azure-devops-oauth`,children:`scheduled Azure DevOps OAuth for removal in 2026`}),` and can stop it on its own schedule. When that happens, templates and environments that use the connection stop working until you switch.`]})}),_jsx(Accordion,{title:`Can I switch using a different Azure DevOps user?`,id:`can-i-switch-using-a-different-azure-devops-user`,children:_jsx(_components.p,{children:`No. Sign in as the user who created the connection. To use a different user, create a new connection and update your templates to use it.`})}),_jsx(Accordion,{title:`Why is the sign-in rejected when I use the right user?`,id:`why-is-the-sign-in-rejected-when-i-use-the-right-user`,children:_jsx(_components.p,{children:`env zero matches the user by the Azure DevOps display name saved when the connection was created. If that user changed their display name since, the switch is rejected. Change the display name back to the one shown in the error, or contact env zero support.`})}),_jsx(Accordion,{title:`Why does the connection still show the mark after I switched?`,id:`why-does-the-connection-still-show-the-mark-after-i-switched`,children:_jsxs(_components.p,{children:[`If env zero shows “Connection status not refreshed”, the switch worked but the connection still shows its old method. Click `,_jsx(_components.strong,{children:`Grant Access`}),` again with the same user.`]})}),_jsx(Accordion,{title:`What if my administrator blocks the sign-in?`,id:`what-if-my-administrator-blocks-the-sign-in`,children:_jsxs(_components.p,{children:[`Your tenant requires admin consent. Send your Microsoft Entra administrator the `,_jsx(_components.a,{href:`#admin-consent`,children:`admin consent link`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`new-template`,children:`New Template`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create Template`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`ADD A NEW TEMPLATE`}),` on the top right in the `,_jsx(_components.em,{children:`Templates`}),` screen. Pick your template type, enter a name for the template, and click `,_jsx(_components.strong,{children:`NEXT`}),`.`]})}),_jsx(Step,{title:`Select Azure DevOps`,children:_jsxs(_components.p,{children:[`Click on the `,_jsx(_components.strong,{children:`Azure DevOps`}),` button.`]})}),_jsx(Step,{title:`Select VCS Connection`,children:_jsxs(_components.p,{children:[`Select a pre-configured Azure DevOps VCS connection from the dropdown. If no connection exists, click `,_jsx(_components.strong,{children:`Add VCS Connection`}),` to create one.`]})}),_jsx(Step,{title:`Select Repository`,children:_jsx(_components.p,{children:`Pick the repository from the list of accessible Azure DevOps projects.`})}),_jsxs(Step,{title:`Configure Source`,children:[_jsxs(_components.p,{children:[`If you would like to pull the code from a specific revision or branch, enter that in the `,_jsx(_components.code,{children:`Branch`}),` field. Leaving this field empty will use your default branch, which is usually “master”/“main”.`]}),_jsx(_components.p,{children:`Enter the folder your IaC files are located in under the IaC type folder. If your IaC files are in the root of the repository, leave this empty.`})]}),_jsx(Step,{title:`Configure Variables`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`NEXT`}),` to proceed to the variables section. Add `,_jsx(_components.a,{href:`/guides/admin-guide/variables#terraform-variables-and-environment-variables`,children:`environment and Terraform variables`}),` that you’d like to be used during deployment, and then click `,_jsx(_components.strong,{children:`NEXT`}),` to go to the final “Projects” section.`]})}),_jsx(Step,{title:`Assign Projects`,children:_jsxs(_components.p,{children:[`Pick the `,_jsx(_components.a,{href:`/guides/admin-guide/projects`,children:`projects`}),` that you’d like to have access to deploy this template, and then click `,_jsx(_components.strong,{children:`DONE`}),` to create the template.`]})})]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:`Troubleshoot`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Can’t find your repository? Verify that the VCS connection has access to the necessary Azure DevOps organization/project. You can check the available repositories in `,_jsx(_components.strong,{children:`Organization Settings > VCS`}),` by selecting the relevant connection.`]}),`\n`]})]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Azure DevOps old domain name URLs`})}),_jsxs(_components.p,{children:[`Repositories using the old domain name URLs are not supported, i.e., if the URL for your git repository is in the format of `,_jsx(_components.code,{children:`\u003corganization-name>.visualstudio...`}),` an environment won’t be created.`]}),_jsxs(_components.p,{children:[`For more information about old domain name URLs and how to resolve the issue, read `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/azure/devops/release-notes/2018/sep-10-azure-devops-launch#switch-existing-organizations-to-use-the-new-domain-name-url`,children:`here`}),`.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`existing-template`,children:`Existing Template`}),`\n`,_jsx(_components.p,{children:`If you would like to integrate an existing template with Azure DevOps:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`From the `,_jsx(_components.strong,{children:`Templates`}),` screen, click on `,_jsx(_components.strong,{children:`Settings`}),` for the appropriate template you would like to integrate with Azure DevOps.`]}),`\n`,_jsxs(_components.li,{children:[`Click on the `,_jsx(_components.strong,{children:`VCS`}),` step. From there you can click on the `,_jsx(_components.strong,{children:`Azure DevOps`}),` button, and integrate with Azure DevOps as you would for a new template.`]}),`\n`]}),`\n`,_jsxs(Info,{children:[_jsx(_components.p,{children:`Additional Content`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://www.envzero.com/blog/managing-terraform-variable-hierarchy`,children:`Managing Terraform variable hierarchy`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://www.envzero.com/alternatives/terraform-cloud-vs-envzero`,children:`Why env zero is a Terraform Cloud alternative?`})}),`\n`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.p,{children:[`Once environments deploy from your Azure DevOps template, you can `,_jsx(_components.a,{href:`/guides/admin-guide/environments/plan-on-pull-request`,children:`run a plan on each pull request`}),` before merging.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Azure DevOps integration","slug":"azure-devops-integration","description":"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.","keywords":["azure devops","ADO","VCS","version control","SCM","azure repos","git integration","azure devops integration","microsoft entra id","entra","admin consent"],"href":"/guides/admin-guide/templates/azure-devops-integration"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Microsoft Entra ID authentication","slug":"microsoft-entra-id-authentication","depth":2,"children":[{"title":"Switch an existing connection","slug":"switch-an-existing-connection","depth":3,"children":[]},{"title":"Admin consent","slug":"admin-consent","depth":3,"children":[]},{"title":"Reauthorization","slug":"reauthorization","depth":3,"children":[]},{"title":"FAQ","slug":"faq","depth":3,"children":[]}]},{"title":"New Template","slug":"new-template","depth":2,"children":[]},{"title":"Existing Template","slug":"existing-template","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/envzero-b61043c8/acfe5f113d987bc4/analytics.js","/_mintlify/custom/envzero-b61043c8/6e65effd4fa229eb/page-dates.js","/_mintlify/custom/envzero-b61043c8/05a202bfcfe4d650/schema.js"],"subdomain":"envzero-b61043c8","siteName":"env zero docs","title":"Azure DevOps integration - env zero docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T13:09:56.866Z","originalFileLocation":"guides/admin-guide/templates/azure-devops-integration.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.\">\u003cmeta data-mint-head name=\"application-name\" content=\"env zero docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Azure DevOps integration - env zero docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"env zero docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://envzero-b61043c8.mintlify.site/_mintlify/api/og/v2?division=Version+control+integration\u0026amp;title=Azure+DevOps+integration\u0026amp;description=Connect+Azure+DevOps+repositories+to+env+zero+for+IaC+template+creation%2C+requiring+Basic+access+level+and+View+permissions+for+the+organization.\u0026amp;theme=b92d60cc1454bb7630490ffe\u0026amp;signature=cebc5d7317d34d353a1ba07f0a828009bb203be8d0637c3f2bf9b153678e03d4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Azure DevOps integration - env zero docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://envzero-b61043c8.mintlify.site/_mintlify/api/og/v2?division=Version+control+integration\u0026amp;title=Azure+DevOps+integration\u0026amp;description=Connect+Azure+DevOps+repositories+to+env+zero+for+IaC+template+creation%2C+requiring+Basic+access+level+and+View+permissions+for+the+organization.\u0026amp;theme=b92d60cc1454bb7630490ffe\u0026amp;signature=cebc5d7317d34d353a1ba07f0a828009bb203be8d0637c3f2bf9b153678e03d4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/envzero-b61043c8/d__z1yG6n7HmXzQt/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"env zero docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/admin-guide/templates/azure-devops-integration.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.envzero.com/#organization\",\"name\":\"env zero docs\",\"url\":\"https://docs.envzero.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/envzero-b61043c8/GWfARhdHeVhvtQPk/logo/logo-light-mode.svg?fit=max\u0026auto=format\u0026n=GWfARhdHeVhvtQPk\u0026q=85\u0026s=6349fff9147169f2120c89694f47cbc0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.envzero.com#website\",\"name\":\"env zero docs\",\"url\":\"https://docs.envzero.com\",\"publisher\":{\"@id\":\"https://docs.envzero.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration#webpage\",\"url\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration\",\"name\":\"Azure DevOps integration\",\"description\":\"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.\",\"dateModified\":\"2026-11-04T13:09:56.866Z\",\"isPartOf\":{\"@id\":\"https://docs.envzero.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"TEMPLATES \u0026 IaC TOOLS\",\"item\":\"https://docs.envzero.com/guides/admin-guide/templates\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Version control integration\",\"item\":\"https://docs.envzero.com/guides/admin-guide/manage-vcs\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Azure DevOps integration\",\"item\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration#article\",\"headline\":\"Azure DevOps integration\",\"name\":\"Azure DevOps integration\",\"description\":\"Connect Azure DevOps repositories to env zero for IaC template creation, requiring Basic access level and View permissions for the organization.\",\"url\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration\",\"mainEntityOfPage\":{\"@id\":\"https://docs.envzero.com/guides/admin-guide/templates/azure-devops-integration#webpage\"},\"dateModified\":\"2026-11-04T13:09:56.866Z\",\"keywords\":\"azure devops, ADO, VCS, version control, SCM, azure repos, git integration, azure devops integration, microsoft entra id, entra, admin consent\",\"publisher\":{\"@id\":\"https://docs.envzero.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.envzero.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"env zero docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"env zero docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/guides/admin-guide/templates/azure-devops-integration.md","siteName":"env zero docs","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"group":"GET STARTED","pages":[{"title":"Overview: What is env zero?","href":""},{"title":"Product homepage","href":"/guides/admin-guide/homepage"},{"group":"Quick start","pages":[{"title":"Getting Started with env zero","sidebarTitle":"Overview","href":"/guides/getting-started/getting-started"},{"title":"Create your organization","href":"/guides/getting-started/create-your-organization"},{"title":"Connect your Git repository","sidebarTitle":"Connect your Git repository (optional)","href":"/guides/getting-started/connect-your-vcs"},{"title":"Connect your cloud account","href":"/guides/getting-started/connect-your-cloud-account"},{"title":"Create your first template","href":"/guides/getting-started/create-your-first-template"},{"title":"Deploy your first environment","href":"/guides/getting-started/running-your-first-environment"}]},{"group":"Migrate from Terraform Cloud","pages":[{"title":"Migrate from Terraform Cloud","sidebarTitle":"Overview","href":"/guides/admin-guide/tfc-migration"},{"title":"Connect and scan","href":"/guides/admin-guide/tfc-migration/connect-and-scan"},{"title":"Resolve issues","href":"/guides/admin-guide/tfc-migration/resolve-issues"},{"title":"Review and migrate","href":"/guides/admin-guide/tfc-migration/review-and-migrate"},{"title":"Go live","href":"/guides/admin-guide/tfc-migration/go-live"},{"title":"Troubleshooting","sidebarTitle":"TFC migration troubleshooting","href":"/guides/admin-guide/tfc-migration/troubleshooting"}]},{"group":"Plan your setup","pages":[{"title":"Plan your setup","href":"/guides/getting-started/plan-your-setup"}]},{"group":"Reference","pages":[{"title":"Supported platforms","href":"/guides/getting-started/supported-platforms"},{"title":"Glossary","href":"/guides/getting-started/glossary"}]}]},{"group":"ENVIRONMENTS \u0026 DEPLOYMENTS","pages":[{"group":"Creating \u0026 managing environments","pages":[{"title":"Environment overview","href":"/guides/admin-guide/environments"},{"title":"Creating a new environment","href":"/guides/admin-guide/environments/setting-up-a-new-environment"},{"title":"Environment access","href":"/guides/admin-guide/environments/access"},{"title":"Managing bulk operations","href":"/guides/admin-guide/environments/bulk-operations"},{"title":"Environment Tags","href":"/guides/admin-guide/environments/tags"},{"title":"Using continuous deployment","href":"/guides/admin-guide/environments/continuous-deployment"},{"title":"Locking environments","href":"/guides/admin-guide/environments/environment-locking"},{"title":"Performing targeted deployments","href":"/guides/admin-guide/environments/targeted-deployments"},{"title":"Configure workflow triggers","href":"/guides/admin-guide/environments/workflow-triggers"},{"title":"Additional deployment controls","href":"/guides/admin-guide/additional-controls"},{"title":"AI-powered summarization and error insights","href":"/guides/admin-guide/environments/ai-powered-summarization-and-error-insights"},{"title":"Moving environments","href":"/guides/admin-guide/environments/move-environment"},{"title":"Plan and apply via PR comments","href":"/guides/admin-guide/environments/plan-and-apply-from-pr-comments"},{"title":"Running plan on pull requests","href":"/guides/admin-guide/environments/plan-on-pull-request"}]},{"group":"Workflows","pages":[{"title":"Workflow overview","href":"/guides/admin-guide/workflows"},{"title":"Creating a new workflow","href":"/guides/admin-guide/workflows/create-a-new-workflow"},{"title":"Partial workflow deployment","href":"/guides/admin-guide/workflows/workflow-partial-deployment"},{"title":"Workflow file reference","href":"/guides/admin-guide/workflows/workflow-file-reference"},{"title":"Workflow file JSON schema","href":"/guides/admin-guide/workflows/workflow-file-json-schema"},{"title":"Terraform provider settings for sub-environments","sidebarTitle":"Terraform provider settings","href":"/guides/admin-guide/workflows/terraform-provider-sub-environment-settings"}]},{"group":"Scheduling \u0026 automation","pages":[{"title":"Deployment scheduling","href":"/guides/admin-guide/environments/scheduling"},{"title":"Running ad hoc tasks","href":"/guides/admin-guide/environments/ad-hoc-tasks"}]},{"group":"Environment discovery","pages":[{"title":"Environment discovery overview","href":"/guides/admin-guide/environment-discovery"},{"title":"Discovery by file","href":"/guides/admin-guide/environment-discovery/discovery-by-file"},{"title":"Auto-create environments from pull requests","sidebarTitle":"Auto-creating environments from pull requests","href":"/guides/admin-guide/environment-discovery/automatic-environment-creation-from-pull-request"},{"title":"Import external environments into env zero","sidebarTitle":"Importing external environments into env zero","href":"/guides/admin-guide/environment-discovery/onboarding-import-external-environments-into-env-zero"}]},{"group":"Drift detection \u0026 remediation","pages":[{"title":"Drift Detection","href":"/guides/admin-guide/environments/drift-detection"},{"title":"Analyze drift cause","href":"/guides/admin-guide/environments/drift-detection/drift-cause"},{"title":"Remediate Drift","href":"/guides/admin-guide/environments/drift-detection/automatic-drift-remediation"},{"title":"Drift Actions","href":"/guides/admin-guide/environments/drift-detection/drift-actions"},{"title":"Drift detection policy","href":"/guides/policies-governance/drift-detection-policy"}]},{"group":"Promotion strategies","pages":[{"title":"Environment promotion strategies","href":"/guides/admin-guide/environments/promotion-strategies"}]}]},{"group":"TEMPLATES \u0026 IaC TOOLS","pages":[{"group":"Managing templates","pages":[{"title":"Template overview","href":"/guides/admin-guide/templates"},{"title":"Managing IaC binary versions","href":"/guides/admin-guide/templates/iac-binaries-versions"},{"title":"Using self-hosted VCS","href":"/guides/admin-guide/templates/self-hosted-vcs"}]},{"group":"Version control integration","pages":[{"title":"Git and VCS integration","href":"/guides/admin-guide/manage-vcs"},{"group":"GitHub integration","pages":[{"title":"Standard GitHub integration","href":"/guides/admin-guide/templates/github-templates"},{"title":"GitHub Enterprise integration","href":"/guides/admin-guide/templates/github-enterprise-integration"}]},{"group":"GitLab integration","pages":[{"title":"Standard GitLab integration","href":"/guides/admin-guide/templates/gitlab-integration"},{"title":"GitLab Enterprise integration","href":"/guides/admin-guide/templates/gitlab-enterprise-integration"}]},{"group":"Bitbucket integration","pages":[{"title":"Standard Bitbucket integration","href":"/guides/admin-guide/templates/bitbucket-integration"},{"title":"Bitbucket Server integration","description":"Integrate Bitbucket Server or Data Center with env zero using a self-hosted agent and a personal access token with Repository write permissions.","href":"/guides/admin-guide/templates/bitbucket-server-integration"}]},{"title":"Azure DevOps integration","href":"/guides/admin-guide/templates/azure-devops-integration"}]},{"group":"IaC ecosystem","pages":[{"title":"OpenTofu","description":"Configure and deploy OpenTofu templates with env zero using the tofu binary for HCL-based infrastructure as an open-source Terraform alternative.","href":"/guides/admin-guide/templates/opentofu"},{"title":"Terraform","href":"/guides/admin-guide/templates/terraform"},{"title":"Pulumi integration","href":"/guides/admin-guide/templates/pulumi"},{"title":"AWS CloudFormation integration","href":"/guides/admin-guide/templates/cloudformation"},{"title":"Kubernetes (K8s) integration","href":"/guides/admin-guide/templates/k8s"},{"title":"Helm integration","href":"/guides/admin-guide/templates/helm"},{"title":"Ansible integration","href":"/guides/admin-guide/templates/ansible"},{"title":"Terragrunt integration","href":"/guides/admin-guide/templates/terragrunt"}]},{"group":"Open source projects","pages":[{"title":"OpenTofu project","href":"/guides/community-and-resources/community-and-open-source/opentofu"},{"title":"Terratag project","href":"/guides/community-and-resources/community-and-open-source/terratag"}]},{"group":"Repository structure","pages":[{"title":"Repository structure","href":"/guides/admin-guide/templates/repository-structure"}]},{"group":"Module \u0026 provider registries","pages":[{"title":"Private registry","href":"/guides/admin-guide/private-registry"},{"group":"Modules registry","pages":[{"title":"Module overview","href":"/guides/admin-guide/private-registry/modules"},{"title":"Using modules","href":"/guides/admin-guide/private-registry/modules/module-usage"},{"title":"Testing modules in CI","href":"/guides/admin-guide/private-registry/modules/modules-continuous-integration-testing"}]},{"title":"Providers overview","href":"/guides/admin-guide/private-registry/providers"}]}]},{"group":"PLATFORM CONFIGURATION","pages":[{"group":"Variables \u0026 secrets","pages":[{"title":"Managing variables","href":"/guides/admin-guide/variables"},{"title":"Manage access tokens","href":"/guides/admin-guide/variables/access-tokens"},{"title":"Handling common errors","href":"/guides/admin-guide/variables/common-errors"},{"title":"Working with environment outputs","href":"/guides/admin-guide/variables/environment-outputs"},{"title":"Managing SSH keys","href":"/guides/admin-guide/variables/ssh-keys"},{"title":"Using variable sets","href":"/guides/admin-guide/variables/variable-sets"},{"title":"Managing workflow variables","href":"/guides/admin-guide/variables/workflow-variables"}]},{"group":"Custom flows","pages":[{"title":"Custom flows overview","href":"/guides/admin-guide/custom-flows"},{"title":"Project-level custom flow","href":"/guides/admin-guide/custom-flows/project-level-custom-flow"},{"title":"Custom flow schema (v2)","href":"/guides/admin-guide/custom-flows/version-2-schema"}]},{"group":"State management","pages":[{"title":"Remote backend","href":"/guides/admin-guide/remote-backend"},{"title":"Using self-hosted remote state","href":"/guides/admin-guide/remote-backend/self-hosted-remote-state"},{"title":"Authenticate locally","href":"/guides/admin-guide/remote-backend/login"},{"title":"Running remote plan","href":"/guides/admin-guide/remote-backend/remote-plan"},{"title":"Running remote apply","href":"/guides/admin-guide/remote-backend/remote-apply"},{"title":"Integrate with Terraform Cloud Remote Backend","sidebarTitle":"Integrating with Terraform Cloud Remote Backend","href":"/guides/admin-guide/remote-backend/working-with-terraform-cloud-remote-backend"},{"group":"State migration \u0026 backend configuration","pages":[{"title":"Migrating State","href":"/guides/admin-guide/remote-backend/state-migration"},{"title":"Configuring state access control","href":"/guides/admin-guide/remote-backend/state-access-control"},{"title":"Remote state data source","href":"/guides/admin-guide/remote-backend/remote-state-data-source"}]}]},{"group":"Plugins","pages":[{"title":"Plugins overview","href":"/guides/integrations/plugins"},{"title":"Using the Checkov plugin","href":"/guides/integrations/plugins/checkov-plugin"},{"title":"Using the import variable plugin","href":"/guides/integrations/plugins/import-variable-plugin"},{"title":"Using the OPA plugin","href":"/guides/integrations/plugins/opa-plugin"},{"title":"Terragrunt module detection","href":"/guides/integrations/plugins/terragrunt-modules-detection"},{"title":"Using the TFLint plugin","href":"/guides/integrations/plugins/tflint-plugin"},{"title":"Using the TFsec plugin","href":"/guides/integrations/plugins/tfsec-plugin"},{"title":"Using the Trivy plugin","href":"/guides/integrations/plugins/trivy-plugin"}]}]},{"group":"SELF-HOSTED AGENTS","pages":[{"group":"Getting started","pages":[{"title":"Self-hosted agents overview","href":"/guides/admin-guide/self-hosted-kubernetes-agent/overview"},{"title":"Self-hosted Kubernetes agent","href":"/guides/admin-guide/self-hosted-kubernetes-agent/self-hosted-kubernetes-agent"},{"title":"Install the agent with Terraform","href":"/guides/admin-guide/self-hosted-kubernetes-agent/terraform-bootstrap"},{"title":"Running a standalone Docker agent","href":"/guides/admin-guide/self-hosted-kubernetes-agent/standalone-docker-agent"}]},{"group":"Deployment image","pages":[{"title":"Configuring deployment image","href":"/guides/admin-guide/self-hosted-kubernetes-agent/deployment-image"},{"title":"Extending deployment image","href":"/guides/admin-guide/self-hosted-kubernetes-agent/extending-deployment-image"},{"title":"Changing user ID","href":"/guides/admin-guide/self-hosted-kubernetes-agent/using-a-custom-image-in-an-agent/change-user-id"},{"title":"Run Docker in custom flows","href":"/guides/admin-guide/self-hosted-kubernetes-agent/docker-in-custom-flows"}]},{"group":"Authentication","pages":[{"title":"Authenticating the agent on AWS EKS","href":"/guides/admin-guide/self-hosted-kubernetes-agent/authenticating-the-agent-on-aws-eks"},{"title":"Authenticating the agent on Azure AKS","href":"/guides/admin-guide/self-hosted-kubernetes-agent/authenticating-the-agent-on-azure-aks"}]},{"group":"Configuration","pages":[{"title":"Custom/optional configuration","href":"/guides/admin-guide/self-hosted-kubernetes-agent/custom-optional-configuration"},{"title":"Using cache with PVC","href":"/guides/admin-guide/self-hosted-kubernetes-agent/cache-with-pvc"},{"title":"Using custom CA certificates","href":"/guides/admin-guide/self-hosted-kubernetes-agent/custom-ca-certificates"},{"title":"Hosting deployment logs","href":"/guides/admin-guide/self-hosted-kubernetes-agent/hosting-the-deployment-logs"},{"title":"env zero Hosted Encrypted State","href":"/guides/admin-guide/self-hosted-kubernetes-agent/env-zero-hosted-encrypted-state"}]},{"group":"High availability \u0026 scaling","pages":[{"title":"HA/DR strategy for self-hosted agents","href":"/guides/admin-guide/self-hosted-kubernetes-agent/hadr-strategy-for-self-hosted-agents"},{"title":"Running multiple self-hosted agents","href":"/guides/admin-guide/self-hosted-kubernetes-agent/multiple-self-hosted-agents"},{"title":"Autoscaling self-hosted agents on Azure Container Apps","sidebarTitle":"Autoscaling on Azure Container Apps","href":"/guides/admin-guide/self-hosted-kubernetes-agent/autoscaling-on-azure-container-apps"},{"title":"Monitoring Self-Hosted Agents","href":"/guides/admin-guide/self-hosted-kubernetes-agent/self-hosted-agents-monitoring"}]},{"title":"Troubleshooting","sidebarTitle":"Self-hosted agent troubleshooting","href":"/guides/admin-guide/self-hosted-kubernetes-agent/troubleshooting"}]},{"group":"CLOUD MANAGEMENT","pages":[{"group":"Cloud resource management","pages":[{"title":"Cloud Compass","href":"/guides/cloud-compass/cloud-compass"},{"title":"Configure an AWS cloud account","href":"/guides/cloud-compass/cloud-compass/configure-cloud-accounts"},{"title":"Configure an Azure cloud account","href":"/guides/cloud-compass/cloud-compass/configure-an-azure-cloud-account"},{"title":"Configure a GCP cloud account","href":"/guides/cloud-compass/cloud-compass/configure-a-gcp-cloud-account"},{"title":"Link environments to Cloud Compass","sidebarTitle":"Linking environments to Cloud Compass resources","href":"/guides/cloud-compass/cloud-compass/linking-environments-to-cloud-compass-resources"}]},{"group":"Cloud insights","pages":[{"title":"Cloud Analyst","href":"/guides/cloud-analyst/cloud-analyst"},{"title":"AI chat interface","href":"/guides/cloud-analyst/cloud-analyst/ai-chat-interface"},{"title":"Dashboards","href":"/guides/cloud-analyst/cloud-analyst/dashboards"},{"title":"Explorer","href":"/guides/cloud-analyst/cloud-analyst/explorer"},{"title":"Insights","href":"/guides/cloud-analyst/cloud-analyst/insights"},{"title":"env zero model","href":"/guides/cloud-analyst/cloud-analyst/env-zero-model"}]},{"title":"env zero Context Layer","sidebarTitle":"Context Layer (CloudQuery)","href":"/guides/integrations/context-layer"}]},{"group":"GOVERNANCE \u0026 POLICIES","pages":[{"group":"Policies \u0026 safeguards","pages":[{"title":"Manage policies","href":"/guides/policies-governance/policies"},{"title":"Ready-to-use policies","href":"/guides/policies-governance/ready-to-use-policies"},{"title":"Enable env zero secrets","href":"/guides/policies-governance/allow-env0-secrets"},{"title":"Force remote backend","href":"/guides/policies-governance/force-remote-backend"}]},{"group":"Approval \u0026 deployment controls","pages":[{"title":"Manage approval policies","href":"/guides/policies-governance/approval-policies"},{"title":"Pin deployments to an approved revision","sidebarTitle":"Pin deployments to a revision","href":"/guides/policies-governance/pin-deployments-to-an-approved-revision"},{"title":"Enable destroy protection","href":"/guides/policies-governance/destroy-protection"},{"title":"Default auto-approve","href":"/guides/policies-governance/default-auto-approve"},{"title":"Deployment controls","href":"/guides/policies-governance/deployment-controls"}]},{"group":"Environment quotas \u0026 TTL settings","pages":[{"title":"Set environment limits","href":"/guides/policies-governance/environment-limits"},{"title":"Configure policy TTL","href":"/guides/policies-governance/policy-ttl"}]},{"group":"Cost management","pages":[{"title":"Estimate costs","href":"/guides/policies-governance/cost-estimation"},{"title":"Set budget notifications","href":"/guides/cost-monitoring/budget-notifications"},{"title":"Set cost monitoring","href":"/guides/cost-monitoring/cost-monitoring"},{"group":"Cloud provider cost setup","pages":[{"title":"Configure AWS costs","href":"/guides/cost-monitoring/aws-costs"},{"title":"Configure Azure costs","href":"/guides/cost-monitoring/setup-azure-costs"},{"title":"Configure GCP costs","href":"/guides/cost-monitoring/gcp-costs"}]}]},{"group":"Code Optimizer","pages":[{"title":"Code Optimizer overview","href":"/guides/policies-governance/code-optimizer/overview"},{"title":"Setup \u0026 prerequisites","href":"/guides/policies-governance/code-optimizer/setup"},{"title":"Scanning your code","href":"/guides/policies-governance/code-optimizer/scanning"},{"title":"Generating \u0026 applying fixes","href":"/guides/policies-governance/code-optimizer/fixes"}]}]},{"group":"ACCESS \u0026 IDENTITY","pages":[{"group":"User, role \u0026 team management","pages":[{"title":"Manage users","href":"/guides/admin-guide/user-role-and-team-management/user-management"},{"title":"Manage teams","href":"/guides/admin-guide/user-role-and-team-management/teams"},{"title":"Role-based access control (RBAC)","href":"/guides/admin-guide/user-role-and-team-management/rbac"},{"title":"Default roles","href":"/guides/admin-guide/user-role-and-team-management/default-roles"},{"title":"Custom roles","href":"/guides/admin-guide/user-role-and-team-management/custom-roles"},{"title":"Assigning roles","href":"/guides/admin-guide/user-role-and-team-management/role-assignment"},{"title":"User API keys","sidebarTitle":"Admin API Keys","href":"/guides/admin-guide/user-role-and-team-management/api-keys"}]},{"group":"Organization \u0026 project settings","pages":[{"title":"Manage organizations","href":"/guides/admin-guide/organizations"},{"title":"Manage projects","href":"/guides/admin-guide/projects"},{"title":"Manage sub-projects","href":"/guides/admin-guide/projects/sub-projects"}]},{"group":"SSO \u0026 identity","pages":[{"title":"Self-service SSO integration","href":"/guides/sso-integrations/self-service-sso"},{"title":"Self-service SAML setup","href":"/guides/sso-integrations/self-service-saml"},{"title":"Sync roles \u0026 groups from your IdP","href":"/guides/sso-integrations/importing-roles-or-groups-from-your-identity-provider"},{"group":"SCIM provisioning","pages":[{"title":"SCIM provisioning","href":"/guides/sso-integrations/scim-provisioning"},{"title":"SCIM provisioning with Okta","href":"/guides/sso-integrations/scim-provisioning-okta"},{"title":"SCIM provisioning with Entra ID","href":"/guides/sso-integrations/scim-provisioning-entra-id"}]},{"group":"Identity provider guides","pages":[{"title":"Azure Active Directory integration","href":"/guides/sso-integrations/self-service-azure-ad"},{"title":"AWS Single Sign-On integration","href":"/guides/sso-integrations/aws-single-sign-on"},{"title":"Google Workspace integration","href":"/guides/sso-integrations/google-workspace"},{"title":"JumpCloud integration","href":"/guides/sso-integrations/jumpcloud"},{"title":"Keycloak integration","href":"/guides/sso-integrations/keycloak"},{"title":"Okta integration","href":"/guides/sso-integrations/okta-integration"},{"title":"OneLogin integration","href":"/guides/sso-integrations/onelogin"},{"title":"VMware Workspace ONE integration","href":"/guides/sso-integrations/vmware-workspace-one"}]}]},{"group":"OIDC integrations","pages":[{"title":"General OIDC integrations","href":"/guides/integrations/oidc-integrations"},{"title":"Retrieve OIDC subject identifier","href":"/guides/integrations/oidc-integrations/oidc-retrieving-your-subject-identifier"},{"title":"OIDC for AWS","href":"/guides/integrations/oidc-integrations/oidc-with-aws"},{"title":"OIDC for Azure","href":"/guides/integrations/oidc-integrations/oidc-with-azure"},{"title":"OIDC for GCP","href":"/guides/integrations/oidc-integrations/oidc-with-google-cloud-platform"},{"title":"OIDC for Vault","href":"/guides/integrations/oidc-integrations/oidc-with-vault"}]},{"group":"Auditing \u0026 transparency","pages":[{"title":"Monitoring dashboards","href":"/guides/admin-guide/dashboards"},{"group":"Forwarding logs","pages":[{"title":"Logs forwarding overview","href":"/guides/integrations/logs-forwarding"},{"title":"Amazon CloudWatch","href":"/guides/integrations/logs-forwarding/cloudwatch"},{"title":"Amazon S3 logs","href":"/guides/integrations/logs-forwarding/s3"},{"title":"Coralogix logs","href":"/guides/integrations/logs-forwarding/coralogix"},{"title":"Datadog logs","href":"/guides/integrations/logs-forwarding/datadog"},{"title":"Dynatrace logs","href":"/guides/integrations/logs-forwarding/dynatrace"},{"title":"Google Cloud Logging","href":"/guides/integrations/logs-forwarding/gcp-logging"},{"title":"Grafana Loki logs","href":"/guides/integrations/logs-forwarding/grafana-loki"},{"title":"Logz.io logs","href":"/guides/integrations/logs-forwarding/logzio"},{"title":"New Relic logs","href":"/guides/integrations/logs-forwarding/new-relic"},{"title":"Splunk logs","href":"/guides/integrations/logs-forwarding/splunk"},{"title":"Sumo Logic logs","href":"/guides/integrations/logs-forwarding/sumologic"}]}]}]},{"group":"SECURITY \u0026 COMPLIANCE","pages":[{"title":"Security overview","href":"/guides/overview/security-overview"},{"title":"IP allowlisting","href":"/guides/overview/security-overview/ip-allowlisting"},{"title":"View audit logs","href":"/guides/admin-guide/audit-logs"},{"title":"IP addresses","href":"/guides/overview/security-overview/ip-addresses"}]},{"group":"INTEGRATIONS \u0026 DEVELOPER TOOLS","pages":[{"group":"Notifications","pages":[{"title":"Manage notifications","href":"/guides/integrations/notifications"},{"title":"Microsoft Teams integration","href":"/guides/integrations/notifications/microsoft-teams"},{"title":"Webhook notifications","href":"/guides/integrations/notifications/webhooks"}]},{"group":"Internal developer platforms","pages":[{"title":"Backstage integration","href":"/guides/integrations/internal-developer-platforms/backstage"}]},{"group":"CLI \u0026 API access","pages":[{"title":"env zero CLI Tool","sidebarTitle":"CLI","href":"/guides/community-and-resources/support-and-help/env-zero-cli"},{"title":"env zero CLI command reference","sidebarTitle":"Command reference","href":"/guides/community-and-resources/support-and-help/env-zero-cli/command-reference"},{"title":"Deploy workflows with the env zero CLI","sidebarTitle":"Deploy workflows","href":"/guides/community-and-resources/support-and-help/env-zero-cli/workflows"},{"title":"Troubleshoot the env zero CLI","sidebarTitle":"Troubleshooting","href":"/guides/community-and-resources/support-and-help/env-zero-cli/troubleshooting"},{"title":"env zero API access","sidebarTitle":"API access","href":"/guides/community-and-resources/support-and-help/api-access"},{"title":"Manage env zero with the Terraform provider","sidebarTitle":"Terraform provider","href":"/guides/community-and-resources/support-and-help/terraform-provider"},{"title":"env zero MCP server","sidebarTitle":"MCP server","href":"/guides/community-and-resources/support-and-help/mcp-server"}]}]},{"group":"BILLING \u0026 SUPPORT","pages":[{"title":"Purchase options","href":"/guides/billing/purchase-options"},{"title":"Subscription tiers","href":"/guides/billing/subscription-tiers"},{"title":"Managing your subscription","href":"/guides/billing/managing-your-subscription"},{"title":"Support","href":"/guides/community-and-resources/support-and-help/support"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/users/list-users-vcs-id-mappings"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelogs"}]},{"tab":"Terraform Provider","icon":"external-link","href":"https://registry.terraform.io/providers/env0/env0/latest"},{"tab":"Status Page","icon":"external-link","href":"https://status.env0.com"},{"tab":"Schedule a Demo","icon":"external-link","href":"https://www.envzero.com/demo-request"},{"tab":"Start Free","icon":"external-link","href":"https://app.env0.com/"}]},"basePath":"","title":"Azure DevOps integration - env zero docs","buildId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","deploymentId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","dynamics":[],"chunks":[]}