1. 程式人生 > 其它 >GitLab Omnibus 更新 8.8.5 => 15.3.5

GitLab Omnibus 更新 8.8.5 => 15.3.5

引文

雖然本意是想要從更新runner開始的,但是自裝完runner之後(我直接裝了最新的版本)提示只有GitLab10以後的版本才能使用,才出現接下來的一堆東西。對於這種情況的解決方案無非有兩種,更新GitLab版本或者降低Runner的版本,總之是一項向著另一項進行適配罷了,所以我也非常毫不猶豫的選擇了更新GitLab的版本(看著不爽hhh),也算是從剛對GitLab入門的小白到稍微瞭解了一些這個應用的大致狀況。

一些有必要預先理解的東西

  1. 作業系統 CentOS 7
  2. 基於Omnibus的升級
  3. 版本更新需要依照主版本號分階段更新(有一種模式是保持定期更新,每週或每個月進行一次更新,可以稍微緩解下第五條提到的漏洞問題)
  4. 多階段有兩個工具可以直接檢視,在更新章節(見第七條)
  5. GitLab在期間有很多版本是有漏洞的,如果開放倉庫地址最好保持一個安全版本,並需要隨時盯著新聞;更新期間可能會經過危險版本,更新期間可能會被注入指令碼(我在伺服器中更新的時候已經被載入了一個疑似勒索病毒的指令碼了)。
  6. 記得隨時備份倉庫哦~
  7. 省流:上面的六條看完了就直接看更新吧

目前已知的安裝方式

GitLab支援的有四種更新方式

  • Omnibus CentOS中的yum,ubuntu的apt-get
  • Source 原始碼安裝
  • Docker
  • Helm Kubernetes

如果自身安裝的環境不同也可以轉換版本,比如原本是用Source進行安裝的,可以在更新的時候轉換成yum這樣的,具體內容這裡不

展開了(大概就是把資料都備份並移植到另一個環境中,走提供的恢復方法)。

檢查伺服器上的安裝方式

檢視自己GitLab版本的方法也比較簡單(理論上)

  • Omnibus gitlab-ctl status
  • Helm helm status gitlab
  • Docker docker logs -f gitlab
  • Source sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
  • 就是知道安裝方式是什麼

版本漏洞

Major versions are reserved for backwards-incompatible changes. We recommend that you first upgrade to the latest available minor version of your current major version.

  1. 在gitlab的更新中不支援跨越主要版本進行更新,只能順著主要版本依次向上更新,據說是因為每個主版本是可以保留兩版本不相容問題的(???)。
  2. GitLab的漏洞層出不窮,你可以在網上找到很多被暴露出的版本漏洞,在每個主要版本的更新期間是會被遭到攻擊的,建議安裝的時候保持伺服器離線,或者在內網環境中安裝,否則容易被注入一些病毒如:Linux_386等。

截止2022年12月04日丟擲過的問題在15.3、15.4、15.5的一些版本上,具體參考這篇文章,我的最終版本是在15.3.5上,屬於其中一個安全版本。

系統支援(片尾有相關連結

舉個例子:

CentOS 8 was EOL on December 31, 2021. In GitLab 14.5 and later, CentOS builds work in AlmaLinux.
CentOS 8已經在2021年年底徹底停止更新了,如果想要搭建的話就只能部署14.6.x版本了。

類似的點一下連結檢視,具體看自己的系統版本,不知道自己系統版本是多少的話可以看一下下面的部分。

檢視伺服器系統(CentOS為例)

cat /etc/centos-release # 檢視Linux版本號 如果你是ubuntu,去網上搜檢視Ubuntu版本號

CentOS Linux release 7.9.2009 (Core)

Anyway~ CentOS 7的EOL(end of life)要到2024年6月,這部分結束。

P.S.
我順著CentOS 7找到了極狐GitLab,還有針對國人使用的極狐GitLab 旗艦版,單安裝的話可以參考使用這個,看起來挺簡單的。

伺服器配置要求&安裝說明

配置方面的參考一下這篇文章就差不多了,安裝的話簡單介紹一下。

  • 原始碼編譯的部分,需要你下載所有的環境,全部安裝到主機中,更新的時候所有的環境依賴也都要相對的跟隨gitlab版本進行更新,所以這是所有方法中最麻煩的一種
  • Docker容器部署&更新,用docker命令即可更新
  • Helm和docker的流程大體差不多
  • Omnibus和裝大部分包一樣,把gitlab當作一個包來裝就好了,環境是嵌入在裡面的。ls /opt/gitlab/sv可以看到這些包名

準備事項(容錯策略)

準備方案分成了軟性和硬性兩部分內容,軟性的部分講究策略,為了保障更新時的容錯率,硬性部分就是具體操作了;在小型企業中,或者說程式碼不太依賴GitLab的場景下(可能有兩到三天不會有人使用GitLab提交程式碼這樣)可以考慮跳過繁瑣的測試方案,因為對於效率和操作而言,這是費時且掉san的。但是對於中大型企業,數百人使用,就要儘可能多的規劃好可能出現的問題,熟悉且熟練的操作倉庫,有一套完美的備選方案,能夠迅速響應問題 ——這部分內容GitLab已經給出了非常成熟的引導,我基本上也只能去照抄了emmmmmm

準備內容分三項:

  1. 更新前建議
  2. 測試方案
  3. 版本回滾&備份恢復

更新前建議(搬運

  1. (生產環境下)複製當前環境出來(系統版本、環境依賴、現GitLab版本),在單獨環境中更新並記錄過程,確保全流程完全走一遍沒有問題之後再更新生產環境的GitLab版本(個人建議寫一套更新指令碼再去更新,減少倉庫不可用的時間)
  2. 知道當前GitLab是用什麼方式安裝的
  3. 知道當前作業系統是什麼,當前作業系統中支援的最高GitLab版本在哪裡(系統相容部分)。
  4. 單機模式還是多節點模式(這裡用的multi-node,大概是指分散式)
  5. 如果使用GitLab Geo,則需要分享任何和(architectural details)有關的所有的子節點
    2-5條應該是和與GitLab Support對接需要參考的問題,不過2-3條還是可以參考的;

原本內容還有6、7兩條,但是感覺沒什麼特別的必要去寫,我建議直接進文件裡看看咯?

測試方案

測試方案是要確保搭建的GitLab倉庫在更新前後都是完全可用的,根據功能被分成了四個基礎部分和三個可新增的模組

  1. 檢查GitLab全域性配置:sudo gitlab-rake gitlab:check
  2. 確保加密的資料可以被當前使用的secret配置解密(貌似不允許在生產環境中使用該命令):sudo gitlab-rake gitlab:doctor:secrets
  3. 測試介面中是否有問題(訪問一下倉庫地址)
    • 是否可以登入GitLab管理頁面(登入一下)
    • 以前的專案是否都可見(到倉庫裡滾一下)
    • 專案issues和合並請求是否都可以開啟(再欣賞一下別人提出的issues)
    • 客戶端是否可以從這裡克隆專案(git clone https://xxxxxxxxxxxxxxxxx.git
    • 客戶端是否可以推送程式碼到倉庫(git push origin master
  4. 測試 GitLab CI/CD(Continuous Integration & Continuous Delivery/Deployment)
    • Runners pick up jobs(大概就是對應Runner有沒有跑tag標中的job)
    • Docker映象可以從(具體配置地點)拉取映象(合理推測一下整個專案流程,Runner打包專案製作成映象,下發到線上伺服器部署)
  5. Geo
  6. Elasticsearch
  7. mail room
    Reply by Email
    Service Desk

5、6、7三條關於拓展的我懶得補,你自己

補充一部分的話可以去看一下gitlab的status,Elasticsearch和文件搜尋相關,mail room多半和訊息推送相關。


倉庫備份

備份的命令有兩段,恢復的也有兩段;兩段分別指倉庫和加密檔案(實際備份包括了整個例項,想了解的話看這裡

倉庫

  • 12.1及以前,使用 gitlab-rake gitlab:back:create 建立備份(注意事項:使用PgBouncer的話要跳過PgBouncer備份、確保上一個備份徹底完成之後再做下一個備份)
  • 12.2及以後,使用 gitlab-backup create 建立備份

secret(自行選擇方式備份、Omnibus地址,其它方式安裝參考這個

  1. /etc/gitlab/gitlab-secrets.json
  2. /etc/gitlab/gitlab.rb

如果找不到的話可以試試用find / -iname gitlab看一下

恢復

倉庫

  • 12.1及以前,使用 gitlab-rake gitlab:back:restore 恢復(這種方式可能會有一些許可權相關的問題,rake拿到的是gitlab user的許可權,但是並沒有root許可權,見已知問題及解決方案
  • 12.2及以後,使用 gitlab-backup restore 恢復倉庫

secret

將備份的secret拷貝至下面的兩個路徑

  1. /etc/gitlab/gitlab-secrets.json
  2. /etc/gitlab/gitlab.rb

備份目錄

預設備份目錄:/var/opt/gitlab/backups

倉庫備份位置可在配置檔案/etc/gitlab/gitlab.rb中進行配置,沒有這個檔案的話自行建立,沒有效果的話考慮一下GitLab的版本問題。

gitlab.rb 配置內容

gitlab_rails[‘manage_backup_path’]=true
gitlab_rails[‘backup_path’]=“/var/opt/gitlab/backups”  #gitlab備份目錄
gitlab_rails[‘backup_archive_permissions’]=0644  #生成的備份檔案許可權
gitlab_rails[‘backup_keep_time’] = 3111000  #備份保留天數,秒計算

具體操作:

vi /etc/gitlab/gitlab.rb

# 此時假設游標在文章開頭
/manage_backup_path  

:set hls  # 高亮內容(我的zsh好像並沒有高亮,也可能根本不需要這個命令,直接n就完事了...)
*  # 標記當前單詞
n  # 選中下一個(同理用?進行反向搜尋的時候也是用n跳轉上一個,按一次跳轉一次)

這個是搜尋部分,可以從大堆文字中定位到配置項,如果搜尋不到內容的話可以考慮把內容寫到配置檔案的末尾。

然後生效下配置:

gitlab-ctl reconfigure

備份用於倉庫版本回滾或者重灌使用。

更新

版本用的比較多的是ce社群版和ee企業版,還有三個其它的版本但是基本上不怎麼用,我也就不寫了,想了解的話看這裡

指定版本安裝

sudo yum install gitlab-ce-X.Y.Z

推薦兩個線上工具,一個是官方提供的工具可以直接查詢出更新線路,路線比較長的話可以用一下,路線比較短的也可以用一下,路線不長不短的......不長不短的自己順著更新路徑表扒拉著找吧。

新增映象

sudo cat > /etc/yum.repos.d/gitlab-ce.repo << END
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el\$releasever/
gpgcheck=0
enabled=1
END

sudo yum makecache

下載

mkdir /usr/yum_cache

for version in 8.11.11 8.12.13 8.17.8 9.5.10 10.8.7 11.11.8 12.0.12 12.1.17 12.10.14 13.0.14 13.1.11 13.8.8 13.12.15 14.0.12 14.3.6 14.9.5 14.10.5 15.0.5 15.3.5
do
    yum install -y --downloadonly --downloaddir=/usr/yum_cache "gitlab-ce-$version"
done

安裝

# >>> 符號被我用來表示輸出結果

ls /usr/yum_cache
# >>> gitlab-ce-8.8.5-ce.0.el7.x86_64.rpm ... gitlab-ce-15.3.5-ce.0.el7.x86_64.rpm

# 因為尾巴都帶有`.0.el7.x86_64.rpm`,所以可以列在模版的範圍內(這部分應該可以用yum指定輸出後的名字來達成規範)
yum install -y /usr/yum_cache/gitlab-ce-15.3.5-ce.0.el7.x86_64.rpm
此處貼一個沒有測試過的順序安裝的指令碼,僅供參考使用。

寫了兩個版本,第一個版本是把安裝過程丟到後臺執行,用管道符把輸出寫入日誌檔案中,使用tail去動態輸出日誌,不過yum經常卡在一些位置,根本看不到實時的進度,所以就給去掉了。

第二個版本是現在這樣的,直接執行,但是每次只能裝好一個版本,之後伺服器就斷連了——不過這樣也好,每次更新之後檢查一下help頁面,確定下安裝可以開啟,至於更新倉庫一些測試......19個版本要更新呢,一個版本要更新30分鐘啊喂!!還有我什麼時候才能讓他們一次跑完啊喂!!好像後臺是可以的吧?但是後臺貌似會在還沒有裝完的時候就提前結束了,所以這就是為什麼不掛到後臺的原因。

# * 在上一個版本使用的時候 下載完安裝的時候這裡就無法判斷下一個版本了,所以目前它只能執行一次更新一個版本,但是可以重複執行,會跳過已經裝過的版本,只能算是實現了半自動 *
# 目前這個流程是基於業務積累後的一個理論指令碼,沒有實際測試過,需要注意 - 可以參考,但不能直接使用 否則後果自負!
# ...誒,我剛剛超帥的有沒有,尤其是那個後果自負!嘿嘿~

update_gitlab(){
    last_version=;
    for version in 8.11.11 8.12.13 8.17.8 9.5.10 10.8.7 11.11.8 12.0.12 12.1.17 12.10.14 13.0.14 13.1.11 13.8.8 13.12.15 14.0.12 14.3.6 14.9.5 14.10.5 15.0.5 15.3.5 99.999.9999
    do
        # 檢測版本是否預期
        cur_version=`cat /opt/gitlab/embedded/service/gitlab-rails/VERSION`;
        if [ $version == $cur_version ]
            # 版本相等,更新
            then 
                last_version=$version;
                continue;

            # 非預期跳出迴圈
            else
                if [ $last_version == $cur_version ]
                    # 更新
                    then 
                        echo "目前更新:$cur_version => $version"
                        yum install -y "/usr/yum_cache/gitlab-ce-$version-ce.0.el7.x86_64.rpm" && 
                        echo "\n\n==============================================================================" 
                        echo "=========================== 版本:$version 更新完成 ===========================" 
                        echo "==============================================================================\n\n"
                    else 
                        echo "\n\n==============================================================================" 
                        # 版本小於當前版本直接下一條,大於當前版本則退出(總體來說可以全部continue操作)
                        echo "新版本:$version \n目前版本:$cur_version 版本不相符,跳過安裝"
                fi
                continue;
        fi
    done
    unset last_version;
}

# 或許後面可以加一個 & 丟到後臺去執行會好一些?我不確定,類似這樣:
# update_gitlab &

update_gitlab

執行

unicorn has been deprecated since 13.10 and was removed in 14.0. Starting with GitLab 14.0, Unicorn is no longer supported and users must switch to Puma

大致是說13.10的版本介面不再使用unicorn,14.0徹底不再引用unicorn了,叢14.0後改用puma替代unicorn。

sudo vim /etc/gitlab/gitlab.rb

# 末尾新增 將頁面服務改到80埠 - 佔用的話換其他的
nginx['listen_port'] = 80  # 嫌麻煩的話可以試試 `echo "nginx['listen_port'] = 80" >> /etc/gitlab/gitlab.rb`,前提是gitlab.rb裡nginx['listen_port']沒有被配置過
# :wq 儲存退出

gitlab-ctl reconfigure && gitlab-ctl start

最後訪問地址檢查一下(由於第一次部署到伺服器裡的時候伺服器炸了...就直接跑到虛擬機器裡了),先放出伺服器埠

瀏覽器訪問10.255.55.2(在虛擬機器和宿主機同閘道器下的虛擬機器地址,檢視用ifconfig |grep inet,找到宿主機和虛擬機器broadcast相同的一行,看前面的地址便是,不懂可以參考這個

檢視一下初始root的密碼:

# *注意:這個檔案將在首次執行reconfigure後24小時自動刪除*
cat /etc/gitlab/initial_root_password

登入,賬號root,密碼從上面的地址裡拷貝。

到這裡應該差不多就完成了,然後是一些個性化設定,語言設定完了之後後面慢慢摸索就好

  • 語言設定Preferences -> Localization(設定完儲存重新整理下生效)
  • ssh 自己搭建gitlab的話應該用過github之類的託管程式碼平臺的吧,所以也應該是知道這個怎麼配置的吧,不知道的話直接看這個連結好了,相關內容當你搭建完之後也可以點了解更多檢視
    • ed2551只是其中一種簽名,類似還有
    • ED25519
    • ED25519_SK (Available in GitLab 14.8 and later.)
    • ECDSA_SK (Available in GitLab 14.8 and later.)
    • RSA
    • DSA (Deprecated in GitLab 11.0.)
    • ECDSA
  • 不開放倉庫 Menu(一般在左上角) -> Admin -> Settings -> General -> Sign-up restrictionsSign-up enable選項取消掉(記得儲存)
  • 配置Runner 下一章展開

然後還有一些像是Gitlab Geo這樣的服務,好像也都是類似外掛的方式安裝的。

一些報錯

error: invalid locale settings; check LANG and LC_* environment variables

環境:新下載了一個Linux映象,然後跑在了虛擬機器中

---- Begin output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
STDOUT: The files belonging to this database system will be owned by user "gitlab-psql".
This user must also own the server process.
STDERR: initdb: error: invalid locale settings; check LANG and LC_* environment variables

問題和系統語言相關,使用locale -a檢查 LANG 和 LC_* 的環境變數,發現Cannot set LC_CTYPE to default locale: No such file or directory

我的解決方案:

cat /etc/locale.conf知道了我的系統語言是zh_CN.UTF-8
echo $LC_CTYPE可以看到未指定語言的UTF-8
/etc/profile後面加兩行內容:

LC_CTYPE="zh_CN.UTF-8"
export LC_CTYPE

source /etc/profile


無法訪問到虛擬機器轉發出來的內容

檢查防火牆,是否開放對映埠

firewall-cmd --zone=public --add-port=80/tcp --permanent
systemctl reload firewalld

參考文章

gitlab挖礦 - https://blog.51cto.com/yifangyou/4888915
GitLab ExifTool RCE - https://netc.shcmusic.edu.cn/2022/0702/c1811a40089/page.htm
GitLab 2022年9月爆出問題 - https://baijiahao.baidu.com/s?id=1742775605505062957&wfr=spider&for=pc
GitLab 2022年11月問題 - https://www.zzwa.org.cn/4759/

gitlab更新官方文件 - https://docs.gitlab.com/ee/update/package/
gitlab版本升級 - https://blog.csdn.net/wanchaopeng/article/details/124062057
gitlab重大版本 - https://docs.gitlab.com/ee/update/#upgrade-paths
gitlab更新操作 - https://docs.gitlab.com/operator/operator_upgrades.html#upgrading-the-operator
gitlab前置需求 - https://docs.gitlab.com/ee/install/requirements.html
gitlab的版本 - https://docs.gitlab.com/archives/
gitlab12跨版本13升級 - https://zhuanlan.zhihu.com/p/166624536
gitlab Omnibus的啟動與關閉 - https://blog.csdn.net/justlpf/article/details/126147349
gitlab-ctl start後沒有反應 - https://blog.csdn.net/qq_37967783/article/details/108558898
gitlab | Supported operating systems - https://docs.gitlab.com/ee/administration/package_information/supported_os.html#os-versions-that-are-no-longer-supported
gitlab預設密碼 - https://blog.csdn.net/qq_42838143/article/details/121198057

開始部署前的計劃 - https://docs.gitlab.com/ee/update/plan_your_upgrade.html#pre-upgrade-and-post-upgrade-checks
檢測gitlab全域性配置 - https://docs.gitlab.com/ee/administration/raketasks/maintenance.html#check-gitlab-configuration
GitLab CI/CD名詞解釋 - https://www.jianshu.com/p/fc298001a944
處理GitLab升級時的錯誤 - https://blog.qiquanji.com/post/445.html
如何重設配置檔案(沒有備份secret檔案怎麼辦!)- https://docs.gitlab.com/ee/raketasks/backup_restore.html#when-the-secrets-file-is-lost
檢測當前倉庫編碼是否與gitlab-secrets.json配置一致 - https://docs.gitlab.com/ee/administration/raketasks/check.html#verify-database-values-can-be-decrypted-using-the-current-secrets

vim命令 - https://zhuanlan.zhihu.com/p/61515833
redis版本更新 - https://blog.csdn.net/weixin_43903312/article/details/125397126
linux 管道命令 - https://blog.csdn.net/qq_36908872/article/details/127117759
CentOS 防火牆命令 - https://blog.csdn.net/weixin_42688499/article/details/124226669

解決LC_CTYPE - https://blog.csdn.net/weixin_40539892/article/details/80719411

一些在過程中跑題了的文章

K8s安裝 - https://blog.csdn.net/triumph12345/article/details/105931753/
K8s介紹 - http://kubernetes.kansea.com/docs/hellonode/
K8s配置檔案介紹 - https://blog.csdn.net/qq_34556414/article/details/110000037
Kubectl命令 - https://blog.csdn.net/as_dingjia/article/details/120364679

製作一個CI Runner - https://soulteary.com/2019/08/04/source-code-compilation-gitlab-runner.html
15.3的程式碼倉庫地址 - https://gitlab.com/gitlab-org/gitlab/-/releases/v15.3.0-ee
非Omnibus版本安裝轉Omnibus安裝 - https://docs.gitlab.com/omnibus/update/convert_to_omnibus.html
GitLab 資料備份及恢復(Docker) 這個人的部落格還可以 - https://soulteary.com/2020/05/05/gitlab-concise-maintenance-guide-v2020-05.html#gitlab-資料備份及恢復

題外話,我找了好久的gitlab-rake的來源,包括怎麼用gem製作一個類似的rake,不過這方面的資訊少之又少就沒有繼續進行下去了,不過我還是扒到了這三個bin,感興趣的話可以點進去看看,不是二進位制的檔案,可以用編輯器檢視。
用Omnibus安裝你可以找到gitlab-rake,而原始碼安裝則是用bundle exec rake,同時指定rails的伺服器環境(完整的看了一圈之後感覺Omnibus是真的簡單啊。。。)
如果你發現專案中/path_to/gitlab/bin裡有gitlab-ctl和gitlab-rake,很有可能就是通過Omnibus安裝的

rake的使用 - https://www.mianshigee.com/note/detail/134766vzq/
make到rake的過渡史(為什麼使用rake,因為rake方便管理!)- http://t.zoukankan.com/wangyuyu-p-3301473.html
ruby的高階功能(ruby都能幹些什麼!)- https://www.runoob.com/ruby/ruby-object-oriented.html
gitlab-rake - https://blog.csdn.net/qq_41588098/article/details/125598435

gitlab reconfigure時出現invalid locale settings - https://www.codenong.com/53592993/
invalid locale settings - https://blog.csdn.net/Kangyucheng/article/details/109898756
parallel埠對映(後來才知道共享和Wi-Fi橋接都不需要設定這個...除非想要對映到其他埠??) - https://www.bilibili.com/read/cv8701763/