Hinzufügen von benutzerdefinierten Eingabeaufforderungen zu Ihrem Workflow

Standardmäßig fordert azd up Informationen zu drei Dingen an: Umgebungsname, Abonnement und Standort. Echte Projekte benötigen jedoch häufig zusätzliche Eingaben, z. B. einen Umgebungstyp, einen Projektbesitzer oder einen Teamnamen. In diesem Artikel werden drei Ansätze zum Hinzufügen von benutzerdefinierten Eingabeaufforderungen beschrieben, von der einfachsten bis zur flexibelsten. Sie können alle drei Ansätze in derselben Vorlage kombinieren und abgleichen.

Option 1: Auswahlliste mit dem @allowed Dekorateur

Die einfachste Möglichkeit zum Hinzufügen einer benutzerdefinierten Eingabeaufforderung besteht darin, den @allowed Dekorateur für einen Bicep Parameter zu verwenden. Wenn azd einen Parameter mit @allowed Werten erkennt und kein Wert angegeben wird, zeigt er eine interaktive Auswahlliste an, ähnlich der integrierten Abonnement- und Standortauswahl.

Fügen Sie den dekorierten Parameter der infra/main.bicep Datei hinzu.

@description('The environment type')
@allowed([
  'dev'
  'staging'
  'prod'
])
param environmentType string

Wenn Sie azd up ausführen, zeigt azd automatisch eine Auswahlliste für diesen Parameter an. Der Benutzer kann mithilfe von Pfeiltasten navigieren und durch Eingabe filtern, genau wie bei der Abonnementauswahl.

Es ist keine zusätzliche Konfiguration erforderlich. Fügen Sie den Parameter zur Bicep Datei hinzu, und azd behandelt den Rest.

Tipp

Verwenden Sie den @metadata Dekorator mit azd.default, um eine Standardauswahl hervorzuheben.

@allowed(['dev', 'staging', 'prod'])
@metadata({
  azd: {
    default: 'dev'
  }
})
param environmentType string

Weitere Dekorieroptionen finden Sie unter Work with Azure Developer CLI metadata for Bicep input parameters.

Option 2: Freitexteingabe

Wenn Sie eine offene Eingabe anstelle einer festen Liste benötigen, deklarieren Sie einen Parameter ohne Standardwert. Wenn azd auf einen erforderlichen Parameter ohne Standardwert und ohne Wert in main.parameters.json stößt, fordert er den Benutzer zur Freitexteingabe auf.

Fügen Sie der Datei den Parameter hinzu infra/main.bicep :

@description('Who owns this project')
param projectOwner string

Wenn Sie azd up ausführen, gibt der Benutzer einen Wert ein und drückt die Eingabetaste.

Option 3: Hooks für benutzerdefinierte Logik

Bicep Dekoratoren decken die meisten Szenarien ab, aber manchmal benötigen Sie mehr Flexibilität, wie z. B. dynamische Listen aus einer API, bedingte Eingabeaufforderungen, Validierungen oder eine benutzerdefinierte Menü-UI. Verwenden Sie in diesen Fällen einen preprovision Hook zum Ausführen eines benutzerdefinierten Skripts vor azd provision.

Verstehen des Flusses

Der Hook-Ansatz funktioniert über die folgende Kette:

  1. Ein Hook-Skript wird ausgeführt und fordert den Benutzer mit benutzerdefinierten Menüs, Überprüfungen oder einer anderen Logik auf.
  2. Das Skript speichert Werte mithilfe von azd env set VARIABLE_NAME value.
  3. Werte bleiben erhalten in .azure/<env>/.env.
  4. main.parameters.json verweist auf die Werte als ${VARIABLE_NAME}.
  5. Bicep diese während der Bereitstellung als normale Parameter empfängt.

Erstellen des Hook-Skripts

Erstellen Sie ein Hook-Skript, das den Benutzer auffordert, und speichert das Ergebnis. Die folgenden Beispiele umfassen einen Idempotenzschutz, der die Eingabeaufforderung bei erneuter Ausführung überspringt, wenn bereits ein Wert festgelegt ist, und einen default Fall, der ungültige Eingaben behandelt.

Erstellen einer hooks/preprovision.ps1 Datei:

Write-Host "========================================"
Write-Host "  Custom Pre-Provision Configuration"
Write-Host "========================================"

# Skip prompt if value is already set
$existingTeam = $null
$output = azd env get-value CUSTOM_TEAM_NAME 2>&1
if ($LASTEXITCODE -eq 0 -and $output) {
    $existingTeam = $output.Trim()
}

if ($existingTeam) {
    Write-Host "Team name is already set to: $existingTeam"
    exit 0
}

Write-Host "Available teams:"
Write-Host "  1) platform-engineering"
Write-Host "  2) app-development"
Write-Host "  3) data-science"
Write-Host "  4) devops"
Write-Host "  5) Enter custom value"

$choice = Read-Host "Select a team (1-5)"
$teamName = switch ($choice) {
    "1" { "platform-engineering" }
    "2" { "app-development" }
    "3" { "data-science" }
    "4" { "devops" }
    "5" { Read-Host "Enter custom team name" }
    default {
        Write-Error "Invalid selection: $choice"
        exit 1
    }
}

# Store in azd environment
azd env set CUSTOM_TEAM_NAME $teamName
Write-Host "Team name set to: $teamName"

Zuordnen der Variablen zu einem Bicep-Parameter

Verweisen Sie in der main.parameters.json Datei auf die Umgebungsvariable:

{
  "parameters": {
    "customTeamName": {
      "value": "${CUSTOM_TEAM_NAME}"
    }
  }
}

Deklarieren Sie den Parameter in Ihrer main.bicep Datei mit einem Standardwert, sodass azd er nicht auch dazu aufgefordert wird:

@description('Team name - set by preprovision hook')
param customTeamName string = ''

Aktivieren des Hooks

Fügen Sie die Hook-Konfiguration zu Ihrem azure.yaml hinzu.

hooks:
  preprovision:
    windows:
      shell: pwsh
      run: hooks/preprovision.ps1
      interactive: true
    posix:
      shell: sh
      run: hooks/preprovision.sh
      interactive: true

Die interactive: true Einstellung bindet das Skript an die Konsole, sodass benutzereingaben gelesen werden können. Weitere Informationen zur Hookkonfiguration finden Sie unter Customize your Azure Developer CLI workflows using command and event hooks.

Wählen Sie den richtigen Ansatz

Szenario Vorgehensweise
Wählen Sie aus einer festen Liste von Werten aus. @allowed Dekorateur (Option 1)
Sammeln sie Freitexteingaben. Parameter ohne Standardwert (Option 2)
Dynamische Listen, API-Aufrufe oder bedingte Logik. Hook-Skript (Option 3)
Überspringen Sie alle Eingabeaufforderungen in CI/CD. Vordefinierte Werte (siehe folgenden Abschnitt)

Überspringen von Eingabeaufforderungen in CI/CD

Alle drei Optionen unterstützen nicht interaktiven Modus. Vor dem Ausführen von azd und dem Übergeben von --no-prompt Werte festlegen:

# Set hook values
azd env set CUSTOM_TEAM_NAME "platform-engineering"

# Set Bicep parameter values
azd env config set infra.parameters.environmentType "prod"
azd env config set infra.parameters.projectOwner "ci-bot"

# Run with no prompts
azd up --subscription <subscription-id> --location eastus --no-prompt

Wenn ein erforderlicher Wert fehlt, meldet azd genau, welcher Parameter fehlt, und zeigt den azd env config set Befehl an, der zur Behebung des Problems erforderlich ist.