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 以前では使用できません。
前提条件
Azure DevOps 組織。 アカウントをお持ちでない場合は、無料で作成することができます。 チームに既にある場合は、使用する Azure DevOps プロジェクトの管理者であることを確認します。
Microsoft によってホストされるエージェントでパイプラインを実行する機能。 並列ジョブを購入するか、Free レベルを要求できます。
Azure Repos ではなく GitHub を使用する予定の場合は、GitHub リポジトリも必要です。 GitHub アカウントがない場合は、無料で作成できます。
サポートされているリポジトリにソース コードが含まれる Azure の既存の関数アプリ。 Azure Functions コード プロジェクトがまだない場合は、次の言語固有の記事を完了して作成できます。
ローカル コード プロジェクトを関数アプリに発行した後は、GitHub または Azure Repos リポジトリに忘れずにアップロードしてください。
アプリの構築
- Azure DevOps 組織にサインインし、プロジェクトに移動します。
- プロジェクト内で、 [パイプライン] ページに移動します。 新しいパイプラインを選択します。
- [コードはどこにありますか?] のオプションのいずれかを選択します。
- GitHub: サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。 GitHub へ初めて接続する場合、ウィザードでは、DevOps を GitHub アカウントに接続するプロセスについての順を追った説明が表示されます。
- Azure Repos Git: 現在の DevOps プロジェクト内のリポジトリをそのまま選択できます。
- リポジトリの一覧が表示されたら、サンプル アプリのリポジトリを選択します。
- 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
に設定します。 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 のプロジェクト管理者である必要があります。
アプリの構築
- 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 に接続するための資格情報が格納されます。 ワークロード ID フェデレーションを使用する接続を作成する必要があります。
v2 バージョンのタスクには、.NET、Python、Node 向けの、より新しいアプリケーション スタックのサポートが含まれています。 このタスクには、ネットワークのデプロイ前のチェックが含まれます。 デプロイ前に問題があると、デプロイは停止します。
Azure Functions にデプロイするには、azure-pipelines.yml
ファイルの末尾に次のスニペットを追加します。 既定の appType
は Windows です。 Linux を指定するには、appType
を functionAppLinux
に設定します。 Flex 従量課金アプリにデプロイするには、appType: functionAppLinux
と isFlexConsumption: 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>'
次のステップ
- 「Azure Functions の概要」を確認してください。
- Azure DevOps の概要を確認してください。