Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OSSコントリビュート ハッカソン

6362c07dc6c77f281f73285cea2f2d5c?s=47 kzkn
November 15, 2021

OSSコントリビュート ハッカソン

6362c07dc6c77f281f73285cea2f2d5c?s=128

kzkn

November 15, 2021
Tweet

Transcript

  1. OSSコントリビュート ハッカソン kzkn 2021/10/29

  2. ChangeLog URL of rubygem

  3. rubygems の ChangeLog URL

  4. rubygems の ChangeLog URL gemspecに一行書くだけ

  5. 未設定のプロジェクトが 多い問題

  6. rubygems の ChangeLog URL を機械的に収集 https://github.com/kzkn/rubygems-changelog-url

  7. rubygems の ChangeLog URL を機械的に収集 https://www.sonicgarden.world/groups/13/entries/1181485

  8. rubygems の ChangeLog URL を機械的に収集 1. rubygems.org の API を叩く

    2. changelog_uri が設定されていればそれを使う 3. なければ GitHub からそれっぽいものを探す
  9. rubygems の ChangeLog URL を機械的に収集 ・それっぽいものを探すのがコスト高い(イケさんの pullreq のおかげでだいぶマシにな りました) ・GitHub

    Actions にかかる料金が増える ・そもそも rubygems.org から ChangeLog URL を引っ張ってくることができれば不要な 処理 ・設定されていれば Actions にかかる料金が下がり、rubygems.org から変更履歴にア クセスできるようになる => いいことしかない
  10. じゃあ設定すればいいじゃん!

  11. changelog_uri が未設定の gem を探す ・changelog_uri を含まない gem を一覧する ・gem の情報を

    rubygems から収集する ・各 gem の ChangeLog URL を探す ・pullreq を投げる
  12. 修正対象 gem の情報を集める

  13. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... rubygems.org の API キーを設定します。

  14. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions 今回はローカルに残ってる gem

    のキャッシュから探します。 rbenv のディレクトリに移動します。
  15. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名に 変換して各gemの情報をrubygems.orgから引っ張ってきます。
  16. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名に 変換して各gemの情報をrubygems.orgから引っ張ってきます。
  17. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名に 変換して各gemの情報をrubygems.orgから引っ張ってきます。
  18. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名 に変換して各gemの情報をrubygems.orgから引っ張ってきます。
  19. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名 に変換して各gemの情報をrubygems.orgから引っ張ってきます。
  20. 修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E

    's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt ファイルパスの8番目の要素(gemspecのファイル名)だけを切り出す
  21. 修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E

    's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt gemの情報をrubygems.orgからcurlでとってきて、jqで必要な情報を抽出するコマンドを構築する
  22. 修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E

    's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt “curl hogehoge | jq fugafuga” なコマンドを実行する
  23. 修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E

    's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt 結果を gems.txt に出力する
  24. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt $ grep '"changelog_uri":null' gems.txt >missing_changelog_uri_gems.txt 無駄な行を省きます。ローカルのキャッシュ上は changelog_uri がないけど、rubygems.org 上は設定されてい るものがあったので除外。
  25. 修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find

    */lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt $ grep '"changelog_uri":null' gems.txt >missing_changelog_uri_gems.txt $ sed -e 's/$/,/' -e '1i [' -e '$a null]' missing_changelog_uri_gems.txt >missing_changelog_uri_gems.json 後続処理のために valid な JSON に変換します。
  26. changelog_uri が未設定の gem を探す ・changelog_uri を含まない gem を一覧する ・gem の情報を

    rubygems から収集する ・各 gem の ChangeLog URL を探す ・pullreq を投げる
  27. gem の ChangeLog URL を 探す

  28. gemのChangeLog URLを探す 前掲のjsパッケージで引っ張ってくるので jsコードを書きます。 https://gist.github.com/kzkn/10b466cb0ef9708979cc61058b40c22b

  29. gemのChangeLog URLを探す $ GITHUB_APIKEY=... node index.js <path/to/missing_changelog_uri_gems.json | tee all.csv

    叩きます。GitHub API を叩きまくるので、API KEY を指定してあげます。さもないとすぐに API Limit に達してし まいます。
  30. gemのChangeLog URLを探す $ GITHUB_APIKEY=... node index.js <path/to/missing_changelog_uri_gems.json | tee all.csv

    $ wc -l all.csv 592 changelog_uris.csv $ grep -v ',null$' all.csv >missing_changelog_urls.csv $ grep -v ',null$' missing_changelog_urls.csv | wc -l 273 273件のChangeLog URLを探すことができました。
  31. changelog_uri が未設定の gem を探す ・changelog_uri を含まない gem を一覧する ・gem の情報を

    rubygems から収集する ・各 gem の ChangeLog URL を探す ・pullreq を投げる
  32. pullreqを投げる

  33. pullreqを投げる ・273個のリポジトリをフォークするのはちょっと。。。 ・リポジトリによって色々決まりがあるので機械的にpullreq投げるのはちょっと。。。  ・スクリプトから gemspec を生成するプロジェクトとか ・非アクティブなプロジェクトもあったりしてちょっと。。。

  34. pullreqを投げる 誰にでも pullreq を投げられるように一覧を作りました!!! https://docs.google.com/spreadsheets/d/1B3nTFNShVPxc07aFH2OA8Y_EI96tO68 RDzZc_s3YxUs/edit?usp=sharing

  35. pullreqを投げる 1. ChangeLog URLにアクセスしてファイルが存在することを確認します(念のため) 2. リポジトリにアクセスします 3. gemspecファイルを開きます 4. 編集します

    5. シートのE列、F列から適宜コードをコピーして貼り付けます 6. まわりとテイストを合わせます 7. pullreqを作ります
  36. pullreqを投げる https://github.com/aasm/aasm/pull/759

  37. OSSコントリビュートの心構え ・どんなに些細なことでもよい ・ほどほどにいい加減でもよい(プロジェクトによるけど)  ・気合入れまくった pullreq が放置されて虚しい目に ・OSSコントリビュートの出発点としてお役立てください!

  38. One more thing...

  39. opsworks_rubyのpuma 5対応 https://github.com/ajgon/opsworks_ruby/pull/276