Azure Pipelines を使用した継続的デリバリー

Azure Pipelines を使用して、Azure Functions に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。

YAML パイプラインは、リポジトリ内の YAML ファイルを使用して定義されます。 ステップは、パイプラインの最小の構成要素であり、スクリプトまたはタスク (事前にパッケージ化されたスクリプト) です。 パイプラインを構成する主要な概念とコンポーネントについて説明します

AzureFunctionApp タスクを使用して、Azure Functions にデプロイします。 現在、AzureFunctionApp タスクには 2 つのバージョンがあります (AzureFunctionApp@1AzureFunctionApp@2)。 AzureFunctionApp@2 には、エラーが原因でパイプラインが失敗する可能性を低くする、強化された検証サポートが含まれています。

記事の上部でタスクのバージョンを選択してください。 YAML パイプラインは、Azure DevOps 2019 以前では使用できません。

前提条件

アプリの構築

  1. Azure DevOps 組織にサインインし、プロジェクトに移動します。
  2. プロジェクト内で、 [パイプライン] ページに移動します。 新しいパイプラインを選択します。
  3. [コードはどこにありますか?] のオプションのいずれかを選択します。
    • GitHub: サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。 GitHub へ初めて接続する場合、ウィザードでは、DevOps を GitHub アカウントに接続するプロセスについての順を追った説明が表示されます。
    • Azure Repos Git: 現在の DevOps プロジェクト内のリポジトリをそのまま選択できます。
  4. リポジトリの一覧が表示されたら、サンプル アプリのリポジトリを選択します。
  5. Azure Pipelines はリポジトリを分析し、[パイプラインの構成] で使用できるテンプレートの一覧を提供します。 言語に適した関数アプリ テンプレートを選択します。 適切なテンプレートが表示されない場合は、[さらに表示] を選択します。
  6. [保存および実行] を選択し、 [Commit directly to the main branch]\(メイン ブランチに直接コミットする\) を選択した後、 [保存および実行] を再度選択します。
  7. 新しい実行が開始されます。 実行が終了するまで待ちます。

YAML ビルド パイプラインの例

アプリをビルドする場合、次の言語固有のパイプラインを使用できます。

次のサンプルを使用して、.NET アプリをビルドする YAML ファイルを作成できます。

アプリのビルド時にエラーが表示される場合は、使用する .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 です。 Linux を指定するには、appTypefunctionAppLinux に設定します。 AzureFunctionApp タスクの @v1 の場合、Flex 従量課金アプリへのデプロイはサポートされていません。

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 を使用する」を参照してください。

コンテナーにデプロイする最も簡単な方法は、[コンテナー上の 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 イメージを指定されたリポジトリからプルし、そのイメージをデプロイします。

コンテナーのビルドやコンテナー レジストリへの発行など、完全なエンドツーエンドのパイプラインの例については、この Azure Pipelines コンテナーのデプロイ例を参照してください。

スロットにデプロイする

複数のスロットを持つように関数アプリを構成できます。 スロットを使用すると、アプリを安全にデプロイし、テストしてから、お客様が使用できるようにすることができます。

次の 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 アクセス許可の要件に関するセクションを参照してください。

    • 自動生成された YAML ファイルをコミットできるように、GitHub リポジトリのメイン ブランチにコミットするためのアクセス許可が必要です。

  • コードが Azure Repos にある場合:

    • サブスクリプションへの書き込みアクセス許可が必要です。

    • Azure DevOps のプロジェクト管理者である必要があります。

アプリの構築

  1. Azure DevOps 組織にサインインし、プロジェクトに移動します。
  2. プロジェクト内で、 [パイプライン] ページに移動します。 次に、新しいパイプラインを作成するためのアクションを選択します。
  3. 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。
  4. サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。
  5. リポジトリの一覧が表示されたら、サンプル アプリのリポジトリを選択します。
  6. Azure Pipelines によってリポジトリが分析され、テンプレートが推奨されます。 [保存および実行] を選択し、 [Commit directly to the main branch](メイン ブランチに直接コミットする) を選択した後、 [保存および実行] を再度選択します。
  7. 新しい実行が開始されます。 実行が終了するまで待ちます。

YAML ビルド パイプラインの例

アプリをビルドする場合、次の言語固有のパイプラインを使用できます。

次のサンプルを使用して、.NET アプリをビルドする YAML ファイルを作成できます。

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 関数アプリのデプロイ v2] タスクを使用してデプロイします。 このタスクには、入力として Azure サービス接続が必要です。 Azure サービス接続には、Azure Pipelines から Azure に接続するための資格情報が格納されます。 ワークロード ID フェデレーションを使用する接続を作成する必要があります。

v2 バージョンのタスクには、.NET、Python、Node 向けの、より新しいアプリケーション スタックのサポートが含まれています。 このタスクには、ネットワークのデプロイ前のチェックが含まれます。 デプロイ前に問題があると、デプロイは停止します。

Azure Functions にデプロイするには、azure-pipelines.yml ファイルの末尾に次のスニペットを追加します。 既定の appType は Windows です。 Linux を指定するには、appTypefunctionAppLinux に設定します。 Flex 従量課金アプリにデプロイするには、appType: functionAppLinuxisFlexConsumption: true の両方を設定する必要があります。

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <SUBSCRIPTION_NAME>
  appName: <APP_NAME>
  # Agent VM image name
  vmImageName: 'windows-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <AZURE_SERVICE_CONNECTION>
    appType: functionApp # this specifies a Windows-based function app
    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>'
    #slotName: '<SLOT_NAME>'

次のステップ