📬

【Node.js】Qiita/Zennの投稿をGitHubのProfileに自動反映する。(半分ポエム)

2022/01/10に公開

はじまり

以下3つのお勉強のため、今回のツールを作りました。

  • RSSフィードを読み取る
  • Node.jsを触る
  • GitHub Actionを作る

3つとも初めての試みでしたが、以下の3つの先人の知恵を参考に取り組みました。(他にも沢山情報を見ましたが、一旦以下だけの紹介で・・・)

こちらは、小さい構成で作られているので、ざっくりと理解するのに役立ちました。
https://github.com/mikkame/mikkame
こちらは、RSSフィードを読み取って捏ねる部分をアプリで作っているので、アプリとしてActionを実行するのに参考になりました。
https://zenn.dev/ikawaha/articles/20210221-c8f2d9ac028ae49d551a
こちらは、双方に見られたaction/の部分の意味を理解するのに役立ちました。
https://dev.classmethod.jp/articles/latest-current-using-actions/

作ったものは、ここに上げています。テスト用のリポジトリはここに。(テストコードを書かず、ライブラリにもせず・・・そこはまた今度・・・)

RSSフィードを読み取る

RSSは、先人同様にZennとQiitaから読み取り、両方ともまとめて比較して新しい順に表示するようにしました。ここにnoteのRSSも載せられないかをhttps://note.com/<note ID>/rssで試してみましたが、出来ませんでした。
どうやら、noteのRSSがCORS対応していないことが原因らしく、以下の記事を参考に作れそうなので、また今度・・・。

https://www.to-r.net/media/note-rss/

Node.jsを触る

ESModuleなのかCommonJSなのか

fetchimport.meta.urlを使ったので、この部分で一度つまづきました。今回はpackage.jsonで指定しましたが、使うライブラリと使わないライブラリで、.js.mjsを区別したほうが良いのか・・・、はまだ判断は付かないと言ったところです。

package.json
{
  "type": "module"
}

モジュール単体で実行させる

単体でテストしてた頃は、node.js上で単にnode index.jsで動かしてましたが、モジュールにするとなるとまた話が変わってきました。

npm installした後、一瞬「はて?」と思い、動きが止まってしまいました。なぜなら、今回のツールは、ライブラリとして利用するわけでなく、単体で実行させる予定だったので。
さてどうしたものかと。

この実行方法として、同じnpmモジュールのcypressの実装方法が役に立ちました。「cypress openするときに一体どう動いているんだろう?」と思い、モジュールの中に実行用のファイルを作る方法を真似しました。

https://docs.cypress.io/guides/getting-started/installing-cypress

.github/workflow/updateReadme.yml
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認証は時間がかかった分、記事にしてしまいました。)

以下が、今回できたワークフローです。なんか想定していたものより圧倒的に長くなっている・・・。

.github/workflow/updateReadme.yml
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