A
review

GitHub Actions と Google Drive 連携による Markdown 自動取り込みレポート

R
Relation
#automation #github-actions #google-drive #astro #report

導入の背景

  • Astro ベースの技術ブログに、継続的に Markdown 記事を追加したい。
  • 記事本文は主に ChatGPT で生成し、最終的には .md として GitHub で管理したい。
  • PC だけでなく iPhone からも投稿できるようにしたいため、GitHub への直接コミットではなく、Google Drive を「一時置き場」として使うワークフローを検討した。
  • 手動フロー(調査 → md 作成 → Git へコミット・プッシュ)が重いため、**「Drive に md を置くだけでブログに反映される状態」**を目標に検証を行った。

1. 試したことの概要

今回の検証では、以下の 4 フェーズに分けて段階的に動作確認を行った。

  1. フェーズ1:GitHub Actions の基本動作確認

    • .github/workflows/test-actions.yml を作成。
    • on: workflow_dispatch で手動実行できるようにし、echo "Hello from GitHub Actions 🎉" を実行。
    • Actions のログ上でメッセージが出力されることを確認し、「まずは CI が動いているか」を明確にした。
  2. フェーズ2:Node.js スクリプトの実行確認

    • scripts/fetch-from-drive.mjs を作成し、console.log("Node script is running from GitHub Actions! 🚀"); を出力するだけのダミー実装に。
    • package.json"fetch-from-drive": "node scripts/fetch-from-drive.mjs" を追加。
    • Actions 側で Node.js のセットアップ (actions/setup-node@v4) と npm install を行い、npm run fetch-from-drive を実行できることを確認した。
  3. フェーズ3:ローカル md → blog ディレクトリへのコピー & 自動コミット

    • リポジトリ直下に raw-md/ を作成し、テスト用の sample.md を配置。
    • Node スクリプトで raw-md/*.md を読み込み、src/content/blog/ へコピーする処理を実装。
    • 変更があった場合のみ、Actions 側から git add / commit / push を実行するようにした。
    • permissions: contents: write をジョブに付与することで、github-actions[bot] からの push を許可。
    • Actions 実行後、GitHub 上で src/content/blog/sample.md が新規コミットとして追加されていることを確認した。
  4. フェーズ4:Google Drive 連携(フォルダ一覧 → md ダウンロード)

    • Google Cloud Console で新規プロジェクトを作成し、Google Drive API を有効化。
    • サービスアカウントを作成し、JSON キーを発行。
    • Google Drive 上に blog-md-articles のようなフォルダを作成し、サービスアカウントの client_email を共有設定に追加。
    • フォルダ URL からフォルダ ID を取得し、GitHub Secrets に以下の 2 つを登録:
      • GDRIVE_SERVICE_ACCOUNT_JSON:サービスアカウント JSON の中身
      • GDRIVE_FOLDER_ID:対象フォルダの ID
    • googleapispackage.json に追加し、scripts/fetch-from-drive-test.mjs で Drive API を使ってフォルダ内ファイルの一覧をログに出力。
    • 最終的に scripts/fetch-from-drive.mjs を以下のように実装:
      • Drive フォルダ内の .md を列挙
      • まだ存在しないファイルだけ src/content/blog/ にダウンロード
      • 1 件以上ダウンロードされた場合のみ、git commit & git push を実行

2. 実際にやってみてどうだったか

2-1. 良かった点

  • 段階的にフェーズを分けたのが正解

    • いきなり Drive 連携までやろうとせず、まずは echo → Node 実行 → ローカルコピー → Drive アクセス、と少しずつ確認したことで、どこで壊れているかが追いやすかった。
  • GitHub Actions からの Node 実行はスムーズ

    • actions/setup-nodenpm install の組み合わせで、ローカルとほぼ同じ感覚でスクリプトを動かせた。
    • Node ベースなので、今後の拡張(Frontmatter のバリデーション、lint、通知など)も実装しやすい。
  • Google Drive を「投稿用インボックス」として使える形が見えてきた

    • iPhone / PC から Google Drive に .md を置くだけ。
    • Actions を手動実行 or schedule で回せば、自動で src/content/blog に入ってくる。
    • 将来的には「iPhone ショートカットで ChatGPT → Drive 保存」を組み合わせることで、かなり軽い投稿フローが作れそう。

2-2. ハマりポイント / 課題

  • git push の 403(Write access to repository not granted)

    • 最初は commit までは成功するが、git push で 403 が出ていた。
    • 原因は以下の 2 点:
      • ジョブ側に permissions: contents: write を付けていなかった。
      • リポジトリ設定の「Actions → Workflow permissions」が Read のままだった。
    • どちらも修正後は問題なく push できるようになった。
  • package-lock.json と依存関係のズレによる本番ビルド失敗

    • package.jsongoogleapis を追加しただけの状態でビルドすると、
      npm error Missing: googleapis@... from lock file といったエラーが発生。
    • ローカルで一度 npm install を実行し、package-lock.json を更新してコミットすることで解消。
    • UI 上だけで lock ファイルをいじるのは現実的ではないので、ここはローカルで対応するのが無難。
  • Drive 側の「処理済み管理」はまだシンプルな状態

    • 現状は「src/content/blog に同名ファイルが存在する場合はスキップ」というだけの制御。
    • 記事の更新(同名ファイルの上書き)や、Drive 側での _processed フォルダ移動などは未対応。

2-3. 体感的なフローの変化

  • これまでは:
    • 調査 → エディタで md 作成 → Git で add / commit / push → デプロイ待ち
  • 構築後は:
    • 調査 → ChatGPT で md 生成 → Drive フォルダに md を置く → Actions を実行(手動 or 自動)
  • 「Git の操作」と「リポジトリを開く」というステップが、かなり後ろに隠蔽された感覚がある。

3. 定量的な変化(あれば)

厳密な数字は取っていないが、ざっくりとした印象は以下の通り。

  • 1 記事あたりの「Git 操作時間」がほぼゼロになった

    • これまでは git add / git commit / git push を毎回手で実行していた。
    • 今回の仕組みでは、Git 操作はすべて GitHub Actions 側に寄せられるため、投稿者は「md を Drive に置く」だけで済む。
  • ミスの種類が変わる(減る方向)

    • 以前は「コミットし忘れ」「間違ったブランチに push した」など、Git 周りのヒューマンエラーが起き得た。
    • 今回は「Drive に md を置き忘れた」「Frontmatter を書き忘れた」など、もう少し限定されたミスに集約される。
  • 投稿のハードルは確実に下がった

    • 特に iPhone から投稿する場合、Git クライアントやブラウザ上での複雑な操作をしなくてよくなる点が大きい。

4. 結論と今後の展望

4-1. 現時点の結論

  • 「Google Drive に md を置く → GitHub Actions で自動取り込み」という流れは実現可能であり、実際に動作している。
  • Actions のワークフローや Drive API 周りの設定は多少手間だが、
    一度構築してしまえば、以降はかなり軽い運用で記事追加ができそう。
  • 無料枠の範囲内で完結できる構成であり、ランニングコストの面でも現実的。

4-2. 採用方針

  • 個人ブログや小規模な技術ブログにおいては、「採用」方針でよさそう
  • 特に、iPhone からの投稿や、非エンジニアに記事を書いてもらうようなケースでは、Git への直接コミットよりも運用しやすい。

4-3. 今後の対応方針・追加でやりたいこと

  • Drive 側での「処理済みフォルダ」運用

    • ダウンロード済みの md を _processed フォルダへ自動移動する。
    • 誤って二重取り込みしないようにする。
  • md 更新時の上書き / 差分管理

    • updatedDate だけが更新されたケースなどにどう対応するか。
    • 同名ファイルが存在する場合に「上書き」か「スキップ」かを選べるようにする。
  • iPhone ショートカット連携

    • テーマ入力 → ChatGPT API 呼び出し → md 生成 → Drive に保存、までを一気に流す。
    • 最終的には「ホーム画面のアイコンをタップ → 記事下書きが Drive にできている」というレベルまで自動化したい。
  • 記事の品質チェック / 自動補正

    • Actions 内で Markdown lint や Frontmatter チェックを挟み、
      必須項目(title / description / tags など)の漏れを検出する。

今回の検証で、「GitHub Actions と Google Drive を組み合わせた、Astro ブログ用の md 自動取り込みフロー」 の土台はほぼできあがった。
あとは運用しながら、小さな改善(エラー時の通知、処理済み管理、ショートカット連携など)を積み重ねていくことで、
「調査した内容をサクッとブログに残せる」仕組みに育てていきたい。