Lägga till anpassade prompter i arbetsflödet

Som standard azd up uppmanas du att ange tre saker: miljönamn, prenumeration och plats. Verkliga projekt behöver dock ofta extra indata, till exempel en miljötyp, projektägare eller teamnamn. Den här artikeln beskriver tre metoder för att lägga till anpassade frågor, från enklast till mest flexibel. Du kan blanda och matcha alla tre metoderna i samma mall.

Alternativ 1: Urvalslista med @allowed-dekoratören

Det enklaste sättet att lägga till en anpassad fråga är att använda @allowed decorator på en Bicep-parameter. När azd stöter på en parameter med @allowed värden och inget värde anges visas en interaktiv urvalslista, liknande inbyggda prenumerations- och platsväljare.

Lägg till den dekorerade parametern i infra/main.bicep filen:

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

När du kör azd upazd visar automatiskt en plocklista för den här parametern. Användaren kan navigera med hjälp av piltangenterna och skriva för att filtrera, precis som prenumerationsväljaren.

Ingen extra konfiguration krävs. Lägg till parametern i Bicep-filen och azd hanterar resten.

Tips/Råd

Använd dekoratören @metadata med azd.default för att markera ett standardval:

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

Fler alternativ för dekoratörer finns i Arbeta med Azure Developer CLI metadata för Bicep-insparametrar.

Alternativ 2: Fritextinmatning

Om du behöver öppna indata i stället för en fast lista deklarerar du en parameter utan standardvärde. När azd påträffar en obligatorisk parameter som inte har något standardvärde och inget värde i main.parameters.jsonuppmanas användaren att ange fritextinmatning.

Lägg till parametern i infra/main.bicep filen:

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

När du kör azd upskriver användaren ett värde och trycker på Retur.

Alternativ 3: Krokar för anpassad logik

Bicep-dekoratörer täcker de flesta scenarier, men ibland behöver du mer flexibilitet, till exempel dynamiska listor från ett API, villkorade uppmaningar, validering eller en anpassad menybaserad UI. I dessa fall använder du en preprovision krok för att köra ett anpassat skript före azd provision.

Förstå flödet

Krokmetoden fungerar genom den följande kedjan:

  1. Ett hook-skript körs och uppmanar användaren med anpassade menyer, validering eller annan logik.
  2. Skriptet lagrar värden med .azd env set VARIABLE_NAME value
  3. Värdena bevaras i .azure/<env>/.env.
  4. main.parameters.json refererar till värdena som ${VARIABLE_NAME}.
  5. Bicep tar emot dem som vanliga parametrar under försörjningen.

Skapa hook-skriptet

Skapa ett hook-skript som frågar användaren och lagrar resultatet. I följande exempel ingår en idempotensskyddsmekanism som hoppar över användaruppmaningen vid omkörningar om ett värde redan har angetts, och ett default fall som hanterar ogiltiga indata.

Skapa en hooks/preprovision.ps1 fil:

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"

Mappa variabeln till en Bicep parameter

main.parameters.json I filen refererar du till miljövariabeln:

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

main.bicep I filen deklarerar du parametern med ett standardvärde så azd frågar inte heller efter den:

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

Aktivera kroken

Lägg till hook-konfigurationen i azure.yaml:

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

Inställningen interactive: true binder skriptet till konsolen så att det kan läsa indata från användaren. Mer information om hookkonfiguration finns i Anpassa dina cli-arbetsflöden för Azure utvecklare med hjälp av kommando- och händelsekrokar.

Välj rätt metod

Scenario Tillvägagångssätt
Välj från en fast lista med värden. @allowed dekoratör (alternativ 1)
Samla in fritextindata. Parameter utan standard (alternativ 2)
Dynamiska listor, API-anrop eller villkorsstyrd logik. Hook-skript (alternativ 3)
Hoppa över alla uppmaningar i CI/CD. Förinställda värden (se följande avsnitt)

Hoppa över uppmaningar i CI/CD

Alla tre alternativen stöder icke-interaktivt läge. Förinställda värden innan du kör azd och skickar --no-prompt:

# 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

Om ett obligatoriskt värde saknas azd rapporterar exakt vilken parameter som saknas och visar kommandot azd env config set som behövs för att åtgärda det.