bitnami gitlab 使用 gitlab-rails 命令

陳順吉發表於2019-03-27

公司的前任配置管理員安裝的 gitlab 使用的是 bitnami 出品的全家桶,和官方的 gitlab 安裝方式完全不同,包括配置檔案、啟動的方式、各種命令列工具都不相同。

他離職之後,gitlab 就交給新配置管理員了,但是對方對 gitlab 瞭解有限,基本上有什麼疑難雜症還得找我。

我們的 gitlab 使用的是版本為 8.5.1,安裝在 /opt 目錄。

因為我們 gitlab 接入了 ldap,並且將 ldap 中的一個使用者設定成了管理員,而這次又不知道是什麼原因導致它被鎖定了。鎖定之後無法解鎖,報 This user cannot be unlocked manually from GitLab 這樣的錯,同時也無法刪除該使用者,因為使用它建立了很多的組。

谷歌了一下,解決辦法是通過 gitlab-rails 命令手動修改使用者的狀態,但是我根本沒有找到這個命令。後來不死心,仔細找了找,終於在 /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/bin/ 找到了 rails 命令。

不過執行直接報錯:

# /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/bin/rails
/usr/bin/env: ruby: No such file or directory
複製程式碼

需要 ruby 環境。雖然可以直接 yum install ruby 來安裝,但是自帶的版本才 1.8.7,不用裝我也知道太老,於是找安裝 ruby 的方法。在官網上找到了一種 RVM 安裝的方式,這種方式類似於 Python 的 pyenv,可以管理多個 ruby 版本。那沒什麼好想的,就它了。

安裝 ruby

# curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
# \curl -sSL https://get.rvm.io | bash -s stable
複製程式碼

安裝在 /usr/local/rvm。安裝完成之後提示要將使用 rvm 的使用者加入到 rvm 組,不過我這裡使用 root,就不管了。

接著就是安裝 ruby 了,安裝什麼版本呢?我也不知道,但是 rvm 知道,執行下面命令即可。

cd /opt/gitlab-8.5.1-0/apps/gitlab/htdocs
/usr/local/rvm/bin/rvm list known
複製程式碼

緊接著你就能夠看到提示:

Required ruby-2.1.8 is not installed.
To install do: 'rvm install "ruby-2.1.8"'
複製程式碼

當然下面還有很多內容,我們不用管,rvm 自動提示我們需要安裝 2.1.8 版本的 ruby。之所以會出現這樣的情況,我猜測是因為當前目錄下存在 Gemfile、Gemfile.lock 等檔案。

安裝 ruby 2.1.8,請確保 yum 源可用:

/usr/local/rvm/bin/rvm install "ruby-2.1.8"
複製程式碼

安裝的位置為 /usr/local/rvm/rubies/ruby-2.1.8/bin/ruby

安裝完成之後我們修改 /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/bin/rails 檔案,將第一行改為 /usr/local/rvm/rubies/ruby-2.1.8/bin/ruby,然後執行 rails 同樣會失敗,報對應的元件不存在。

安裝依賴

不用慌,因為它依賴的包我們還沒有裝,這時返回到它的上級目錄,就是 htdocs,它下面存在 Gemfile。

然後執行下面命令:

/usr/local/rvm/wrappers/ruby-2.1.8/bundle install
複製程式碼

它開始安裝 Gemfile 裡面的依賴包,安裝過程中難為會報錯,因為總有些開發包你沒有安裝。報錯了也不用慌,基本上它都會講解決辦法告訴你。

比如我這裡安裝 charlock_holmes 失敗:

Fetching charlock_holmes 0.7.3
Installing charlock_holmes 0.7.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/gems/charlock_holmes-0.7.3/ext/charlock_holmes
/usr/local/rvm/rubies/ruby-2.1.8/bin/ruby -r ./siteconf20190319-934-13vhsli.rb extconf.rb
checking for main() in -licui18n... no
which: no brew in
(/usr/local/rvm/gems/ruby-2.1.8/bin:/usr/local/rvm/gems/ruby-2.1.8@global/bin:/usr/local/rvm/rubies/ruby-2.1.8/bin:/usr/lib64/qt-3.3/bin:/usr/local/jdk1.7.0_79/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
checking for main() in -licui18n... no

# 這裡已經告訴你解決辦法
***************************************************************************************
*********** icu required (brew install icu4c or apt-get install libicu-dev) ***********
***************************************************************************************
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/local/rvm/rubies/ruby-2.1.8/bin/ruby
	--with-icu-dir
	--without-icu-dir
	--with-icu-include
	--without-icu-include=${icu-dir}/include
	--with-icu-lib
	--without-icu-lib=${icu-dir}/lib
	--with-icui18nlib
	--without-icui18nlib
	--with-icui18nlib
	--without-icui18nlib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/extensions/x86_64-linux/2.1.0/charlock_holmes-0.7.3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/gems/charlock_holmes-0.7.3 for inspection.
Results logged to /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/extensions/x86_64-linux/2.1.0/charlock_holmes-0.7.3/gem_make.out

An error occurred while installing charlock_holmes (0.7.3), and Bundler cannot continue.
Make sure that `gem install charlock_holmes -v '0.7.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  gitlab_git was resolved to 8.2.0, which depends on
    github-linguist was resolved to 4.7.5, which depends on
      charlock_holmes
複製程式碼

上面已經說了要我們 brew install icu4c or apt-get install libicu-dev,這裡是 macOS 和 Ubuntu 的解決辦法,CentOS 的解決方法則是 yum install libicu-devel

有些報錯可能不會直接將解決辦法告訴你,但是它也將原因告訴你了,比如這個報錯:

Fetching rugged 0.24.0b13
Installing rugged 0.24.0b13 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/gems/rugged-0.24.0b13/ext/rugged
/usr/local/rvm/rubies/ruby-2.1.8/bin/ruby -r ./siteconf20190319-2037-829l33.rb extconf.rb
checking for gmake... yes
checking for cmake... no
ERROR: CMake is required to build Rugged.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
複製程式碼

說缺少 cmake,那我們直接 yum install cmake

接下來還遇到兩次報錯,一次是 mysql2,提示 yum install mysql-devel;還有一次是 pg,說是找不到 libpq-fe.h,使用 yum provides "*/libpq-fe.h",可以找到是 postgresql-devel,yum insall 完事。

需要注意的是,你最好一次性都安裝成功,如果只安裝一半,會影響 gitlab 的正常使用。最大的體現就是無法合併分支,而且拉分支的話會報 Branch creation was rejected by Git hook 這樣的錯。

安裝 nodejs

再次執行 rails 會報錯,提示沒有 nodejs 執行環境:

# ./rails console
...
/opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/gems/execjs-2.6.0/lib/execjs/runtimes.rb:48:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
	from /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/vendor/bundle/ruby/2.1.0/gems/execjs-2.6.0/lib/execjs.rb:5:in `<module:ExecJS>'
複製程式碼

既然沒有,那就下一個唄:

wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz
tar xf node-v10.15.3-linux-x64.tar.xz -C /usr/local
cd /usr/local
ln -s node-v10.15.3-linux-x64/ node
ln -s `pwd`/node/bin/node /usr/bin/node
複製程式碼

修改 postgresql 配置

再次執行 ./rails console 成功進入。但是一旦你執行命令,它會報錯,連不上 postgresql:

2.1.8 :001 > User.find_by_any_email("EMAIL")
PG::ConnectionBad: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
複製程式碼

預設通過 Unix 域套接字來連線資料庫,但是這個套接字檔案不在 /tmp 下。這個問題解決起來也簡單,只需要找到現在的套接字檔案,然後連線到 /tmp 目錄下即可。當然,你也可以直接修改 pgsql 的配置檔案,一次性解決問題。無論如何,我們都得先找到它的配置檔案。

其實只要在 gitlab 的安裝目錄稍微找找就能夠找到,我這裡就直接開啟了:

vim /opt/gitlab-8.5.1-0/postgresql/data/postgresql.conf

# 這行就指定了套接字的目錄
unix_socket_directories = '/opt/gitlab-8.5.1-0/postgresql'
複製程式碼

看到之後,你可能立即就 ls 這個目錄了,咦,怎麼啥都沒有?因為這個檔案是以 . 開頭,你要通過 -a 引數才能看到,域套接字的格式就是 .s.PGSQL. + 埠。

找到之後,我們直接做個軟連線:

ln -s /opt/gitlab-8.5.1-0/postgresql/.s.PGSQL.5432 /tmp/
複製程式碼

繼續執行 rails 命令:

# ./rails console

2.1.8 :001 > User.find_by_any_email("EMAIL")
PG::ConnectionBad: fe_sendauth: no password supplied
複製程式碼

又 ™ 報錯了,說沒有指定密碼。pgsql 雖然連上了,但是卻沒有密碼,於是我趕緊看了下 rails 的使用幫助,但是並沒有找到有輸入密碼的地方,而且我也不知道它的密碼是啥。。

又仔細的看了下 rails 命令的輸出,於是發現了這行:

Loading development environment (Rails 4.2.5.1)
複製程式碼

說是載入了開發環境的配置,它竟然還有環境之分,這我也是第一次知道,畢竟對 gitlab 瞭解不多。於是又翻了翻 gitlab 的配置檔案,找到了資料庫方面的配置,我這裡就直接開啟了。

# vim /opt/gitlab-8.5.1-0/apps/gitlab/htdocs/config/database.yml

#
# PRODUCTION
#
production:
  adapter: postgresql
  encoding: unicode
  database: 手動打碼
  pool: 10
  username: 手動打碼
  password: 手動打碼
  host: 127.0.0.1
  port: 5432
  # port: 5432

#
# Development specific
#
development:
  adapter: postgresql
  encoding: unicode
  database: 手動打碼
  pool: 5
  username: 手動打碼
  password: 手動打碼
複製程式碼

環境挺多,這裡只列出了開發和生成環境,因為我這裡的開發環境的密碼沒有配置,所以才會出現上面沒有認證的情況。解決辦法就是直接使用生產環境的配置,於是看了看 rails 的用法,找到了指定生產環境的方法。

# ./rails console -e production

2.1.8 :002 > user = User.find_by_any_email("MAIL")
複製程式碼

順利的找到一堆結果,然後修改下使用者的狀態就能夠將使用者解鎖:

2.1.8 :003 > user.state = "active"
2.1.8 :004 > user.save
2.1.8 :005 > exit
複製程式碼

ok,文章到此結束。

相關文章