くまがいブログ

エンジニアに目指す社会人

GitHub Actions を使って Gemini API で週報を自動生成する

目次


はじめに


この記事は「HCの月報を簡単にしてみよう」「GitHub Actions を使って Gemini API で月報を自動生成する」の続きの記事です。

日報を蓄積した Markdown ファイルを週単位でまとめ、自動的に「週報」を生成・コミットする仕組みを構築します。

詳細コードはリポジトリを参照してください。ここでは要点と必要最小限のコードを紹介します。

1. プロジェクトの目的


  • 日報(YYYY/MM/DD.md)を管理
    • 毎日の学習や作業を Markdown 形式で保存
  • 週ごとのマージ & 要約 → 週報生成
    • GitHub Actions + Gemini API で文章を自動生成し、週報を自動コミット
    • 手動で文章をまとめる手間を削減し、振り返り精度を向上

2. 全体の流れ


  1. 手動トリガー
    • workflow_dispatch で「週の開始曜日」「対象週(last_week/this_week)」を入力
  2. シェルスクリプトで期間計算
    • date -d を使い、START_DATE(週初)と END_DATE(週末)を算出
    • 例(「金曜始まり」「先週」):
      END_DATE=$(date -d "last friday" +'%Y/%m/%d')
      START_DATE=$(date -d "$END_DATE - 6 days" +'%Y/%m/%d')
      
  3. 日報ファイルをマージ
    • merged/weekly_{開始日}_to_{終了日}.md を作成
    • 期間内の各 YYYY/MM/DD.md を以下のように追記(見出し+区切り線)
      echo "---" >> merged_file.md
      echo "# 2025/06/01" >> merged_file.md
      cat "2025/06/01.md" >> merged_file.md
      
    • 該当ファイルがなければワークフローを停止
  4. プロンプト文字列を生成
    • weekly_report_template.txt(テンプレート) + マージ済み日報 を組み合わせ、merged/tmp_prompt.txt に保存
    • 例:
      TEMPLATE=$(< weekly_report_template.txt)
      MERGED=$(< merged/weekly_…md)
      echo -e "テンプレート:\\n${TEMPLATE}\\n対象:\\n${MERGED}" > merged/tmp_prompt.txt
      
  5. Gemini API 呼び出し → 要約取得
    • curljq で JSON ペイロードを作成し POST
    • 成功時に .candidates[0].content.parts[0].textGENERATED_CONTENT として取得
  6. 週報ファイルを .txt で書き出し
    • weekly_report/{開始日}to{終了日}.txt を作成し、要約文を保存
  7. Git コミット & プッシュ
    • Bot ユーザーでコミットし、origin main にプッシュ
    • git diff --cached --quiet で差分確認 → 差分がない場合はコミットスキップ

3. 必要なファイル構成例


  • .github/workflows/generate_weekly_report.yml
    • ワークフロー定義(手動トリガー/期間計算/マージ/AI 呼び出し/コミット)
  • weekly_report_template.txt
    • 週報のフォーマット見本(プレーンテキスト)
  • YYYY/MM/DD.md(日報)
    • 毎日の学習記録ファイル
  • (出力)merged/weekly_…mdmerged/tmp_prompt.txt
  • (出力)weekly_report/2025-05-26to2025-06-01.txt など

※詳細なディレクトリ構造や完全なコードはリポジトリ内をご確認ください。

4. 実装上のポイント


  1. シェルで日付計算
    • date -d "last friday" などを使い、曜日ベースで柔軟に期間を取得
    • タイムゾーンは必要に応じて TZ=Asia/Tokyo を指定すると安全
  2. ファイルマージ時のフォーマット
    • --# YYYY/MM/DD を挿入して日付を明示
    • AI が要約しやすいよう、「テンプレート」「対象の内容」を明示的に分ける
  3. Gemini API 呼び出しのエラー処理
    • HTTP ステータスが 2xx 以外ならワークフローを失敗
    • レスポンスが空文字や JSON 形式ではない場合もエラーとして扱う
  4. 自動コミットの差分チェック
    • git diff --cached --quiet で「前回とまったく同じ内容ならコミットしない」
    • 空の週報や内容が更新されなかった場合の無駄コミットを防止

5. まとめ


  • 最小構成
    1. workflow_dispatch で手動起動
    2. シェルで週の期間を計算
    3. 日報マージ → 1 ファイルにまとめる
    4. テンプレート+マージ内容 → AI プロンプト作成
    5. Gemini API で要約取得
    6. .txt ファイルとして出力
    7. コミット & プッシュ
  • メリット
    • 手作業による文章まとめを完全自動化し、振り返りコストを削減
    • AI で週報を生成することで、文章品質が安定しやすい
    • Git 履歴に週報が残るため、振り返りの蓄積と参照が容易
  • 注意点
    • 日報の命名規則・フォーマットを統一しておかないとマージ漏れやフォーマット崩れが発生
    • Gemini API のレスポンス品質・速度に依存するため、要約結果の確認が必要
    • 最終的な Markdown 形式での公開が必要な場合は、手動で .txt から .md に変換する手順を準備
  • 感想
    このワークフローのおかげで、週報時に振り返り作業が効率化される期待しています。
    AI が要約してくれることで、週報作成にかかる時間を短縮できるだけでなく、
    毎週の内容を客観的にレビューしやすくなり、学習のモチベーション維持にもつながりそうです。出力された内容はチェックや修正は必要ですが、「面倒だな」と思うことが少しでも減ったので作った甲斐はあったと思います。