2020年4月24日金曜日

Gitlab 11.8 をソースコードからインストールしてみた

概要

Gitlab をソースコードからインストールしてみました
基本は公式のドキュメントを参考にしています
バージョンも上記のドキュメントに記載の通り 11.8 というバージョンをインストールしています 

Gitlab 自体の開発をしたりビルドする必要がある場合には必須かなと思います
Ruby のバージョンは公式のドキュメントだと 2.6 ですが 2.6 だと protocolbuf などがインストールできないので 2.5.3 を使います

環境

ビルドが成功した際の各種パッケージや言語環境のバージョンは以下の通りです

  • Gitlab
  • Ubuntu 16.04.6 LTS
  • Ruby 2.5.3 (rvm)
  • Go 1.13.5
  • Nodejs 12.16.2
    • yarn 1.22.4
  • Postgres 9.5.21
  • Redis 3.0.6
  • git 2.26.2

依存パッケージのインストール

  • sudo su -
  • apt -y update
apt -y install build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libre2-dev \
  libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev \
  libxslt-dev libcurl4-openssl-dev libicu-dev logrotate rsync python-docutils pkg-config cmake \
  runit

editor コマンドのエディタを vim にする

  • sudo su -
  • update-alternatives --set editor /usr/bin/vim.basic

git の最新版をインストール

2.18 以上のバージョンが必要なためです
Ubuntu16.04 のデフォルトリポジトリだと古い git がインストールされてしまいます

  • sudo su -
  • add-apt-repository ppa:git-core/ppa
  • apt -y update
  • apt -y install git

Ruby のインストール

rvm から 2.5.3 をインストールします

  • sudo apt -y install gnupg2
  • gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  • \curl -sSL https://get.rvm.io | bash -s stable
  • /usr/local/rvm/bin/rvm install ruby-2.5.3
  • /usr/local/rvm/bin/rvm alias create default ruby-2.5.3

ruby -v でバージョンが表示されれば OK です

Go のインストール

  • sudo su -
  • mkdir /tmp/go && cd /tmp/go
  • curl --remote-name --progress https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
  • echo '512103d7ad296467814a6e3f635631bd35574cab3369a97a323c9a585ccaa569 go1.13.5.linux-amd64.tar.gz' | shasum -a256 -c - && tar -C /usr/local -xzf go1.13.5.linux-amd64.tar.gz
  • ln -sf /usr/local/go/bin/{go,godoc,gofmt} /usr/local/bin/

go version でバージョンが表示されれば OK です

Nodejs と yarn のインストール

  • sudo su -
  • curl --location https://deb.nodesource.com/setup_12.x | bash -
  • apt -y install nodejs
  • curl --silent --show-error https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
  • echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
  • apt -y update
  • apt -y install yarn

node -vyarn -v でバージョンが表示されれば OK です

git ユーザの作成

git ユーザは Gitlab のアプリケーションの所有者になります

  • sudo su -
  • adduser --disabled-login --gecos 'GitLab' git

Postgres のインストールと設定

  • sudo su -
  • apt -y install postgresql postgresql-client libpq-dev postgresql-contrib

続いてデータベースの作成などを行います
公式の手順にはない手順として git ロールのパスワードの設定をしています
このパスワードはデフォルトの database.yml に記載されているパスワードになります

  • systemctl start postgresql
  • su - postgres
  • sudo -u postgres psql -d template1 -c "CREATE USER git CREATEDB;"
  • sudo -u postgres psql -d template1 -c "ALTER ROLE git WITH PASSWORD 'secure password';"
  • sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
  • sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
  • `sudo -u git -H psql -d gitlabhq_production

SQL プロンプトになったら pg_trgm エクステンションが有効になっているか確認します

  • SELECT true AS enabled FROM pg_available_extensions WHERE name = 'pg_trgm' AND installed_version IS NOT NULL;

Redis のインストール

  • sudo su -
  • apt -y install redis-server

設定ファイルを編集して socket ファイルでローカル接続できるようにします
オリジナルのファイルの一部を書き換えて書き換えた設定を新たなコンフィグファイルとして書き換えています
また tmp ディレクトリを定期的に削除するルールを追加します

  • cp /etc/redis/redis.conf /etc/redis/redis.conf.orig
  • sed 's/^port .*/port 0/' /etc/redis/redis.conf.orig | tee /etc/redis/redis.conf
  • echo 'unixsocket /var/run/redis/redis.sock' | tee -a /etc/redis/redis.conf
  • echo 'unixsocketperm 770' | tee -a /etc/redis/redis.conf
  • mkdir -p /var/run/redis
  • chown redis:redis /var/run/redis
  • chmod 755 /var/run/redis
if [ -d /etc/tmpfiles.d ]; then
  echo 'd  /var/run/redis  0755  redis  redis  10d  -' | tee -a /etc/tmpfiles.d/redis.conf
fi
  • systemctl restart redis
  • usermod -aG redis git

redis-cli -s /var/run/redis/redis.sock で接続できれば OK です

Gitlab インストールと設定

  • sudo su -
  • cd /home/git
  • git config --global http.postBuffer 524288000
  • sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-foss.git -b 11-8-stable gitlab

リポジトリがかなり大きいです
error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54 などが出る場合は以下の shallow clone を試してみてください

  • sudo -u git -H git clone --depth 1 https://gitlab.com/gitlab-org/gitlab-foss.git -b 11-8-stable gitlab

必要な設定ファイルの配置を行います
シングルホストであれば基本はデフォルトのままで動作するはずです

  • cd /home/git/gitlab
  • sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
  • # sudo -u git -H editor config/gitlab.yml
  • sudo -u git -H cp config/secrets.yml.example config/secrets.yml
  • sudo -u git -H chmod 0600 config/secrets.yml
  • sudo chown -R git log/
  • sudo chown -R git tmp/
  • sudo chmod -R u+rwX,go-w log/
  • sudo chmod -R u+rwX tmp/
  • sudo chmod -R u+rwX tmp/pids/
  • sudo chmod -R u+rwX tmp/sockets/
  • sudo -u git -H mkdir -p public/uploads/
  • sudo chmod 0700 public/uploads
  • sudo chmod -R u+rwX builds/
  • sudo chmod -R u+rwX shared/artifacts/
  • sudo chmod -R ug+rwX shared/pages/
  • # sudo -u git -H cp config/puma.example.development.rb config/puma.rb
  • # sudo -u git -H editor config/puma.rb
  • sudo -u git -H cp config/unicorn.rb.example.development config/unicorn.rb
  • sudo -u git -H editor config/unicorn.rb
#listen '/home/git/gitlab.socket'
listen '/home/git/gitlab/tmp/sockets/gitlab.socket'

ドキュメントでは puma で動作するはずなのですが unicorn のようなので unicorn.rb を配置します
また socket ファイルの場所を変更します、これは gitlab-workhorse が見ている socket ファイルの場所がデフォルトだと /home/git/gitlab/tmp/sockets/gitlab.socket になっているためです
次に git の設定を変更します
おそらくこの辺りはコミッター向けの設定かなと思います

  • sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
  • sudo -u git -H git config --global core.autocrlf input
  • sudo -u git -H git config --global gc.auto 0
  • sudo -u git -H git config --global repack.writeBitmaps true
  • sudo -u git -H git config --global receive.advertisePushOptions true
  • sudo -u git -H git config --global core.fsyncObjectFiles true

最後に Redis を使ったワーカーの設定ファイルを配置します

  • sudo -u git -H cp config/resque.yml.example config/resque.yml
  • # sudo -u git -H editor config/resque.yml

DB の設定を行います
こちらも基本的には変更は不要だと思います

  • sudo -u git cp config/database.yml.postgresql config/database.yml
  • # sudo -u git -H editor config/database.yml
  • sudo -u git -H chmod o-rwx config/database.yml

Gem のインストール

ここからは git ユーザに変わって作業することをおすすめします
bundle install の際は「development」「test」を指定しないと rake -T でタスクの一覧が確認できなかったので指定します

  • su - git
  • bundle install --with development test
  • bundle exec rake -T

Gitlab を管理するシェルをインストール

  • su - git
  • bundle exec rake gitlab:shell:install REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production SKIP_STORAGE_VALIDATION=true
  • # editor /home/git/gitlab-shell/config.yml

/home/git/gitlab-shell/bin/gitlab-shell にインストールされます

  • bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production

/home/git/gitlab-workhorse/gitlab-workhorse にインストールされます

なお公式のドキュメントにある「gitlab:indexer:install」はタスクの一覧に 11-8-stable ブランチにはないようです

Gitaly のインストールと起動

  • su - git
  • bundle exec rake "gitlab:gitaly:install[/home/git/gitaly,/home/git/repositories]" RAILS_ENV=production

/home/git/gitaly/_build/bin/gitaly にインストールされます

  • sudo su -
  • chmod 0700 /home/git/gitlab/tmp/sockets/private
  • chown git /home/git/gitlab/tmp/sockets/private
  • su - git
  • cd /home/git/gitaly
  • # editor config.toml
  • gitlab_path=/home/git/gitlab gitaly_path=/home/git/gitaly && ${gitlab_path}/bin/daemon_with_pidfile ${gitlab_path}/tmp/pids/gitaly.pid ${gitaly_path}/gitaly ${gitaly_path}/config.toml >> ${gitlab_path}/log/gitaly.log 2>&1

ps aux | grep gitaly で 3 つほどプロセスが起動していれば OK です

データベースのマイグレート

この作業には事前に gitaly の起動が必要です

  • sudo su -
  • su - git
  • cd /home/git/gitlab
  • bundle exec rake gitlab:setup RAILS_ENV=production

psql gitlabhq_production -c '\d' を実行すると 294 個のテーブルが作成されていることが確認できると思います

各プロセスの起動スクリプトを配置

  • sudo su -
  • cd /home/git/gitlab
  • cp lib/support/init.d/gitlab /etc/init.d/gitlab
  • cp lib/support/init.d/gitlab.default.example /etc/default/gitlab
  • update-rc.d gitlab defaults 21

ls -l /etc/rc*.d/*gitlab でランレベルなどを確認できます
なお起動スクリプト配置後は gitaly の起動と停止もここから行えます

ログローテションの設定

  • sudo su -
  • cd /home/git/gitlab
  • cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

状態を確認する

  • sudo su -
  • su - git
  • cd /home/git/gitlab
  • bundle exec rake gitlab:env:info RAILS_ENV=production

ここまでのインストール状況では以下のように表示されました

System information
System:         Ubuntu 16.04
Current User:   git
Using RVM:      yes
RVM Version:    1.29.10
Ruby Version:   2.5.3p105
Gem Version:    2.7.7
Bundler Version:1.16.2
Rake Version:   12.3.2
Redis Version:  3.0.6
Git Version:    2.7.4
Sidekiq Version:5.2.5
Go Version:     go1.13.5 linux/amd64

GitLab information
Version:        11.8.10
Revision:       7d457b7
Directory:      /home/git/gitlab
DB Adapter:     postgresql
URL:            http://localhost
HTTP Clone URL: http://localhost/some-group/some-project.git
SSH Clone URL:  git@localhost:some-group/some-project.git
Using LDAP:     no
Using Omniauth: yes
Omniauth Providers: 

GitLab Shell
Version:        8.4.4
Repository storage paths:
- default:      /home/git/repositories
Hooks:          /home/git/gitlab-shell/hooks
Git:            /usr/bin/git

UI 関連の作業

あとは UI 関連のインストールや設定を行います

GetText PO files の作成

簡単に言えば UI の国際化対応 (ローカライズ) のためのファイルを作成します

  • sudo su -
  • su - git
  • cd /home/git/gitlab
  • bundle exec rake gettext:compile RAILS_ENV=production

アセットファイルの作成

UI のビルドを行い js ファイルを生成します
少し時間がかかります

  • sudo su -
  • su - git
  • cd /home/git/gitlab
  • yarn install --production --pure-lockfile
  • bundle exec rake gitlab:assets:compile RAILS_ENV=production NODE_ENV=production

Gitlab の起動

起動スクリプトを配置してので systemctl or service コマンドで起動できます

  • sudo su -
  • systemctl start gitlab

bundler: failed to load command: unicorn_rails (/home/git/gitlab/vendor/bundle/ruby/2.5.0/bin/unicorn_rails) が出る場合は unicron.rb が設置されているか確認しましょう

Nginx のインストールと設定

xenial デフォルトのリポジトリからインストールできる nginx はバージョンが古いので最新の安定版の nginx をインストールします

  • sudo su -
  • add-apt-repository ppa:nginx/stable
  • apt -y update
  • apt -y install nginx
  • cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
  • ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
  • rm -f /etc/nginx/sites-enabled/default

nginx -t で config ファイルの間違えをチェックしましょう

  • systemctl restart nginx

動作確認

  • sudo su -
  • su - git
  • cd /home/git/gitlab
  • bundle exec rake gitlab:check RAILS_ENV=production
Checking GitLab subtasks ...

Checking GitLab Shell ...

GitLab Shell: ... GitLab Shell version >= 8.4.4 ? ... OK (8.4.4)
Running /home/git/gitlab-shell/bin/check
Check GitLab API access: OK
Redis available via internal API: OK

Access to /home/git/.ssh/authorized_keys: OK
gitlab-shell self-check successful

Checking GitLab Shell ... Finished

Checking Gitaly ...

Gitaly: ... default ... OK

Checking Gitaly ... Finished

Checking Sidekiq ...

Sidekiq: ... Running? ... yes
Number of Sidekiq processes ... 1

Checking Sidekiq ... Finished

Checking Incoming Email ...

Incoming Email: ... Reply by email is disabled in config/gitlab.yml

Checking Incoming Email ... Finished

Checking LDAP ...

LDAP: ... LDAP is disabled in config/gitlab.yml

Checking LDAP ... Finished

Checking GitLab App ...

Git configured correctly? ... yes
Database config exists? ... yes
All migrations up? ... yes
Database contains orphaned GroupMembers? ... no
GitLab config exists? ... yes
GitLab config up to date? ... yes
Log directory writable? ... yes
Tmp directory writable? ... yes
Uploads directory exists? ... yes
Uploads directory has correct permissions? ... yes
Uploads directory tmp has correct permissions? ... skipped (no tmp uploads folder yet)
Init script exists? ... yes
Init script up-to-date? ... yes
Projects have namespace: ... can't check, you have no projects
Redis version >= 2.8.0? ... yes
Ruby version >= 2.3.5 ? ... yes (2.5.3)
Git version >= 2.18.0 ? ... yes (2.26.2)
Git user has default SSH configuration? ... yes
Active users: ... 1

Checking GitLab App ... Finished


Checking GitLab subtasks ... Finished

まずは必要なプロセスが動作しているか確認しましょう
自分は Update your git to a version >= 2.18.0 from 2.7.4 が出たので git を最新版に変更しました (冒頭で紹介)
最終的にエラーが表示されなければ OK です

あとはブラウザで Ubuntu サーバの IP (自分は vagrant なので 192.168.100.11) にアクセスしましょう
ちゃんと Gitlab にアクセスできることが確認できます

root ユーザのパスワードを設定しプロジェクトの作成ができるか確認してみましょう

コードを直接変更するには

手元にコードがあるので直接変更してみましょう
Gitlab は 192.168.100.11/favicon.png に問い合わせると favicon のアイコンデータが URL にリダイレクトします
修正してトップページリダイレクトされるようにしてみましょう

  • sudo su - git
  • cd /home/git/gitlab
  • vim config/routes.rb
favicon_redirect = redirect do |_params, _request|
  '/'
  #ActionController::Base.helpers.asset_url(Gitlab::Favicon.main)
end
  • sudo systemctl restart gitlab

これで 192.168.100.11/favicon.png に問い合わせるとトップページにリダイレクトされるようになると思います

おまけ: Gitlab Pages のインストールと設定

この操作は任意です
Pages はなくても動作します

  • sudo su - git
  • cd /home/git
  • git clone https://gitlab.com/gitlab-org/gitlab-pages.git
  • cd gitlab-pages/
  • git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
  • make

設定ファイルを変更して Gitlab Pages を有効にします

  • vim config/gitlab.yml
pages:
  enabled: true
  • sudo vim /etc/default/gitlab
gitlab_pages_enabled=true
  • sudo cp lib/support/nginx/gitlab-pages /etc/nginx/sites-available/gitlab-pages.conf
  • sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages.conf

あとは nginx と gitlab を再起動すれば OK です

  • sudo systemctl restart nginx
  • sudo systemctl restart gitlab

最後に

Gitlab をソースコードからインストールしてみました
Gitlab の仕組みなどを学習したい場合には良いかなと思いますが実際に production で使う場合には Omnibus Install を使いましょう
ソースコードが手元にあるので直接バグを改修したりできるので開発者やデバッガ向けの環境かなと思います

大変だったのは Gitlab のバージョンによる Ruby のバージョンの違いかなと思います
当初は Ruby2.6 で進めていたのですがうまく行かず 2.5 にしました
あとはドキュメントがちょくちょく間違っているのでそこは自力で解決した感じです
Gitlab のログは /home/git/gitlab/log/ にあるのでこのあたりを見ながら解決しました

また後からわかったのですが gitlab-foss は readonly リポジトリになっているようで開発のメインリポジトリをビルドしたい場合は gitlab.org/gitlab をビルドしてみると良いと思います

参考サイト

0 件のコメント:

コメントを投稿