🕌

HonoでRPCをしたAzureFunctionsをAzureDevOpsのパイプラインからデプロイしたメモ

2024/08/01に公開

概要

前回はフロントエンドのデプロイパイプラインを作った。
今回はバックエンドのビルドパイプラインとリリースパイプラインを作成する。

ソースコード

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 SettingsService 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