🛠️

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

2024/09/27に公開

GitHub Actions から Azure Functions にコードをデプロイしたら関数が見えなくなるという現象が発生しました。

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

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

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 Function では、以下のファイルが含まれている必要があるので、どうやらこれが原因のようです。

  • .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