【Node.js】Qiita/Zennの投稿をGitHubのProfileに自動反映する。(半分ポエム)
はじまり
以下3つのお勉強のため、今回のツールを作りました。
- RSSフィードを読み取る
- Node.jsを触る
- GitHub Actionを作る
3つとも初めての試みでしたが、以下の3つの先人の知恵を参考に取り組みました。(他にも沢山情報を見ましたが、一旦以下だけの紹介で・・・)
こちらは、小さい構成で作られているので、ざっくりと理解するのに役立ちました。action/
の部分の意味を理解するのに役立ちました。
作ったものは、ここに上げています。テスト用のリポジトリはここに。(テストコードを書かず、ライブラリにもせず・・・そこはまた今度・・・)
RSSフィードを読み取る
RSSは、先人同様にZennとQiitaから読み取り、両方ともまとめて比較して新しい順に表示するようにしました。ここにnoteのRSSも載せられないかをhttps://note.com/<note ID>/rss
で試してみましたが、出来ませんでした。
どうやら、noteのRSSがCORS対応していないことが原因らしく、以下の記事を参考に作れそうなので、また今度・・・。
Node.jsを触る
ESModuleなのかCommonJSなのか
fetch
やimport.meta.url
を使ったので、この部分で一度つまづきました。今回はpackage.json
で指定しましたが、使うライブラリと使わないライブラリで、.js
と.mjs
を区別したほうが良いのか・・・、はまだ判断は付かないと言ったところです。
{
"type": "module"
}
モジュール単体で実行させる
単体でテストしてた頃は、node.js上で単にnode index.js
で動かしてましたが、モジュールにするとなるとまた話が変わってきました。
npm install
した後、一瞬「はて?」と思い、動きが止まってしまいました。なぜなら、今回のツールは、ライブラリとして利用するわけでなく、単体で実行させる予定だったので。
さてどうしたものかと。
この実行方法として、同じnpmモジュールのcypress
の実装方法が役に立ちました。「cypress open
するときに一体どう動いているんだろう?」と思い、モジュールの中に実行用のファイルを作る方法を真似しました。
jobs:
updateFeed:
runs-on: ubuntu-latest
steps:
- name: run feedFetcher
run: |
chmod 777 ./node_modules/feed-fetcher/bin/run
./node_modules/feed-fetcher/bin/run --config-yaml=configOfFeedFetcher.yml
package.json
に"bin"フィールドを追加すればこんな長く書かなくても良さそうですが、それはまた今度・・・。
GitHub Actionを作る
モジュールとして動いたので、やっとGitHub Actionsとして作成に取り掛かることができました。(想定以上に時間がかかった・・・想定が甘かったか・・・)
色々と時間がかかりましたが、最も時間がかかったのが、SSHプロトコルでわざわざやってしまったことで、すごい時間が掛かりました。(SSH認証は時間がかかった分、記事にしてしまいました。)
以下が、今回できたワークフローです。なんか想定していたものより圧倒的に長くなっている・・・。
name: Update README for Qiita/Zenn feed
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
updateFeed:
runs-on: ubuntu-latest
steps:
- name: apt update
run: sudo apt update
- name: Checkout
uses: actions/checkout@v2
- name: node set up
uses: actions/setup-node@v2
with:
node-version: '16.13.1'
- name: Authenticate SSH
env:
PRIVATE_KEY: ${{ secrets.TOFEEDFETCHER }}
run: |
mkdir -p ~/.ssh
echo "$PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
chmod 700 ~/.ssh/id_rsa
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
- name: Confirm version of node and npm
run: |
node -v
npm -v
- name: Install feedFetcher
run: npm install ssh://github.com/Landmaster135/feed-fetcher
# run: npm install https://github.com/Landmaster135/feed-fetcher
# run: npm install github.com/Landmaster135/feed-fetcher@latest
- name: run feedFetcher
run: |
chmod 777 ./node_modules/feed-fetcher/bin/run
./node_modules/feed-fetcher/bin/run --config-yaml=configOfFeedFetcher.yml
- name: git setting
run: |
git config --local user.email "52403447+Landmaster135@users.noreply.github.com"
git config --local user.name "Landmaster135"
- name: git commit
run: |
git log -1
git add README.md
git diff --cached --quiet || (git commit -m "Update feed snippet" && git push origin main)
本当はスキーム名をyamlに書かないでinstallしたかったのですが結局分からず・・・。また今度・・・。
一応やりたいことは達成
とりあえず、成果物としてはテスト用のリポジトリにある通り。
おしまい
元々Tech記事として書くつもりでしたが、記事を書いてみたら、なんだか留保事項が沢山ありアイデア段階のものばかりだったので、途中でIdea記事にしました笑
今回苦労してツールを作りましたが、まだまだ改善の余地が沢山あり、まだまだ分からないことが沢山あると感じました。
プログラム道果てしねえ・・・と思った次第でしたとさ[°□°]
Discussion