Cloudflare Workersの自動デプロイの失敗を解決した

# はじめに
以前、Cloudflare Workersのプロジェクトを自動デプロイするため、GitHub Actionsを設定する方法を書いたことがあります。

https://qiita.com/dev-cho/items/f4c9e766170e9e85f456

しかし、新規プロジェクトを生成し、自動デプロイを設定しましたが、GitHub Actionsからの自動デプロイが失敗してしまったことがありました。 (昔に作成したプロジェクトは問題なく自動デプロイできました。)
色々調べて、今は問題解決ができたので、今回は、その解決方法を記録しておきたいと思います。

# 環境
- Ubuntu 24.04
- Wrangler 3.107.3

# 問題が起きているworkflowファイル
Github Actionを使うため、作成したworkflowファイルの内容が以下になります。
```yml:.github/workflows/deploy.yml
name: Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    name: Deploy
    steps:
      - uses: actions/checkout@v4
      - name: Deploy
        uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

```

# デプロイ成功/失敗の状況

ローカル環境でデプロイすると正常にデプロイできるが、上記のworkflowを作成した後、GitHubにpushしてGitHub Actionsからデプロイするとデプロイが失敗されます。
| 環境 | デプロイ<br>成功/失敗 |
|:-|:-:|
| ローカル | 成功 |
| GitHub Actions | <font color="red">**失敗**</font> |

GitHub Actionsのデプロイが失敗内容は以下のようでした。
```
   /usr/local/bin/npx wrangler deploy
  
   ⛅️ wrangler 3.90.0 (update available 3.107.3)
  ----------------------------------------------
  
  
  ✘ [ERROR] Missing entry-point: The entry-point should be specified via the command line (e.g. `wrangler deploy path/to/script`) or the `main` config field.
```

# 原因
結論から言うと、新規プロジェクト作成で使用したローカルのWranglerのバージョンと、Github Actionsのバージョンの違いが自動デプロイ失敗の原因だと思います。

まず、以下のエラーメッセージは、ルートディレクトリに`wrangler.toml`ファイルがない場合、発生するエラーでした。
```
  ✘ [ERROR] Missing entry-point: The entry-point should be specified via the command line (e.g. `wrangler deploy path/to/script`) or the `main` config field.
```
https://developers.cloudflare.com/workers/ci-cd/builds/troubleshoot/#missing-wranglertoml

確かに、新規生成したプロジェクトのディレクトリを確認してみると、`wrangler.toml`はなく、`wrangler.json`ファイルがありました。
しかし、私はプロジェクトを新規作成した後、ファイルを触ったことがありませんでした。

もう少し調べてみると、Wrangler 3.91.0バージョンから、設定ファイルの仕様変更があったことを見つけました。

>As of Wrangler v3.91.0 Wrangler supports both JSON (wrangler.json or wrangler.jsonc) and TOML (wrangler.toml) for its configuration file. Prior to that version, only wrangler.toml was supported. The format of Wrangler's configuration file is exactly the same across both languages, except that the syntax is JSON rather than TOML. Throughout this page and the rest of Cloudflare's documentation config snippets are provided as both JSON and TOML.

https://developers.cloudflare.com/workers/wrangler/configuration/

つまり、3.91.0バージョンからは設定ファイルとしてJSON (`wrangler.json`または`wrangler.jsonc`)とTOML (`wrangler.toml`)を両方使えるようになったようです。

なので、最新のWranglerバージョンからは新規プロジェクトを生成すると、`wrangler.toml`ではなく`wrangler.json`ファイルを生成するようですね。

しかし、GitHub Actionsで動作するWranglerは、`cloudflare/wrangler-action`が起動するとき、Wranglerの存在をチェックし、存在しないならWranglerをインストールしてDeployをしますが、デフォルトで設定されているWranglerバージョンが3.90.0のようです。(2025/02/09時点)

```typescript:src/index.ts
const DEFAULT_WRANGLER_VERSION = "3.90.0";
```

https://github.com/cloudflare/wrangler-action/blob/main/src/index.ts#L8

整理すると、ローカル環境と、GitHub Actionsで動いているWranglerのバージョンは以下のように違いがありました。
| 環境 | Wranglerバージョン |
|:-|:-|
| ローカル | 3.107.3 |
| GitHub Actions | 3.90.0 |

ローカル環境のWrangler (v3.107.3)から新規のプロジェクトを生成すると、`wrangler.toml`ファイルはなく`wrangler.json`ファイルのみ生成されますが、
GitHub Actionsでインストールされて動作するWrangler (v3.90.0)は`wrangler.toml`がないとエラーが発生されます。
これが、今回の自動デプロイ失敗の原因だと思います。

# 解決
古いバージョンのWranglerがインストールされることで問題が起きているため、Deploy前に最新のパッケージをインストールし、最新のWranglerでDeployを行うようにworkflowファイルの内容を修正して問題を解決しました。

```diff_yaml:.github/workflows/deploy.yml
name: Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    name: Deploy
    steps:
      - uses: actions/checkout@v4

+     - name: Install     # 追加
+       run: npm install  # 追加

      - name: Deploy
        uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}


```

# おわりに
新規生成したプロジェクトは急に自動デプロイができなかったのでびっくりしましたが、`cloudflare/wrangler-action`で設定されているWranglerのデフォルトバージョンが最新に変更されたら、別に何もしなくても解決されると思います。

# 参考
https://developers.cloudflare.com/workers/wrangler/configuration/

https://github.com/cloudflare/wrangler-action