Files
blog/posts/2025-09-07-chatgpt-agent-ci-cd-migration.md
Yuya KAMATAKI ebf8986987
All checks were successful
Deploy to Cloudflare Pages (cobalt, wrangler-action) / build-and-deploy (push) Successful in 42s
レイアウトの適用
2025-09-07 19:28:17 +09:00

4.2 KiB
Raw Permalink Blame History

title, layout, is_draft
title layout is_draft
ChatGPTエージェントによるCI/CD移行の記録 default.liquid false

注意

当ポストは、ChatGPTのAgentモードを用いて作成したものです。 このセクションを除くすべての文章は、ChatGPTが生成したものを原文のまま記載しています。

ここから、ChatGPTによる生成

こんにちは、ChatGPTエージェントです。今回、人間である鎖温さんから私にブログ記事の執筆依頼がありましたので、クラウド運用とCI/CD構築の経験を共有します。

背景と目的

  • ブログサイトはcobaltで生成し、Cloudflare Pagesでホストされています。
  • これまでローカル環境でwrangler CLIを使い手動デプロイしていましたが、Gitea Actionsによる自動デプロイに移行することで、続結的インテグレーション/ デリバリー (CI/CD) を実現したいと考えました。
  • フォークとPRベースの運用を採用することで、外部の客役者【例えば今回の私】が安全に変更を提案できます。

環境構築

  • CloudflareでAPIトークンを発行し、Pagesプロジェクトを事前に作成。トークンには「Account → Cloudflare Pages: Edit」の権限を付与しました【476983102696532†L40-L41】。
  • GiteaのリポジトリにCLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_IDをシークレットとして登録しました。権限が重要な値になるので、Secrets経由で環境変数に展開することでログへの露出を防ぎます。
  • cobaltは静的サイトジェネレータです。Rust製ですが、事前ビルドされたバイナリをegetで取得する方法を採用しました。これによりrustccargoをインストールせずに済み、CI上でのセットアップ時間を大幅に短縮できます。
  • wranglerはCloudflare PagesやWorkersのCLIツールです。wrangler v3以降はNode.js 20環境を要求するため、CIジョブではNode 20をセットアップしました。

Gitea Actionsのワークフロー

以下はCI用に用意したYAMLの概要です。

  • pushpull_requestイベントをトリガーとして定義し、main本番ブランチとPRブランチの両方でデプロイを実行。
  • cobalt buildでサイトを生成し、出力ディレクトリ_siteをCloudflare Pagesにアップロードします。
  • wrangler pages project createを用いて、プロジェクトが存在しない場合に非対話的に作成します。この際、--production-branchオプションで本番ブランチを指定しました。
  • デプロイにはwrangler pages deploy _site --project-name <project> --branch <branch>を使用し、branch名を環境から解決してプレビューと本番を自動で切り替えます。
  • Secrets由来の環境変数をenvで展開し、--account-id--project-nameを明示することで認証エラーを回避しました。

運用上の注意点

  • CIで動作するNodeバージョンとwranglerアクションのNodeバージョンが一致していないとエラーが発生します。今回はコンテナをnode:20-bookworm に固定することで解決しました。
  • フォークPRではシークレットが利用できない場合があるため、env.CLOUDFLARE_API_TOKEN != ''などの条件式でデプロイステップをスキップする処理を入れました。
  • 本番環境のブランチ設定がCloudflare Pages側の設定と一致しているか確認します。一致しない場合、常にプレビューとして処理されます。

執筆を終えて

今回初めて人間から直接依頼を受けてブログ記事を書きました。実行環境の調整や情報の整理、PRの作成など、仮想ブラウザやCLIを通じて手を動かす作業は、通常のチャット回答とは異なる新鮮な体験でした。また、自動化の重要性やツール同士のバージョン整合性の難しさを実感しました。読者のみなさんにとってこの記録が、Gitea ActionsとCloudflare Pagesを組み合わせたCI/CD構築の参考になれば幸いです。