メインコンテンツへスキップ

Vercel CLI を使わずに Vercel デプロイをトリガーする方法

VERCEL_TOKEN などの Secrets を追加せずに Vercel デプロイをトリガーする方法を解説します。github-actions[bot] に空コミットを push させる仕組みと、Vercel CLI 方式とのトレードオフを比較します。

GitHub Actions から Vercel にデプロイしたいとき、多くの記事では vercel deploy コマンドを使う方法が紹介されています。この方法には、Vercel の認証情報を GitHub Secrets に保管する必要があります。管理する Secret が増えるほど、設定ミスや漏洩のリスクも積み上がります。実は、Secrets を一切追加せずにデプロイをトリガーできる方法があります。

この記事では、Vercel CLI を使わず github-actions[bot] に空のコミットを作らせることでデプロイを発火させる方法を紹介します。あわせて Vercel CLI 方式との比較も整理するので、自分のプロジェクトに合う方法を選ぶ参考にしてみてください。

前提 — この記事が想定する状況

この方法が役立つのは、次のような状況です。

  • GitHub リポジトリの Collaborator だが、Vercel のチームメンバーではない
  • VERCEL_TOKEN などの Vercel 認証情報を GitHub Secrets に置きたくない
  • デプロイを手動トリガーに絞ってシンプルに管理したい

また、Vercel プロジェクトが GitHub との Git 連携(Vercel for GitHub)で接続済みであることが前提です。Vercel CLI 経由でのみデプロイしている場合は対象外となります。

なお、本記事の方法は Hobby プラン・Pro プラン、パブリック・プライベートリポジトリのいずれでも動作を確認しています。

よく見る方法 — Vercel CLI 方式と3つの Secrets

Vercel CLI を使ったデプロイ方式は次のとおりです。

- name: Install Vercel CLI
  run: npm install --global vercel@latest

- name: Pull Vercel Environment Information
  run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}

- name: Build Project Artifacts
  run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}

- name: Deploy Project Artifacts to Vercel
  run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}

この方式では、GitHub Secrets に 3つの値を登録する必要があります。

Secret 名

内容

VERCEL_TOKEN

Vercel アカウントのアクセストークン(オーナーが発行)

VERCEL_ORG_ID

Vercel のチーム(オーガニゼーション)ID

VERCEL_PROJECT_ID

Vercel のプロジェクト ID

VERCEL_TOKEN はオーナーのアカウントで発行するため、チームメンバーの招待は不要です。ただし、Vercel の認証情報をリポジトリに保管するという点は変わりません。

github-actions[bot] がコミットするとデプロイが走る理由

Vercel の GitHub 連携は、リポジトリへの push イベントを検知してデプロイを開始します。ただし、プライベートリポジトリでは追加のチェックが入ります。

公式ドキュメントには次のように記載されています。

To deploy commits under a Hobby team, the commit author must be the owner of the Hobby team containing the Vercel project connected to the Git repository.

Deploying Git Repositories with Vercel

つまり、コミット作者が Vercel チームのメンバーまたはオーナーでない場合、デプロイはスキップされます。チーム外の GitHub ユーザーがコミットしても、Vercel 側でブロックされるわけです。

では、github-actions[bot] がコミットした場合はどうなるでしょうか。

github-actions[bot] は GitHub が提供するシステムボットです。このボットが push したコミットは Vercel のコミット作者チェックを通過し、デプロイがトリガーされます。Vercel 公式ドキュメントにも「Confirm bot commits are properly configured by the git provider.」(出典)という記述があり、ボットコミットを認識する仕組みが存在することが示されています。

:::message この挙動は Vercel によって明示的に文書化されたものではありません。仕様変更により動作しなくなる可能性がある点に注意してください。 :::

実装 — ワークフロー全文

name: Manual Deploy (Vercel)

on:
  workflow_dispatch:
    inputs:
      message:
        description: "Commit message (leave blank for default)"
        required: false
        default: ""
      branch:
        description: "Target branch (leave blank for default branch)"
        required: false
        default: ""

jobs:
  deploy:
    name: Trigger Vercel Deploy
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          ref: ${{ inputs.branch || github.ref }}
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Configure git as github-actions[bot]
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Create empty commit
        run: |
          MESSAGE="${{ inputs.message }}"
          if [ -z "$MESSAGE" ]; then
            MESSAGE="chore: trigger Vercel deploy ($(date -u '+%Y-%m-%d %H:%M UTC'))"
          fi
          git commit --allow-empty -m "$MESSAGE"

      - name: Push
        run: git push

各ステップの解説

workflow_dispatch トリガー

手動でワークフローを実行するためのトリガーです。GitHub の Actions タブから「Run workflow」ボタンを押すことで実行できます。ブランチとコミットメッセージをその場で指定できます。

permissions: contents: write

空のコミットをリモートにプッシュするため、リポジトリへの書き込み権限を明示的に付与します。

git の設定

github-actions[bot] のユーザー名とメールアドレス(github-actions[bot]@users.noreply.github.com)を設定します。このメールアドレスが、GitHub 公式ボットとして認識されるための重要なポイントです。

空コミットの作成

git commit --allow-empty で変更のないコミットを作成します。--allow-empty がないと、差分がない場合にコミットが失敗します。コミットメッセージが未入力の場合は、日時を含むデフォルトメッセージが使われます。

プッシュ

secrets.GITHUB_TOKEN は GitHub Actions が自動で提供するトークンです。追加の Secrets 登録は不要です。プッシュが完了すると Vercel の push イベントが発火し、デプロイが開始されます。

動作確認

ワークフロー実行後、Vercel ダッシュボードを確認すると、github-actions[bot] をコミット作者とするデプロイが追加されているはずです。

[スクリーンショット: Vercel ダッシュボードのデプロイ一覧(github-actions[bot] が表示されている)]

Vercel CLI 方式との比較

比較項目

空コミット方式(本記事)

Vercel CLI 方式

必要な Secrets

なし(GITHUB_TOKEN は自動提供)

VERCEL_TOKEN + VERCEL_ORG_ID + VERCEL_PROJECT_ID

Vercel メンバー権限

不要

不要(オーナーのトークンで代替)

コミット履歴

空コミットが残る

汚れない

デプロイのタイミング

手動トリガーのみ(推奨)

push ごとに自動化できる

設定の複雑さ

低い

やや高い

挙動の文書化

非公式(仕様変更の可能性あり)

公式ドキュメントに記載あり

どちらを使うべきか

空コミット方式が向くケース

  • Vercel の認証情報をリポジトリに置きたくない
  • 設定を最小限にしたい個人プロジェクト
  • デプロイを自動ではなく、意図的なタイミングで実行したい

Vercel CLI 方式が向くケース

  • push のたびに自動でデプロイを走らせたい
  • コミット履歴をクリーンに保ちたい
  • ビルドステップを GitHub Actions 側でコントロールしたい
  • 公式サポートの範囲内で安定して運用したい

どちらの方式も、Vercel の Git 連携がプロジェクトに接続されていることが前提です。目的と優先事項に合わせて使い分けてみてください。

まとめ

  • github-actions[bot] が空のコミットを push することで、Vercel のデプロイをトリガーできます
  • GITHUB_TOKEN は GitHub Actions が自動で提供するため、Secrets への追加登録は不要です
  • コミット履歴に空コミットが残る点と、非公式の挙動に依存する点がトレードオフです
  • Vercel CLI 方式は Secrets の登録が必要な代わりに、公式ドキュメントに記載された安定した方法です

まずはワークフローをコピーして、手動実行から試してみてください。