Ubuntu 18.04 LTSにDockerを使ってGitLabとMattermostを導入してみた

はじめに

Gitのバージョン管理システムとしてGitHub継続的インテグレーションツールとしてCircleCIやTravisCI、開発者向けのコミュニケーションツールとしてSlackといったクラウドサービス(SaaS)が注目を集めています(というより、昨今では当たり前に使われているツールかも)。

しかし、会社によってはクラウドはNGでオンプレミスである必要があったり、予算的な問題があったりとなかなか導入できない事情があるかと思います。

オープンソースGitHubやCircleCI、Slack風の機能を実装したツールはないものか…。 そこで、GitLabの出番です!

about.gitlab.com

GitLabって何?

GitLabは、GitHub風なGitのバージョン管理ツールに加えて、システム開発のフロー全体をカバーする様々なツールを提供してくれます。コア機能についてはオープンソースで開発が行われており、フリーで自前のサーバに導入可能です(オープンソース版であるGitLab Community Edition (CE)はMIT License下で配布されています)。

GitLabの具体的な機能としては、Gitによるバージョン管理以外に、継続的インテグレーション・継続的デリバリー(GitLab CI/CD)、チケット管理ツール、各種コミュニケーションツール(Mattermost含む)、監視ツール(Prometheus)、Dockerイメージレジストリ(GitLab Container Registry)、Web IDEなどなど、たくさんの有用な機能を使うことができます(もちろん、フリーの範囲内で利用可能)。

上記のサービスに対応するSaaSGitHub、CircleCI、JIRAなど)を使う場合には、どうしても費用がかかってしまいますし、別々のサービスになるので管理も大変になります。GitLabならオールインワンで、それらのサービスがフリーで手に入ります(ただし、オンプレミスに限る。もちろん、サーバの管理も必要になる)。

機能の詳細については、公式のドキュメントを参照してみてください(Core / Freeとなっているのが、オープンソースで開発されているFree版で使える機能になります)。

about.gitlab.com

また、これらのサービスを活用することで、チケット駆動開発TiDD)、テスト駆動開発(TDD)、継続的インテグレーション・継続的デリバリー(CI/CD)などのモダンな開発手法を開発プロセスに組み込んでいくことができます。

最近、Ubuntu 18.04 LTS(デスクトップ版)をインストールしたPCを用意したので、今回はこの環境にGitLabを導入してみたいと思います。また、GitLabのDockerイメージからGitLabサーバを立ててみたいと思います(SlackクローンであるMattermostも同梱されているのでこれも導入してみます)。

なぜDockerを使うのか?

以下は、個人的な意見です。Dockerは使い始めたばかりなので、間違っている箇所もあるかもしれませんが、DockerコンテナとしてGitLabを導入するメリットを挙げてみました。

GitLabのすべての構成が1つのDockerイメージに集約されている (Monolithic Image)

GitLabのDockerイメージは、すべてのツールを単一のコンテナに収めたモノリシックなDockerイメージです。そのため、NginxやPostgreSQLなどのGitLabを構成するミドルウェアのDockerコンテナを別途立ち上げる必要はありません。やることとしては、GitLabのDockerイメージをpullした後、イメージを起動させるだけです(使用者から見ると構成がシンプル)。

インフラ構成がDockerfileとしてコード化されている (Infrastructure as Code)

DockerならOS固有のインストール手順に従う必要がありません(仮想環境で実行するため、OSの違いを吸収できる)。DockerfileとしてDockerイメージの構成がコード化されており、利用者はそのファイルを実行することでDockerイメージを自動で生成することができます。そのため、インストール手順書を見ながらGitLabを導入するなんてことも必要ありません(誰でも簡単にGitLabを立ち上げることができる)。

別環境への移行が簡単 (Portability)

Dockerはポータビリティ性に優れています。新しいサーバにGitLabのシステムを移行したい場合には、既存のGitLabの環境を簡単に新しい環境に移行することが可能です。異なるOSだから、インストール方法が変わってしまう、データの引き継ぎが面倒ということはありません。

以上の観点から、中長期的にGitLabを運用していくにあたり、ホストOSに直接GitLabをインストールするのではなく、DockerコンテナとしてGitLabを運用したほうがメリットが大きいと考えられます。

検証環境

  • Ubuntu 18.04 LTS (デスクトップ版)(サーバ側)
  • Windows10 Pro(クライアント側)

Dockerのインストール

以下のUbuntuへのDockerのインストール方法は、Dockerの公式ドキュメントを参考にしました。詳しくは、そちらを参照のこと。

Get Docker CE for Ubuntu
https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-repository

まず、aptパッケージのインデックスをアップデートします。

$ sudo apt-get update

HTTPS経由でリポジトリを使うようにするため、追加のパッケージをインストールします。

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

Docker公式のGPGキーを追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

GPGキー(9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)を取得できたか確認します。

$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [  不明  ] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

Stable版のDockerのリポジトリを設定します。 現状、Ubuntu17.10以前のバージョンでは以下の方法でOKです。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

一方、Ubuntu18.04の場合、まだDockerがバージョンに対応できていないので、$(lsb_release -cs)の箇所(bionic)をartfulに書き換えて以下のように設定します。

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   artful \
   stable"
参考

https://linuxconfig.org/how-to-install-docker-on-ubuntu-18-04-bionic-beaver

もう一度、aptパッケージのインデックスをアップデートします。

$ sudo apt-get update

最新のStable版Dockerをインストールします。

$ sudo apt-get install docker-ce

特定のバージョンのDockerをインストールしたい場合、以下のコマンドで、インストール可能なDockerのバージョンを確認できます。

$ apt-cache madison docker-ce
 docker-ce | 18.03.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu artful/stable amd64 Packages
 docker-ce | 17.12.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu artful/stable amd64 Packages
 docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu artful/stable amd64 Packages

GitLabのDockerイメージの準備・起動

それでは、いよいよGitLabのDockerイメージの準備をしていきます。

詳しくは公式ドキュメントを参照してください。
https://docs.gitlab.com/omnibus/docker/

GitLab公式のDockerイメージはこちら。
https://hub.docker.com/r/gitlab/gitlab-ce/

まず、GitLabのDockerイメージをpullしてきます。

$ sudo docker pull gitlab/gitlab-ce

次に、GitLabのデータの永続化のために、GitLab用のファイルを保存するディレクトリをあらかじめつくっておきます(ディレクトリが存在しない場合、Docker起動後に自動的に生成されるようなので必要ないかも…)。

/home/imamachi/desktop/は適当なディレクトリを指定してください。以下は、設定例になります。

$ mkdir -p /home/imamachi/desktop/gitlab/config
$ mkdir -p /home/imamachi/desktop/gitlab/logs
$ mkdir -p /home/imamachi/desktop/gitlab/data

今回は、ローカルネットワーク経由でアクセスできるようにしたいので、Ubuntuのマシンに割り当てられているIPアドレスを調べておきます。

$ ifconfig

上記のコマンドをインストールしていない場合、以下のコマンドでインストールしておきましょう。

$ sudo apt install net-tools

GitLabのDockerイメージを起動するために、以下のコマンドを実行します。 以下のオプションは、自身の環境に合わせて設定します。
--hostname: Ubuntu(サーバ側)に割り当てられているIPアドレス
--volume: /home/imamachi/desktop/の部分は、先ほど作成したディレクトリのパスに合わせてください。
--name: 起動するコンテナの名称。任意の名前でOKですが、わかりやすくgitlabにしておきました。

sudo docker run --detach \
    --hostname 192.168.100.114 \
    --publish 443:443 --publish 80:80 --publish 22:22 --publish 8001:8001 \
    --name gitlab \
    --restart always \
    --volume /home/imamachi/desktop/gitlab/config:/etc/gitlab \
    --volume /home/imamachi/desktop/gitlab/logs:/var/log/gitlab \
    --volume /home/imamachi/desktop/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

--volumeの内容をまとめると、以下の通り。

ローカルディレクト コンテナ内ディレクト 内容
/home/imamachi/desktop/gitlab/config /etc/gitlab GitLabの設定ファイルを格納
/home/imamachi/desktop/gitlab/logs /var/log/gitlab GitLabのログファイルを格納
/home/imamachi/desktop/gitlab/data /var/opt/gitlab GitLabの各種データを格納

--publishでは、サービスごとのポート番号(ホストOS側 : Dockerコンテナ側)を指定しています。

サービス等 ポート番号
HTTPS 443
HTTP 80
SSH 22
Mattermost 8001

--restartalwaysを設定しておくと、ホストOSをリブート(再起動)したときに、自動的にGitLabのDockerイメージを起動させることができます。特別な理由がない限り、この設定でOKだと思います。

毎回、上記のコマンドをコピペして実行していたら面倒なので、Dockerのコマンド類をmakefileにまとめて置くと便利です。

以下は、GitLab用のmakefileの例です。

start:
  sudo docker run --detach \
      --hostname 192.168.100.114 \
      --publish 443:443 --publish 80:80 --publish 22:22 --publish 8001:8001  --publish 9090:9090 \
      --name gitlab \
      --restart always \
      --volume /home/imamachi/Desktop/gitlab/config:/etc/gitlab \
      --volume /home/imamachi/Desktop/gitlab/logs:/var/log/gitlab \
      --volume /home/imamachi/Desktop/gitlab/data:/var/opt/gitlab \
      gitlab/gitlab-ce:latest

restart:
  sudo docker restart gitlab

stop:
  sudo docker stop gitlab

rm:
  sudo docker rm gitlab

例えば、GitLabのDockerイメージの起動は以下のコマンドで実行可能になります。

$ make start

Ubuntuにmakeコマンドがインストールされていない場合、以下のコマンドでインストールしてください。

$ sudo apt install make

GitLabの起動が完了したかどうか確認するために、Dockerイメージの起動時に設定したGitLabのログファイルの出力先(上の例では、/home/imamachi/Desktop/gitlab/logs)を参照します。

logsディレクトリ直下のreconfigureディレクトリ内に*.logファイルが出力されるはずです。コンテナ起動中は、随時ログ情報が書き込まれていきます。

起動が正常に完了すると、最後に以下のログが出力されるはずです。

[2018-04-28T22:33:27+00:00] INFO: Running report handlers
[2018-04-28T22:33:27+00:00] INFO: Report handlers complete

GitLabにアクセスしてみる

http://<IPアドレス>から、GitLabにアクセスすることができます(上記の例では、http://192.168.100.114)。

初期画面では、rootユーザのパスワードの設定画面が表示されます。任意のパスワードを設定して、Change your passwordをクリックします。

Screenshot from 2018-04-19 07-31-27.png (46.9 kB)

次に、ログイン画面が表示されるので、rootユーザもしくは新規にユーザを作成(Register)してGitLabにログイン(Sign In)します。

Screenshot from 2018-04-19 07-31-51.png (43.7 kB)

初回ログインでは、以下のスタートメニューが表示されます。

image.png (123.7 kB)

SSHキーの設定

公開鍵認証によりGitLabとやり取りをするために、SSHキーの設定を行います。

Windows10の場合

WindowsではおなじみのPuTTY Keyだとうまく行かなかったので、OpenSSHにしました。

こちらのGitのサイトから、Git for Windowsをインストールしておきます。
https://git-scm.com/download/win

また、Git用のクライアントアプリとして、SourceTreeをインストールしておきます。
https://ja.atlassian.com/software/sourcetree

Git for Windowsのインストールが完了したら、Git Bashを起動します。

image.png (28.0 kB)

Git Bash上で、以下のコマンドから、SSHキーを生成します。

$ ssh-keygen -t rsa

すると、C:\Users\<ユーザ名>\.ssh以下にid_rsa.pubという名前の公開鍵が生成されるので、テキストエディタなどでファイルを開き、ファイルの中身をコピーします。

image.png (92.6 kB)

User SettingsのSSH Keysの画面から、先ほどコピーしたSSHキーをKey欄に貼り付けます(Titleも自動的につきます)。内容に問題がなければ、Add KeyをクリックしSSHキーを登録します。

image.png (81.6 kB)

SSH Keysを再度クリックして見ると、以下のようにSSHキーが登録されていることが確認できると思います。

image.png (54.6 kB)

今度は、SourceTreeを起動し、先ほど用意した秘密鍵の方を設定しておきます。 SourceTreeの[ツール] -> [オプション]をクリックします。

image.png (25.4 kB)

SSHクライアントの設定で、SSHキーに先ほど用意した秘密鍵をセットします。 SSHクライアントには、OpenSSHを設定します。

image.png (63.6 kB)

続いて、GitLab上のリモートレポジトリを取得します。 まず、GitLab上でリポジトリを作成し、赤枠で囲んだリポジトリのパスをクリップボードにコピーします。

image.png (183.9 kB)

SourceTreeのCloneタブから、先ほどコピーしたリポジトリのパスをペーストします。 「クローン」ボタンをクリックすると、ローカルにリモートリポジトリのクローンを作成できます。

image.png (98.3 kB)

Ubuntuの場合(MacOSの場合もほぼ同様)

以下のコマンドから、SSHキーを生成します。

$ ssh-keygen -t rsa

すると、~/.ssh以下にid_rsa.pubという名前の公開鍵が生成されるので、ファイルの中身をコピーします。

例えば、catコマンドでファイルの中身をコンソールに出力し、内容をコピーしていきます。

$ cat ~/.ssh/id_rsa.pub
(余談)クリップボードへのコピー

上記のように、手作業でコピーしているとミスを誘発する可能性があるので、できればやりたくないです。そこで、コマンド操作でクリップボードへコピーする方法を取ります。

xselコマンドは標準でUbuntuに入っていないので、以下のコマンドでインストールしておきます(何かと使うので入れておくと便利です)。

$ sudo apt install xsel

以下のように、クリップボードへファイルの中身をコピーすることが可能です。でも、xselのコマンドオプションが2つもあって面倒くさいです…。

$ cat ~/.ssh/id_rsa.pub | xsel --clipboard --input

なので、MacOSpbcopyと同じ名前のエイリアスをつけておきます(名前はわかりやすければ何でもいいです)。

$ echo "alias pbcopy='xsel --clipboard --input'" >> ~/.bashrc
$ source ~/.bashrc

すると、以下のコマンドでクリップボードにファイルの中身をコピーできるようになります。

$ cat ~/.ssh/id_rsa.pub | pbcopy

User SettingsのSSH Keysの画面から、先ほどコピーしたSSHキーをKey欄に貼り付けます(Titleも自動的につきます)。内容に問題がなければ、Add KeyをクリックしSSHキーを登録します。

image.png (81.6 kB)

SSH Keysを再度クリックして見ると、以下のようにSSHキーが登録されていることが確認できると思います。

image.png (54.6 kB)

以降の処理は、Windowsと同じなので割愛します。

参考

公開鍵暗号を用いてのSSH接続(きほん)
https://qiita.com/mukoya/items/f20def019e25dc162ca8
コマンドラインからクリップボードへのコピー
https://qiita.com/Kzno/items/6f2fa98256bdffb0fd43

MattermostへGitLabのアカウントでシングルサインオン(SSO)する

GitLabに同梱されているMattermostは、別途Mattermost用のアカウントを作成しなくても、GitLabのアカウントからログインすることができます(シングルサインオン(SSO))。

以下では、GitLabアカウントでのシングルサインオンを行うための設定について紹介します。

ブラウザからGitLabにアクセスし、rootユーザでログイン後、Settingsから、

Screenshot from 2018-04-19 07-33-41.png (18.4 kB)

Applicationsタブに移動し、Mattermostという名前のアプリケーションをGitLabに登録します。 Redirect URIには、以下のURIを指定します(IPアドレスにはホストOSに割り当てられている値を設定してください。ここでは、192.168.100.114にしています)。

http://192.168.100.114:8001/signup/gitlab/complete
http://192.168.100.114:8001/login/gitlab/complete

同じサーバで運用している場合、以下のようにMattermostのポート番号も指定する必要があります。そうしないと、リダイレクトに失敗してしまうので注意です。

Screenshot from 2018-04-19 07-34-47.png (101.4 kB)

Save applicationボタンをクリックし、登録を完了してください。登録に成功すると、以下の画面が表示されます。ここで、Application idSecretの値を次に使うので、控えておいてください。

image.png (85.8 kB)

詳しくは以下を参考のこと。
https://docs.gitlab.com/omnibus/gitlab-mattermost/

続いて、GitLabの設定ファイルを変更します。 まず、一時的にgitlab.rbを編集可能にしておきます(もしくはVimで編集)。

$ cd /home/imamachi/desktop/gitlab/config/
$ sudo chmod 755 gitlab.rb

1125行目辺りにある、以下を編集します。 http://<IPアドレス>:8001と設定します。

mattermost_external_url 'http://192.168.100.114:8001'

Screenshot from 2018-04-19 07-37-17.png (35.5 kB)

1219-1225行辺りにある、以下をコメントアウトをはずして内容を編集します。
gitlab_enable: trueに変更。
gitlab_id: 先ほどのApplication idを指定。
gitlab_secret: 先ほどのSecretを指定。
gitlab_auth_endpoint: http://<IPアドレス>/oauth/authorizeを指定。
gitlab_token_endpoint: http://<IPアドレス>/oauth/tokenを指定。
gitlab_user_api_endpoint: http://<IPアドレス>/api/v4/userを指定。

mattermost['gitlab_enable'] = true
mattermost['gitlab_id'] = "abfb91bd4ebd564d515be4f3d34cb3feb23eeb30a1d47b21548e3f9a63d2b502"
mattermost['gitlab_secret'] = "1e60f2d1148c712a69a3771ccf095db8dd812f482e98360c3b7e0330f168eae7"
mattermost['gitlab_scope'] = ""
mattermost['gitlab_auth_endpoint'] = "http://192.168.100.114/oauth/authorize"
mattermost['gitlab_token_endpoint'] = "http://192.168.100.114/oauth/token"
mattermost['gitlab_user_api_endpoint'] = "http://192.168.100.114/api/v4/user"

Screenshot from 2018-04-20 07-54-05.png (38.8 kB)

GitLabのDockerコンテナを一旦停止させて、破棄します。

$ sudo docker stop gitlab
$ sudo docker rm gitlab

makefileを用意していれば、以下のコマンドで実行できます。

$ make stop
$ make rm

続いて、Dockerコンテナを起動します。

$ sudo docker run --detach \
    --hostname 192.168.100.114 \
    --publish 443:443 --publish 80:80 --publish 22:22 --publish 8001:8001 \
    --name gitlab \
    --restart always \
    --volume /home/imamachi/desktop/gitlab/config:/etc/gitlab \
    --volume /home/imamachi/desktop/gitlab/logs:/var/log/gitlab \
    --volume /home/imamachi/desktop/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

makefileを用意していれば、以下のコマンドで実行できます。

$ make start

参考

https://docs.gitlab.com/omnibus/docker/
https://docs.gitlab.com/omnibus/gitlab-mattermost/

GitLabのDockerコンテナを起動した後、http://<IPアドレス>:8001/にアクセスします(ここまでの例では、http://192.168.100.114:8001/)。すると、GitLab Mattermostのログイン画面が表示されます。

Screenshot from 2018-04-19 07-48-49.png (27.7 kB)

リダイレクトが正しく設定されていると、GitLab Single Sign-Onをクリックした後、以下の画面が表示されます。

image.png (85.4 kB)

Authorizeボタンをクリックすると、Mattermostにログインできます。Create a new teamをクリックし、

Screenshot from 2018-04-19 07-53-09.png (29.7 kB)

チーム名を入力して登録すると、

Screenshot from 2018-04-19 07-53-25.png (28.0 kB)

Screenshot from 2018-04-19 07-53-32.png (37.9 kB)

Mattermostのメイン画面が表示されるはずです。

Screenshot from 2018-04-19 07-53-44.png (60.4 kB)

基本的な準備は、以上で完了です。

まとめ

  • GitLabのDockerイメージの準備・起動
  • GitLabへのSSHキーの設定
  • Mattermostの起動(GitLabアカウントによるSSO)

今回、上記の3つについて、やり方をまとめてみました。他にも、重要なこととしてバックアップのとり方や、サーバ監視などがありますが、今回は割愛しました。以下に、公式のドキュメントのリンクを示すのにとどめておきます。

Backing up and restoring GitLab
https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-omnibus-installations
GitLab Prometheus
https://docs.gitlab.com/ee/administration/monitoring/prometheus/