🔥

hono(bun)をcloudflare workersにGitHub actions ci/cdで自動デプロイ

2024/01/31に公開

今回作成したリポジトリはこちらです
https://github.com/umaidashi/hono-workers

bunを入れる

homebrewを使っているのでbrewコマンドで入れました

$ brew install bun

Hono環境構築

手順はこのページの通り
https://hono.dev/getting-started/cloudflare-workers

bunで入れます

$ bunx create-hono hono-workers

dependenciesをinstall

$ cd hono-workers
$ bun i

Githubにこのリポジトリを作成しておいてください

CLI経由で一度デプロイ

おそらくやらなくてもデプロイできると思いますが、私は先にCLI経由でデプロイしたので書きます
といってもコマンドを打つだけです

$ bun run deploy

公開されているか確認しておいてください。

CloudflareのAPI_TOKEN発行

GitHub actionsでcloudflare workersにデプロイする際に必要なAPI_TOKENを取得します

この記事を参考にしました
https://zenn.dev/camomile_cafe/articles/ec3df91c4e7a58

Cloudflare > My Profile > API Tokens > Create Tokenに行きます

Edit Cloudflare Workersuse templateボタンを押します

権限・Roleなどを選択し生成します

Githubの環境変数に登録

Github actionsの設定ファイルに先ほど生成したAPI_TOKENを使用するのですが、ベタ書きは危ないのでリポジトリの環境変数として保存します
登録するとGithub actionsのymlファイルで`secrets.HOGEHOGEのような形で使用できます

Your Repository > Settings > Secrets and variables > Actions > New Repository secretに登録します

名前はなんでもいいですが、github actionsの設定ファイルで使用するのでわかりやすいCLOUDFLARE_API_TOKENなどがいいんじゃないでしょうか

Github actionsの設定

pushやpr作成時などをトリガーにデプロイする処理を書いていきます

詳細は以下の記事が最新でわかりやすく書かれているので、参考にしました
https://qiita.com/shun198/items/14cdba2d8e58ab96cf95#runs-on

Rootディレクトリに.github/workflowsディレクトリを作成してください

アクションを指定するymlファイルを書いていきます

名前はなんでもいいですが、deploy.ymlファイルを.github/workflows下に作成します

最終的な中身は以下のようになります

deploy.yml
name: Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    name: Deploy
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Bun
        uses: oven-sh/setup-bun@v1

      - name: Install dependencies
        run: bun install

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

少しずつ解説していきます


name: Deploy

1行目のnameはアクションの名前です

Your Repository > Actionsページのサイドバーに表示される名前になります

今回はデプロイするアクションなのでDeployにしています


on:
  push:
    branches:
      - main

これはこのアクションが発火されるタイミングを書いています

この設定では、「mainブランチにプッシュされた時」にこのactionが走ります

pr作成時など様々設定できます


jobs:
  deploy:
    runs-on: ubuntu-latest
    name: Deploy
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Bun
        uses: oven-sh/setup-bun@v1

      - name: Install dependencies
        run: bun install

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

今回は一つのジョブ(実行環境?)しか登録していませんが、jobsには複数のジョブを登録できます

deploy:の部分はジョブの名前です。自由につけられます。テストなどをやるならジョブを増やしてtestやらlintやらやってみたらいいと思います。
Actions画面ではこの名前ではなく、ジョブ内のname:が表示されるみたいです(多分)

runs-onはジョブを実行するOS(ランナー)を指定するコマンドです
詳しくないのですが、web開発ではubuntuが多いようです

ややこしいのですが、ジョブの中のname: DeployJobsの中の一つのJobの名前です。なんでもいいです

steps:の中は順に実行されます。
ジョブ詳細画面でname:に設定された処理ごとにまとまります
job詳細画面

- name: Checkout
  uses: actions/checkout@v4

usesコマンドでは人が作った処理を使うことができるので借ります

このactions/checkout@v4が何をしているかは、この記事を読んでみてください

Github actionsに関する多くの記事は、actions/checkout@v3とバージョンが3になっているものが多いですが、github actionsがNode@v16に対応しなくなるとのことなので、Node@v20に対応しているバージョン4を使いましょう

- name: Setup Bun
  uses: oven-sh/setup-bun@v1

今回はbunを使うので、そのセットアップを行います

Download, install, and setup Bun in GitHub Actions.

https://github.com/marketplace/actions/setup-bun

- name: Install dependencies
  run: bun install

actionの実行環境内でライブラリなどのインストールをします

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

いよいよデプロイを実行する処理です。
cloudflare/wrangler-action@v3はcloudflareが提供している簡単にデプロイするためのアクションです。借ります

先ほど設定したCLOUDFLARE_API_TOKENはここで使います

Wranglerの設定をする

このままでは、cloudflareが、どのアプリに対してデプロイしているのか、どのファイルをエントリーポイントとしてみればいいのかわからないので、wrangler.tomlに設定を書いていきます
wrangler.toml自体はすでにあると思います

まず、wrangler.toml.gitognoreから削除してください

bunx create-honoした時点では.gitignorewrangler.tomlが書かれてますが、github actionsで参照するので.gitignoreから削除しましょう
ただ、wrangler.tomlがリモートリポジトリにpushされるので中身には注意してください。適宜envファイルに書くなどしてください

エントリーポイントを追加する

wrangler.tomlにエントリーポイント、実行ファイル?を指定します

初期設定のpackage.jsondeployコマンドに、wrangler deploy --minify src/index.tsと書かれていると思います
初期設定ではsrc/index.tsがエントリーポイントなので、これをwrangler.tomlに追加します

wrangler.toml
name = "hono-workers"
compatibility_date = "2023-12-01"
+ main = "src/index.ts"

これで全て設定が完了です

mainブランチにpushしたらデプロイされると思います

おつかれさまでした

Discussion