Deno Deploy の auto deploy を GitHub Actions に移行した

Deno Deploy の auto deploy を GitHub Actions に移行した

背景

Deno.cron()Deno.openKv() を使ったDiscord botをDeno Deploy (classic) で運用していた。

問題

Deno DeployのGitHub連携(auto deploy)を使っていると、PRを出すたびにpreview deploymentが走る。しかしこのbotはHTTPエンドポイントがなく、cronベースの起動のためpreviewでは動作しない。

Deno Deployのログには毎回こんなエラーが出ていた。

Crons are not supported for preview deployments. Cron jobs will not be executed in this context.
isolate start time: 35.68 ms

Deno.cron() を含むコードをpreviewにデプロイしようとして ISOLATE_INTERNAL_FAILURE になっていた。加えてPRのチェック欄に @deno-deploy — Failed to deploy が常に出るのも地味につらい。

対応

Deno KVに依存しているためDeno Deploy自体は維持しつつ、デプロイのトリガーをGitHub Actionsに移行した。

Before: GitHub push → Deno Deploy auto deploy(preview含む)
After:  GitHub push to main → GitHub Actions → Deno Deploy(productionのみ)

試行錯誤

Deno Deployの設定を見るとGitHub連携を使う場合、auto deploy設定ありでpreviewの切り替えもできないように思える。そのためunlinkしてGitHub Actionsに切り替える対応しか出来なさそう。

そして、GitHub連携を解除すると当然ながらOIDCは使えない。

最初はGitHub Actionのラッパーのdenoland/deployctlを利用しようとした。

しかし、denoland/deployctl GitHub Action (v1.13.1) はOIDC専用の設計で、tokenwith: で渡せない。

Error: Failed to get the GitHub OIDC token.

そこでGitHub Actionのラッパーを使わず、deployctl CLIを直接 deno run で呼ぶ方法に切り替え。DENO_DEPLOY_TOKEN を環境変数で渡せばトークン認証できる。

ただし deployctl はデフォルトでpreviewとしてデプロイするため、そのままでは同じエラーが発生する。--prod フラグを追加して production deployment として直接デプロイすることで解決した。

最終的な構成

# .github/workflows/deploy.yml
name: Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x
      - name: Deploy to Deno Deploy
        run: deno run -Ar jsr:@deno/deployctl deploy --project=<project-name> --prod main.ts
        env:
          DENO_DEPLOY_TOKEN: ${{ secrets.DENO_DEPLOY_TOKEN }}

Deno Deploy側はプロジェクトの Settings → Git → デプロイモードを GitHub Actions に変更し、GitHubのSecretsに DENO_DEPLOY_TOKEN を登録するだけ。

まとめ

auto deploy(before)GitHub Actions(after)
PR時の挙動preview deployが走る何も起きない
mainマージ時production deployGitHub Actions経由でproduction deploy
PRチェック@deno-deploy Failed が出る出ない

cron駆動・画面なしのbotにpreview deploymentは不要。--prod フラグ一つで解決した。通常のWebサービスと違い、botはPRレビューでコードチェックが完結しているので、mainマージ時点で即production deployするのがシンプルでよい。