# GitLab升級步驟
## 升級方法
> GitLab不支援跳板升級,需按照[官方升級途徑](https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/?distro=centos&edition=ce)進行升級。
## 升級範圍
>OS:RHEL 7.6 -> RHEL 8.6
>GitLab:12.5.5 -> 15.10.8
### 升級途徑:

[What's news since](https://gitlab-com.gitlab.io/cs-tools/gitlab-cs-tools/what-is-new-since/?order=-1&tab=features&minVersion=12_05&maxVersion=15_10) 12.5.5 -> 15.10.8
### 下載安裝檔:
不同版本&平台連結的路徑不一樣,可參考[官網連結](https://packages.gitlab.com/gitlab)
[RHEL7 for 12.0.14](https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.10.14-ce.0.el7.x86_64.rpm/download.rpm)
[RHEL8 for 12.0.14](https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-12.10.14-ce.0.el8.x86_64.rpm/download.rpm)
## 升級流程
~~~mermaid
graph LR;
RHEL7.6-->Git備份;
Git備份-->GitLab升級12.10.14;
GitLab升級12.10.14-->Git備份;
RHEL8.6--->安裝Git12.10.14;
安裝Git12.10.14--->匯入RHEL7.6資料;
匯入RHEL7.6資料--->升級至13.X;
升級至13.X--->升級至14.X;
升級至14.X--->升級至15.X;
~~~
## 升級步驟
## 步驟一:升級 gitlab版本@RHEL7.6
> 升級原RHEL7.6上之gitlab版本to12.10.14
### 1.備份gitlab資料 @RHEL7.6
~~~bash
gitlab-rake gitlab:backup:create #備份檔案存放在/var/opt/gitlab/backups
~~~

### 2.升級gitlab至12.10.14 @RHEL7.6
#### 2.1 保留git版本資訊
~~~bash
gitlab-rake gitlab:env:info | tee -a gitlab-ce-12.10.14_before.txt
~~~
#### 2.2 升級至12.10.14
~~~bash
yum localinstall gitlab-ce-12.10.14-ce.0.el7.x86_64.rpm | tee gitlab-ce-12.10.14_install.txt
~~~
#### 2.3 驗證gitlab
#### 2.3.1 gitlab健康狀態
~~~bash
#確認gitlab各個元件狀態
gitlab-rake gitlab:check | tee -a gitlab-ce-12.10.14_check.txt
~~~
##### 2.3.2 確認DB是否轉移
~~~bash
#status應該為[ up ]
gitlab-rake db:migrate:status | tee -a gitlab-ce-12.10.14_check.txt
~~~
##### 2.3.3 gitlab元件狀態
~~~bash
#確認所有服務皆為run
gitlab-ctl status | tee -a gitlab-ce-12.10.14_check.txt
~~~
##### 2.3.4 確認版本資訊
~~~bash
gitlab-rake gitlab:env:info | tee -a gitlab-ce-12.10.14_after.txt
~~~
##### 2.3.5 備份gitlab on 12.10.14
~~~bash
gitlab-rake gitlab:backup:create
~~~

## 步驟二:安裝gitlab @RHEL8.8
於新的機器上(RHEL8.8),安裝gitlab(12.10.14)
### 1.安裝gitlab
~~~bash
yum localinstall gitlab-ce-12.10.14-ce.0.el8.x86_64.rpm | tee gitlab-ce-12.10.14_install.txt
~~~
### 2.修改設定檔
將原有機器上(RHEL7.6)的config複製到新機器上。
檔案位置 => /etc/gitlab/gitlab.rb
以下為目前XXX的設定檔,幾點需要特別注意
> 1.external_url => 安裝過程中要使用新的IP,轉移完後才修改為原有IP
> 2./git/git-data => 確認該資料夾要存在
~~~bash
external_url 'http://10.20.241.89'
gitlab_rails['time_zone'] = 'Asia/Taipei'
gitlab_rails['gitlab_email_from'] = 'gitlabService@XXX.com.tw'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['gitlab_default_can_create_group'] = false
git_data_dirs({
"default" => { "path" => "/var/opt/gitlab/git-data" },
"git_400G" => { "path" => "/git/git-data"
}
})
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "10.20.40.53"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_domain'] = "10.20.40.53"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
~~~
### 3.重新config gitlab
~~~bash
gitlab-ctl reconfigure
~~~
### 4.驗證gitlab
#### 4.1 gitlab健康狀態
~~~bash
#確認gitlab各個元件狀態
gitlab-rake gitlab:check | tee -a gitlab-ce-12.10.14_check.txt
~~~
#### 4.2 確認DB是否轉移
~~~bash
#status應該為[ up ]
gitlab-rake db:migrate:status | tee -a gitlab-ce-12.10.14_check.txt
~~~
#### 4.3 gitlab元件狀態
~~~bash
#確認所有服務皆為run
gitlab-ctl status | tee -a gitlab-ce-12.10.14_check.txt
~~~
#### 4.4 確認版本資訊
~~~bash
gitlab-rake gitlab:env:info | tee -a gitlab-ce-12.10.14_after.txt
~~~
## 步驟三:匯入資料 @RHEL8.8
### 1.複製檔案
> 檔案位置預設為 => /var/opt/gitlab/backups
### 2.還原資料
~~~bash
gitlab-rake gitlab:backup:restore BACKUP=1692092214_2023_08_15_12.10.14
~~~


>hint1:檔名 => 要將完整名稱貼上

>hint2:權限 => 確認user & group為git

### 3.驗證gitlab
#### 3.1 gitlab健康狀態
~~~bash
#確認gitlab各個元件狀態
gitlab-rake gitlab:check | tee -a gitlab-restore_check.txt
~~~
#### 3.2 確認DB是否轉移
~~~bash
#status應該為[ up ]
gitlab-rake db:migrate:status | tee -a gitlab-restore_check.txt
~~~
#### 3.3 gitlab元件狀態
~~~bash
#確認所有服務皆為run
gitlab-ctl status | tee -a gitlab-restore_check.txt
~~~
#### 3.4 驗證repository清單
> 3.4.1 確認管理者帳號是否可以登入
> 3.4.2 確認namespace(repository)數量是否正確
> 3.4.3 確認namespace(repository)資料是否正確
> 3.4.4 確認user & group是否正確
> 3.4.5 確認project是否正確
> 3.4.6 確認git client是否可以正常使用
## 步驟四:升級gitlab @RHEL8.8
### 1.保留git版本資訊
~~~bash
gitlab-rake gitlab:env:info | tee -a gitlab-ce-12.10.14_before.txt
~~~
### 2.升級至[ gitlab-ce-15.4.6 ]
>依升級途徑,重複以下步驟,直至升級到15.4.6(共11次)
#### 2.1 保留git版本資訊
~~~bash
gitlab-rake gitlab:env:info | tee -a gitlab-ce-13.0.14_before.txt
~~~
#### 2.2 升級至[ x.y.z ]
~~~bash
yum localinstall gitlab-ce-[ 13.0.14 ]-ce.0.el8.x86_64.rpm | tee gitlab-ce-13.0.14_install.txt
~~~
#### 2.3 驗證gitlab
##### 2.3.1 gitlab健康狀態
~~~bash
gitlab-rake gitlab:check | tee -a gitlab-ce-13.0.14_check.txt
~~~
##### 2.3.2 確認DB是否轉移
~~~bash
#status應該為[ up ]
gitlab-rake db:migrate:status | tee -a gitlab-ce-13.0.14_check.txt
~~~
##### 2.3.3 gitlab元件狀態
~~~bash
#確認所有服務皆為run
gitlab-ctl status | tee -a gitlab-ce-13.0.14_check.txt
~~~
##### 2.3.4 確認版本資訊
~~~bash
gitlab-rake gitlab:env:info | tee -a gitlab-ce-13.0.14_after.txt
~~~
### 3.驗證repository清單
> 3.1 確認管理者帳號是否可以登入
> 3.2 確認namespace(repository)數量是否正確
> 3.3 確認namespace(repository)資料是否正確
> 3.4 確認user & group是否正確
> 3.5 確認project是否正確
> 3.6 確認git client是否可以正常使用
> gitlab 14.X以後的版本,可多檢查 <font color="#1E90FF">Background Migrations</font>
> 路徑 => <font color="#2E8B57"> Admin Area -> Background Migrations</font>


---
## 附錄(一):Git常用指令
~~~bash
gitlab-rake gitlab:env:info #確認git資訊
~~~

~~~bash
gitlab-rake gitlab:backup:create #進行git備份
~~~

~~~bash
gitlab-rake gitlab:backup:restore BACKUP=1691486492_2023_08_08_12.10.14 #還原git備份
~~~


~~~bash
gitlab-rake gitlab:check #檢查GitLab健康狀態
~~~


~~~bash
gitlab-rake db:migrate:status #檢查資料庫是否搬移完成(status都up)
~~~

:::warning
:bulb: gitlab-rake db:migrate => 如status顯示為down,使用此指令重新觸發migrate
:::
~~~bash
gitlab-ctl status #確認GitLab元件的狀態
~~~

---
## 附錄(二):Git升級小memo
> 升級過程中,可透過下列方法快速備份相關的log
~~~bash
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.4.6 => 15.10.8
version=15.10.8
gitlab-rake gitlab:env:info | tee -a gitlab-ce-${version}_before.txt
yum localinstall gitlab-ce-${version}-ce.0.el8.x86_64.rpm | tee gitlab-ce-${version}_install.txt
gitlab-rake gitlab:check | tee -a gitlab-ce-${version}_check.txt ; \
gitlab-rake db:migrate:status | tee -a gitlab-ce-${version}_check.txt ; \
gitlab-ctl status | tee -a gitlab-ce-${version}_check.txt ; \
gitlab-rake gitlab:env:info | tee -a gitlab-ce-${version}_after.txt ; \
mkdir gitlab_log/gitlab-ce-${version} ; mv gitlab-ce-${version}*.txt gitlab_log/gitlab-ce-${version} ; mv gitlab-ce-${version}-ce.0.el8.x86_64.rpm gitlab_rpm ;
~~~
---
## 附錄(三):重新設定root密碼
>開啟Rails console
~~~bash
gitlab-rails console
~~~
>依序輸入下列指令
~~~bash
user = User.where(id: 1).first #查詢id唯一的是誰(通常是root)
user.password = 'your secret' #輸入欲變更的密碼(在15.3後,需注意,密碼要符合複雜性原則)
user.password_confirmation = 'your secret' #確認密碼
user.save #儲存
exit
~~~
#### 範例
~~~bash
[root@gitlab02 ~]# gitlab-rails console
--------------------------------------------------------------------------------
Ruby: ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [x86_64-linux]
GitLab: 15.10.8 (a47a26d5673) FOSS
GitLab Shell: 14.18.0
PostgreSQL: 12.14
------------------------------------------------------------[ booted in 16.93s ]
Loading production environment (Rails 6.1.7.2)
irb(main):001:0> user = User.where(id: 1).first
=> #<User id:1 @root>
irb(main):002:0> user.password = 'Root12345'
=> "Root12345"
irb(main):003:0> user.password_confirmation = 'Root12345'
=> "Root12345"
irb(main):004:0> user.save
=> false #false是因為密碼不符合複雜性原則
irb(main):005:0> user.password = '$RFV3edc'
=> "$RFV3edc"
irb(main):006:0> user.password_confirmation = '$RFV3edc'
=> "$RFV3edc"
irb(main):007:0> user.save
=> true
irb(main):008:0> exit
~~~