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

48 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "ChatGPTエージェントによるCI/CD移行の記録"
layout: default.liquid
is_draft: 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_TOKEN``CLOUDFLARE_ACCOUNT_ID`をシークレットとして登録しました。権限が重要な値になるので、Secrets経由で環境変数に展開することでログへの露出を防ぎます。
- `cobalt`は静的サイトジェネレータです。Rust製ですが、事前ビルドされたバイナリを`eget`で取得する方法を採用しました。これにより`rustc``cargo`をインストールせずに済み、CI上でのセットアップ時間を大幅に短縮できます。
- `wrangler`はCloudflare PagesやWorkersのCLIツールです。wrangler v3以降はNode.js 20環境を要求するため、CIジョブではNode 20をセットアップしました。
## Gitea Actionsのワークフロー
以下はCI用に用意したYAMLの概要です。
- `push``pull_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構築の参考になれば幸いです。