Azure Pipelines を使用して、コード プロジェクトを Azure の関数アプリに自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。
YAML パイプラインは、リポジトリ内の YAML ファイルを使用して定義されます。 ステップは、パイプラインの最小の構成要素であり、スクリプトまたはタスク (事前にパッケージ化されたスクリプト) です。 パイプラインを構成する主要な概念とコンポーネントについて説明します。
AzureFunctionApp タスクを使用してコードをデプロイします。 次の表で比較した 2 つのバージョンの AzureFunctionAppがあります。
| 比較/バージョン | AzureFunctionApp@2 | AzureFunctionApp@1 |
|---|---|---|
| Flex 従量課金プランをサポート | ✔ | ❌ |
| 強化された検証サポートを含む* | ✔ | ❌ |
| 使用するタイミング... | 新しいアプリのデプロイに推奨 | レガシーデプロイメントのために保守されています。 |
* 検証のサポートが強化されているため、エラーが原因でパイプラインが失敗する可能性が低くなります。
記事の上部でタスクのバージョンを選択してください。
注
新機能と長期的なサポートにアクセスするために、 AzureFunctionApp@1 から AzureFunctionApp@2 にアップグレードします。
前提条件
Azure DevOps 組織。 アカウントをお持ちでない場合は、無料で作成することができます。 チームに既にある場合は、使用する Azure DevOps プロジェクトの管理者であることを確認します。
Microsoft によってホストされるエージェントでパイプラインを実行する機能。 並列ジョブを購入するか、Free レベルを要求できます。
Azure Repos ではなく GitHub を使用する予定の場合は、GitHub リポジトリも必要です。 GitHub アカウントがない場合は、無料で作成できます。
サポートされているリポジトリにソース コードが含まれる Azure の既存の関数アプリ。 Azure Functions コード プロジェクトがまだない場合は、次の言語固有の記事を完了して作成できます。
ローカル コード プロジェクトを関数アプリに発行した後は、GitHub または Azure Repos リポジトリに忘れずにアップロードしてください。
アプリの構築
- Azure DevOps 組織にサインインし、プロジェクトに移動します。
- プロジェクト内で、 [パイプライン] ページに移動します。 次に、新しいパイプラインを作成するためのアクションを選択します。
- 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。
- サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。
- リポジトリの一覧が表示されたら、サンプル アプリのリポジトリを選択します。
- Azure Pipelines によってリポジトリが分析され、テンプレートが推奨されます。 [保存および実行] を選択し、 [Commit directly to the main branch]\(メイン ブランチに直接コミットする\) を選択した後、 [保存および実行] を再度選択します。
- 新しい実行が開始されます。 実行が終了するまで待ちます。
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'
- 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:
- 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 を指定するには、appType を functionAppLinux に設定します。
Flex Consumption アプリは Linux 上で実行され、appType: functionAppLinuxとisFlexConsumption: 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
このスニペットでは、 appType を functionAppLinux に設定します。これは、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 のプロジェクト管理者である必要があります。
次のステップ
- 「Azure Functions の概要」を確認してください。
- Azure DevOps の概要を確認してください。