Dockerで自宅GitLab環境構築~GitLab-CIの初歩まで

![1086321.png](https://qiita-image-store.s3.amazonaws.com/0/258841/57a38858-d9cb-0058-43e4-258e75668cb4.png)


## 背景

[「GitLab実践ガイド」を読んだ](http://blog.chaspy.me/entry/2018/02/17/120000)
このサイトを見て以降GitLabに興味を持ったので自宅に構築してみました。
その手順等を公開していこうと思います。

記事概要は構築とリポジトリにプッシュされたら簡単なテストを実行ってところです。

## 対象読者

* 自宅にGitサーバを。。。と思ってる人
* CIしてみたい人

## GitLab

GitHubと同様に、Gitベースのソースコード管理機能や、マージリクエストによるレビュー機能を備えたサービス。
社内OSSや自宅OSSなんかで使える無料プランもあります。
Ruby on Railsで開発されており他のGitサーバと比べると比較的マシンスペックが要求されます。

機能的に一番の特徴はリポジトリのCI/CD。コミット後に自動でテストを行ってくれる機能。
以下の記事が大変わかりやすかったので参考にしながら実行していこうと思います。
■ [GitLab CIでテスト・ビルド・デプロイを自動化する](https://qiita.com/bremen/items/f47f383b9931a840a25c)

リポジトリは下記
https://github.com/gitlabhq/gitlabhq

OSSのGitサーバは他にも何点か有名どころがあります。
それぞれの違いについては今回は言及しませんがリンクだけ張っておきます。

* [GitBucket](https://github.com/gitbucket/gitbucket)
* [gitblit](https://github.com/gitblit/gitblit)
* [gogs](https://github.com/gogs/gogs)

## 環境

今回も自宅のサーバ機にインストールしていきます。
DockerとDocker-composeのバージョンは下記です。

``` bash
root@ubuntu0827:~/work/gitlab/test# uname -r
4.15.0-39-generic

root@ubuntu0827:~/work/gitlab/test# docker --version
Docker version 18.06.1-ce, build e68fc7a

root@ubuntu0827:~/work/gitlab/test# docker-compose --version
docker-compose version 1.22.0, build f46880f
```

## 導入手順

特に何も気にせずにGitLabの公式ドキュメント通りにベースを作成。
ポートが競合するのでその部分のみ新たに設定してます。

``` yaml:docker-compose.yml
web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'localhost'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost:9010'
        gitlab_rails['gitlab_shell_ssh_port'] = 2022
    ports:
      - '9010:9010'
      - '2022:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
```

docker-compose.ymlをのあるディレクトリであとは実行するだけで構築完了。
ここまで約15分。ほんと便利ですねDocker。
もちろん細かい設定を考えればもっとかかりますがとりあえず味見程度の使用なら上記で問題なさそうです。
HTTPSの利用も2行修正すれば使えますがSafariで使用する時に警告がうるさいのでオフにしてます。

``` bash
root@ubuntu0827:~/work/gitlab/test# docker-compose up -d

# 下記でログを確認。エラー等が出ていなければ問題なし
root@ubuntu0827:~/work/gitlab/test# docker-compose logs -f
```

起動したらあとはクライアントのブラウザから設定したポートへアクセスするだけ。
rootユーザのパスワード設定を求められるので設定してくだいさい。
設定後はとりあえずrootでリポジトリを作るところまでやってみます。

#### パスワード設定画面

![スクリーンショット 2018-12-01 21.09.27.png](https://qiita-image-store.s3.amazonaws.com/0/258841/495026bf-4368-d8f6-eaa4-7b6b07487789.png)

#### リポジトリ作成画面

![スクリーンショット 2018-12-01 21.21.48.png](https://qiita-image-store.s3.amazonaws.com/0/258841/7125e9de-b265-0360-a008-f702418d134e.png)

first_projectというリポジトリを作成。
privateを選択しcreateを押すだけでリポジトリが作成されます。

#### cloneしてpushまでしてみる

いつものGitの使い方と同じです。
cloneしたりpushしたり操作に違いはありません。

``` bash
$ git clone http://localhost:9010/root/first_project.git
$ git diff
diff --git a/README.md b/README.md
index 30d74d2..000610e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-test
\ No newline at end of file
+test
+first commit

$ git config user.name ryuichi1208
$ git config user.email test_mail@exmample.com
$ git add -A . ; git commit -m "first commit"
$ git push
```

## ユーザ/グループ作成

上記の時点では管理者のみでこのような運用はありえない。
ユーザとグループを作成して適切な権限を与えてみる。

と、書いている途中で気づいたが基本GUIでとても分かりやすいので消しました笑
まあ迷う人はいないと思います。。。

一応途中まで書いていた際に参考にしたURLを記載します。
http://www.rexent.co.jp/blog/gitlab-%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B


## CI環境を作ってみる

CIをするにはGitLabとは別途にGitLab Runnerを使用します。
サーバーからのテスト実行要求を受けて実際にビルドをするのはRunnerで、Serverは各Runnerにビルド実行要求を出し、その結果を管理します。

## Runnnerを使ってみる

#### GitLab Runnnerのインストール

Dockerをつかうか迷いましたが今回はホストへ直接入れました。
インストール手順は公式にありますので詳細はそちらをご参照ください。
https://docs.gitlab.com/runner/install/

``` bash
$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
$ chmod +x /usr/local/bin/gitlab-runner 
$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
$ gitlab-runner start
$ gitlab-runner status
gitlab-runner: Service is running!
```

ちなみにDockerをつかう方法も公式に書いてありますが例を記載。
手順的には対して手間ではなさそう。

``` bash
docker exec -it gitlab-runner gitlab-runner register \
    --url [gitlabのURL] \
    --registration-token [token] \
    --name [名前] \
    --tag-list [タグ名] \
    --executor docker \
    --docker-image alpine:latest
```

#### GitLabへRunnerを登録
GitLab CI ServerにRunnerを登録します。

アクセスtokenをGitLabのページより取得し、「gitlab-runner register」で対話的に設定を行います(塗りつぶしてるところ辺りにあります)。

![スクリーンショット 2018-12-01 22.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/258841/146e95fd-9a57-b5d9-85be-c006c0a13bb8.png)

タグを指定は「.gitlab-ci.yml」に定義しているものと一致させてください。
カンマ区切りで復数指定も可能。

``` bash
$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=27613 revision=3afdaba6 version=11.5.0
Running in system-mode.                            
                                                   
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://[GitLabサーバのIPアドレス]:9010/
Please enter the gitlab-ci token for this runner:
[取得したアクセスtokenを入力]
Please enter the gitlab-ci description for this runner:
[ubuntu0827]:  
Please enter the gitlab-ci tags for this runner (comma separated):
docker
Registering runner... succeeded                     runner=33tekJda
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
```

excutorについては色々と調べていると記事が1つかけそうな感じなので今回は省略。
とりあえずshellを選択しています。

https://docs.gitlab.com/runner/executors/shell.html

#### CI実施

CIするにはデフォルトでは「.gitlab-ci.yml」というファイル名にJobを記述しpushします。
下記は簡単な例でhello worldするソースをCで書いてあるものを一緒にpush
ビルドし実行までを自動でやるように記述しています。
(めちゃくちゃ省いていますが結構機能豊富でまとめきれません。。。)

``` yaml:.gitlab-ci.yml
stages:
  - test

test_job:
  type: test
  script:
    - gcc -o hello hello.c
    - ./hello world
  tags:
    - docker
```

この状態でGitLabへpushすると下記のような感じでビルド結果や実行結果などがわかるようになります。成功時はステータスが「passed」で失敗時は「failed」。
一瞬で成否がわかるので開発スピード向上になりそうですね。

![スクリーンショット 2018-12-01 22.57.30.png](https://qiita-image-store.s3.amazonaws.com/0/258841/1f66b74e-3baf-0e8a-845a-949cdf4da5db.png)

## まとめ

GitLab構築まで約15分でしたがCIについて調べ始めると機能面の豊富さに圧倒され
3時間ほど色々見てしまう結果になりました。
サクッとつかうだけでなく実運用面での機能が豊富です。
(Merge Accept予約や自動デプロイもちょっと見たがどれもこれも大変面白そう)
とりあえず構築→簡単なCIまでの導入手順でした。

## 参考にしたサイト

◼ [公式ドキュメント](https://docs.gitlab.com/)
◼ [Gitlab CI を使ってみるメモ](https://ngyuki.hatenablog.com/entry/2017/07/07/093326)