Share via


使用命令和事件攔截自定義 Azure 開發人員 CLI 工作流程

Azure 開發人員 CLI 支援各種擴充點來自定義您的工作流程和部署。 攔截中間件可讓您在命令和服務生命週期事件前後 azd 執行自定義腳本。 攔截會遵循命名慣例,在相符azd的命令或服務事件名稱上使用前置詞和後置前置詞。

例如,您可能想要在下列案例中執行自定義腳本:

  • 使用預先儲存區勾點來自定義相依性管理。
  • 使用預先部署勾點來確認外部相依性或自定義組態已就緒,再部署您的應用程式。
  • 使用工作流程或管線結尾的後置攔截來執行自定義清除或記錄。

可用的勾點

下列 azd 命令勾點可供使用:

  • prerestorepostrestore:還原套件相依性之前和之後執行。
  • preprovisionpostprovision:在建立 Azure 資源之前和之後執行。
  • predeploypostdeploy:在應用程式程式代碼部署至 Azure 之前和之後執行。
  • preuppostup:在合併的部署管線前後執行。 Up是執行、 provisiondeploy 循序的速記命令restore
  • predownpostdown:在移除資源之前和之後執行。

以下是可用的服務生命週期事件攔截:

  • prerestorepostrestore:還原服務套件和相依性之前和之後執行。
  • prepackagepostpackage:在封裝應用程式以進行部署之前和之後執行。
  • predeploypostdeploy:在服務程式代碼部署至 Azure 之前和之後執行。

攔截組態

您可以在根目錄或特定服務組態的檔案中註冊 azure.yaml 勾點。 所有類型的勾點都支援下列組態選項:

  • shellsh | pwsh (如果未指定,則自動從執行推斷)。
    • 注意:需要 PowerShell 7。pwsh
  • run:定義內嵌腳本或檔案的路徑。
  • continueOnError:當 set 會在命令攔截期間發生腳本錯誤之後繼續執行時 (預設值 false)。
  • interactive:設定時會將執行中的文稿系結至主控台 stdinstdoutstderr (預設值 false) 。
  • windows:指定巢狀組態只會套用在 Windows OS 上。 如果排除此組態選項,則勾點會在所有平台上執行。
  • posix:指定巢狀組態僅適用於POSIX型OS(Linux和 MaxOS)。 如果排除此組態選項,則勾點會在所有平台上執行。

勾點範例

下列範例示範不同類型的攔截註冊和組態。

根命令註冊

勾點可以設定為針對檔案azure.yaml根目錄的特定azd命令執行。

項目目錄 (檔案 azure.yaml 所在的位置) 是命令攔截的預設目前工作目錄 (cwd)。

name: todo-nodejs-mongo
metadata:
  template: todo-nodejs-mongo@0.0.1-beta
hooks:
  prerestore: # Example of an inline script. (shell is required for inline scripts)
    shell: sh
    run: echo 'Hello'
  preprovision: # Example of external script (Relative path from project root)
    run: ./hooks/preprovision.sh
services:
  web:
    project: ./src/web
    dist: build
    language: js
    host: appservice
  api:
    project: ./src/api
    language: js
    host: appservice

服務註冊

攔截也可以設定為只針對檔案 .yaml 中定義的特定服務執行。

服務目錄(與檔案中服務組態azure.yaml的 屬性中所project定義的相同路徑)是服務攔截的預設值cwd

name: todo-nodejs-mongo
metadata:
  template: todo-nodejs-mongo@0.0.1-beta
services:
  web:
    project: ./src/web
    dist: build
    language: js
    host: appservice
  api:
    project: ./src/api
    language: js
    host: appservice
    hooks:
      prerestore: # Example of an inline script. (shell is required for inline scripts)
        shell: sh
        run: echo 'Restoring API service...'
      prepackage: # Example of external script (Relative path from service path)
        run: ./hooks/prepackage.sh

OS 特定勾點

或者,您也可以將勾點設定為在 Windows 或 Posix (Linux 和 MaxOS) 上執行。 根據預設,如果 Windows 或 Posix 設定已排除,則勾點會在所有平台上執行。

name: todo-nodejs-mongo
metadata:
  template: todo-nodejs-mongo@0.0.1-beta
hooks:
  prerestore: 
    posix: # Only runs on Posix environments
      shell: sh
      run: echo 'Hello'
   windows: # Only runs on Windows environments
     shell: pwsh
     run: Write-Host "Hello"
services:
  web:
    project: ./src/web
    dist: build
    language: js
    host: appservice
  api:
    project: ./src/api
    language: js
    host: appservice

搭配勾點使用環境變數

勾點可以使用 和 azd set <key> <value> 命令,.env在檔案azd env get-values中取得和設定環境變數。 勾點也可以使用 語法,從本機環境 ${YOUR_ENVIRONMENT VARIABLE} 擷取環境變數。 azd 當指令執行時,會自動設定檔案中的 .env 特定環境變數,例如 AZURE_ENV_NAMEAZURE_LOCATION。 檔案中的 main.bicep 輸出參數也會在 檔案中 .env 設定。 [ 管理環境變數 ] 頁面包含環境變數工作流程的詳細資訊。

勾點可以內嵌或透過參考的腳本取得及設定環境變數,如下列範例所示:

name: azure-search-openai-demo
metadata:
  template: azure-search-openai-demo@0.0.2-beta
services:
  backend:
    project: ./app/backend
    language: py
    host: appservice
hooks:
  postprovision:
    windows: # Run referenced script that uses environment variables (script shown below)
      shell: pwsh
      run: ./scripts/prepdocs.ps1
      interactive: true
      continueOnError: false
    posix:
      shell: sh
      run: ./scripts/prepdocs.sh
      interactive: true
      continueOnError: false
  postdeploy: # Pull environment variable inline from local device and set in .env file
      shell: sh
      run: azd env set REACT_APP_WEB_BASE_URL ${SERVICE_WEB_ENDPOINT_URL}

參考的:文稿: prepdocs.sh

echo "Loading azd .env file from current environment"

# Use the `get-values` azd command to retrieve environment variables from the `.env` file
while IFS='=' read -r key value; do
    value=$(echo "$value" | sed 's/^"//' | sed 's/"$//')
    export "$key=$value"
done <<EOF
$(azd env get-values) 
EOF

echo 'Creating python virtual environment "scripts/.venv"'
python3 -m venv scripts/.venv

echo 'Installing dependencies from "requirements.txt" into virtual environment'
./scripts/.venv/bin/python -m pip install -r scripts/requirements.txt

echo 'Running "prepdocs.py"'
./scripts/.venv/bin/python ./scripts/prepdocs.py './data/*' 
    --storageaccount "$AZURE_STORAGE_ACCOUNT"
    --container "$AZURE_STORAGE_CONTAINER"
    --searchservice "$AZURE_SEARCH_SERVICE"
    --openaiservice "$AZURE_OPENAI_SERVICE"
    --openaideployment "$AZURE_OPENAI_EMB_DEPLOYMENT"
    --index "$AZURE_SEARCH_INDEX"
    --formrecognizerservice "$AZURE_FORMRECOGNIZER_SERVICE"
    --tenantid "$AZURE_TENANT_ID" -v

要求說明

如需如何提出 Bug、要求協助或為 Azure 開發人員 CLI 提出新功能的資訊,請流覽 疑難解答和支援 頁面。