GitHub ActionsでCloudflare Workersをデプロイする

このページでは、GitHub Actionsを使用して、Cloudflare Workersをデプロイする方法を説明します。

前提

このページで紹介する方法は、Cloudflare WorkersのStatic Assets機能を利用したワーカーをデプロイすることを想定します。
デプロイするワーカーの設定ファイルのイメージは次のとおりです。

wrangler.toml
name = "sample"
compatibility_date = "2024-12-05"
main = "src/index.ts"

[site]
bucket = "./public"

なお、wrangler.tomlは、リポジトリにコミットしているものとします。

事前準備

GitHub ActionsからCloudflareに認証するには、CloudflareのアカウントIDとAPIトークンが必要です。
また、デプロイすると実行ログにワーカーURLが出力されます。
実行ログのURLをマスクしたい場合は、ワーカーURLも確認します。

アカウントIDとワーカーURLの確認

  1. Cloudflareのダッシュボードにログインします。

  2. 左メニューから[Compute (Workers)]>[Workers & Pages]の順でクリックします。

  3. 右ペインの「Account details」で、次の項目をメモします。

    • Account ID:アカウントIDです。
    • Subdomain:ワーカーURLのサブドメインです。

画面キャプチャ:「Account details」が表示されている

APIトークンの生成

次の手順でAPIトークンを生成します。
Cloudflare Workersへのデプロイ用のテンプレートが用意されていますが、不要なスコープを多く含みます。
そのため、ここでは1からスコープを付与する方法で、APIトークンを生成します。

  1. 右上のプロフィールアイコンから[My Profile]をクリックします。

  2. 左メニューから[API Tokens]をクリックします。

  3. [Create Token]をクリックします。

  4. [Create Custom Token]をクリックします。

  5. 「Token name」にトークン名を入力します(例:「GitHub Actions」)。

  6. 「Permissions」で次のPermissionを付与します。

    • Account
      • Workers KV Storage - Edit
      • Workers Scripts - Edit
    • User
      • Memberships - Read
      • User Details - Read

    画面キャプチャ:「Permissions」が表示されている

  7. [Continue summary]をクリックし、[Create token]をクリックします。

  8. 生成されたAPIトークンをメモします。
    APIトークンは生成時にだけ表示されるため、必ずメモしておきましょう。

GitHub Actionsの設定

GitHub Action Secretの追加

GitHubのリポジトリの設定で、事前設定で確認したアカウントIDやAPIトークン、ワーカーURLを、GitHub Action Secretに追加します。

  1. リポジトリを開き、[Settings]タブを選択します。

  2. 左メニューから[Secret and Variables]>[Actions]の順でクリックします。

  3. 「Repository secrets」の[New repository secret]をクリックし、それぞれ次のシークレットを追加します。

    • CF_ACCOUNT_ID:事前準備でメモしたアカウントID
    • CF_API_TOKEN:事前設定でメモしたAPIトークン
  4. 実行ログのURLをマスクしたい場合は、シークレットにCF_WORKERS_URLも追加します。
    値は、<ワーカー名>.<事前準備でメモしたワーカーURL>です。
    たとえば、ワーカー名が「sample」で、ワーカーURLが「username.123456789.workers.dev」の場合、「sample.username.123456789.workers.dev」です。

ワークフローの作成

.github/workflows/deploy.ymlに、次のワークフローを作成します。 今回は、任意のタイミングでデプロイしたいため、workflow dispatchを実行トリガーにしています。

.github/workflows/deploy.yml
name: deploy

on:
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: false

jobs:
  deploy:
    runs-on: ubuntu-latest
    timeout-minutes: 3
    steps:
      - uses: actions/checkout@v4

      # npm管理ツールにpnpmを使っている場合は記載する
      - uses: pnpm/action-setup@v4
        with:
          version: 9

      - name: Install dependencies
        run: pnpm install --shamefully-hoist
        env:
          CI: true

      # 実行ログのURLをマスクしたい場合だけ記載する
      # 本来、GitHub Actions Secretに登録したシークレットは、自動でマスクされる
      # ただ、マスキングされないこともあったので、念の為マスク機能を使う
      - name: Mask secrets
        run: echo "::add-mask::${{ secrets.CF_WORKERS_URL }}"

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

ワークフローの実行

[Actions]タブからDeployワークフローを開き、[Run workflow]でワークフローを実行します。
デプロイの成功や、ワーカーURLがマスクされたことを確認します。

画面キャプチャ:ワークフローのデプロイステップの実行ログ

wrangler.tomlに秘匿情報を含む場合

Cloudflare Workersの設定ファイルには、環境変数やD1のデータベース名など、リポジトリにコミットしたくない情報を含むことがあります。
その場合、wrangler.tomlをリポジトリにコミットせず、設定例としてwrangler.toml.sampleを作ることがあり得ます。
秘匿すべき情報は、wrangler.toml.sample内で<YOUR_SECRET>のように仮の値で表現します。

wrangler.toml.sample
name = "sample"

# ...略...

[vars]
HOST = "<YOUR_SECRET>"

このようなワーカーをGitHub Actionsでデプロイする場合、デプロイの前に次のことを行います。

  • wrangler.toml.samplewrangler.tomlにリネーム
  • 仮の値を、あらかじめGitHub Actions Secretに追加したシークレットの値に置換
    以下の例では、あらかじめCF_ENV_HOSTというシークレットを登録している

したがって、次のステップをワークフローに追記します。

.github/workflows/deploy.yml
+      - name: Edit wrangler.toml
+        run: |
+          mv ./wrangler.toml.sample ./wrangler.toml
+          sed -i 's|<YOUR_SECRET>|${{ secrets.CF_ENV_HOST }}|' ./wrangler.toml

      - name: Deploy

ステップを追記したワークフローを実行すると、環境変数を設定できたことを確認できます。
画面キャプチャ:環境変数を設定したことを示すログを強調している

ワーカーの設定画面でも、GitHub Actions Secretに追加したシークレットが設定されたことを確認できます。
画面キャプチャ:環境変数が設定されている