From 2243e39e76a7b1a40c17c28af74d1678f4f1ba8c Mon Sep 17 00:00:00 2001 From: Gui <51219838+gui-ace@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:17:54 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20CMS=E3=82=92editorial=20workflow?= =?UTF-8?q?=E3=81=B8=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cms-content-pr.yml | 83 ---------------------------- AGENTS.md | 3 + README.md | 15 +++-- docs/cms-write-workflow.md | 27 +++++++++ public/admin/config.yml | 4 +- scripts/write-cms-runtime-config.mjs | 4 +- 6 files changed, 44 insertions(+), 92 deletions(-) delete mode 100644 .github/workflows/cms-content-pr.yml create mode 100644 docs/cms-write-workflow.md diff --git a/.github/workflows/cms-content-pr.yml b/.github/workflows/cms-content-pr.yml deleted file mode 100644 index cafcb3a..0000000 --- a/.github/workflows/cms-content-pr.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: CMS Content PR - -on: - push: - branches: - - cms-content - -permissions: - contents: read - pull-requests: write - -jobs: - open-pr: - runs-on: ubuntu-latest - - steps: - - name: Check out CMS branch - uses: actions/checkout@v4 - with: - ref: cms-content - fetch-depth: 0 - - - name: Create pull request for CMS changes - env: - GH_TOKEN: ${{ secrets.CMS_PR_TOKEN || github.token }} - REPO: ${{ github.repository }} - BASE_BRANCH: main - HEAD_BRANCH: cms-content - run: | - set -euo pipefail - - owner="${REPO%%/*}" - git fetch origin "$BASE_BRANCH" - - if git diff --quiet "origin/$BASE_BRANCH...HEAD"; then - echo "No CMS changes to publish." - exit 0 - fi - - existing_pr="$( - gh pr list \ - --repo "$REPO" \ - --head "$owner:$HEAD_BRANCH" \ - --base "$BASE_BRANCH" \ - --state open \ - --json number \ - --jq '.[0].number // ""' - )" - - if [ -n "$existing_pr" ]; then - echo "CMS pull request already exists: #$existing_pr" - exit 0 - fi - - body_file="${RUNNER_TEMP}/cms-content-pr.md" - cat > "$body_file" <<'BODY' - ## 関連 Issue - - なし - - ## 概要 - - Sveltia CMS から `cms-content` ブランチに保存された編集内容を `main` に反映します。 - - ## 主な変更点 - - - CMS で保存された記事、ページ文言、著者、タグ、アップロード画像など - - ## 確認したこと - - - 自動作成 PR のため未実施 - - ## 未確認事項・補足 - - - レビュー後、通常の merge commit または rebase merge でマージしてください。squash merge では `cms: ...` commit subject が失われ、翻訳 PR task の自動検出対象外になる場合があります。 - BODY - - gh pr create \ - --repo "$REPO" \ - --base "$BASE_BRANCH" \ - --head "$owner:$HEAD_BRANCH" \ - --title "CMS編集内容を反映" \ - --body-file "$body_file" diff --git a/AGENTS.md b/AGENTS.md index c24c383..5ec29d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,6 +27,9 @@ - 翻訳ファイルは `src/i18n/translations/{locale}.json` に集約されている。日本語 source のキー構造と翻訳側のキー構造を揃える。 - サイト文言を CMS から編集可能にする場合は `public/admin/config.yml` も更新し、対応する JSON key とフィールド名を揃える。 - CMS の日時、キャンペーン、告知、募集枠など期間制御が必要な情報は、表示開始と表示終了を CMS から扱える設計にする。 +- CMS backend の publication branch は `main` にし、`publish_mode: editorial_workflow` で短命な CMS branch と PR を作らせる。 +- `cms-content` のような恒久的な CMS 投稿受け皿 branch は使わない。 +- CMS PR は merge commit または rebase merge で `main` に入れる。squash merge では `cms: ...` commit subject が失われ、翻訳 PR task の自動検出対象外になる場合がある。 - 翻訳作業だけを依頼された場合は、日本語 source を勝手に変更しない。placeholder、URL、コード風 token、製品名は壊さない。 - ブログやニュースを増やす場合は、タグ、関連記事、内部リンク、CTA、Pagefind への影響を確認する。 diff --git a/README.md b/README.md index a4c9d27..52a4188 100644 --- a/README.md +++ b/README.md @@ -108,11 +108,15 @@ src/ #### 本番 CMS の保存と PR 反映 -- 本番 CMS の保存先は `cms-content` ブランチです。`main` は protected branch のため、CMS から直接 commit しません。 -- `cms-content` に保存されると `.github/workflows/cms-content-pr.yml` が `main` 向けの「CMS編集内容を反映」PRを作成します。既に open PR がある場合は二重作成しません。 -- 初回セットアップやブランチ再作成が必要な場合は、`main` の最新状態から `git fetch origin main`、`git push origin origin/main:refs/heads/cms-content` で `cms-content` を用意します。 +- 本番ソースの正は `main` です。Cloudflare Pages の production deploy 元も GitHub 連携の `main` にします。 +- Sveltia CMS は `backend.branch: main` と `publish_mode: editorial_workflow` で運用します。 +- CMS 保存時は `cms/...` のような短命 branch と PR が作られ、`main` に直接 commit しません。 +- 恒久的な `cms-content` 投稿受け皿 branch は使いません。 - CMS PR は通常の merge commit または rebase merge でマージします。squash merge では `cms: ...` commit subject が失われ、翻訳 PR task の自動検出対象外になる場合があります。 -- GitHub Actions の `GITHUB_TOKEN` で PR 作成が許可されていない環境では、Repository settings の Actions 権限を見直すか、PR 作成権限を持つ `CMS_PR_TOKEN` secret を設定します。 +- CMS PR が `main` に merge されると、Cloudflare Pages が GitHub `main` push を受けて production deploy します。 +- 既存の remote `cms-content` branch は、この変更の反映後に未反映差分がないことを確認して削除候補にします。 + +運用判断は [docs/cms-write-workflow.md](docs/cms-write-workflow.md) を参照してください。 #### キャンペーン告知の運用 @@ -149,7 +153,7 @@ author: 'author-id' Sveltia CMS は日本語ソース記事と日本語の固定ページ文言を編集できます。多言語記事本文とページ文言は GitHub Copilot coding agent が作成する Pull Request ベースで管理します。PR 量を抑えるため、push 連動の対象は Sveltia CMS の `cms: ...` commit だけに限定します。 1. 日本語ソースを Sveltia CMS で更新する -2. CMS commit が `cms-content` ブランチに保存され、GitHub Actions が `main` 向け PR を作成する +2. editorial workflow が短命な CMS branch と `main` 向け PR を作成する 3. CMS PR を `main` にマージすると、CMS commit の本文差分または日本語文言 key 差分だけを GitHub Actions が検出する 4. Copilot coding agent が該当差分だけに沿って `src/content/blog/{locale}/` または `src/i18n/translations/{locale}.json` を更新する 5. 完了時に `[translation]` PR が ready for review になったら、内容とビルドを確認してから必要に応じて手動マージする @@ -159,7 +163,6 @@ Sveltia CMS は日本語ソース記事と日本語の固定ページ文言を ### 自動 PR task workflow - Workflow: `.github/workflows/create-translation-prs.yml` -- CMS PR Workflow: `.github/workflows/cms-content-pr.yml` - Script: `scripts/create-translation-prs.mjs` - Trigger: `src/content/blog/*.md` または `src/i18n/source/ja/**/*.json` の `main` 反映時。ただし自動実行は Sveltia CMS の `cms: ...` commit のみ - CMS commit と通常 commit が同じ push に混在した場合は、自動翻訳 PR task を作成せず workflow を止める。CMS PR の merge commit はこの判定から除外する diff --git a/docs/cms-write-workflow.md b/docs/cms-write-workflow.md new file mode 100644 index 0000000..9fc9bba --- /dev/null +++ b/docs/cms-write-workflow.md @@ -0,0 +1,27 @@ +# CMS 書き込み branch 運用 + +最終確認日: 2026-06-19 + +## 方針 + +`main` は本番ソースの唯一の正にします。Cloudflare Pages の production deploy 元も GitHub 連携の `main` だけにします。 + +Sveltia CMS は `backend.branch: main` と `publish_mode: editorial_workflow` で運用します。CMS 保存は恒久的な投稿受け皿 branch ではなく、短命な `cms/...` branch と PR として扱います。 + +`cms-content` は恒久運用しません。既存 remote branch は、この変更が `main` に反映され、未反映差分や open PR がないことを確認してから削除候補にします。 + +## 現行フロー + +1. Sveltia CMS が `main` を publication branch として読み込む。 +2. CMS 保存時、editorial workflow が短命な CMS branch と PR を作る。 +3. CMS PR を merge commit または rebase merge で `main` に入れる。 +4. `main` push を受けて Cloudflare Pages が production deploy する。 +5. `src/content/blog/*.md` または `src/i18n/source/ja/**/*.json` の CMS commit を検出した場合、翻訳 PR task が作成される。 + +CMS PR は squash merge しません。squash merge では `cms: ...` commit subject が失われ、翻訳 PR task の自動検出対象外になる場合があります。 + +## 残る制約 + +現在の Sveltia CMS は GitHub OAuth 経由で保存します。editorial workflow により `main` 直 commit は避けられますが、PR branch 作成の actor は編集者個人の GitHub 権限です。 + +編集者個人ではなく専用 bot / GitHub App / backend actor に完全移行したい場合は、CMS 保存を受ける backend を別途実装し、その backend が content-only PR を作る形にします。 diff --git a/public/admin/config.yml b/public/admin/config.yml index 987838b..3b1e10a 100644 --- a/public/admin/config.yml +++ b/public/admin/config.yml @@ -3,7 +3,7 @@ backend: name: github repo: acecore-systems/acecore-net - branch: cms-content + branch: main base_url: https://sveltia-cms-auth.sparkling-tree-7cef.workers.dev auth_methods: [oauth] commit_messages: @@ -13,6 +13,8 @@ backend: uploadMedia: 'cms: upload "{{path}}"' deleteMedia: 'cms: delete media "{{path}}"' +publish_mode: editorial_workflow + media_folder: /public/uploads public_folder: /uploads diff --git a/scripts/write-cms-runtime-config.mjs b/scripts/write-cms-runtime-config.mjs index 783fd9b..aff8888 100644 --- a/scripts/write-cms-runtime-config.mjs +++ b/scripts/write-cms-runtime-config.mjs @@ -1,14 +1,14 @@ import { mkdir, writeFile } from 'node:fs/promises' import { dirname, resolve } from 'node:path' -const defaultCmsBranch = 'cms-content' +const defaultCmsBranch = 'main' const deploymentBranch = process.env.CF_PAGES_BRANCH || process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME || process.env.BRANCH const cmsBranch = - process.env.CMS_CONTENT_BRANCH || + process.env.CMS_BACKEND_BRANCH || (deploymentBranch && deploymentBranch !== 'main' ? deploymentBranch : defaultCmsBranch)