🛠️

何もしていないのに Azure Functions が壊れた

に公開

GitHub Actions から Azure Functions にコードをデプロイしたところ、関数が見えなくなる現象に遭遇しました。

  • デプロイ前は関数が見えていた
  • インフラの変更はしていない
  • 依存関係のバージョンを上げただけでコードの変更はしていない
  • 依存関係のバージョンを戻しても改善しない
  • GitHub Actions のワークフローも変更していない

GitHub Actions のワークフローでは build と deploy でジョブを分割していました。

jobs:
  build:
    steps:
      - name: Checkout repos
        uses: actions/checkout@v4
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 8.x
      - name: Build source
        shell: pwsh
        run: dotnet publish -p:PublishDir=build
      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: artifacts
          path: build
  deploy:
    needs: build
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: artifacts
      - name: Connect to Azure
        uses: azure/login@v2
        with:
          creds: ${{secrets.AZURE_CREDENTIALS}}
      - name: Deploy artifacts
        uses: azure/webapps-deploy@v2
        with:
          app-name: ${{secrets.AZURE_FUNC_NAME}}
          package: artifacts

build ジョブでアップロードした成果物に .azurefunctions フォルダーが含まれていないことが原因でした。Azure Functions では、以下のファイルが含まれている必要があります。

  • .azurefunctions/
  • extensions.json
  • functions.metadata
  • host.json
  • worker.config.json

https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-process-guide?WT.mc_id=M365-MVP-5002941#deployment-payload

.azurefunctions フォルダーが含まれていない理由としては、actions/upload-artifact@v4 の破壊的変更が影響しています。v4.4 からは隠しファイルが対象に含まれなくなりました。.azurefunctions フォルダーは隠しファイルとなるため、含まれなかったということです。

https://github.com/actions/upload-artifact/blob/main/docs/MIGRATION.md#hidden-files

そのため、ワークフローを修正しました。これで正常に動作するようになりました。

  jobs:
    build:
      steps:
        - name: Checkout repos
          uses: actions/checkout@v4
        - name: Setup .NET Core
          uses: actions/setup-dotnet@v4
          with:
            dotnet-version: 8.x
        - name: Build source
          shell: pwsh
          run: dotnet publish -p:PublishDir=build
        - name: Upload artifacts
          uses: actions/upload-artifact@v4
          with:
            name: artifacts
            path: build
+           include-hidden-files: true    
    deploy:
      needs: build
      steps:
        - name: Download artifacts
          uses: actions/download-artifact@v4
          with:
            name: artifacts
        - name: Connect to Azure
          uses: azure/login@v2
          with:
            creds: ${{secrets.AZURE_CREDENTIALS}}
        - name: Deploy artifacts
          uses: azure/webapps-deploy@v2
          with:
            app-name: ${{secrets.AZURE_FUNC_NAME}}
            package: artifacts

マイナーバージョンの変更でも重要な仕様変更がある場合は、リリースノートやドキュメントをしっかり確認することが大切です。

Discussion