🚀

【リリースノート】gemini-actions-lab v0.5.4 - Zenn連携ワークフローの強化とヘッダー画像対応

に公開

imagen-4-ultra_2025-09-22T16-32-25-199Z_Create_a_minimalist_typographic_illustration_displ_1.png

はじめに

gemini-actions-labは、Gemini APIを活用してGitHub Actions上での様々なタスク自動化を目指すプロジェクトです。今回のリリース v0.5.4では、特にリリースノートからZennの記事を自動投稿するワークフローを大幅に強化しました。ファイル名の自動生成・検証機能や、ヘッダー画像の自動挿入に対応し、より信頼性の高い自動化を実現しています。

主な変更点

本リリースのハイライトは以下の2点です。

  1. Zenn連携ワークフローの強化: Zennの記事ファイル名(slug)が、Zennの命名規則(12〜50文字、使用可能文字a-z0-9_-)に厳密に従うように自動生成・検証されるようになりました。これにより、手動でのファイル名修正が不要になり、ワークフローの信頼性が向上しました。
  2. ヘッダー画像の自動挿入: リリースノートやZennの記事に、関連するヘッダー画像が自動で挿入される機能を追加しました。これにより、記事の視覚的な魅力が向上します。

技術的な詳細

今回のアップデートの中心は、.github/workflows/gemini-release-notes.ymlの改善です。コード差分を元に、具体的な変更点を解説します。

Zennの記事ファイル名(slug)生成ロジックの改善

これまで、Zennの記事ファイル名はリポジトリ名やタグから単純に生成していましたが、Zennが要求するslugの命名規則を完全に満たせていませんでした。今回のアップデートで、この生成ロジックを大幅に改善し、以下の処理をシェルスクリプト内で自動的に行うようにしました。

-          # ファイル名を生成: YYYYMMDD-reponame-version-release.md
-          FILENAME="${TIMESTAMP}-${REPO_NAME,,}-${TAG_CLEAN}-release.md"  # ,,で小文字に変換
+
+          # ファイル名(拡張子を除く)はZenn記事のslugとなるため、制約に合わせて生成
+          RAW_SLUG="${TIMESTAMP}-${REPO_NAME}-${TAG_CLEAN}-release"
+          RAW_SLUG="${RAW_SLUG,,}"  # 小文字化
+
+          # 使用可能文字(a-z0-9_-)以外をハイフンに置換し、ハイフン・アンダースコアの連続を整理
+          SLUG=$(echo "${RAW_SLUG}" \
+            | sed 's/[^a-z0-9_-]/-/g' \
+            | sed -E 's/-{2,}/-/g' \
+            | sed -E 's/_{2,}/_/g' \
+            | sed -E 's/^[-_]+//; s/[-_]+$//')
+
+          # (中略)
+
+          # 最大文字数(50文字)を超える場合はトリミングし、末尾のハイフン/アンダースコアを除去
+          if [[ ${#SLUG} -gt 50 ]]; then
+            SLUG="${SLUG:0:50}"
+            SLUG=$(echo "${SLUG}" | sed -E 's/[-_]+$//')
+          fi
+
+          # 最小文字数(12文字)に満たない場合は許容文字でパディング
+          while [[ ${#SLUG} -lt 12 ]]; do
+            SLUG="${SLUG}x"
+          done
+
+          # 最終的なslugが制約を満たすか検証
+          if [[ ! "${SLUG}" =~ ^[a-z0-9_-]{12,50}$ ]]; then
+            echo "生成されたslug '${SLUG}' が制約を満たしません" >&2
+            exit 1
+          fi
+
+          FILENAME="${SLUG}.md"

このスクリプトにより、以下の処理が厳密に行われます。

  • サニタイズ: Zennで許可されていない文字をハイフンに置換します。
  • 文字数制限: 12文字未満の場合はパディングし、50文字を超える場合はトリミングします。
  • 検証: 最終的に生成されたslugが正規表現^[a-z0-9_-]{12,50}$にマッチするかを検証し、満たさない場合はエラーとして処理を中断します。

これにより、CI/CDプロセスがより堅牢になりました。

ヘッダー画像の柔軟な挿入

従来はシェルスクリプトでヘッダー画像のMarkdownを記事コンテンツに追記していましたが、この処理をGeminiへのプロンプトに移行しました。

--- a/.github/workflows/gemini-release-notes.yml
+++ b/.github/workflows/gemini-release-notes.yml
@@ -367,6 +367,8 @@ jobs:
           DIFF_STATS: "${{ steps.ctx.outputs.diff_stats }}"
           DIFF_CONTENT: "${{ steps.ctx.outputs.diff_content }}"
           RELEASE_NOTES: "${{ steps.gemini.outputs.summary }}"
+          HEADER_IMAGE_URL: "${{ steps.header.outputs.raw_url }}"
+          HEADER_IMAGE_NAME: "${{ steps.header.outputs.image_name }}"
         with:
           gemini_api_key: "${{ secrets.GEMINI_API_KEY }}"
           gcp_workload_identity_provider: "${{ vars.GCP_WIF_PROVIDER }}"

ワークフローからヘッダー画像のURLとファイル名をGeminiに渡すように変更し、プロンプト側で「ヘッダー画像があればfrontmatterの直後にMarkdownで表示する」という指示を追加しました。

この変更により、単に画像を挿入するだけでなく、将来的には画像の文脈に合わせたキャプションを生成するなど、より高度なコンテンツ生成が可能になる柔軟性が生まれました。

まとめ

v0.5.4では、Zennへの記事投稿ワークフローの信頼性向上と、コンテンツの品質向上に焦点を当てた改善を行いました。特にslug生成ロジックの強化は、手動介入を不要にし、完全自動化への大きな一歩となります。

今後もGeminiを活用し、開発ワークフローのさらなる自動化と効率化を進めていきます。


📚 参考リンク

Discussion