上個禮拜 GitLab 升級到 17.3 了(官方部落格)。由於 Heresy 是使用 Docker 版本,所以在升級上一直都算簡單,只要升級 Docker image、讓他去跑更新就好。
不過,這次從 17.2.2 升級到 17.3 的時候,倒是又久違地碰到更新之後 Docker 容器會不斷重啟的問題了。
而透過 gitlab logs gitlab
這樣的指令去看紀錄的話,可以發現他是死在 migrate gitlab-rails database、也就是遷移 gitlab-rail 資料庫這項工作;下面是一些紀錄(這邊把時間抽掉了):
[TIME] FATAL: Stacktrace dumped to
/opt/gitlab/embedded/cookbooks/cache/cinc-stacktrace.out
[TIME] FATAL: -----------------------------------------------------
[TIME] FATAL: PLEASE PROVIDE THE CONTENTS OF THE stacktrace.out FILE
(above) IF YOU FILE A BUG REPORT
[TIME] FATAL: ------------------------------------------------------
[TIME] FATAL: Mixlib::ShellOut::ShellCommandFailed:
rails_migration[gitlab-rails] (gitlab::database_migrations line 51)
had an error: Mixlib::ShellOut::ShellCommandFailed:
bash_hide_env[migrate gitlab-rails database]
(gitlab::database_migrations line 20) had an error:
Mixlib::ShellOut::ShellCommandFailed:
Expected process to exit with [0], but received '1'
Recipe: gitlab::database_migrations * ruby_block[check remote PG version] action nothing
(skipped due to action :nothing) * rails_migration[gitlab-rails] action run[TIME] WARN:
gitlab-rails does not have a log_group or default logdir mode defined.
Setting to 0700. * bash_hide_env[migrate gitlab-rails database] action run [execute] rake aborted! StandardError: An error has occurred, this and all later
migrations canceled: PG::InternalError: ERROR: no unpinned buffers available
再把虛擬機器還原後再跑了一次,還是一樣的錯誤,所以問題應該還算滿明確的?找了一下後,在官方論壇上果然也有人有同樣的問題。在《Upgrade 17.2.2 -> 17.3 fails at DB migration》裡面就有人提出同樣的問題,而且也已經有人回答可用的答案了。
這邊看來原因很單純,就是 PostgreSQL 預設的 shared memory buffers 是 256MB、很有可能不夠大,所以才導致失敗。
所以解決的方法,就是把它改大就好了!
這邊基本上就是去編輯 GitLab 的設定檔、gitlab.rb
(在 GitLab 裡面的話,是 /etc/gitlab/gitlab.rb
),找到:
##! **recommend value is 1/4 of total RAM, up to 14GB.**
# postgresql['shared_buffers'] = "256MB"
然後把他的註解拿掉、並把 256MB 改大了~
(這邊的 gitlab.rb
如果不是系統產生、而是一開始就自己寫的話,可能會沒有上面的內容、這時候會需要自己修改)
Heresy 這邊是改成:
##! **recommend value is 1/4 of total RAM, up to 14GB.**
postgresql['shared_buffers'] = "1024MB"
修改好之後、再重新啟動 GitLab 的 Docker 容易、應該就可以正常完成升級了。