Auto-enable no-prompt mode in CI environments#9125
Conversation
azd now auto-enables no-prompt mode when it detects a CI/CD environment (in addition to the existing AI-agent detection). This fixes a bug where running in CI without --no-prompt could resolve interactive confirmations incorrectly against an EOF stdin: a confirmation with a `true` default would silently return `false` and abort the operation. - cmd/auto_install.go: extend NoPrompt auto-detection to resource.IsRunningOnCI(). - pkg/input/asker.go: non-terminal Confirm now returns PromptRequiredError on EOF-with-no-answer instead of silently defaulting; MultiSelect falls back to its default selection when stdin is exhausted. - test/azdcli/cli.go: set AZD_NON_INTERACTIVE=false for stdin-driven functional tests so CI auto-detection doesn't stop azd from reading piped answers. - docs + reserved_flags: document AZD_NON_INTERACTIVE opt-out and updated help. - CHANGELOG bug-fix entry; regenerated usage snapshots. Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
There was a problem hiding this comment.
Pull request overview
Auto-enables no-prompt mode in detected CI environments and improves EOF handling for non-terminal prompts.
Changes:
- Adds CI detection and environment/flag precedence tests.
- Makes confirmation EOF failures explicit and adds MultiSelect fallback behavior.
- Updates documentation, test harness behavior, changelog, and generated help snapshots.
Reviewed changes
Copilot reviewed 113 out of 113 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
cli/azd/CHANGELOG.md |
Records the CI no-prompt fix. |
cli/azd/cmd/auto_install.go |
Enables no-prompt mode in CI. |
cli/azd/cmd/auto_install_integration_test.go |
Clears ambient CI variables in tests. |
cli/azd/cmd/auto_install_test.go |
Tests CI detection and overrides. |
cli/azd/docs/environment-variables.md |
Documents AZD_NON_INTERACTIVE. |
cli/azd/internal/reserved_flags.go |
Updates reserved flag help. |
cli/azd/pkg/input/asker.go |
Changes EOF prompt handling. |
cli/azd/pkg/input/asker_test.go |
Tests confirmation EOF behavior. |
cli/azd/test/azdcli/cli.go |
Preserves interactive functional tests. |
cli/azd/cmd/testdata/TestFigSpec.ts |
Updates generated completion help. |
cli/azd/cmd/testdata/TestUsage-azd.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-add.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-agent.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-connection.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-finetuning.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-inspector.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-models.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-project.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-routine.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-skill.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-ai-toolbox.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-appservice.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-auth.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-auth-login.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-auth-logout.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-auth-status.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-coding-agent.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-completion.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-completion-bash.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-completion-fig.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-completion-fish.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-completion-powershell.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-completion-zsh.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-concurx.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-get.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-list-alpha.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-options.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-reset.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-set.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-show.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-sub-filter.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-sub-filter-remove.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-sub-filter-set.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-config-unset.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-copilot.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-copilot-consent.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-copilot-consent-grant.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-copilot-consent-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-copilot-consent-revoke.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-demo.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-deploy.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-down.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-config.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-config-get.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-config-set.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-config-unset.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-get-value.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-get-values.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-new.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-refresh.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-remove.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-select.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-set.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-env-set-secret.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-exec.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-install.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-show.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-source.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-source-add.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-source-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-source-remove.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-source-validate.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-uninstall.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-extension-upgrade.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-hooks.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-hooks-run.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-infra.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-infra-generate.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-init.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-mcp.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-mcp-start.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-monitor.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-package.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-pipeline.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-pipeline-config.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-provision.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-publish.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-restore.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-show.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template-show.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template-source.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template-source-add.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template-source-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-template-source-remove.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool-check.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool-install.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool-list.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool-show.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool-uninstall.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-tool-upgrade.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-up.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-update.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-version.snap |
Updates usage snapshot. |
cli/azd/cmd/testdata/TestUsage-azd-x.snap |
Updates usage snapshot. |
- Narrow the AZD_NON_INTERACTIVE=false documented contract: it opts out of the automatic no-prompt enablement rather than "forcing interactive behavior" end to end, since some commands avoid prompting in CI by design. - MultiSelect now propagates PromptRequiredError on mid-selection EOF instead of discarding already-answered items; add regression test. - Regenerated usage snapshots for the updated --no-prompt help text. Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
…ation 2) The non-terminal Confirm reader keyed the (Y/n) indicator and the blank-line result off the incoming *pResponse, which AskerConsole.Confirm passes as a zero-initialized bool. This ignored DefaultValue: true. Base both on v.Default instead, and set Default on the synthetic MultiSelect confirmations so their per-item defaults are preserved. Add regression test. Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
- test/azdcli/cli.go: reword the AZD_NON_INTERACTIVE=false comment so it does not imply end-to-end interactive behavior the harness cannot provide. - internal/global_command_options.go: add automatic CI/CD detection to the NoPrompt "Can be enabled via" list. Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
…ation 5) The type is now also returned when a non-terminal prompt reaches EOF or exhausts piped stdin, not only in --no-prompt mode. Update the type and PromptMessage field docs accordingly. Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
…ration 6) The non-terminal EOF path reused the no-prompt "interactive prompts disabled" wording, which is misleading when interactive mode was active but stdin was underfed. Add a StdinExhausted variant with its own headline, user-facing guidance, and JSON type (stdinExhausted), keeping no-prompt failures unchanged. Add ToString/MarshalJSON output tests for both cases. Co-authored-by: Copilot <[email protected]> Copilot-Session: cb137813-06e2-447c-ad1d-17f998bdc752
Azure Dev CLI Install InstructionsInstall scriptsMacOS/Linux
bash: pwsh: WindowsPowerShell install MSI install Standalone Binary
MSI
Documentationlearn.microsoft.com documentationtitle: Azure Developer CLI reference
|
Summary
Fixes an inconsistency in how azd handles interactive prompts in non-interactive environments (tracked internally in
Azure/azure-dev-pr#1796): when azd runs in CI without--no-prompt, interactive confirmations were resolved against an EOF stdin and could silently return the wrong value. Concretely, aConfirmwithDefaultValue: truewould returnfalseand abort the operation instead of honoring its default.This PR collapses azd into two well-defined modes in non-interactive environments:
resource.IsRunningOnCI()), mirroring the existing AI-agent auto-detection. In this mode, prompts honor their defaults (or fail fast with an actionable error when a required value has no default).Confirmreader returns aPromptRequiredErroron EOF-with-no-answer instead of silently defaulting. This path is only reachable when interactive mode is explicitly forced (AZD_NON_INTERACTIVE=false) or piped input is underfed.Explicit
--no-prompt/--non-interactiveflags and theAZD_NON_INTERACTIVEenv var continue to take precedence. SetAZD_NON_INTERACTIVE=falseto opt out of the automatic no-prompt enablement (the global no-prompt setting stays off). Note that some commands still avoid interactive prompts in CI/CD by design, independent of this variable.Changes
cmd/auto_install.go— extend NoPrompt auto-detection toresource.IsRunningOnCI(); update--no-prompthelp text.pkg/input/asker.go— non-terminalConfirmreturnsPromptRequiredErroron EOF;MultiSelectpropagates the same error on mid-selection EOF instead of discarding already-answered items.internal/reserved_flags.go— document auto-enable +AZD_NON_INTERACTIVE=falseopt-out.test/azdcli/cli.go— setAZD_NON_INTERACTIVE=falsefor stdin-driven functional tests (the suite itself runs in CI) so azd keeps reading piped answers, mirroring the existingAZD_DISABLE_AGENT_DETECT=1precedent.docs/environment-variables.md— documentAZD_NON_INTERACTIVE.CHANGELOG.md— bug-fix entry.Testing
TestParseGlobalFlags_CIDetection(CI vars enable no-prompt; flags/env override).Test_NewAsker_NonTerminal_Confirm_EOFReturnsPromptRequired.Test_NewAsker_NonTerminal_MultiSelect_EOFReturnsPromptRequired(partial-input + EOF).clearAgentEnvVarsForTestto clear CI vars so existing flag tests remain deterministic when the suite runs in CI.go build ./...,go vet,golangci-lint(0 issues),gofmt, cspell all clean;pkg/inputandcmdflag/usage suites pass.Notes
os.Environ()are covered by the newAZD_NON_INTERACTIVE=falseharness opt-out; session-based tests already exclude CI vars.go.mod/go.sumchanges.