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

![hero.png](https://qiita-image-store.s3.amazonaws.com/0/140792/60a5f234-8791-47b6-a50f-2e5446e97454.png)
※上記は2015年の時のTシャツです。[引用元](https://blog.digitalocean.com/hacktoberfest-is-back/)

# はじめに
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](https://hacktoberfest.digitalocean.com/sign_up/register)にGitHubアカウントを登録する**
- **10/1から10/31の間でGitHubの任意のオープンリポジトリにプルリクを4つ以上送る**

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

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

なお自分がオープンリポジトリに送ったプルリクの数と状態はこちらでチェックできます。
[HacktoberfestChecker](https://hacktoberfestchecker.herokuapp.com/)
↓アカウント名で検索するとこんな感じでプルリクの総数が表示されます
<img width="675" alt="スクリーンショット 2017-10-08 21.18.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/140792/ab31dc4d-9c0a-404f-90f8-1717a61119a2.png">


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

ただし、**Tシャツ欲しさに例えば「READMEのタイポを直すだけ」のようなほぼ無意味なプルリクエストを送るのはメンテナの手を煩わせてしまうことになるのでやめましょう。**


# はじめての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はフォークをしたリポジトリに対して開発を行なっていきます。
フォークはオリジナルのリポジトリにある以下の部分からできます。

<img width="996" alt="スクリーンショット 2017-10-07 15.19.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/140792/1d97fbe4-b5b0-4445-1d1b-9de965efe1a0.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 master`に`upstream 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 へプルリクを送りました。

<img width="1075" alt="スクリーンショット 2017-10-07 15.14.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/140792/dfbed1ac-05df-9bbd-1370-5432c93dae5e.png">


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


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

# 参考
[OSSへContributionする際のPull Request出す手順とか](http://shotat.hateblo.jp/entry/2016/09/16/223548)
[GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する](https://qiita.com/xtetsuji/items/555a1ef19ed21ee42873)
[phoenix/CONTRIBUTING.md](https://github.com/phoenixframework/phoenix/blob/master/CONTRIBUTING.md)
[意外ととっつきやすいOSS開発参加方法まとめ](https://qiita.com/shunsuke227ono/items/94dd6e707d34a1da2617)