Git
GitHub
OSS

OSS開発未経験者もHacktoberfestを機にプルリクを出してTシャツをGetしよう!

hero.png
※上記は2015年の時のTシャツです。引用元

はじめに

OSS開発という言葉を聞いたことのあるエンジニアは多くいると思いますが実際にOSS開発するのは敷居が高く難しいイメージがあると思います。
しかし、エンジニアであれば誰でもOSS開発に貢献できる機会はあり、実は想像以上に難しいものではありません。
実際はOSS活動をするためのスキルがないために何もしていないのではなく、OSS活動とか面白そうだなと漠然と思っていながらも具体的なモチベーションがないため今まで特に活動をしてこなかったという方が大多数ではないかと思います。

今回はOSS活動に漠然と興味を持っているがやり方がわからない、モチベーションが見つからない人に向けてHacktoberfestというイベントを紹介したいと思います。
さらに実際にOSSにプルリクを送るまでの手順を説明したいと思います。

OSS活動とは

OSSとはオープンソースソフトウェアのことをいい、そのソフトウェアの発展に貢献することをOSS活動といいます。
OSSのほとんどはGithub上でオープンリポジトリで管理されているので誰でもそのソースコードをみることができます。ソースコードが公開されているのであれば言語・フレームワーク・ライブラリ・プライグインといったものは全てOSSといえます。ですので単にOSSといってもその規模には大小あります。
OSS活動には大きく分けて以下のような種類があります。

  • ドキュメントの整備
  • イシューの作成
  • ソースコードの追加・修正

ドキュメントの整備とはOSSを使いやすくするために漏れや間違いがある文章などを修正することです。例えば、OSSの利用手順で分かりにくい部分があればREADMEを修正するのがこれに該当します。
イシューの作成とは実際にOSSを利用してみて発見したバグを報告したり新規機能の提案をしたりすることです。これも歴としたOSS活動になります。
ソースコードの追加・修正は、その名の通りOSSのバグ修正や新規機能を追加することです。自分でOSSを利用しておりその過程でバグを踏んだ、使いづらさを感じたといった時に実際にソースコードを修正してOSSに貢献するのがこれに該当します。

OSS活動のイメージとして強いのがソースコードの追加・修正の部分だと思いますが、上記であげたように様々な形でOSS活動に貢献できるので実はそこまで敷居が高いものではないということがわかります。

Hacktoberfestとは

HacktoberfestとはDigitalOceanが主催をしているOSS活動を広めるために行われているイベントです。
イベントの概要ですが、ある条件を満たしたOSS活動を行うとオリジナルTシャツが無料でもらえるというものです。

ある条件とは以下の2つです

  • HacktoberfestにGithubアカウントを登録する
  • 10/1から10/31の間でGithubの任意のオープンリポジトリにプルリクを4つ以上送る

これだけでオリジナルTシャツがもらえてしまいます!

なお、カウントされるプルリクの対象ですが公式ページにいくつかオープンリポジトリが紹介されていますがそれ以外でもオープリポジトリであればなんでもOKです。もちろん、スパムだったり自動作成されたプルリクなど不正なものはカウントされません。
しかも、任意のオープンリポジトリが対象なので、自分のオープンリポジトリも対象になります。ですのでOSSに4つ以上もプルリクを出すと聞くと難しそうに見えますが自分のリポジトリでもOKなので敷居はそこまで高くないです。

なお自分がオープンリポジトリに送ったプルリクの数と状態はこちらでチェックできます。
HacktoberfestChecker
↓アカウント名で検索するとこんな感じでプルリクの総数が表示されます
スクリーンショット 2017-10-08 21.18.37.png

今までモチベーションがなくOSS活動をしてこなかった人も、OSSに貢献した人だけに配られるオリジナルTシャツがもらえるイベントが開催されている今こそ是非チャレンジしてみてはいかがでしょうか。

はじめてのOSS活動の進め方

とはいえ、いきなりOSS活動をしてみようと言われても難しいと思うので、自分の経験談も含めながらOSS開発をどのように進めていけばいいか(=プルリクを出していけばいいか)具体的な手順について説明をしたいと思います。
なお、今回の記事は初めてOSS活動をする人がOSSにプルリクを送れるようになることを目標にしています。本来はプルリクは目的ではなく手段だと思うのですがその点はご了承ください。

どのOSSに貢献するか対象を決める

まずは貢献する対象のOSSを決めます。王道なのは自分が使っているOSSでバグを見つけたり使いにくいところがあればソースコードをみて修正するというものです。もし自分の中で該当するOSSがあり、ソースコードも理解できるようであれば是非チャレンジしてみてください。
もしそのようなものがないのであれば、比較的小規模なOSS(ライブラリとか)、自分の得意な言語、自分がよく知っているOSSなどを基準に選定するといいと思います。
あとは、有効な手段として目星をつけたOSSのイシューをみてみるというものがあります。イシューを眺めてみて実際に自分なら解決できそうだという問題があればそれを解決することを目標にするといいと思います。
なお、初めてのOSS活動ではドキュメントの整理が一番敷居が低いと思います。

自分の場合は、Reactを勉強している時にcreate-react-appというライブラリを利用した経験があったのでそのリポジトリのイシューを確認するとリンク切れの報告をしているものを見つけました。これなら自分でもできそうと思い、自分はcreate-react-appを対象として決めました。

どのように貢献するか手順を確認する

次にどうやって活動していくのか具体的な方法を確認します。
ブランチをどのように作ってプルリクを送るのかなど方針はOSSによって異なります。そもそも個人的な趣味のオープンソースだからプルリクは受け付けないといったものもあります。ですので、OSS開発をどのようにすればいいか確認をする必要があります。

方針についてはCONTRIBUTING.mdというものがあればそこに書いてあります。もしくはREADME.mdの項目にコントリビュータに向けた説明が書いてあるものもあります。まずはそこを読んでおきます。コントリビュータへの説明がしっかりされているかどうかでそのOSSがどれだけ管理されているかということもわかります。

プルリクを作成する

ではここから実際のコマンドを交えながらプルリクをOSSに投げるまでの説明をしたいと思います。
ここでは王道な方法を説明しますが先ほども説明したようにOSSによっては多少異なるかもしれないのでそこはご了承ください。

対象のリポジトリのソースコードを持ってくる

まずは対象のリポジトリのソースコードを自分のリポジトリとして持ってきます。そのためにはフォークというものをします。
例えば、facebookincubator/create-react-appを自分(nishina555)がフォークするとnishina555/create-react-appというものが自分のアカウントに作成されます。
基本的にOSSはフォークをしたリポジトリに対して開発を行なっていきます。
フォークはオリジナルのリポジトリにある以下の部分からできます。

スクリーンショット 2017-10-07 15.19.37.png

フォークをした上でそのリポジトリをローカルにcloneしてきます。

$ git clone https://github.com/nishina555/create-react-app.git
Cloning into 'create-react-app'...
...
...
...
$ cd create-react-app
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

これでフォークしたcreate-react-app(nishina555/create-react-app)のmasterをcloneすることができました。

次に、オリジナル(フォーク元)のリポジトリの管理もローカルでできるようにします。
これは、オリジナルのリポジトリの修正をフォークしてきた自分のリポジトリにも反映できるようにするためです。
フォークしてきたリポジトリの向き先をoriginに設定していた対して、オリジナルのリポジトリをupstreamという名前で設定します。

$ git remote add upstream https://github.com/facebookincubator/create-react-app.git

$ git fetch upstream
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/upstream/master

remotes/upstream/masterというのがブランチ一覧に出ているところからわかるように、これでオリジナルのリポジトリも管理できるようになりました。

トピックブランチを作成して修正を行う

フォークをしたmasterブランチをローカルに用意したあとは実際の修正をするためmasterブランチからトピックブランチを作成します。OSSのプルリクでもよく見かけたのですが、フォークしてきたmasterブランチでは作業はしないほうがいいでしょう。

$ git checkout master
$ git checkout -b <topic-branch-name>

もし、オリジナルのリポジトリに色々と修正が加えられたのでその内容をmasterにも反映させてからトピックブランチを作りたい場合は以下のようにします。

$ git checkout master
$ git pull upstream master
$ git checkout -b <topic-branch-name>

このようにpull upstream master (fetch & merge)をすることでorigin masterupstream masterの内容を取り込むことができます。

もし、トピックブランチにオリジナルのリポイジトリの修正を反映させる場合は以下のようまずmasterを最新の状態にしたあとトピックブランチをmasterでrebaseします。

$ git checkout master
$ git pull upstream master
$ git checkout <your-topic-branch>
$ git rebase master

このようにトピックブランチにオリジナルの内容を反映させる時はpullではなく、上記のようにrebaseを利用しなくてはいけないことを注意してください。(rebsaeを使うのはコミットログが綺麗になるため)

プルリクを送る

ここまで終了したら実際にトピックブランチにコミットをし、フォーク元のリモートリポジトリにpushします。そのあとオリジナルのリポジトリにプルリクを送って完了です。
自分の場合ですと、nishina555/fix_package-management_linkからfacebookincubator/master へプルリクを送りました。

スクリーンショット 2017-10-07 15.14.47.png

コミットログの書き方や、プルリクの説明文の書き方などは今までの履歴などを確認して真似するといいと思います。
もし問題があれば指摘が来るでしょうし、大丈夫なようであればマージされるでしょう。

終わりに

今回はOSS活動初心者に向けてHacktoberfestの紹介とOSSにプルリクを作成する方法の説明をしました。
自分も規模の大きなOSSにプルリクを送りマージされた経験は今回が初めてでした。実際の内容はREADMEの修正をしたという些細なものですが実際にマージされてコミットログに自分のアイコンとコミットログが残っていると結構うれしいものです。OSS活動を一回経験することでOSSという存在が身近に感じるようになったのは個人的には大きい収穫だと思っています。
Hacktoberfestを機にOSS活動を初めてみてはいかがでしょうか。
Happy Hacking!

参考

OSSへContributionする際のPull Request出す手順とか
GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する
phoenix/CONTRIBUTING.md
意外ととっつきやすいOSS開発参加方法まとめ