はじめに
こんにちは、piyovateです。
この記事は「Qiita自動投稿シリーズ」第2回です 🚀
前回(第1回)では、Qiita CLIとGitHub Actionsで自動投稿環境を構築しました。
今回は、**記事ごとに公開日を指定して、自動的に公開する「予約投稿機能」**を実装します 💪
🎯 この記事でできるようになること
- 記事ごとに公開日を指定できる
- 毎週月・金の朝9時に自動チェックして公開
- 完全自動で予約投稿
🧭 前提条件
- 第1回の記事の環境構築が完了していること
- Qiita CLIとGitHub Actionsが動作していること
⚠️ 重要:Qiita CLIには予約投稿機能がない
実は、Qiita CLI標準では予約投稿機能は提供されていません。
利用可能なフィールド:
-
private: true/false- 公開・限定公開の制御 -
updated_at- 自動更新(スケジュール機能なし)
そこで、GitHub Actionsを使って独自に予約投稿機能を実装します。
🔧 仕組み
1. 記事ファイル名を YYYY-MM-DD_タイトル.md 形式にする
↓
2. GitHubにpush(private: true のまま)
↓
3. 毎週月・金の朝9時にGitHub Actionsが起動
↓
4. ファイル名から公開日を取得して今日と比較
↓
5. 公開日が来た記事を private: false に自動変更
↓
6. workflow_runイベントでPublish articlesが自動実行
↓
7. Qiitaに投稿 🎉
なぜファイル名?
最初はfront matterのpublish_dateフィールドやコメント# publish_dateで実装を試みましたが、Qiita CLIがnpx qiita pull時にカスタムフィールドやコメントを削除してしまうため、ファイル名で管理する方式を採用しました。
📝 実装手順
Step 1: ワークフローファイルを作成
.github/workflows/scheduled-publish.yml を作成:
name: Scheduled Publish
on:
schedule:
- cron: '0 0 * * 1,5' # 月・金 09:00 JST(UTC 00:00)
workflow_dispatch:
permissions:
contents: write
jobs:
check_and_publish:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: Check and update publish dates
shell: bash
run: |
set -euo pipefail
shopt -s nullglob
TODAY=$(TZ=Asia/Tokyo date +%Y-%m-%d)
echo "Today is: $TODAY"
changed=0
for file in public/*.md; do
basename=$(basename "$file")
if [[ "$basename" =~ ^([0-9]{4}-[0-9]{2}-[0-9]{2})_ ]]; then
PUBLISH_DATE="${BASH_REMATCH[1]}"
else
continue
fi
echo "::group::Check $file"
echo "publish_date=$PUBLISH_DATE"
echo "::endgroup::"
if [[ "$PUBLISH_DATE" < "$TODAY" || "$PUBLISH_DATE" == "$TODAY" ]]; then
if grep -Eq '^[[:space:]]*private:[[:space:]]*(true|["'"'"']true["'"'"'])[[:space:]]*$' "$file"; then
echo "Publishing $file"
sed -i -E 's/^[[:space:]]*private:[[:space:]]*(true|["'"'"']true["'"'"'])[[:space:]]*$/private: false/' "$file"
changed=1
fi
fi
done
echo "CHANGED=$changed" >> "$GITHUB_ENV"
- name: Commit and push if changed
if: env.CHANGED == '1'
shell: bash
run: |
TODAY=$(TZ=Asia/Tokyo date +%Y-%m-%d)
if [[ -n "$(git status --porcelain)" ]]; then
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A
git commit -m "Auto-publish articles for $TODAY"
git push
else
echo "No changes to commit."
fi
ポイント解説:
-
cron: '0 0 * * 1,5'= 月・金の00:00 UTC(= 09:00 JST) - ファイル名から
YYYY-MM-DDパターンを抽出 - 公開日が今日以前なら
private: falseに変更 - 変更があれば自動commit & push
Step 2: publish.ymlにworkflow_runトリガーを追加
.github/workflows/publish.yml の on: セクションに追加:
on:
push:
branches:
- main
- master
workflow_dispatch:
workflow_run:
workflows: ["Scheduled Publish"]
types:
- completed
これにより、scheduled-publish.yml完了後に自動的にpublish.ymlが実行されます。
重要: GitHub Actionsのbotからのpushは、デフォルトでは他のワークフローをトリガーしません。
workflow_runを使うことで、この制限を回避できます。
Step 3: 記事ファイル名を日付付きにリネーム
記事ファイルを YYYY-MM-DD_タイトル.md 形式にリネーム:
# 例:2025年10月27日に公開したい場合
mv "public/記事タイトル.md" "public/2025-10-27_記事タイトル.md"
front matterは通常通り設定(private: trueのまま):
---
title: '記事タイトル'
tags:
- Qiita
private: false
updated_at: ''
id: null
---
Step 4: GitHubにpush
git add .
git commit -m "Add scheduled publish workflow"
git push
Step 5: 手動実行でテスト
- GitHubのリポジトリで Actions タブをクリック
- 左側のリストから「Scheduled Publish」を選択
- 右上の Run workflow ボタンをクリック
- ブランチを選択(通常は
main) - Run workflow をクリック
実行完了後、以下を確認:
- Scheduled Publishが成功したか
- Publish articlesが自動実行されたか(workflow_runトリガー)
- 記事がQiitaに公開されたか
💡 補足:
- 左側のリストに「Publish articles」と「Scheduled Publish」の2つが表示されます
- Scheduled Publish完了後、自動的にPublish articlesが実行されます
- ワークフローの実行履歴で連携を確認できます
🚀 使い方
予約投稿する
- 記事ファイルを作成・リネーム:
# 新規記事の場合
npx qiita new 記事タイトル
mv "public/記事タイトル.md" "public/2025-10-27_記事タイトル.md"
# 既存記事の場合
mv "public/記事タイトル.md" "public/2025-10-27_記事タイトル.md"
- front matterで
private: trueに設定:
---
title: '記事タイトル'
tags:
- Qiita
private: false
---
- GitHubにpush:
git add .
git commit -m "Add new article scheduled for 2025-10-27"
git push
指定日(ファイル名の日付)の朝9時に自動公開されます 🎉
🎓 まとめ
この記事では、GitHub Actionsを使った予約投稿機能を実装しました。
✅ ファイル名で公開日を指定(Qiita CLI対応)
✅ 毎週月・金の朝9時に自動チェック
✅ workflow_runで連携して完全自動化
技術的なポイント
- ファイル名ベース: Qiita CLIがカスタムフィールドを削除する問題を回避
- workflow_run: GitHub Actionsのbotからのpush制限を回避
🙌 おわりに
この記事が役に立ったら、いいねをお願いします 👍
次回もお楽しみに!