0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita記事の予約投稿を実現する【Qiita自動投稿シリーズ#2(実践編)】

Last updated at Posted at 2025-10-26

はじめに

こんにちは、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.ymlon: セクションに追加:

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: 手動実行でテスト

  1. GitHubのリポジトリで Actions タブをクリック
  2. 左側のリストから「Scheduled Publish」を選択
  3. 右上の Run workflow ボタンをクリック
  4. ブランチを選択(通常は main
  5. Run workflow をクリック

実行完了後、以下を確認:

  1. Scheduled Publishが成功したか
  2. Publish articlesが自動実行されたか(workflow_runトリガー)
  3. 記事がQiitaに公開されたか

💡 補足:

  • 左側のリストに「Publish articles」と「Scheduled Publish」の2つが表示されます
  • Scheduled Publish完了後、自動的にPublish articlesが実行されます
  • ワークフローの実行履歴で連携を確認できます

🚀 使い方

予約投稿する

  1. 記事ファイルを作成・リネーム:
# 新規記事の場合
npx qiita new 記事タイトル
mv "public/記事タイトル.md" "public/2025-10-27_記事タイトル.md"

# 既存記事の場合
mv "public/記事タイトル.md" "public/2025-10-27_記事タイトル.md"
  1. front matterでprivate: trueに設定:
---
title: '記事タイトル'
tags:
  - Qiita
private: false
---
  1. 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制限を回避

🙌 おわりに

この記事が役に立ったら、いいねをお願いします 👍

次回もお楽しみに!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?