OSS開発初めかた (GitLabにある本家にマージ)

> この記事は，東京大学工学部電子情報工学科・電気電子工学科(通称EEIC)の3年後期実験の一つである「大規模ソフトウェアを手探る」のレポートとして，書かれたものです。




# OSS開発初めかた (GitLabにある本家にマージ)
[「大規模ソフトウェアを手探る」](https://doss.eidos.ic.i.u-tokyo.ac.jp/)という実験で私たちの班はOSSのお絵かきソフトであるinkscapeを題材として選択し、バグを修正してマージするところまでできました。この記事ではGitLab上でOSSのIssueを直したMRが承認されるまでを書きます。環境構築、バグの直しかたについては以下の概要記事から参照してください。
[Inkscapeを手探る - Qiita](https://qiita.com/momoka_0122y/private/df19a0ff5a993514cc89)

また直したいバグがないけどOSS活動がしたい方はそれぞれのOSSのIssue一覧をみると良いです。[OSS開発初めかた (Issueの見つけ方) - Qiita](https://qiita.com/momoka_0122y/items/64d35862a357d42c3381)
inkscapeへのバグの修正のマージの経験を例にOSSへのMRが承認されるまでを書きます。本家という単語を何度か使いますがこれは貢献するOSSのリモートリポジトリを意味します(この投稿では[inkscape](https://gitlab.com/inkscape/inkscape))。

## 自分のアカウントのリモートリポジトリにForkする
本家のリポジトリに直接branchをはやすことはできないので、自分のリモートリポジトリにForkする必要があります。

本家のページの右上にあるForkボタンを押すと自分のアカウントのリモートリポジトリにコピーが作られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/c07c0d01-64a8-1483-39bd-1a39aaba8b3d.png)
以下が自分のリポジトリにForkされたもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/bcc7f3f2-8f09-7211-62f9-4d633d15041e.png)

## cloneして仕事にかかる！
### forkしたリポジトリをローカルにclone
cloneと書いてあるところからurlをコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/ca116a4b-11c4-51e4-fc3c-8ec3c7d2285f.png)

ワーキングディレクトリを、ディレクトリをクローンしたい場所へ移動してクローンする。

```
$ git clone コピーしたURL
```

例

```
$ git clone https://gitlab.com/自分のアカウント名/リポジトリ名.git
```


### 上流リポジトリとして本家リポジトリを設定する。
Forkした自分のリポジトリからcloneしただけだと、ローカルで作業中に本家で変更があった時にそれを取り込めないため、上流リポジトリとして本家ディレクトリを設定します。
まず```git remote -v```で現在のリモートリポジトリの一覧を確認。

例

```
$ git remote -v
> origin  https://gitlab.com/自分のアカウント名/リポジトリ名.git (fetch)
> origin  https://gitlab.com/自分のアカウント名/リポジトリ名.git (push)
```

```git remote add upstream　本家url``` リモートリポジトリとして、本家のリポジトリを upstream という名前で設定します。本家って名前の方がわかりやすいなら```git remote add honke```とかでも別にいい。

```
$ git remote add upstream https://gitlab.com/本家アカウント名/リポジトリ名.git
```

再度```git remote -v ```と入力して,フォークの URL が origin として、本家のリポジトリの URL が upstream として表示されていることを確認。

これで本家に変更があった場合に以下の手順で本家と同期させることができる。

```
$ git fetch upstream
$ git checkout master
$ git merge upstream/master
```

※GitLab Docsを読んでいたら[Repository mirroring](https://docs.gitlab.com/ee/user/project/repository/repository_mirroring.html)というのを用いれば、upstream設定をしなくてもForkしたリポジトリが自動的に本家に同期できるらしい。

これでローカルで作業できる！
ローカルでバグを直したり、新機能実装などができたら自分のリポジトリにpushしてMRを出しましょう。

# MRだす。 (本題)
自分のリモートリポジトリの上の➕マークから New merge request のところをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/d22e5839-3512-9460-d53c-214a2c6e6651.png)

自分のリポジトリのどのbranchから本家のどのbranchにmergeするか確認。(今回開発したinkscapeは全てのmergeがmasterにされていたためmasterにmergeしたがプロジェクトによってはdevelopブランチにMRを出すところもあるので、それぞれのOSSのcontributing guidelines を確認しよう。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/31332595-0f88-9c78-c54b-ee7b14b0082a.png)
###Tile と Descriptionを書く。
Titleはどのような変更をしたかわかりやすいように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/d409c7e2-4741-bf88-6b62-c58e9476dcc3.png)

今回は[Issueにあったバグ](https://gitlab.com/inkscape/inkscape/-/issues/1921)を直したのでそのIssue番号をのせた。```I fixed #1921```
番号を載せるだけで自動で該当Issueへのリンクがつき、該当IssueのページにもそのIssueを直すMRが提出されたことが自動で言及される。
```Yusuke Ebihara @ebiyuu1121 mentioned in merge request !2401 (merged) 2 weeks ago```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/39fddcdf-90a5-351f-cc07-50e002c2880f.png)
自動でこのコメントがついたため自らコメントする必要はなかったかもしれないが、一応礼儀(?)ということで```I fixed this issue here.```と一応コメントも残した。

# MRがマージされるまで
### pipelineテスト
GitLab上にコードをpushするとそのリモートリポジトリ上に設定されているテストが作動します。動作は.gitlab-ci.ymlに記述されています。これはpushしたコードがきちんとビルドするかのテストや、clang-tidyによるエラーチェック、codequalityによるコーディングスタイルチェックがされます。codequality意外のテストでfailとなった場合はコードに問題があることが予想されるためMRを出してもレビューされない可能性があるため、テストをパスしているか気をつけましょう。(failするとgitlabからメールが来るので気づく)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/478495c6-6f13-46fe-9dfc-5580122a27d4.png)

参考：https://www.ospn.jp/osc2019-fall/pdf/OSC2019_TokyoFall_Yano.pdf
### 権限ある人の目に留まる。
Merge許可をだす権限の人の目に留まり、コードに問題がなければmergeされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/12727f42-3d21-1650-a6f8-e390d7c1038e.png)
同時にこのMRにより直されたバグのIssueもクローズされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279062/ff20aea1-1a06-a77b-7c15-977d42425463.png)

##完了！
今回は[マージリクエスト](https://gitlab.com/inkscape/inkscape/-/merge_requests/2401)を出しマージされた事によりInkscape上の[Issue #1921](https://gitlab.com/inkscape/inkscape/-/issues/1921)を解決することができた。数日間でMRオープンからマージまでいきました。

今回例として使ったMRの他に[不要なコメント削除をお願いするMR](https://gitlab.com/inkscape/inkscape/-/merge_requests/2403#note_430497159)も提出しました。こちらは１日でマージされました。inkscapeは活動が盛んのようですぐに承認されました。

これからもOSSにコミットしていきたいと思いました。