Ubuntu 18.04 LTSにDockerを使ってGitLabとMattermostを導入してみた
はじめに
Gitのバージョン管理システムとしてGitHub、継続的インテグレーションツールとしてCircleCIやTravisCI、開発者向けのコミュニケーションツールとしてSlackといったクラウドサービス(SaaS)が注目を集めています(というより、昨今では当たり前に使われているツールかも)。
しかし、会社によってはクラウドはNGでオンプレミスである必要があったり、予算的な問題があったりとなかなか導入できない事情があるかと思います。
オープンソースでGitHubやCircleCI、Slack風の機能を実装したツールはないものか…。 そこで、GitLabの出番です!
GitLabって何?
GitLabは、GitHub風なGitのバージョン管理ツールに加えて、システム開発のフロー全体をカバーする様々なツールを提供してくれます。コア機能についてはオープンソースで開発が行われており、フリーで自前のサーバに導入可能です(オープンソース版であるGitLab Community Edition (CE)はMIT License下で配布されています)。
GitLabの具体的な機能としては、Gitによるバージョン管理以外に、継続的インテグレーション・継続的デリバリー(GitLab CI/CD)、チケット管理ツール、各種コミュニケーションツール(Mattermost含む)、監視ツール(Prometheus)、Dockerイメージレジストリ(GitLab Container Registry)、Web IDEなどなど、たくさんの有用な機能を使うことができます(もちろん、フリーの範囲内で利用可能)。
上記のサービスに対応するSaaS(GitHub、CircleCI、JIRAなど)を使う場合には、どうしても費用がかかってしまいますし、別々のサービスになるので管理も大変になります。GitLabならオールインワンで、それらのサービスがフリーで手に入ります(ただし、オンプレミスに限る。もちろん、サーバの管理も必要になる)。
機能の詳細については、公式のドキュメントを参照してみてください(Core / Freeとなっているのが、オープンソースで開発されているFree版で使える機能になります)。
また、これらのサービスを活用することで、チケット駆動開発(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 |
--restart
にalways
を設定しておくと、ホスト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
をクリックします。
次に、ログイン画面が表示されるので、rootユーザもしくは新規にユーザを作成(Register)してGitLabにログイン(Sign In)します。
初回ログインでは、以下のスタートメニューが表示されます。
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を起動します。
Git Bash上で、以下のコマンドから、SSHキーを生成します。
$ ssh-keygen -t rsa
すると、C:\Users\<ユーザ名>\.ssh
以下にid_rsa.pub
という名前の公開鍵が生成されるので、テキストエディタなどでファイルを開き、ファイルの中身をコピーします。
User SettingsのSSH Keysの画面から、先ほどコピーしたSSHキーをKey欄に貼り付けます(Titleも自動的につきます)。内容に問題がなければ、Add Key
をクリックしSSHキーを登録します。
SSH Keysを再度クリックして見ると、以下のようにSSHキーが登録されていることが確認できると思います。
今度は、SourceTreeを起動し、先ほど用意した秘密鍵の方を設定しておきます。 SourceTreeの[ツール] -> [オプション]をクリックします。
SSHクライアントの設定で、SSHキーに先ほど用意した秘密鍵をセットします。
SSHクライアントには、OpenSSH
を設定します。
続いて、GitLab上のリモートレポジトリを取得します。 まず、GitLab上でリポジトリを作成し、赤枠で囲んだリポジトリのパスをクリップボードにコピーします。
SourceTreeのCloneタブから、先ほどコピーしたリポジトリのパスをペーストします。 「クローン」ボタンをクリックすると、ローカルにリモートリポジトリのクローンを作成できます。
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
なので、MacOSのpbcopy
と同じ名前のエイリアスをつけておきます(名前はわかりやすければ何でもいいです)。
$ 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キーを登録します。
SSH Keysを再度クリックして見ると、以下のようにSSHキーが登録されていることが確認できると思います。
以降の処理は、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から、
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のポート番号も指定する必要があります。そうしないと、リダイレクトに失敗してしまうので注意です。
Save application
ボタンをクリックし、登録を完了してください。登録に成功すると、以下の画面が表示されます。ここで、Application id
とSecret
の値を次に使うので、控えておいてください。
詳しくは以下を参考のこと。
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'
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"
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のログイン画面が表示されます。
リダイレクトが正しく設定されていると、GitLab Single Sign-On
をクリックした後、以下の画面が表示されます。
Authorize
ボタンをクリックすると、Mattermostにログインできます。Create a new team
をクリックし、
チーム名を入力して登録すると、
Mattermostのメイン画面が表示されるはずです。
基本的な準備は、以上で完了です。
まとめ
- 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/