使用 Azure Pipelines 持續傳遞

使用 Azure Pipelines 自動部署至 Azure Functions。 Azure Pipelines 可讓您使用 Azure DevOps 建置、測試及部署持續整合 (CI) 與持續傳遞 (CD)。

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

您將使用 AzureFunctionApp 工作,來部署至 Azure Functions。 現在有兩個版本的 AzureFunctionApp 工作 (AzureFunctionApp@1AzureFunctionApp@2)。 AzureFunctionApp@2 包含增強的驗證支援,此支援可將管線因錯誤而失敗的可能性降低。

選擇文章頂端的工作版本。 YAML 管線不適用於 Azure DevOps 2019 和更早版本。

必要條件

建置應用程式

  1. 登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
  2. 在您的專案中,瀏覽至 Pipelines 頁面。 然後選取 [新增管線]
  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:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.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 函數應用程式部署工作進行部署。 此工作需要 Azure 服務連線作為輸入。 Azure 服務連線會儲存認證,以便從 Azure Pipelines 連線到 Azure。

若要部署至 Azure Functions,請在 azure-pipelines.yml 檔案結尾處新增下列程式碼片段。 預設的 appType 是 Windows。 您可以將 appType 設定為 functionAppLinux 以指定 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: 'ubuntu-latest'

- task: AzureFunctionApp@1 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    #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 Name>'
    #slotName: '<Slot name>'

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

部署容器

您可以在每次組建成功之後,將程式碼自動部署至 Azure Functions 作為自訂容器。 若要深入了解容器,請參閱使用自訂容器在 Linux 上建立函數

使用適用於容器的 Azure 函數應用程式工作進行部署

部署至容器的最簡單方式是在容器部署工作上使用 Azure 函數應用程式

若要部署,請在 YAML 檔案結尾處新增下列程式碼片段:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

程式碼片段會將 Docker 映像推送至您的 Azure Container Registry。 容器部署上的 Azure 函數應用程式工作會從指定的存放庫提取對應 BuildId 的適當 Docker 映像,然後部署該映像。

部署到位置

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

下列 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

使用 Azure CLI 建立管線

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

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

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

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

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

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

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

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

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

建置應用程式

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

範例 YAML 組建管線

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

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

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.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。

工作的第 2 版包含對 .NET、Python 和 Node 較新的應用程式堆疊支援。 工作包括網路預先部署檢查。 發生預先部署問題時,部署會停止。

若要部署至 Azure Functions,請在 azure-pipelines.yml 檔案結尾處新增下列程式碼片段。 預設的 appType 是 Windows。 您可以將 appType 設定為 functionAppLinux 以指定 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: 'ubuntu-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.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 Name>'
    #slotName: '<Slot name>'

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

部署容器

您可以在每次組建成功之後,將程式碼自動部署至 Azure Functions 作為自訂容器。 若要深入瞭解容器,請參閱使用容器和 Azure Functions

使用適用於容器的 Azure 函數應用程式工作進行部署

部署至容器的最簡單方式是在容器部署工作上使用 Azure 函數應用程式

若要部署,請在 YAML 檔案結尾處新增下列程式碼片段:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

程式碼片段會將 Docker 映像推送至您的 Azure Container Registry。 容器部署上的 Azure 函數應用程式工作會從指定的存放庫提取對應 BuildId 的適當 Docker 映像,然後部署該映像。

部署到位置

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

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

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    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

使用 Azure CLI 建立管線

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

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

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

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

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

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

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

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

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

下一步