そろそろPrivateリポジトリを使ってみようか 〜 Gitlabに入門してみる

# はじめに
そろそろ個人開発のプロジェクトが大きくなってきてprivateリポジトリにしたいけど、そのためだけにGithubの有料アカウントにするのはちょっと...という人を想定しています。

# Gitlabって？
GitlabはGithubに限りなく近づけられたGitのホスティングサービスです。各々のサーバを用意してそこに無料で無制限にプロジェクトを管理できる...との説明がよくされているようですが、サーバ云々はGitlab側がやってくれることなので心配いりません。

[2013年時点の紹介記事](http://www.find-job.net/startup/5-git-hosting)によるとインストール型となっていますが、現在はWeb上でも使うことができるようになっておりChromeのGithub用エクステンションの動作も確認できています。


僕が最初に知ったのはTopCoderのコンテストの際でいざ使ってみると色々便利なことがあったのでご紹介したいと思います。

# 事前準備
アカウントの作成などにかんしてはGithubなどと変わらないので省略させていただきます。

作成したら[Gitlabのsshに関するREADME](https://gitlab.com/help/ssh/README)をみてSSH鍵の設定をしておいてください。

# Githubのプロジェクトを移行する
Gitlabは画面上にある＋ボタンからNew Projectの画面に入ると（ここらへんはGithubのUIを踏襲していることが多いのでわかりやすいと思います）「Import Project from」という項目があります。
そうなんです。実はGitlabは様々なコード管理サービスからプロジェクトを引っ張ってくることが出来るのです。

現在であるのはGithub、Bitbucket、Gitorious.org、Google Code、Fogbugzで、その他にもgitで管理しているものであればAny repo by URLからImport出来るようです。

今回はGithubのみを例にとりますが恐らく他のものでも同じかと思います。先ほどのところからGithubを押すと最初はお馴染みのGithubの連携認証画面に飛ぶと思うので認証してください。すると以下のようなページに飛びます。
<img width="1057" alt="スクリーンショット 2016-04-29 13.45.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/10943/060c9edf-7f89-8199-5828-6d00992e2ae2.png">
このページでインポートしたいリポジトリのImportボタンを押せば完了です。画像のようにImportが終わるとdoneと表示されます。

ただこのままだとpublicになっているのでプロジェクトページにいって設定を変えましょう。
こっからは推測の域を出ないのですが、ここでpublicになるのはGithubの設定を忠実にすべて継承しているからだと思われます。また、このImportによってIssueやcommit履歴などもすべて引き継がれます。

さてここまででWeb上のプロジェクト移行は完了しました。残りはローカルと紐付けるだけです。もちろんGitlabのリポジトリをクローンし直すというのもありですが.gitignoreなどで色々設定していてクローンし直すのが面倒という人は[こちらのQiita記事 by @satomyumiさん](http://qiita.com/satomyumi/items/15ee0127cfe9ca5760a8)を適宜読み替えれば同じ方法でできるとおもいます。

# なぜGitlabなのか？
さて、どうしてGitlabにPrivateリポジトリをつくるのかという動機付けをしてみたいと思います。

まず第一に無料で無制限というのがあります。この無制限とは完全なる無制限を意味しているので自由に使うことができます。

第二に非常にGithubライクに作られているということです。Bitbucketなどもcontributorの制限はあるものの自分一人で使うには充分です。ですがGithubとの併用を考えた時、なるべくGithubに近いものを使うほうがコストも下がると思います。逆にGithubも併用するという理由はGithubが数多くの大企業で採用されているという点があげられると思います。

そして第三にGitlab Pagesなどがあげられます。これはGithub Pagesと同じようなものなのですが、Plain HTMLやJekyllなど様々なもののサンプルプロジェクトが用意されていてそれをforkすることで簡単に始めることができます。またこれを実現する仕組みとしてshared runnerというものがあって、これは仮想環境で[Docker](https://www.docker.com/)を利用して動かされているため、Dockerで出来ることの大抵ができるようになっています。その代表例としてCIサービスが無料で利用できるというものがあります。これによってRuby on RailsなどのプロジェクトもGitlab上でビルドできるみたいです。（ここらへんはまだ詳しくないので間違ってたらごめんなさい...）

# Gitlab Pagesを使ってみる
Gitlab Pagesでは上でも述べた通り、Docker上で動くようなものであればなんでもよくて調べると[Pythonで動くmkdocsでサンプルを作成している人](http://h-miyako.hatenablog.com/entry/2016/04/30/004751)もいます。
今回はPublicからPrivateにうつすということが主目的の記事なのでそのPrivateにしたリポジトリの製品のプロモーションサイトを作るという方向性で見ていきたいと思います。つまりGithubからインポートしたリポジトリごとのページを作るという感じです。

Gitlab Pagesは基本的に.gitlab-ci.ymlを書いてやればいいのですがやり方を間違えるとサイト用のファイルと一緒にコードまでpublicフォルダにコピーしてしまってprivateにした意味が無いみたいなことになりかねません。僕のやった二つの方法をご紹介したいとおもいます。

### ① masterブランチにページ用のファイルを置くフォルダをつくってそれをpublicにコピーする
この場合は.gitlab-ci.ymlはリポジトリの一番上の階層に置いて、ページ用のindex.htmlなどはpagesというディレクトリの中に入れることにします。

そして.gitlab-ci.ymlは以下のようにします。

```yaml:.gitlab-ci.yml
pages:
    script:
        - mkdir .public
        - cp -r pages/* .public
        - mv .public public
    artifacts:
        paths:
            - public
    only:
        - master
```

デフォルトのサンプルと変えているのはscriptの二行目です。publicというサイトのファイルを置くための公開フォルダにコピーしたいのはpagesディレクトリの中身だけなのでコピー元をpages/*としました。
この方法のいい点は何より管理が楽で簡単というところです。ただ、この場合pushする度にビルドがはしります。普段使っている分ではこれはまったく影響ないですが、Gitlabのサイトを見ているとpushの度にビルド待ちみたいな印がついてちょっとうざったいです。

### ②　専用のブランチをつくる。
次の方法が専用のブランチをつくる方法です。```git checkout --orphan pages```などとして空のブランチを作り、そこにサイトのデータと.gitlab-ci.ymlのみをadd&commitします。.gitlab-ci.ymlは今度は以下のようになります。

```yaml:.gitlab-ci.yml
pages:
    script:
        - mkdir .public
        - cp -r * .public
        - mv .public public
    artifacts:
        paths:
            - public
    only:
        - pages
```

今度はonlyの項目を変えています。これによってビルドを走らせるブランチを指定しているのです。この利点はなんといってもサイトとプロダクトを別々に管理できるというところです。逆に欠点は入りからわかるようにgitの機能を駆使しなければならず、またiPhoneアプリなんかでcarthageやpodなんかを入れていて.gitignoreを細かく設定していたり、あるいはライブラリがgitフォルダとして内包されてたりすると非常に事故率が高い操作をしなければならないというところだと思います（僕も見事に事故りながらやってました。気をつけましょう。。。）僕もサラッとしか書きませんでしたが、```git chekout --orphan```で空のリポジトリをちゃんと用意しようとするとかなり骨が折れますし、何より心臓に悪いことが多々起きたり起きなかったりなのでちゃんと調べながら、あるいはGit上級者に助けてもらってやるのがいいと思います。

# 終わりに
自分の　iPhoneアプリのコードを移行したついでにガガーっと書いてみました。使ったことがないサービスといってもGithubに似たものなので学習コストはかなり低いと思いました。