egashira.dev
Published on

Vercel bot がデプロイした後に任意の処理を実行する

はじめに

ホスティングサービス Vercel には GitHub 連携機能があり、連携済みの GitHub リポジトリへの push や Pull Request などをトリガーに自動でデプロイを行ってくれる。ちなみに本サイトも Vercel でホスティングしている。ある時に、この Vercel bot のデプロイ後に何かしら処理を行いたい場合、ググってもあまり情報が出てこなくて困ったので記事にしてみる。

結論

GitHub Actions で deployment_status というイベントをトリガーとすることで実現できる。

.github/workflows/deploy-after-action.yaml
name: Handle after Vercel bot deploys

on: [deployment_status]

jobs:
  Handle:
    name: handle
    runs-on: ubuntu-latest
    steps:
      # One or several steps

公式の関連するドキュメントを見つけたので記載しておく。

How Do I Get Notified When My Vercel Deployment Fails? – Vercel Docs

Vercel bot は何をしているのか

結論から先に言ってしまったが、具体的にどういう流れになるのか追っていこうと思う。

先程述べた Vercel の自動デプロイは push や Pull Reuqest をトリガーとして Vercel bot という GitHub App が担っている。

GitHub Apps - Vercel

仕組みとしては、ある決まったイベントをトリガーに Vercel bot が GitHub API をコールすることで Pull Reuqest へのコメントやデプロイを実現している。この Vercel bot は通常 CI/CD を構築する手間を削減してくれる一方で、ユーザ側からは隠蔽されている。

いろんなユースケース

Vercel bot のデプロイ後の処理で考えられるユースケースとその実現方法について検討してみたので記載する。

デプロイ結果によって処理を分けたい場合

ワークフロー構文の if 条件を付けることで Vercel bot のデプロイが成功した場合と、失敗した場合の処理を分けることができる。例えば下記のようなことが考えられる。

  • デプロイが成功したらブログの更新を Twitter に投稿する
  • デプロイが失敗したら Slack へ通知する
.github/workflows/deploy-after-action.yaml
name: Handle after Vercel bot deploys

on: [deployment_status]

jobs:
  success-job:
    name: In case of successful
    runs-on: ubuntu-latest
    if: github.event.deployment_status.state == 'success'
    steps:
      # One or several steps
  failure-job:
    name: In case of failure
    runs-on: ubuntu-latest
    if: github.event.deployment_status.state == 'failure'
    steps:
      # One or several steps

特定のブランチでフィルタリングしたい場合

通常 push や Pull Request では下記のようにできる。

on:
  push:
    branches:
      - main
      - 'feature/**'

しかし、deployment_status では、ブランチによるイベントのフィルタができない。回避策としては、デプロイする環境でデフォルトブランチ(main/master)とそれ以外で区別する。

2022/05 現在ではそれしか対処法がないと思うが、もしこうやったらできるよという対策があれば教えていただきたい:pray:

.github/workflows/deploy-after-action.yaml
name: Handle after Vercel bot deploys

on: [deployment_status]

jobs:
  production-env:
    name: In case of production
    runs-on: ubuntu-latest
    if: github.event.deployment.environment == 'Prorduction'
    steps:
      # One or several steps
  preview-env:
    name: In case of preview
    runs-on: ubuntu-latest
    if: github.event.deployment.environment == 'Preview'
    steps:
      # One or several steps

まとめ

Vercel bot のデプロイ後に処理をする方法について検討してみた。微妙に痒いところに手が届かず、詳細に制御したい場合は内部でロジックを組み立てる必要がありそう。

参考