ラクスアドベントカレンダー 2日目の記事です
GitHub Actionsでusesを使って呼び出せるアクションの学習も兼ねて、RSSの更新をGitHub Actionsを使って監視するためのアクションを作ったので、その紹介です。
使い方
実行
普通のサードパーティアクション同様、usesでこのアクションを呼び出します。with.feed-urlに監視対象のRSSのURLを設定します。
on:
schedule:
- cron: '0 * * * *'
jobs:
check-feed:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Subscribe to feed
id: feed
uses: takaram/subscribe-feed-action@main
with:
feed-url: 'https://github.blog/feed/'
結果の取得
ステップのoutputで実行結果がわかります。
-
has-new-items: 更新があればtrue -
new-items: 新規アイテムの配列のJSON
new-itemsの中身は、フィードの形式 (RSS 1.0, 2.0, or Atom) や持つ要素によって少し異なりますが、titleやlink, content, pubDateなどのキーを持ちます。
既読フィードの管理
フィードを取得し終わると、既読となったアイテムをファイル(既定ではrss-state.json)に保存します。
このアクション自体はあくまでファイルへの保存しかしないので、このファイルはリポジトリにコミットしたり、アーティファクトとして保存したりしておく必要があります。
さもないと、一度取得したアイテムが次回以降の実行時にもまた新規アイテム扱いされてしまいます。
アクションの作成
ここからは、このアクションの作成過程の話です。
アクションは3種類あるのですが、今回はJavaScriptアクションとして作成しました。
- JavaScriptアクション
- JS/TSで実装したコードをRunner上で動かす
- コンポジットアクション
- ワークフローファイルと同じように、YAMLにシェルコマンドや外部アクションを並べて実装する
- コンテナアクション
- Dockerコンテナを作成してその中でコードを動かす
リポジトリの作成
1から作成してもいいのですが、TypeScriptでJavaScriptアクションを実装するためのリポジトリのテンプレをGitHub公式で用意してくれています。
テスト環境やCIなども全て用意してくれているので、これを利用すればビルドで大きく詰まったりすることはないかもしれません。
(いろいろ用意してくれすぎていてちょっと使いこなせていない感じもしますが……
)
コードの実装
テンプレからリポジトリを作成したら、修正すべきファイルは概ね以下のとおりです。
-
action.yml- input, outputの定義を記載します
-
src/main.ts- 実際の処理を記述します
- テンプレでは
wait.tsを読み込んでいますが、ただのサンプルなのでそのあたりは削除でOK
-
__tests__/main.test.ts- jestでテストが実装されているので、
main.tsの内容に合わせる
- jestでテストが実装されているので、
-
.github/workflows/ci.yml-
test-actionジョブで、このリポジトリ自身を呼び出しているので、input/outputなど修正
-
ビルド実行
修正が完了すれば、npm run bundleを実行してdist/index.jsを更新します。
最終的にアクション呼び出し時に実行されるのはこの.jsファイルなので(action.ymlで指定されている)、この工程を忘れると修正が反映されません。
作成したアクションは、冒頭で紹介したようにuses: (リポジトリ名)@(ブランチ名/タグ名/コミットハッシュ)で呼び出すことができます。
多くのアクションではv1のようなタグやブランチが用意されていますが、別に必須ではないのでmainやdevでもいいですし、コミットのSHAハッシュでの指定も可です。