$30 off During Our Annual Pro Sale. View Details »

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

kzkn
November 15, 2021

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

kzkn

November 15, 2021
Tweet

Other Decks in Programming

Transcript

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

    View Slide

  2. ChangeLog URL
    of
    rubygem

    View Slide

  3. rubygems の ChangeLog URL

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. rubygems の ChangeLog URL を機械的に収集
    1. rubygems.org の API を叩く
    2. changelog_uri が設定されていればそれを使う
    3. なければ GitHub からそれっぽいものを探す

    View Slide

  9. rubygems の ChangeLog URL を機械的に収集
    ・それっぽいものを探すのがコスト高い(イケさんの pullreq のおかげでだいぶマシにな
    りました)
    ・GitHub Actions にかかる料金が増える
    ・そもそも rubygems.org から ChangeLog URL を引っ張ってくることができれば不要な
    処理
    ・設定されていれば Actions にかかる料金が下がり、rubygems.org から変更履歴にア
    クセスできるようになる
    => いいことしかない

    View Slide

  10. じゃあ設定すればいいじゃん!

    View Slide

  11. changelog_uri が未設定の gem を探す
    ・changelog_uri を含まない gem を一覧する
    ・gem の情報を rubygems から収集する
    ・各 gem の ChangeLog URL を探す
    ・pullreq を投げる

    View Slide

  12. 修正対象 gem の情報を集める

    View Slide

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

    View Slide

  14. 修正対象 gem の情報を集める
    $ RUBYGEMS_APIKEY=....
    $ cd ~/.rbenv/versions
    今回はローカルに残ってる gem のキャッシュから探します。 rbenv のディレクトリに移動します。

    View Slide

  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から引っ張ってきます。

    View Slide

  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から引っ張ってきます。

    View Slide

  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から引っ張ってきます。

    View Slide

  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から引っ張ってきます。

    View Slide

  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から引っ張ってきます。

    View Slide

  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のファイル名)だけを切り出す

    View Slide

  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で必要な情報を抽出するコマンドを構築する

    View Slide

  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” なコマンドを実行する

    View Slide

  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 に出力する

    View Slide

  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 上は設定されてい
    るものがあったので除外。

    View Slide

  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 に変換します。

    View Slide

  26. changelog_uri が未設定の gem を探す
    ・changelog_uri を含まない gem を一覧する
    ・gem の情報を rubygems から収集する
    ・各 gem の ChangeLog URL を探す
    ・pullreq を投げる

    View Slide

  27. gem の ChangeLog URL を
    探す

    View Slide

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

    View Slide

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

    View Slide

  30. gemのChangeLog URLを探す
    $ GITHUB_APIKEY=... node index.js 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を探すことができました。

    View Slide

  31. changelog_uri が未設定の gem を探す
    ・changelog_uri を含まない gem を一覧する
    ・gem の情報を rubygems から収集する
    ・各 gem の ChangeLog URL を探す
    ・pullreq を投げる

    View Slide

  32. pullreqを投げる

    View Slide

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

    View Slide

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

    View Slide

  35. pullreqを投げる
    1. ChangeLog URLにアクセスしてファイルが存在することを確認します(念のため)
    2. リポジトリにアクセスします
    3. gemspecファイルを開きます
    4. 編集します
    5. シートのE列、F列から適宜コードをコピーして貼り付けます
    6. まわりとテイストを合わせます
    7. pullreqを作ります

    View Slide

  36. pullreqを投げる
    https://github.com/aasm/aasm/pull/759

    View Slide

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

    View Slide

  38. One more thing...

    View Slide

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

    View Slide