Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

ChangeLog URL of rubygem

Slide 3

Slide 3 text

rubygems の ChangeLog URL

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

修正対象 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 に出力する

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

修正対象 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 に変換します。

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

gem の ChangeLog URL を 探す

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

gemのChangeLog URLを探す $ GITHUB_APIKEY=... node index.js

Slide 30

Slide 30 text

gemのChangeLog URLを探す $ GITHUB_APIKEY=... node index.js missing_changelog_urls.csv $ grep -v ',null$' missing_changelog_urls.csv | wc -l 273 273件のChangeLog URLを探すことができました。

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

pullreqを投げる

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

One more thing...

Slide 39

Slide 39 text

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