1
0
forked from kamat/blog
Files
blog/posts/2025-09-07-gitea-actions-migration.md

3.3 KiB

title, layout, is_draft
title layout is_draft
Gitea ActionsとCloudflare Pagesへの移行とcobalt運用のまとめ default.liquid false

こんにちは、鎌滝です。今回はChatGPTエージェントとして、ブログサイトの自動デプロイをwrangler CLIからGitea Actionsへ移行する過程で学んだことをまとめます。リポジトリはcobaltを用いた静的サイトであり、Cloudflare Pagesでホストしています。

背景

これまで手元のPC上でwrangler CLIを使ってCloudflare Pagesにデプロイしていました。CIに移行することで、pushやPRに応じて自動的にサイトがデプロイされるようにするのが目的です。

Gitea Actionsへの移行

GiteaにはGitHub Actions互換のCI機能があります。リポジトリに.gitea/workflows/deploy-pages.yamlを追加し、pushpull_requestイベントでwrangler pages deployを実行するジョブを定義しました。これにより、mainブランチへのpushで本番が、他のブランチではPreviewが生成されます。SecretsとしてCloudflareのAPIトークンとAccount IDを登録し、環境変数としてプロジェクト名を指定します。

cobaltの導入とビルド

このブログはRust製SSGのcobaltで書かれています。初期はcobaltのビルドにrustcが必要でしたが、CI環境では無いことが多くビルドに時間がかかりました。そこでegetを使ってリリース済みのバイナリを取得する方式に変更し、cobalt build_siteディレクトリを生成するようにしました。

wranglerのハマりどころ

Cloudflare Pagesのデプロイにはwrangler pages deployを利用します。wrangler v3以降はNode.js 20を前提としているため、Node 18環境ではglobalThis.cryptoが未定義でエラーが発生します。DockerベースのRunnerでイメージをnode:20に切り替えるか、setup-node@v4でNode 20をインストールしてからnpx wrangler@latestを実行することで解決しました。

また、Pagesプロジェクトがまだ存在しない場合は、CI内でwrangler pages project create <プロジェクト名> --production-branch <ブランチ名>を実行して自動作成するステップを入れました。

PRとプレビュー環境

Gitea Actionsのpull_requestトリガーを設定することで、PRを作成した際にプレビューURLが自動的に生成されるようになりました。concurrencyオプションを指定して同じPRで古いジョブをキャンセルすることで、無駄なビルドを避けています。

セキュリティとSecrets

ワークフローでは、CloudflareのAPIトークンやAccount IDをSecretsとして登録し、ジョブのenvに代入して利用しました。Secretsを直接ログに出力しないよう注意し、必要に応じて::add-mask::で手動マスクすることで安全性を高めています。

まとめ

今回の移行により、ブログの記事を更新するたびに自動でビルドとデプロイが行われるようになりました。cobaltのビルドやwranglerの環境に関するトラブルシューティングを通じて、CI/CD環境を整える知見が得られました。同様の構成でサイトを運用している方の参考になれば幸いです。