GitHub クローンな GitLab をインストールする
Software Configuration Management (SCM)
自分だけで使う Git リポジトリを GitHub で管理してみたくなりましたが、非公開にしたいリポジトリの数が多くて GitHub だと費用がかさみ現実的ではありませんでした。
そんな中、GitLab という GitHub クローンなオープンソースの Git リポジトリマネージャーがあると知り、試しに使ってみることにしました。
GitLab とは
GitLab というのは、GitHub と同じ勝手で利用出来る GitHub クローンな Git リポジトリマネージャーです。
オープンソースで開発されていて、自由にインストールして運用できるようになっています。
この頃、自作の iOS アプリのプロジェクトを GitHub で運用してみたくなったのですが、非公開にしたいプロジェクトの数が多くて GitHub だと料金がかさんでしまうのがネックでした。
GitHub と比べて機能に制限があるものの、GitHub のような使い勝手で、非公開プロジェクトも無料でいくつでも運用できます。
GitLab のインストール
今回は GitLab を、 ConoHa VPS 上で稼働している Fedora 20 にインストールします。
GitLab のダウンロードページ
まず、GitLab | Omnibus package downloads for GitLab CE にあるダウンロードページを開くと、インストール予定の OS を選択する画面が表示されます。
今回は Fedora 20 にインストールする予定なので、それにいちばん近い「CentOS 7 (and RedHat/Oracle/Scientific Linux)」を選択します。
そうすると、GitLab のダウンロードからインストール方法までが、その下のDownload the Omnibus package and install everything
の欄に表示されます。
GitLab をインストールするにあたって
ここの、特にcurl
で始まる行に注意して、インストールを進めます。
今回はcurl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.6.2_omnibus.5.3.0.ci.1-1.el7.x86_64.rpm
という表示になってましたが、GitLab
の新しいバージョンが出ると変わるはずなので、そのときの最新のものをダウンロードするようにします。
また、インストール方法の説明の中ではopenssh-server
やpostfix
のインストールについても触れられていますが、必ずしもこれらは必要ありません。
パッケージ | 扱い |
---|---|
openssh-server | SSH サーバーです。Fedora 20 では標準でインストールされているので、これらに関するインストールは必要ありませんでした。 |
postfix | GitLab はさまざまな通知をメール送信しますが、そのときに SMTP サーバーが必要になります。送信用の SMTP サーバーが既にどこかにあれば Postfix のインストールは必要ない様子でした。今回は別に用意されている SMTP サーバーを使うため、インストールは行いません。 |
これらの他にも、GitLab をセットアップしたときに、関係する次のサービスが GitLab 用のディレクトリ (/opt/gitlab/sv/
) に暗黙的にインストールされます。
ちなみにこれらのサービスは、Fedora 20 で一般的なパッケージ管理システムのyum
では管理されない様子です。
サービス | 場所 | 内容 |
---|---|---|
logrotate | /opt/gitlab/sv/logrotate | 運用する中で収集されるログが肥大しないようにログファイルを自動でローテーションするサービスです。 |
nginx | /opt/gitlab/sv/nginx | 軽量、高速性をウリにした Web サーバーです。GitLab の Web インターフェイスを提供するのに使われます。 |
postgresql | /opt/gitlab/sv/postgresql | データベースサーバーです。 |
redis | /opt/gitlab/sv/redis | Key-Value 型のデータストアサーバーです。 |
sidekiq | /opt/gitlab/sv/sidekiq | Ruby で非同期処理を効率良く実装するための仕組みだそうです。 |
unicorn | /opt/gitlab/sv/unicorn | Nginx で Ruby On Rails フレームワークを稼働させる機能を提供するようです。 |
これらのサービスはシステム全般とは別の専用のディレクトリにインストールされて稼働されるようですが、Web サーバーは一般的に TCP の 80 番ポートが使われるので、既に Web サーバーが稼働しているシステムに GitLab をインストールしたいときは衝突しないよう調整が必要そうです。
GitLab のダウンロード
GitLab のダウンロードは、先ほどのダウンロードページに記載されていたとおりのcurl
を使って行います。
curl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.6.2_omnibus.5.3.0.ci.1-1.el7.x86_64.rpm
このようにすることで、このコマンドを実行したときのカレントディレクトリに GitLab の RPM パッケージがダウンロードされます。
どのディレクトリへダウンロードしても大丈夫です。今回は ~/src
ディレクトリにダウンロードすることにしました。
GitLab をインストールする
次のようにしてダウンロードした RPM パッケージをインストールすれば、GitLab のセットアップに必要な機能がインストールされます。
sudo rpm -i gitlab-7.6.2_omnibus.5.3.0.ci.1-1.el7.x86_64.rpm
こうすることで、GitLab の管理を行うためのgitlab-ctl
コマンドや、GitLab の設定を行う/etc/gitlab/gitlab.rb
がインストールされます。
GitLab のセットアップ
GitLab の運用に必要な機能をインストールしたら、基本設定の調整と、最終的なセットアップを行います。
基本設定を調整する
GitLab の基本設定は/etc/gitlab/gitlab.rb
で行います。
設定項目がたくさんありますが、気になったのは次のあたりでした。
GitLab の URL を設定
GitLab の Web インターフェイスや Git リポジトリへアクセスするときに使う URL を、設定ファイルの最初にあるexternal_url
で指定します。
external_url 'http://gitlab.xx.jp'
メール送信で使う SMTP を設定
GitLab が通知メールを送信するときに使う SMTP サーバーをGitLab email server settings
のところで行います。
################################
# GitLab email server settings #
################################
# see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/629def0a7a26e7c2326566f0758d4a27857b52a3/doc/settings/smtp.md#smtp-settings
# Use smtp instead of sendmail/postfix.
# gitlab_rails['smtp_enable'] = true
# gitlab_rails['smtp_address'] = "smtp.server"
# gitlab_rails['smtp_port'] = 456
# gitlab_rails['smtp_user_name'] = "smtp user"
# gitlab_rails['smtp_password'] = "smtp password"
# gitlab_rails['smtp_domain'] = "example.com"
# gitlab_rails['smtp_authentication'] = "login"
# gitlab_rails['smtp_enable_starttls_auto'] = true
# gitlab_rails['smtp_tls'] = false
# gitlab_rails['smtp_openssl_verify_mode'] = false
GitLab をインストールした直後は、上記のように設定が全て #
でコメントアウトされているので、この中のgitlab_rails['smtp_enable'] = true
のコメントを外して有効化し、その他の必要な項目を有効化しつつ調整します。
GitLab を運用するアカウントの設定
GitLab を運用する Linux アカウントに関する設定がModify default git user
のところで行なえるようです。
既定ではアカウント名とグループ名がともにgit
が使われるようで、今回もそれを用意するのでこの設定は調整しませんでしたが、別のアカウントで GitLab を運用したい場合には、この辺りを調整すると良さそうです。
## Modify default git user.
# user['username'] = "git"
# user['group'] = "git"
# user['uid'] = nil
# user['gid'] = nil
# # The shell for the git user
# user['shell'] = "/bin/sh"
# # The home directory for the git user
# user['home'] = "/var/opt/gitlab"
# user['git_user_name'] = "GitLab"
# user['git_user_email'] = "gitlab@#{node['fqdn']}"
データの保存場所に関係する設定
今回は調整しませんでしたが、GitLab のデータを保存する場所に関すると思われる設定もありました。
設定項目 | 設定パス | 用途 |
---|---|---|
gitlabrails['backuppath'] | /var/opt/gitlab/backups | GitLab のバックアップデータが保存される場所のようです。 |
gitdatadir | /var/opt/gitlab/git-data | GitLab で作成した Git リポジトリが保存される場所です。 |
postgresql['datadir'] | /var/opt/gitlab/postgresql/data | GitLab システムのデータベースが保存される場所です。 |
gitlabrails['uploads_directory'] | /var/opt/gitlab/gitlab-rails/uploads | GitLab の Web インターフェイスから登録したアバター画像などのデータがアップロードされる場所です。 |
これらを調整することで変更できるかは試していませんが、保存場所を変更したい場合はこの辺りを中心に探ってみると良いかもしれません。
運用に必要なアカウントを登録する
今回はあらかじめ追加してあった "git" アカウントを使って GitLab を運用することにしました。
既に登録してあったため、GitLab のインストールでこのアカウントが自動作成されるか分からなかったのですが、必要であれば次のようにしてアカウントを作成できます。
useradd git
セットアップを実行する
設定の調整が終わったら、次のようにして GitLab のセットアップを行います。
sudo gitlab-ctl reconfigure
こうすることで、先ほど編集した設定ファイルの内容に従って GitLab がセットアップされます。このとき、データベースや Web サーバーなど、先ほど挙げたサーバー群もインストールされるので、最初は数分ほどの時間がかかります。
設定を再調整したときにもこのコマンドを実行します。その場合はデータベース等はセットアップなどは省かれ、現行のデータが引き続き利用できます。
セキュリティ設定を調整する
これで GitLab のセットアップは終わりましたが、アクセスするには Fedora 20 のセキュリティ設定を調整する必要があります。
Web へのアクセスを許可する
Fedora 20 では標準で Web サービスへのアクセスが禁止されているので、次のようにしてファイアーウォールを通過できるようにします。
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
SSH Key を登録できるようにする
GitLab の Web インターフェイスから SSH キーの登録操作を行えるように、SELinux のセキュリティ設定を調整します。
module gitlab 1.0;
require {
type ssh_keygen_t;
type init_tmp_t;
class file open;
}
allow ssh_keygen_t init_tmp_t:file open;
このようなType Enforcement
ファイルをgitlab.te
として作成したら、次のコマンドを実行して、Policy Package
ファイルgitlab.pp
を作成します。
checkmodule -M -m -o gitlab.mod gitlab.te
semodule_package -o gitlab.pp -m gitlab.mod
こうしてgitlab.pp
が出来上がったら、それを次のようにしてSELinux
に組み込みます。
sudo semodule -i gitlab.pp
こうすることで、GitLab の Web インターフェイスを使用して SSH キーを登録できるようになります。
この設定を行わなかった場合、Web インターフェイスで SSH キーを登録しようとするとFingerprint cannot be generated
というエラーメッセージが表示されます。
GitLab の Web インターフェイスにアクセスする
これで、ブラウザで GitLab のセットアップのときに設定ファイルに指定したexternal_url
にアクセスして、GitLab の Web インターフェイスを使い始められます。
初期パスワードの設定
ここのSign in
のところに、GitLab の公式ページに記載されていた初期アカウントを入力すると、GitLab にサインインできます。
項目 | 初期値 |
---|---|
Username or Email | root |
Password | 5iveL!fe |
初期アカウントでサインインすると、最初に、パスワードの変更画面が表示されます。
ここでCurrent password
に初期パスワードを入力して、Password
とPassword confirmation
に新しく設定したいパスワードを入力します。
そして
を押せば、サインイン用のパスワードの設定は完了です。SSH キーを登録する
GitLab の Git リポジトリを SSH 接続で扱いたい場合には、プロフィール設定にSSH 公開鍵 を登録する必要があります。
最初、SSH キーが未登録の状態だと『SSH のキーを追加しないと、SSH 経由で pull や push ができない』という旨のメッセージがProject
管理ページの上側に表示されています。
Mac で秘密鍵と公開鍵を作成する
まず、接続したい Mac でターミナルを開いて、次のコマンドを実行し、公開鍵と秘密鍵を作成します。
ssh-keygen -t rsa -b 4096
このコマンドを実行した最後にEnter file in which to save the key:
と表示されるので、作成した秘密鍵を保存するファイル名を入力します。何も指定しないとid_rsa
というファイル名になり、ホームディレクトリの.ssh
ディレクトリに保存されます。
そして、秘密鍵のファイル名と同じ名前で、拡張子.pub がつけられたファイルが公開鍵です。
GitLab に公開鍵を登録する
この公開鍵ファイルに保存されているテキストをコピーして、GitLab のProfile
設定画面にあるSSH Keys
の中のKey
の入力欄に貼り付けます。
ここにはTitle
という入力欄もありますが、これはこの公開鍵が何か(どのホスト用のものかなど)を記録するメモのようなものです。
これらの情報を入力したら
を押せば、公開鍵が登録され、秘密鍵を使ってこの GitLab へ SSH 接続できるようになります。Title
欄は自分で自由に入力することもできますが、公開鍵の末尾にはそういった情報が含まれていて、先にKey
欄に公開鍵を張り付ければ、自動的にTitle
も入力されるようになっていました。
準備完了
これで GitLab を使ってひととおりの操作を行う準備ができました。
Appendix
上記までで GitLab の設定は完了です。
以下ではその他の、運用する中で必要になるかもしれないちょっとしたことを記しておきます。
GitLab の起動と停止
GitLab を停止させたい場合は、稼働しているサーバー上で次のコマンドを入力します。
sudo gitlab-ctl stop
このコマンドを実行すると、画面には次のようなメッセージが表示され、GitLab に関連するすべてのサービスが停止されます。
ok: down: logrotate: 0s, normally up ok: down: nginx: 0s, normally up ok: down: postgresql: 0s, normally up ok: down: redis: 0s, normally up ok: down: sidekiq: 1s, normally up ok: down: unicorn: 0s, normally up
GitLab を稼働させたい場合は、次のコマンドを使用します。
sudo gitlab-ctl start
sudo gitlab-ctl start
やsudo gitlab-ctl stop
に続けて、たとえばpostgresql
などのサービス名を指定すると、そのサービスだけを起動したり終了させたりできます。
GitLab の設定を変更したい場合
たとえば運用するホスト名や使用する SMTP サーバーなど、GitLab の設定を変更したい場合は、設定ファイル (/etc/gitlab/gitlab.rb
) を調整して、最初にセットアップしたのと同じコマンドを再度実行します。
sudo gitlab-ctl reconfigure
こうすることで、新しい設定内容が GitLab に反映されます。現在のリポジトリやデータベースなどはそのまま引き続き利用できます。
ただし、たとえばリポジトリの保存先 (data_dir
) を新しいディレクトリに変更した場合は、新しい場所が空のまま用意されるだけで以前のリポジトリは移動されないので、GitLab がリポジトリを見失います。
その場合、以前に使っていたリポジトリをProject
管理画面でインポートできる様子でした。
各種サービスが使用するファイル
GitLab を構成する各種サービスに関係する設定やデータなどのファイルは、既定では次の場所に保存するように設定されている様子でした。
サービス | 内容 | パス |
---|---|---|
Git | リポジトリ | /var/opt/gitlab/git-data/repositories |
PostgreSQL | 実行ファイル | /opt/gitlab/embedded/bin/postgres |
PostgreSQL | データベースのデータ | /var/opt/gitlab/postgresql/data |
Nginx | 実行ファイル | /opt/gitlab/embedded/sbin/nginx |
Nginx | 設定ファイル | /var/opt/gitlab/nginx/conf/gitlab-http.conf |
Nginx | ルートディレクトリ | /opt/gitlab/embedded/service/gitlab-rails/public |
Nginx | アクセスログ | /var/log/gitlab/nginx/gitlabaccess.log |
Nginx | エラーログ | /var/log/gitlab/nginx/gitlaberror.log |
logrotate | 実行ファイル | /opt/gitlab/embedded/sbin/logrotate |
logrotate | 設定ファイル | /var/opt/gitlab/logrotate/logrotate.conf |
redis | 実行ファイル | /opt/gitlab/embedded/bin/redis-server |
redis | 設定ファイル | /var/opt/gitlab/redis/redis.conf |
設定ファイルの更新は、通常は/etc/gitlab/gitlab.rb
の内容を更新してgitlab-ctl reconfigure
有効化する流れになるようです。そのとき上記の各種設定ファイルが上書き更新されるらしいので、直接変更する際は注意が必要そうです。