動態臨時變數為 Azure DevOps Pipeline 變數自定義錦上添花

微軟技術棧發表於2022-05-24

大家好,我是本期的微軟MVP實驗室研究員貟乾。Azure Pipeline 本身已經提供了內建變數。不同於上述方式,今天我將帶來如何在 Azure DevOps Pipeline 執行時建立、使用動態臨時變數,實現變數的動態自定義。接下來讓我們在實驗中一探究竟吧!
9a585767b174fc6a09962cdc2cbc571.png

思路淺析

在我們分享的 Azure Terraform 系列文中有介紹到關於 Terraform 的狀態檔案遠端儲存的問題,我們在 Azure DevOps Pipeline 的 Task Job 加 azure_cli_script 執行內聯指令碼(該指令碼幫我們建立好 Terraform 狀態檔案儲存所需要的 Azure Resource Group、 Azure Storage Account、Azure KeyVault 等資源)。大家需要注意的是,內聯指令碼中有使用動態變數,該變數臨時儲存 Azure Storage Account 的 Account Key,如下圖所示:

本篇文章,我繼續帶領大家分析如何在 Azure DevOps Pipeline 執行中建立使用動態臨時變數,使用動態臨時變數替換 Azure Pipeline 管道變數。

專案整體架構圖

Pipeline 變數定義、輸出

在此階段,我們需要利用 azure_cli_script 任務,建立動態臨時變數,輸出引數,其中最主要的是將動態臨時變數輸出,Task yaml 如下所示
輸出的變數用於同一個 stage,不同 job

- stage: script
  jobs:
   - job: azure_cli_script
     steps: 
      - task: AzureCLI@2
        displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'
        name: 'output_variable'
        inputs:
          azureSubscription: 'Microsoft Azure Subscription(xxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)'
          scriptType: 'bash'
          addSpnToEnvironment: true
          scriptLocation: 'inlineScript'
          inlineScript: |
              # create azure resource group
              az group create --location eastasia --name $(terraform_rg)
​
              # create azure storage account
              az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
​
              # create storage account container for tf state 
              az storage container create --name $(storage_account_container) --account-name $(storage_account)
​
              # query storage key and set variable
              ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
​
              # create azure keyvault
              az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
​
              # set keyvault secret,secret value is ACCOUNT_KEY
              az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault)  --value $ACCOUNT_KEY
​
              # set secret varivale and add to environment
              echo "##vso[task.setvariable variable=ACCOUNT_KEY;isOutput=true]$ACCOUNT_KEY"
              #echo "##vso[task.setvariable variable=ACCOUNT_KEY;issecret=true;isOutput=true]$ACCOUNT_KEY"
​
   - job: same_stage_echo
     dependsOn: azure_cli_script
     variables:
       ACCOUNT_KEY: $[dependencies.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
     steps:
       - task: Bash@3
         displayName: 'Bash :output temporary variables in different jobs on the same stage'
         inputs:
           targetType: 'inline'
           script: |
             # echo ACCOUNT_KEY
             echo "ACCOUNT_KEY is $ACCOUNT_KEY"

輸出變數用於不同 stage

- stage: echo_varibale
  dependsOn: script
  jobs:
    - job: different_stage_echo
      variables:
        ACCOUNT_KEY: $[stageDependencies.script.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
      steps:
        - task: Bash@3
          displayName: 'Bash :output temporary variables in same jobs on the same stage'
          inputs:
            targetType: 'inline'
            script: |
              # echo ACCOUNT_KEY
              echo "ACCOUNT_KEY is $ACCOUNT_KEY"

以下為完整的 azure-pipelines-1.yaml

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
​
trigger:
- remote_stats
​
pool:
  vmImage: ubuntu-latest
​
stages:
- stage: script
  jobs:
   - job: azure_cli_script
     steps: 
      - task: AzureCLI@2
        displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'
        name: 'output_variable'
        inputs:
          azureSubscription: 'Microsoft Azure Subscription(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx)'
          scriptType: 'bash'
          addSpnToEnvironment: true
          scriptLocation: 'inlineScript'
          inlineScript: |
              # create azure resource group
              az group create --location eastasia --name $(terraform_rg)
​
              # create azure storage account
              az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
​
              # create storage account container for tf state 
              az storage container create --name $(storage_account_container) --account-name $(storage_account)
​
              # query storage key and set variable
              ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
​
              # create azure keyvault
              az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
​
              # set keyvault secret,secret value is ACCOUNT_KEY
              az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault)  --value $ACCOUNT_KEY
​
              # set secret varivale and add to environment
              echo "##vso[task.setvariable variable=ACCOUNT_KEY;isOutput=true]$ACCOUNT_KEY"
              #echo "##vso[task.setvariable variable=ACCOUNT_KEY;issecret=true;isOutput=true]$ACCOUNT_KEY"
​
   - job: same_stage_echo
     dependsOn: azure_cli_script
     variables:
       ACCOUNT_KEY: $[dependencies.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
     steps:
       - task: Bash@3
         displayName: 'Bash :output temporary variables in different jobs on the same stage'
         inputs:
           targetType: 'inline'
           script: |
             # echo ACCOUNT_KEY
             echo "ACCOUNT_KEY is $ACCOUNT_KEY"
​
- stage: echo_varibale
  dependsOn: script
  jobs:
    - job: different_stage_echo
      variables:
        ACCOUNT_KEY: $[stageDependencies.script.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
      steps:
        - task: Bash@3
          displayName: 'Bash :output temporary variables in same jobs on the same stage'
          inputs:
            targetType: 'inline'
            script: |
              # echo ACCOUNT_KEY
              echo "ACCOUNT_KEY is $ACCOUNT_KEY"
  • 重點:管道內變數與動態臨時變數使用區別
  • Pipeline 管道內使用方式:$(變數名稱)
  • 動態臨時變數使用方式:$變數名稱

配置 Pipeline 管道變數

使用 Azure CLI 建立 Azure Storage Account、Azure Key Vault 的內聯指令碼中使用管理內變數控制引數
image.png

執行 Pipeline,檢視配置輸出

由於我們已經在 azure-pipelines-1.yaml 檔案中指定了工作分支 “remote_stats”,當我們只要觸發 “remote_stats” 分支的 “push” 或者 “pull_request” 動作都會觸發 Azure DevOps Pipeline 的執行。
相同 stage 內的 job 輸出:

不同 stage 的 job 輸出:

總結

本期實驗,我們學習瞭如何在 Azure DevOps Pipeline 執行期間建立的動態臨時變數以及變數的輸出,使得我們更加靈活的在任意 job 中宣告自定義的動態臨時變數,並將動態臨時變數應用到任意的 job 中,這種方式有區別與Pipeline 管道內變數,尤其是在定義階段和使用語法上,詳細內容參考官方文件。

相關連結:


微軟最有價值專家(MVP)

微軟最有價值專家是微軟公司授予第三方技術專業人士的一個全球獎項。29年來,世界各地的技術社群領導者,因其線上上和線下的技術社群中分享專業知識和經驗而獲得此獎項。

MVP 是經過嚴格挑選的專家團隊,他們代表著技術最精湛且最具智慧的人,是對社群投入極大的熱情並樂於助人的專家。MVP 致力於通過演講、論壇問答、建立網站、撰寫部落格、分享視訊、開源專案、組織會議等方式來幫助他人,並最大程度地幫助微軟技術社群使用者使用 Microsoft 技術。
更多詳情請登入官方網站:https://mvp.microsoft.com/zh-cn


長按識別二維碼

關注微軟中國MSDN

相關文章