共用方式為


使用 Azure Pipelines 持續傳遞

使用 Azure Pipelines 自動將程式碼專案部署至 Azure 中的函式應用程式。 Azure Pipelines 可讓您使用 Azure DevOps 建置、測試及部署持續整合 (CI) 與持續傳遞 (CD)。

YAML 管線是使用存放庫中的 YAML 檔案來定義。 步驟是管線最小的組建區塊,可以是指令碼或工作 (預先封裝的指令碼)。 了解構成管線的重要概念和元件

您可以使用 AzureFunctionApp 工作來部署程式碼。 現在有兩個版本 AzureFunctionApp的 ,在此表中進行比較:

比較/版本 AzureFunctionApp@2 AzureFunctionApp@1
支援 彈性消費計劃
包括增強的驗證支援*
何時使用... 建議用於新的應用程式部署 針對舊版部署進行維護

* 增強的驗證支援可讓管線不太可能因為錯誤而失敗。

選擇文章頂端的工作版本。

附註

AzureFunctionApp@1 升級到 AzureFunctionApp@2 以啟用新功能和獲得長期支援。

先決條件

請記得,在您將本機程式碼專案發佈至函數應用程式之後,將本機程式碼專案上傳至 GitHub 或 Azure Repos 存放庫。

建置您的應用程式

  1. 登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
  2. 在您的專案中,瀏覽至 [管線] 頁面。 然後,選擇用來建立新管線的動作。
  3. 先選取 GitHub 作為原始程式碼的位置,以逐步完成精靈的步驟。
  4. 系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入您的 GitHub 認證。
  5. 出現存放庫清單時,請選取您的範例應用程式存放庫。
  6. Azure Pipelines 會分析您的存放庫,並建議範本。 選取 [儲存並執行],並選取 [直接認可至主要分支],然後再次選擇 [儲存並執行]
  7. 新的執行隨即啟動。 等待執行完成。

範例 YAML 組建管線

下列特定語言管線可用於建置應用程式。

您可以使用下列範例來建立 YAML 檔案以建置 .NET 應用程式:

pool:
  vmImage: 'windows-latest'
steps:
  - task: UseDotNet@2
    displayName: 'Install .NET 8.0 SDK'
    inputs:
      packageType: 'sdk'
      version: '8.0.x'
      installationPath: $(Agent.ToolsDirectory)/dotnet
  - script: |
      dotnet restore
      dotnet build --configuration Release
  - task: DotNetCoreCLI@2
    displayName: 'dotnet publish'
    inputs:
      command: publish
      arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
      projects: 'csharp/*.csproj'
      publishWebProjects: false
      modifyOutputPath: false
      zipAfterPublish: false
  - task: ArchiveFiles@2
    displayName: "Archive files"
    inputs:
      rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
      includeRootFolder: false
      archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
      artifactName: 'drop'
  1. 登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
  2. 在您的專案中,瀏覽至 [管線] 頁面。 然後選取 [新增管線]
  3. 選取下列其中一個選項,您的程式碼在哪裡?
    • GitHub:系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入您的 GitHub 認證。 當此連線是您的第一個 GitHub 連線時,精靈也會逐步引導您完成將 DevOps 連線至 GitHub 帳戶的流程。
    • Azure Repos Git:您立即能夠在目前的 DevOps 專案中選擇存放庫。
  4. 出現存放庫清單時,請選取您的範例應用程式存放庫。
  5. Azure Pipelines 會分析您的存放庫,並在 [設定管線] 中提供潛在範本清單。 為您的語言選擇適當的函數應用程式範本。 如果您沒有看到正確的範本,請選取 [顯示更多]
  6. 選取 [儲存並執行],並選取 [直接認可至主要分支],然後再次選擇 [儲存並執行]
  7. 新的執行隨即啟動。 等待執行完成。

範例 YAML 組建管線

下列特定語言管線可用於建置應用程式。

您可以使用下列範例,建立 YAML 檔案以建置 .NET 應用程式。

如果您在建置應用程式時看到錯誤,請確認使用的 .NET 版本與 Azure Functions 版本相符。 如需詳細資訊,請參閱 Azure Functions 執行階段版本概觀

pool:
  vmImage: 'windows-latest'
steps:
  - task: UseDotNet@2
    displayName: 'Install .NET 8.0 SDK'
    inputs:
      packageType: 'sdk'
      version: '8.0.x'
      installationPath: $(Agent.ToolsDirectory)/dotnet
  - script: |
      dotnet restore
      dotnet build --configuration Release
  - task: DotNetCoreCLI@2
    displayName: 'dotnet publish'
    inputs:
      command: publish
      arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
      projects: 'csharp/*.csproj'
      publishWebProjects: false
      modifyOutputPath: false
      zipAfterPublish: false
  - task: ArchiveFiles@2
    displayName: "Archive files"
    inputs:
      rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
      includeRootFolder: false
      archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
      artifactName: 'drop'

部署您的應用程式

您將使用 Azure 函數應用程式部署第 2 版工作進行部署。 此工作需要 Azure 服務連線作為輸入。 Azure 服務連線會儲存認證,以便從 Azure Pipelines 連線到 Azure。 您應該建立使用工作負載識別身分同盟的連線。

若要部署至 Azure Functions,請在檔案結 azure-pipelines.yml 尾新增此程式碼片段,視您的應用程式是在 Linux 還是 Windows 上執行:

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'windows-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Name of your Azure subscription>
    appType: functionApp # this specifies a Windows-based function app
    appName: $(appName)
    package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
    deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
    #Uncomment the next lines to deploy to a deployment slot
    #Note that deployment slots is not supported for Linux Dynamic SKU
    #deployToSlotOrASE: true
    #resourceGroupName: '<RESOURCE_GROUP>'
    #slotName: '<SLOT_NAME>'

預設 appType 值為 Windows (functionApp)。 您可以將 appType 設定為 functionAppLinux 以指定 Linux。 Flex Consumption 應用程式在 Linux 上執行,並且您必須同時設定 appType: functionAppLinuxisFlexConsumption: true

程式碼片段會假設 YAML 檔案中的組建步驟在代理程式的 $(System.ArtifactsDirectory) 資料夾中產生 zip 封存檔。

您可以使用 Azure 函式應用程式部署 工作進行部署。 此工作需要 Azure 服務連線作為輸入。 Azure 服務連線會儲存認證,以便從 Azure Pipelines 連線到 Azure。

這很重要

不支援使用 @v1 工作的 AzureFunctionApp 來部署到彈性使用量應用程式。

若要部署至 Azure Functions,請在檔案結 azure-pipelines.yml 尾新增此程式碼片段:

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: DownloadBuildArtifacts@1 # Add this at the end of your file
  inputs:
    buildType: 'current'
    downloadType: 'single'
    artifactName: 'drop'
    itemPattern: '**/*.zip'
    downloadPath: '$(System.ArtifactsDirectory)'
- task: AzureFunctionApp@1
  inputs:
    azureSubscription: $(azureSubscription)
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip

此程式碼片段將 設定 appTypefunctionAppLinux,部署至在 Linux 上執行的應用程式時,這是必要的。 預設 appType 值為 Windows (functionApp)。

此範例假設 YAML 檔案中的建置步驟會在代理程式的資料夾中 $(System.ArtifactsDirectory) 產生 zip 封存。

部署容器

小提示

建議您使用 Azure 容器應用程式中的 Azure Functions 支援,在自訂 Linux 容器中裝載函式應用程式。 如需詳細資訊,請參閱 Azure 容器應用程式上的 Azure Functions 概觀

部署容器化函式應用程式時,您使用的部署工作取決於特定的裝載環境。

您可以使用 Azure Container Apps 部署 工作 (AzureContainerApps) ,將函式應用程式映像部署至針對 Azure Functions 最佳化的 Azure Container App 執行個體。

此程式碼會部署 .NET 8 隔離程序模型函式應用的基礎映像檔:

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzureContainerApps@1
  inputs:
    azureSubscription: <Name of your Azure subscription>
    imageToDeploy: 'mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0'
    containerAppName: <Name of your container app>
    resourceGroup: <Name of the resource group>

理想情況下,您會在管線中建置自己的自訂容器,而不是使用基底映像,如本範例所示。 如需詳細資訊,請參閱 從 Azure Pipelines 部署至 Azure 容器應用程式

部署到位置

這很重要

彈性使用量方案目前不支援槽位。 Linux 應用程式在取用方案中執行時也不支援插槽,而且 未來將淘汰對這些應用程式的支援

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'windows-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Name of your Azure subscription>
    appType: functionApp # this specifies a Windows-based function app
    appName: $(appName)
    package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
    deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
    deployToSlotOrASE: true
    resourceGroupName: '<RESOURCE_GROUP>'
    slotName: '<SLOT_NAME>'

您可以將函數應用程式設定為有多個位置。 位置可讓您安全地部署應用程式並加以測試,然後再提供給您的客戶使用。

下列 YAML 程式碼片段示範如何部署至預備位置,然後交換成生產位置:

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deployToSlotOrASE: true
    resourceGroupName: <Name of the resource group>
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <Azure service connection>
    WebAppName: <name of the function app>
    ResourceGroupName: <name of resource group>
    SourceSlot: staging
    SwapWithProduction: true

使用 部署位置時,您也可以新增下列工作,以在部署過程中執行位置交換。

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <AZURE_SERVICE_CONNECTION>
    WebAppName: <APP_NAME>
    ResourceGroupName: <RESOURCE_GROUP>
    SourceSlot: <SLOT_NAME>
    SwapWithProduction: true

使用 Azure CLI 建立管線

若要在 Azure 中建立組建管線,請使用 az functionapp devops-pipeline create命令。 系統會建立組建管線,以建置和釋放存放庫中所做的任何程式碼變更。 此命令會產生新的 YAML 檔案,該檔案會定義組建和發行管線,然後將管線提交給您的存放庫。 此命令的必要條件取決於您的程式碼位置。

  • 如果您的程式碼位於 GitHub:

    • 您必須擁有訂用帳戶的寫入權限。

    • 您必須是 Azure DevOps 中的專案系統管理員。

    • 您必須具備建立 GitHub 個人存取權杖 (PAT) 的足夠權限。 如需詳細資訊,請參閱 GitHub PAT 權限需求

    • 您必須擁有權限,才能在 GitHub 存放庫中認可主要分支,以便認可自動產生的 YAML 檔案。

  • 如果您的程式碼位於 Azure Repos:

    • 您必須擁有訂用帳戶的寫入權限。

    • 您必須是 Azure DevOps 中的專案系統管理員。

後續步驟