今回やること
以下を定期的に行う設定を作成する。
- 公開可能な記事データを抽出
- 更新日が最も古いものの
date
を更新
コミット部分は別で対応。
前提
- hugo v0.96.0+extended
- 記事抽出・更新のコマンドを作成 検討時の詳細はこちら
- act version 0.2.34 インストールのことはこちら
yamlファイルに設定を書く
プロジェクトのルートディレクトリに.github/workflows/
ディレクトリを作成。
この中の.yaml
ファイルに記載した内容が実行される。
クイックスタート
https://docs.github.com/ja/actions/quickstart
構文
https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions
イベントトリガー(スケジュール)
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#schedule
一旦以下の内容で作成
|
|
※Run publish command
については後で修正する。uses
で公開されているアクションを使用することができる。
https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses
リポジトリを取ってきたり、必要なもののインストールは既存のものを使用すると簡単にできる。
actions/checkout@v3
https://github.com/actions/checkout
リポジトリ操作関連。READMEに使用例が記載されている。
peaceiris/actions-hugo@v2
https://github.com/peaceiris/actions-hugo
hugoセットアップのアクション。
動作確認
上記の内容だと処理されたかがわからないので、最終行に以下を追加して確認する。
git diff --name-only
変更されたファイルが表示された。
❯ act
セットアップ部分は省略
[publish-draft-false/deploy] ⭐ Run Main Run publish command
[publish-draft-false/deploy] 🐳 docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/2] user= workdir=
| content/ja/posts/github-actions.md
[publish-draft-false/deploy] ✅ Success - Main Run publish command
[publish-draft-false/deploy] 🏁 Job succeeded
実際にはact
実行時と本番環境間でsed
の挙動が違ってエラーになったが、一旦ローカルでは確認できた。
問題点
別のマシン上でコマンドが実行されるので、更新日時は当てにならないことに気づいた。
環境毎に出力して確認したのが以下。
ローカル
❯ hugo list future | cut -d ',' -f 1 | xargs -r ls -trl
-rw-r--r-- 1 piyo staff 5957 1 3 04:57 content/ja/posts/publish_script.md
-rw-r--r-- 1 piyo staff 116 1 3 13:37 content/ja/posts/hoge.md
-rw-r--r-- 1 piyo staff 117 1 3 13:37 content/ja/posts/hoge3.md
-rw-r--r-- 1 piyo staff 117 1 3 13:38 content/ja/posts/hoge2.md
act
| -rw-r--r-- 1 root root 5957 Jan 2 19:57 content/ja/posts/publish_script.md
| -rw-r--r-- 1 root root 116 Jan 3 04:37 content/ja/posts/hoge.md
| -rw-r--r-- 1 root root 117 Jan 3 04:37 content/ja/posts/hoge3.md
| -rw-r--r-- 1 root root 117 Jan 3 04:38 content/ja/posts/hoge2.md
本番
-rw-r--r-- 1 runner docker 5957 Jan 3 04:53 content/ja/posts/publish_script.md
-rw-r--r-- 1 runner docker 117 Jan 3 04:53 content/ja/posts/hoge3.md
-rw-r--r-- 1 runner docker 117 Jan 3 04:53 content/ja/posts/hoge2.md
-rw-r--r-- 1 runner docker 116 Jan 3 04:53 content/ja/posts/hoge.md
act
の使い方の問題かもしれないが、上記のような結果だった。
とりあえずgit log
を使用してコミットでソートする方向に変更する。
修正
ls
を使用していた部分をgit log
を使用するように変更。
出力に合わせて、sort
とcut
を追加。
- name: Run publish command
run: |
hugo list future |\
cut -d ',' -f 1 |\
xargs -n 1 -I {} git log -1 --format='%cd {}' --date=iso {} |\
sort |\
cut -d ' ' -f 4 |\
head -1 |\
xargs -r sed -i "s/9999-12-31T00:00:00+09:00/$(TZ=Asia/Tokyo date -Iseconds)/"
sort
時点の出力はこのようになっている。
2023-01-03 04:56:11 +0900 content/ja/posts/publish_script.md
2023-01-03 13:44:14 +0900 content/ja/posts/hoge.md
2023-01-03 13:44:27 +0900 content/ja/posts/hoge2.md
2023-01-03 13:44:38 +0900 content/ja/posts/hoge3.md
流れ
git log
を使用して各ファイルの最新コミットを取得。- フォーマットを整えて、日付でソートできるようにする。
- 最初のファイル(一番コミット日が古いもの)のみ更新する。
記事の順番が重要な場合にはコミットの順序で調整する必要があるが、これでやりたいことはできた。
git log
のドキュメント
https://git-scm.com/docs/git-log
あとは変更をコミットするstepを追加することで完成しそう。