🕌
HonoでRPCをしたAzureFunctionsをAzureDevOpsのパイプラインからデプロイしたメモ
概要
前回はフロントエンドのデプロイパイプラインを作った。
今回はバックエンドのビルドパイプラインとリリースパイプラインを作成する。
monorepo環境
モノレポで管理しているためnode_modulesの作成位置には気を付ける必要がある。
- turbo.json
- package.json
+ node_modules # ← ここの階層にライブラリがインストールされてしまう
- apps
- api
- package.json
- host.json # ← Azure Functions的にはhost.jsonと同じフォルダにライブラリが欲しい
+ src
今回は必要なファイルをbuildフォルダにコピーし、その中でデプロイ用のnodeインストールなどを行うようにした。
- turbo.json
- package.json
+ node_modules
- apps
- api
- package.json
- host.json
+ src
- build # ← このディレクトリを作成して必要なファイルをコピー
- host.json
- package.json
+ src
+ node_modules
ビルドパイプライン
リリースパイプラインで名前が必要になるので、作成時にbuild-functions
と名付けておく。(作ってからrenameも可)
.azure-devops/functions-build-pipeline.yaml
trigger:
branches:
include:
- develop
- id/8/addpipeline
paths:
include:
- apps/api/*
- .azure-devops/functions-build-pipeline.yaml
pool:
vmImage: ubuntu-latest
steps:
- task: UseNode@1
inputs:
version: '20.15.1'
displayName: 'Install Node.js'
- task: Npm@1
inputs:
command: custom
customCommand: 'install -g npm@10.8.2'
displayName: 'Upgrade npm to latest version'
- bash: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --output ./bin
fi
npm install --ignore-scripts
bash build.sh
workingDirectory: $(System.DefaultWorkingDirectory)/apps/api
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/apps/api/build"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
補足: npm install --ignore-scripts
はhuskyの起動を防ぐためのオプション
ビルドパイプライン設定 | 設定値 |
---|---|
リポジトリ | デプロイしたいリポジトリ名 |
ビルドパイプラインファイル |
/.azure-devops/functions-build-pipeline.yaml ※ |
※ビルドパイプラインを作るときのテンプレートはExisting Azure Pipelines YAML file
を選択
apps/api/build.sh
#!/bin/bash
BIN_DIR=$(cd $(dirname $0) && pwd)
BUILD_DIR=$BIN_DIR/build
rimraf ./build
rimraf ./dist
npm run build
mkdir $BUILD_DIR
cp -r dist $BUILD_DIR
cp host.json $BUILD_DIR
cp .funcignore $BUILD_DIR
cp local.settings.json $BUILD_DIR
# package.json から devDependencies を削除して、本番環境用の node_modules を作成 (@async-ttrpg/typescript-configなどmonorepoの機能で参照しているパッケージがエラーを引き起こすため)
jq 'del(.devDependencies)' package.json > temp.json && mv temp.json $BUILD_DIR/package.json
npm run build --if-present
cd $BUILD_DIR && npm install -omit=dev
リリースパイプライン
Artifactsの設定
項目 | 設定値 |
---|---|
Source(build pipeline) | build-functions |
Default version | Latest |
Source alias | _build-functions |
Continuous deployment trigger
Enabledに設定
Tasksの設定
Run on agent
項目 | 設定値 |
---|---|
Agent pool | Azure Pipelines |
Agent Specification | ubuntu-22.04 |
Azure Functions Deploy
項目 | 設定値 |
---|---|
Task vesion | 2 |
Azure Resource Manger connection |
Project Settings のService connections で定義したAzure Resource Manger と接続したconnectionを選択 |
App Type | Function App on Linux |
Azure Functions App name | デプロイ先のFunctionsを選択 (connectionができているとドロップダウンで選択できる) |
Package or folder |
$(System.DefaultWorkingDirectory)/_async-ttrpg-build-functions/drop/*.zip ※横の...からフォルダエクスプローラーで選択できる |
*.zipには356.zipや355.zipなどビルド番号が入るので、*
にする必要がある
参考
Azure DevOpsのパイプラインでAzure FunctionsにTypescriptのNodeランタイムのAPIをデプロイしたメモ
モノレポ ( Turborepo ) の Azure Functions(Node Typescript)のデプロイで関数がない状態になることの対応をしたメモ
Discussion