Azure Pipelines を使用した継続的デリバリー
Azure Pipelines を使用して、Azure Functions に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。
YAML パイプラインは、リポジトリ内の YAML ファイルを使用して定義されます。 ステップは、パイプラインの最小の構成要素であり、スクリプトまたはタスク (事前にパッケージ化されたスクリプト) です。 パイプラインを構成する主要な概念とコンポーネントについて説明します。
AzureFunctionApp タスクを使用して、Azure Functions にデプロイします。 現在、AzureFunctionApp タスクには 2 つのバージョンがあります (AzureFunctionApp@1、AzureFunctionApp@2)。 AzureFunctionApp@2 には、エラーが原因でパイプラインが失敗する可能性を低くする、強化された検証サポートが含まれています。
記事の上部でタスクのバージョンを選択してください。 YAML パイプラインは、Azure DevOps 2019 以前では使用できません。
前提条件
リポジトリを作成できる GitHub アカウント。 アカウントをお持ちでない場合は、無料で作成することができます。
Azure DevOps 組織。 アカウントをお持ちでない場合は、無料で作成することができます。 チームに既にある場合は、使用する Azure DevOps プロジェクトの管理者であることを確認します。
Microsoft によってホストされるエージェントでパイプラインを実行する機能。 並列ジョブを購入するか、Free レベルを要求できます。
GitHub リポジトリにそのコードがある関数アプリ。 Azure Functions コード プロジェクトがまだない場合は、次の言語固有の記事を完了して作成できます。
アプリの構築
- Azure DevOps 組織にサインインし、プロジェクトに移動します。
- プロジェクト内で、 [パイプライン] ページに移動します。 次に、新しいパイプラインを作成するためのアクションを選択します。
- 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。
- サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。
- リポジトリの一覧が表示されたら、サンプル アプリのリポジトリを選択します。
- Azure Pipelines によってリポジトリが分析され、テンプレートが推奨されます。 [保存および実行] を選択し、 [Commit directly to the main branch](メイン ブランチに直接コミットする) を選択した後、 [保存および実行] を再度選択します。
- 新しい実行が開始されます。 実行が終了するまで待ちます。
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 を指定するには、appType
を functionAppLinux
に設定します。
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 アクセス許可の要件に関するセクションを参照してください。
自動生成された YAML ファイルをコミットできるように、GitHub リポジトリのメイン ブランチにコミットするためのアクセス許可が必要です。
コードが Azure Repos にある場合:
サブスクリプションへの書き込みアクセス許可が必要です。
Azure DevOps のプロジェクト管理者である必要があります。
アプリの構築
- Azure DevOps 組織にサインインし、プロジェクトに移動します。
- プロジェクト内で、 [パイプライン] ページに移動します。 次に、新しいパイプラインを作成するためのアクションを選択します。
- 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。
- サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。
- リポジトリの一覧が表示されたら、サンプル アプリのリポジトリを選択します。
- Azure Pipelines によってリポジトリが分析され、テンプレートが推奨されます。 [保存および実行] を選択し、 [Commit directly to the main branch](メイン ブランチに直接コミットする) を選択した後、 [保存および実行] を再度選択します。
- 新しい実行が開始されます。 実行が終了するまで待ちます。
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 に接続するための資格情報が格納されます。
v2 バージョンのタスクには、.NET、Python、Node 向けの、より新しいアプリケーション スタックのサポートが含まれています。 このタスクにはネットワークのデプロイ前チェックが含まれており、問題がある場合はデプロイが進行しません。
Azure Functions にデプロイするには、azure-pipelines.yml
ファイルの末尾に次のスニペットを追加します。 既定の appType
は Windows です。 Linux を指定するには、appType
を functionAppLinux
に設定します。
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 アクセス許可の要件に関するセクションを参照してください。
自動生成された YAML ファイルをコミットできるように、GitHub リポジトリのメイン ブランチにコミットするためのアクセス許可が必要です。
コードが Azure Repos にある場合:
サブスクリプションへの書き込みアクセス許可が必要です。
Azure DevOps のプロジェクト管理者である必要があります。
次のステップ
- 「Azure Functions の概要」を確認してください。
- Azure DevOps の概要を確認してください。