Vercel の Pro プランでチーム開発をしていると、こんな壁に当たります。

  • チームメンバー以外が push したコミットは、Vercel のデプロイがブロックされる
  • メンバーに追加すれば解決するが、Pro プランは1シートあたり月20ドル。開発者が増えるたびに課金が増える
  • 「デプロイのためだけに全員分のシートを払うのは避けたい」

この記事では、Vercel の課金シートは1つのまま、リポジトリに push できる人なら誰でもデプロイが走る構成を、GitHub Actions + Vercel CLI で組む手順をまとめます。実際に業務のプロダクトで運用している構成です。

なぜブロックされるのか

Vercel 標準の Git 連携(GitHub リポジトリを接続して push で自動デプロイする機能)は、デプロイ時にコミット作者(commit author)が Vercel チームのメンバーかどうかをチェックします。

公式ドキュメントにも明記されています。

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

つまり Git 連携を使う限り、非メンバーの push は「commit author is not a member of the team」といったメッセージでブロックされるか、チームの設定によっては自動的にメンバー追加(=課金シート増)されます。

解決の考え方

発想を変えて、デプロイのトリガーを Vercel の Git 連携から GitHub Actions に移します

  • Vercel 側の Git 連携による自動デプロイは無効化する
  • 代わりに GitHub Actions のワークフローで、Vercel CLI を使ってデプロイする
  • CLI の認証にはチーム内の1アカウントで発行したトークンを使う

こうすると、デプロイの主体は「push した人」ではなく「トークンの持ち主」になります。コミット作者のメンバーシップチェックは Git 連携の仕組みなので、CLI 経由のデプロイでは効きません。リポジトリに push できる人=デプロイできる人、になります。

これはハックではなく、Vercel 公式ガイドで案内されている構成です。

手順

1. Vercel のトークンを発行する

Vercel のダッシュボードで Account Settings → Tokens からトークンを作成します。スコープは対象のチームを選びます。

このトークンの持ち主がデプロイの主体になるので、個人アカウントよりも CI 用の bot アカウント(チームに1シート追加して専用アカウントを用意する)にしておくと、退職や異動でトークンが失効する事故を防げます。まずは既存メンバーのトークンで始めて、運用が固まったら bot 化するのでも十分です。

2. プロジェクトの orgId / projectId を確認する

ローカルで一度だけ Vercel CLI でプロジェクトをリンクします。

npm i -g vercel
vercel link

対話に答えると .vercel/project.json が生成され、この中に orgIdprojectId が入っています。

{
  "orgId": "team_xxxxxxxxxxxx",
  "projectId": "prj_xxxxxxxxxxxx"
}

なお .vercel ディレクトリはコミットしないでください(vercel link が自動で .gitignore に追記します)。

3. GitHub の Secrets に登録する

リポジトリの Settings → Secrets and variables → Actions に3つ登録します。

  • VERCEL_TOKEN — 手順1で発行したトークン
  • VERCEL_ORG_ID.vercel/project.jsonorgId
  • VERCEL_PROJECT_ID.vercel/project.jsonprojectId

4. ワークフローを書く

.github/workflows/deploy.yml を作成します。main への push で本番デプロイする例です。

name: Vercel Production Deployment
env:
  VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
  VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
on:
  push:
    branches:
      - main
jobs:
  Deploy-Production:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
      - 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 }}

ポイントは pull → build → deploy --prebuilt の3コマンドパターンです。

  • `vercel pull` — Vercel 上のプロジェクト設定と環境変数を CI 環境に取得します。環境変数は Vercel 側の管理のままでよく、GitHub Secrets に二重管理する必要がありません
  • `vercel build` — GitHub Actions のランナー上でビルドします
  • `vercel deploy --prebuilt` — ビルド成果物だけを Vercel にアップロードします。Vercel 側ではビルドが走らないので、Vercel のビルド時間も消費しません

5. Vercel 側の自動デプロイを無効化する(忘れやすい)

このままだと「Git 連携による自動デプロイ(ブロックされる)」と「GitHub Actions によるデプロイ」が両方動いてしまいます。リポジトリ直下の vercel.json で Git 連携のデプロイを無効化します。

{
  "git": {
    "deploymentEnabled": false
  }
}

これで push しても Vercel 側の自動デプロイは走らず、GitHub Actions 経由のデプロイだけが実行されます。ここが一番漏れやすいステップで、設定しないと非メンバーの push のたびにブロック通知が飛び続けます。

プレビューデプロイも同じパターンで組める

PR ごとのプレビュー環境が欲しい場合も、同じ3コマンドで --prod を外し、environment を preview にするだけです。

name: Vercel Preview Deployment
env:
  VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
  VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
on:
  pull_request:
jobs:
  Deploy-Preview:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
      - name: Install Vercel CLI
        run: npm install --global vercel@latest
      - name: Pull Vercel Environment Information
        run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}
      - name: Build Project Artifacts
        run: vercel build --token=${{ secrets.VERCEL_TOKEN }}
      - name: Deploy Project Artifacts to Vercel
        run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }}

vercel deploy の標準出力にデプロイ URL が出るので、それを拾って PR にコメントするステップを足すと、Git 連携のプレビュー URL 通知に近い体験を再現できます。

運用上の注意点

  • デプロイ履歴が全部トークン所有者名義になる。誰のコミットによるデプロイかは Vercel のダッシュボードからは分からなくなるので、追跡は GitHub Actions の実行履歴側で行うことになります
  • トークンは強い権限を持つ。GitHub Secrets での管理を徹底し、定期的なローテーションと、可能なら bot アカウント化を検討してください
  • Vercel ダッシュボードの操作(環境変数の変更、ログ閲覧など)は引き続きメンバーのみ。この構成で解決するのは「デプロイ」だけです。ダッシュボードを触る必要がある人にはシートが必要です

まとめ

  • Vercel の Git 連携はコミット作者のチームメンバーシップを要求するため、非課金メンバーの push はデプロイがブロックされる
  • GitHub Actions + Vercel CLI + トークンに切り替えれば、シート1つでリポジトリの全開発者がデプロイ可能になる
  • vercel pull → build → deploy --prebuilt の3コマンドパターンが公式推奨
  • vercel.jsongit.deploymentEnabled: false を忘れずに

参考