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

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

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

AzureFunctionApp タスクを使用してコードをデプロイします。 次の表で比較した 2 つのバージョンの AzureFunctionAppがあります。

比較/バージョン AzureFunctionApp@2 AzureFunctionApp@1
Flex 従量課金プランをサポート
強化された検証サポートを含む*
使用するタイミング... 新しいアプリのデプロイに推奨 レガシーデプロイメントのために保守されています。

* 検証のサポートが強化されているため、エラーが原因でパイプラインが失敗する可能性が低くなります。

記事の上部でタスクのバージョンを選択してください。

新機能と長期的なサポートにアクセスするために、 AzureFunctionApp@1 から AzureFunctionApp@2 にアップグレードします。

前提条件

ローカル コード プロジェクトを関数アプリに発行した後は、GitHub または Azure Repos リポジトリに忘れずにアップロードしてください。

アプリの構築

  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:
  - 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. [保存および実行] を選択し、 [Commit directly to the main branch]\(メイン ブランチに直接コミットする\) を選択した後、 [保存および実行] を再度選択します。
  7. 新しい実行が開始されます。 実行が終了するまで待ちます。

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

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

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

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

Azure Functions にデプロイするには、アプリが Linux と Windows のどちらで実行されているかに応じて、 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: '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) です。 Linux を指定するには、appTypefunctionAppLinux に設定します。 Flex Consumption アプリは Linux 上で実行され、appType: functionAppLinuxisFlexConsumption: trueの両方を設定する必要があります。

このスニペットでは、YAML ファイルのビルド ステップによってエージェント上の $(System.ArtifactsDirectory) フォルダーに zip アーカイブが生成されることが想定されています。

Azure Function App のデプロイ タスクを使用してデプロイします。 このタスクには、入力として Azure サービス接続が必要です。 Azure サービス接続には、Azure Pipelines から Azure に接続するための資格情報が格納されます。

Important

@v1 タスクのAzureFunctionAppを使用した Flex Consumption アプリへのデプロイはサポートされていません。

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 アーカイブが生成されることを前提としています。

コンテナーをデプロイする

ヒント

カスタム Linux コンテナーで関数アプリをホストするには、Azure Container Apps で Azure Functions のサポートを使用することをお勧めします。 詳細については、 Azure Container Apps での 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 Container Apps にデプロイする」を参照してください。

スロットにデプロイする

Important

Flex 従量課金プランでは、現在スロットはサポートされていません。 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 アクセス許可の要件に関するセクションを参照してください。

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

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

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

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

次のステップ