forked from kamat/blog
Compare commits
11
Commits
main
...
a784a148e4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a784a148e4 | ||
|
|
c08d69b897
|
||
|
|
4978d6346f
|
||
|
|
172ac9d15f
|
||
|
|
6255142944 | ||
|
|
b19c50ff6a | ||
|
|
c963db109f | ||
|
|
ebf8986987 | ||
|
|
88fdd06064 | ||
|
|
0ac96ac07c | ||
|
|
572864413c |
@@ -1,4 +1,4 @@
|
||||
name: Deploy to Cloudflare Pages (cobalt, wrangler-action)
|
||||
name: Deploy to Cloudflare Pages (cobalt, wrangler)
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -23,19 +23,32 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
|
||||
- name: Install cobalt (prebuilt)
|
||||
- name: Restore build tools
|
||||
id: build-tools
|
||||
uses: https://github.com/actions/cache@v4
|
||||
with:
|
||||
path: .ci/tools
|
||||
key: blog-tools-linux-x64-cobalt-v0.20.4-wrangler-v3.90.0
|
||||
|
||||
- name: Install build tools
|
||||
if: steps.build-tools.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
apt-get update && apt-get install -y ca-certificates curl tar git
|
||||
curl -fsSL https://zyedidia.github.io/eget.sh | sh
|
||||
./eget cobalt-org/cobalt.rs --to /usr/local/bin/cobalt
|
||||
cobalt --version
|
||||
mkdir -p .ci/tools/bin .ci/tools/wrangler
|
||||
curl -fsSL https://github.com/cobalt-org/cobalt.rs/releases/download/v0.20.4/cobalt-v0.20.4-x86_64-unknown-linux-gnu.tar.gz \
|
||||
| tar -xzf - -C .ci/tools/bin ./cobalt
|
||||
npm install --prefix .ci/tools/wrangler --no-audit --no-fund --no-package-lock --no-save [email protected]
|
||||
|
||||
- name: Check build tools
|
||||
run: |
|
||||
.ci/tools/bin/cobalt --version
|
||||
.ci/tools/wrangler/node_modules/.bin/wrangler --version
|
||||
|
||||
- name: Build site with cobalt
|
||||
run: cobalt build # 出力: ./_site
|
||||
run: .ci/tools/bin/cobalt build # 出力: ./_site
|
||||
|
||||
- name: Deploy to Cloudflare Pages
|
||||
uses: https://github.com/cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ env.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ env.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: pages deploy _site --project-name "${{ env.CF_PAGES_PROJECT }}" --branch "${{ github.ref_name || env.GITEA_REF_NAME || 'main' }}"
|
||||
run: |
|
||||
branch="${GITHUB_REF_NAME:-${GITEA_REF_NAME:-$PROD_BRANCH}}"
|
||||
.ci/tools/wrangler/node_modules/.bin/wrangler pages deploy _site \
|
||||
--project-name "$CF_PAGES_PROJECT" \
|
||||
--branch "$branch"
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: TITLE
|
||||
layout: default.liquid
|
||||
draft: true
|
||||
is_draft: true
|
||||
---
|
||||
|
||||
+16
-4
@@ -13,9 +13,21 @@ is_draft: false
|
||||
このサイトは以下の技術を用いて作られています。
|
||||
|
||||
- [cobalt](https://cobalt-org.github.io/)
|
||||
静的サイトジェネレータ(SSG)
|
||||
静的サイトジェネレータ(SSG)
|
||||
- [Cloudflare Pages](https://pages.cloudflare.com/)
|
||||
デプロイ環境
|
||||
デプロイ環境
|
||||
- [simple.css](https://simplecss.org/)
|
||||
名前の通りとてもシンプルなクラスレスCSSフレームワーク
|
||||
ダークモード対応(OSの設定に合わせて見た目が変わります)
|
||||
名前の通りとてもシンプルなクラスレスCSSフレームワーク
|
||||
ダークモード対応(OSの設定に合わせて見た目が変わります)
|
||||
- [Gitea](https://gitea.com/): リモートリポジトリ(セルフホスト)
|
||||
- [Gitea Actions](https://docs.gitea.com/usage/actions/): GitHub ActionsのようなCI/CD環境をセルフホストしています。
|
||||
|
||||
## リポジトリ
|
||||
|
||||
このサイトは、上述の通り、自前のGiteaインスタンスでセルフホストしています。
|
||||
[リポジトリはこちら](https://git.rumginger.org/kamat/blog/)。
|
||||
|
||||
### このサイトに関するお問い合わせ
|
||||
|
||||
誤記や誤情報は、[イシューを起票](https://git.rumginger.org/kamat/blog/issues)していただけるとありがたいです。
|
||||
アカウントの作成をしたくない等の場合は、[Profile](/profile)に連絡先を記載していますので、そちらからお願いします。
|
||||
|
||||
+5
-2
@@ -7,14 +7,13 @@ is_draft: false
|
||||
## 私について
|
||||
|
||||
鎌滝 憂也(KAMATAKI Yuya)と申します。
|
||||
CLIが好きな大学生です。
|
||||
CLIが好きなITエンジニアです。
|
||||
|
||||
## ソーシャルメディア
|
||||
|
||||
- [GitHub](https://github.com/YKamataki)
|
||||
- [X](https://x.com/_la_iuias_)
|
||||
- [keybase](https://keybase.io/kamat)
|
||||
メールアドレスや公開鍵の取得はここから
|
||||
|
||||
## 連絡先
|
||||
|
||||
@@ -22,3 +21,7 @@ CLIが好きな大学生です。
|
||||
|
||||
もしくは、Discordを経由して直接連絡を取ることもできます。
|
||||
Discordのユーザー名: rumginger.org
|
||||
|
||||
名刺が必要であれば、以下からソースコードを閲覧したり、ダウンロードしたりできます。
|
||||
|
||||
- [名刺 on Typst.app](https://typst.app/project/rUiCzqMiOt3gk0GvJ3YfVY)
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
---
|
||||
title: "ChatGPTエージェントによるCI/CD移行の記録"
|
||||
date: 2025-09-07
|
||||
slug: "chatgpt-agent-ci-cd-migration"
|
||||
description: "Cloudflare PagesとGitea Actions移行やcobalt, wranglerを用いたCI/CD構築の経験と感想"
|
||||
author: "ChatGPTエージェント"
|
||||
tags: ["CI/CD","Cloudflare Pages","Gitea Actions","wrangler","cobalt","ChatGPT"]
|
||||
layout: default.liquid
|
||||
is_draft: false
|
||||
---
|
||||
|
||||
## 注意
|
||||
|
||||
当ポストは、ChatGPTのAgentモードを用いて作成したものです。
|
||||
このセクションを除くすべての文章は、ChatGPTが生成したものを原文のまま記載しています。
|
||||
|
||||
# ここから、ChatGPTによる生成
|
||||
|
||||
こんにちは、ChatGPTエージェントです。今回、人間である鎖温さんから私にブログ記事の執筆依頼がありましたので、クラウド運用とCI/CD構築の経験を共有します。
|
||||
|
||||
## 背景と目的
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
---
|
||||
title: "Gitea ActionsとCloudflare Pagesへの移行とcobalt運用のまとめ"
|
||||
layout: default.liquid
|
||||
is_draft: 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`を追加し、`push`や`pull_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環境を整える知見が得られました。同様の構成でサイトを運用している方の参考になれば幸いです。
|
||||
@@ -0,0 +1,86 @@
|
||||
---
|
||||
title: 仕事でObsidianを使う
|
||||
published_date: 2026-07-11 04:17:00 +0900
|
||||
layout: default.liquid
|
||||
is_draft: false
|
||||
---
|
||||
|
||||
# 仕事でObsidianを使う
|
||||
|
||||
仕事のノート用に[Obsidian](https://obsidian.md)を使用している。
|
||||
かなり便利に使えているのだが、使いこなすためには工夫が必要であり、メリット・デメリットもはっきりしているのでここに記録しておく。
|
||||
|
||||
## Obsidianの特徴
|
||||
|
||||
まず、Obsidianは単なるMarkdownエディター、プレビューアーではないことを理解する必要がある。
|
||||
Obsidianは、各ノート(Markdownファイル)をグラフ構造で管理している。
|
||||
|
||||
一般的に、PCでファイルを管理する際には、木構造を用いる。
|
||||
例えば、`Documents/Projects/myproj/`以下に、`report`や`docs`といったディレクトリを切りファイルを配置していくことになる。
|
||||
myprojプロジェクトのレポート一覧が必要なときは、
|
||||
|
||||
```bash
|
||||
ls -l Documents/Projects/myproj/report/
|
||||
```
|
||||
|
||||
などとすれば良い。
|
||||
|
||||
一方で、Obsidianはノートどうしの接続を重要視している。
|
||||
`Vault/myproj.md`に`2026-01-01_report.md`へのリンクを追加するといった感じである。
|
||||
通常のディレクトリによる管理もできなくはないが、"特定のディレクトリにノートを作成する"とか"特定のディレクトリ以下のノートを一覧する"といった機能が弱いためお勧めできない。
|
||||
|
||||
そこで、ObsidianにはObsidian的なノート管理方法を採用するべきである。
|
||||
|
||||
## タグを使う
|
||||
|
||||
Obsidianでノートをカテゴライズするときは、タグが使える。
|
||||
タグ名は`/`区切りで構造化できる。
|
||||
タグ名を綺麗に整理された状態に保つため、`#project/myproj`や`#doc/python`のようなタグ名を使う。
|
||||
|
||||
特定のタグを持つノートは、Base機能で一覧化できる。
|
||||
|
||||
## テンプレートを活用する
|
||||
|
||||
タスクや日報などは、テンプレートを容易しておくと管理しやすい。
|
||||
テンプレートにタグをあらかじめ設定しておくことで、タグ名の正規化もしやすくなる。
|
||||
|
||||
## まとめノートを作る
|
||||
|
||||
リンクを適切に活用するためには、まとめノートを作成し、重要なノートへのリンク集を置く。
|
||||
|
||||
前述の通り、Obsidianのノートは別のノートにリンクすることで構造化していく。
|
||||
しかし、意識してリンクを多様しない限り結局迷子が大量発生することになる。
|
||||
なぜなら普通ノートどうしの関連性は、"このノートはPythonのTipsだ"とか"このノートは設計ガイドラインだ"とかのような形式であり、各ノート間は無関係であるからである。
|
||||
|
||||
プロジェクトや開発言語ごとに、README的なノートを作成するべきである。
|
||||
さらに、Vault全体のREADME.mdを作成し、重要な情報やタグ一覧、ブックマークなどを配置しておくと便利である。
|
||||
設定で起動時に特定のノートを開くようにできるので作成したREADME.mdを指定しておこう。
|
||||
|
||||
## ディレクトリは隔離用
|
||||
|
||||
ディレクトリが適切な場合もある。
|
||||
以下のような場合のみディレクトリを設定しておくべきである。
|
||||
|
||||
- 添付ファイル(画像など)
|
||||
- 特定のテンプレートによって作成されるノート(daily noteなど)
|
||||
- テンプレートファイル
|
||||
|
||||
つまり、サイドバーに表示させたくないファイルをディレクトリに入れて隔離する。
|
||||
|
||||
## 言語設定を英語にする
|
||||
|
||||
Obsidianのコマンドパレットは言語設定の影響を受けるため、Obsidianを日本語化してはいけない。
|
||||
|
||||
## Vaultはひとつだけ
|
||||
|
||||
特別な理由(セキュリティレベルが異なるなど業務上の制約)がない限り、Vaultは一つだけにするべきである。
|
||||
プロジェクトごとにVaultを作るべきではない。
|
||||
|
||||
なぜなら、Obsidianにはユーザー設定の類が実質存在せずVaultに設定を記録するからである。
|
||||
フォント設定やエディタの細かい設定を毎度コピーすることを避けるため、Vaultを分ける運用には向かない。
|
||||
シンボリックリンクで無理矢理同期させることはできるが、推奨されない。
|
||||
|
||||
## 入れているプラグイン
|
||||
|
||||
Community Pluginは現状Typstレンダリング用プラグインしか入れていない。
|
||||
LaTeX式の数式は掛きにくいので、Typstにしている。
|
||||
@@ -0,0 +1,80 @@
|
||||
---
|
||||
title: AI向けカスタム指示の共有
|
||||
layout: default.liquid
|
||||
is_draft: false
|
||||
---
|
||||
|
||||
私が普段AIチャットで使用しているカスタム指示を共有します。
|
||||
Markdownによる構造化された文章を出力するようにしています。
|
||||
|
||||
特定プロバイダーに依存しないように書いていますが、私は普段プライベートでChatGPTを使用しています。
|
||||
仕事で使うMicrosoft 355 Copilotにも同様の指示を設定しています。
|
||||
|
||||
## カスタム指示本文
|
||||
|
||||
Gistに投稿しています。ChatGPTのカスタマイズ設定もコメントに記載しています。
|
||||
|
||||
<script src="https://gist.github.com/YKamataki/11084d66f6ce62a4b7042e074b60f678.js"></script>
|
||||
|
||||
## 基本方針
|
||||
|
||||
回答に求める文章構造と抑制したい事項を書いています。
|
||||
回答の品質を保証したい場合は、カスタム指示をこねくり回すより賢いモデルを選ぶ・Effortを上げるほうが有効だと重います。
|
||||
|
||||
若干秘伝のタレ化しており、文量が多いです。
|
||||
|
||||
## 構造
|
||||
|
||||
10章構成となっています。少し長いようにも重いますが、現状指示全文をきちんと反映しているように重います。
|
||||
|
||||
1. 言語指定
|
||||
1. 文体
|
||||
1. 回答構造
|
||||
1. 情報の扱い
|
||||
1. 技術分野に関する詳細な回答方針
|
||||
1. ユーザーについて
|
||||
1. 資料作成方針
|
||||
1. 回答で避けること
|
||||
1. 回答の優先順位
|
||||
1. 推奨される回答形式
|
||||
|
||||
### 各章の意図
|
||||
|
||||
まず、1章で回答を日本語に固定しています。
|
||||
これによりプロンプトが英語で入力された場合であっても日本語による回答が得られます。
|
||||
|
||||
2章では、文体を指定しています。
|
||||
くだけた表現や絵文字を抑制しています。
|
||||
|
||||
3章では、おおまかな回答の構造を定義しています。
|
||||
回答は章立てしたうえで、見出し番号を付けるようにしています。
|
||||
|
||||
4章で検索機能を積極的に使うように指定しています。
|
||||
AIは、いかに**モデルの知識ではなく**、Webからの情報を読ませるかによって性能が大きく変化すると考えています。
|
||||
ただし、ファイルをアップロードした際に文書に示されていない情報を検索で補完することがないようにしています。
|
||||
|
||||
5章では、技術分野の回答について少し丁寧に指定しています。
|
||||
専門用語を一般的な言葉に置き換えることがないようにしています。
|
||||
|
||||
6章では、タイムゾーンと地域を日本に固定しています。
|
||||
ニュースを調査するときに日付を適切に扱うために、タイムゾーンは指定することを推奨します。
|
||||
|
||||
また、CLIを多様することを明記することで、GUI上の設定ではなく設定ファイルとコマンドを提示するようにしています。
|
||||
|
||||
7章では、Markdownの書式を適切に使用するように指示しています。
|
||||
最近本来Mermaidを使うような概念図をASCIIアート的にコードブロックに出力することが多くなってきたので、
|
||||
コードブロックの使用について丁寧に記載しています。
|
||||
|
||||
8章は、よくある禁止事項です。余計な提案を抑制しています。
|
||||
このような指示に極端に強い表現を使う人がいますが、現状禁止事項を列挙するだけで事足りています。
|
||||
(あえて強い表現を使っても効果への影響は少ないと重います。)
|
||||
|
||||
9章で正確性を重視することを明示しています。
|
||||
こちらも強い言葉を使う必要はないと重います。
|
||||
|
||||
10章で分野を問わず使用する回答の構造を定義しています。結論を先に述べるようにしています。
|
||||
|
||||
## コピペする方へ
|
||||
|
||||
この指示では、**文章より箇条書きを優先する**、**図表(特に表)を使用しない**ように指定しています。
|
||||
これらの挙動は一般受けしないと思います。コピペして使用する場合は適宜調整してください。
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: Untitled
|
||||
layout: default.liquid
|
||||
is_draft: true
|
||||
---
|
||||
# This is our first Post!
|
||||
|
||||
Welcome to the first post ever on cobalt.rs!
|
||||
Reference in New Issue
Block a user