🦉

Zennに予約投稿するためのGitHub Actionsを作ってみた

2022/05/17に公開

作ったもの

GitHub Actionsのワークフローから定期的に呼び出すことにより、記事のメタデータに記載された公開予定時刻で公開状態にしてくれるActionを作成した。

https://github.com/x-color/zenn-post-scheduler

この記事もこれを用いて予約投稿されている。

作ったきっかけ

このActionを作る以前にはリポジトリ内に専用のCLIを作って、それをGitHub Actionsで定期的に呼び出して予約投稿を実現していた。
これでも良かったのだが、ワークフローの見た目があんまりスマートじゃないのが気になっていた。
せっかくならGitHub Actionsを呼び出すだけで完結させたいなと思ったのと、GitHub Actionsを作ったことないから作ってみたいと思ったので、今回作成に挑戦した。

作成にあたっては、公式ドキュメントを参考にした。

https://docs.github.com/ja/actions/creating-actions/creating-a-javascript-action

また、Actionsを作るためのテンプレートリポジトリが用意されているのでありがたくこれを利用させてもらった。

https://github.com/actions/typescript-action

使い方

今回作成したActionは下記を用意することで利用可能。

  • 予約投稿したい記事に公開予定日時の情報を記載する
  • GitHub Actionsのワークフローで「zenn-post-scheduler」呼び出す

下記で1つずつ説明する。

記事へ公開予定日時の情報を記載する

予約投稿したい記事ファイルのメタデータにpublished_atを追加。
ここに公開したい日時をJSTで記載する。
なお、published_atはデフォルトでzenn-post-schedulerが確認するキー。この後に説明するが、このキー名は自由に設定可能。

下記例だと、2022年1月1日の午前9時に公開される(publishedtrueに更新される)。

---
title: Zennに予約投稿するためのGitHub Actionsを作ってみた
emoji: 🦉
type: tech
topics:
    - GitHub
    - GitHubActions
    - TypeScript
published: false
published_at: 2022/01/01 09:00:00
---

注意点として、たとえば午前9時に公開したい場合はpublished_atを9時前に指定しておくと良い。
このActionは現在時刻が公開予定時刻を超えている場合に記事を公開する。GitHub Actionsのワークフローの起動タイミングによっては、9時前に起動してしまい、9時での公開がされず10時などに公開されることがある。
このズレが許容できない場合は、本来の公開時刻より少し前に予定時刻を設定しておくか、ワークフローの起動頻度を上げておく必要がある。ワークフローの起動頻度を上げると無駄な実行が増えGitHub Actionsの制限に引っかかりやすくなるので予定時刻を早めておくことを推奨する。

GitHub Actionsのワークフローを設定する

下記はGitHub Actionsのワークフローのサンプル。
公開予定時刻を記載し、このようなワークフローをZennの記事を管理しているリポジトリに用意しておけば自動で記事公開の処理がされる。

name: publish

on:
  schedule: # *1
    - cron: '0 * * * *'

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      # Publish articles *2
      - uses: x-color/zenn-post-scheduler@v1.0.0
      # Commit and Push published articles to main branch *3
      - run: |
          git config --local user.email '<YOUR EMAIL>'
          git config --local user.name '<YOUR USERNAME>'
          git add -u articles
          git diff --cached --quiet || git commit -m 'Publish articles' && git push origin main

このワークフローの流れは下記。

  1. schedule 設定により定期的にワークフローを起動する。(*1)
  2. zenn-post-schedulerを呼び出す。(*2)
  3. 記事が格納されているディレクトリに入っているファイルを確認し、公開予定日時(published_at)を過ぎていればpublishedtrueに更新する。
  4. Gitの設定をし、更新されたファイルがCommitしてPushする。(*3)
  5. Zenn側でpublishedtrueな記事を検知し、公開される。

なお、このActionは下記の入力や出力をサポートしている。

Actionに渡せる入力。

  • path: 記事を格納しているディレクトリ名を指定するパラメータ。デフォルトは「articles」。
  • target_key: 公開予定日時を指定しているメタデータのキー名を指定するパラメータ。デフォルトは「published_at」。これを指定することにより、公開予定日時を指定するキー名を自由に変更可能。

Actionから返される出力。

  • published: 公開された記事のファイルパスのリスト

動作内容

このActionは下記のような挙動をしている。

  1. 記事が格納されているディレクトリ直下のファイルをすべて読み込む
  2. 各ファイルの公開設定を確認し、未公開となっている(published: false)ファイルを対象に処理を継続
  3. 各ファイルの予定公開日時メタデータ(published_at)を確認し、現在の日本時間と比較
  4. 予定公開日時が現時刻よりも前に指定されていた場合、公開設定を「true」に変更しファイルを更新

やっていることはシンプルで、全記事のメタデータを読み込み、公開予定時刻と現在時刻を比較し公開するタイミングであった場合は、公開設定を更新しているだけ。
公開・非公開の設定のしくみはZennがサポートしてくれているので、このActionが行うのはその設定の切り替えのみとなっている。

終わりに

このActionのおかげで、記事をまとめて書いて指定タイミングで投稿ができるので、いちいち投稿のタイミングに作業をしなくて良くなったのがとてもよい。
Zennで予約投稿をしたいと考えている方、よろしければ使ってみてください。

Discussion