自建Gitlab遷移工具指南,遷移工具對自建 Gitlab 服務的資料搬站提供了支援,可以友善地将 Gitlab 的 Git 代碼資料、使用者權限關系和已開啟的合并請求資料進行批量遷移,大幅降低企業遷移成本。
說明
遷移工具包于 2022 年 04 月 13 日 進行更新,新增自建 Gitlab 人員權限關系和已開啟的合并請求遷移能力,建議該日期前下載下傳工具的使用者更新最新版本使用。
注意
建議導入庫位址使用 HTTP 協定,後續将基于 HTTP 協定支援倉庫同步能力。
工具使用方法
簡單三步,完成代碼庫批量遷移:
- 步驟一.下載下傳遷移工具;
- 步驟二.通過指令自動生成阿裡雲RAM子賬号,作為遷移使用者映射關系的配置檔案;
- 步驟三.通過指令自動生成期望導入的代碼庫清單,作為遷移庫範圍的配置檔案;
- 步驟四.執行遷移指令,工具将依據步驟二、三生成的配置檔案将自建 Gitlab 資料遷移至 Codeup 指定企業;
一、工具準備
下載下傳遷移工具,其原理是根據你在自建的 Gitlab 服務裡的權限,自動生成相關配置檔案,并可以按需調整配置檔案内容後,再依據配置檔案規則将 Gitlab 資料遷移至 Codeup 企業中。
下載下傳工具
macOS ARM 64位 下載下傳位址
macOS 64位 下載下傳位址
Linux 64位 下載下傳位址
Windows 64位 下載下傳位址
安裝工具
Windows環境可以跳過安裝,直接使用,但需要保證在指令行執行的目錄下有已下載下傳的遷移工具。
Linux和macOS,需要将下載下傳得到的檔案放在 /usr/local/bin/ 目錄下:
mv codeup /usr/local/bin/
測試工具
在指令行中執行,執行成功會顯示工具的幫助資訊:
codeup -h
在 macOS 可能會提示 macOS 無法打開工具,因為無法驗證開發者,請通過“系統偏好設定”-“安全性與隐私”-“通用”頁面,選擇“仍然允許”,來授權 macOS 使用工具
二、遷移計劃和準備工作
現在,你有一個自建的 Gitlab 服務,上面有若幹個使用者,以及若幹代碼庫和已經設定好的代碼庫成員權限、保護分支規則,正在進行中的合并請求等資料。
本工具可以幫助你進行如下資料的遷移:
- 代碼庫 Git 資料
- 代碼庫的基本設定:僅包括庫的描述資訊、庫的預設分支設定
- 代碼庫的保護分支規則:僅包括分支名、允許推送角色、允許合并角色
- 代碼庫的成員資訊:根據提供的使用者映射配置檔案,将 Gitlab 使用者映射到 Codeup 的庫使用者,并将使用者添加到 Codeup 的對應代碼庫成員中,轉變為 Codeup 的庫角色時有如下映射原則:
Gitlab 庫角色 | Codeup 庫角色 |
Owner/Mantainer | 庫管理者 |
Developer | 庫開發者 |
Repertor/Guest | 庫浏覽者 |
- 代碼庫中正在進行中的合并請求(已開啟的合并請求):會在 Codeup 中以遷移操作人的身份建立同名的合并請求,并将能識别到映射關系的評審者進行遷移。不會保留已有的評論、動态和建立人等資訊。
其中,代碼庫成員資料和合并請求資料的遷移是可選的,你可以選擇遷移或者不遷移。
假設你已經下載下傳安裝好工具,并測試工具正常可運作,已明确遷移的内容:要遷移上述支援的所有資料。我們推薦你遵照下面的遷移計劃:
- 在正式遷移生産庫前,建議使用非正式庫進行試遷移,保障配置正确後正式遷移;
- 在遷移操作時建議控制自建 Gitlab 的庫變更和寫入行為,一旦倉庫遷移成功後,重複遷移不會重新整理變更的代碼資料,即遷移後 Gitlab 的新增内容不會更新至 Codeup;
說明 準備工作:以上假設值在下面的工具執行中會用到,請在實際遷移過程中使用你真實的配置資訊替換。
- 一個阿裡雲的主賬号(同時需要作為雲效目标企業的擁有者),以及擷取主賬号的AK 、SK , 假設是 '$aliyunAk', '$aliyunSk'
- 目标期望遷移到的 Codeup 企業ID, 假設是 '$orgId'(可在雲效企業管理背景檢視)
- 阿裡雲主賬号在 Codeup 的個人通路令牌,要勾選授予權限 write:repo ,假設令牌是’$codeupToken‘
- 你的 Gitlab 服務位址,假設是 http://mygitlab.com
- 你的Gitlab管理者賬号的 AccessToken(需要授予 read_user, read_api , read_repository 權限),假設為 '$gitlabToken'
三、遷移過程
3.1 遷移 Gitlab 使用者權限【可選】
Gitlab 和 Codeup 使用者關系存在以下兩種情況:
- Gitlab 使用者已經在 Codeup 上手動自己建立了一個使用者(可能同名或不同名)
- Gitlab 使用者在 Codeup 上沒有對應的使用者
首先要明确的是 Gitlab 的使用者資料和 Codeup 上的使用者資料是獨立不相關的,對于 Codeup 來說需要你提供映射關系表。
即使你知道 Codeup 上有個叫張三的使用者,在 Gitlab 有一個 zhangsan 的使用者,兩個使用者其實是同一個人,那麼也是需要告訴工具,兩個賬号的關聯關系。這樣就需要一個使用者的映射配置檔案,遷移工具會根據這個使用者映射檔案,将 Gitlab 使用者權限關系資料遷移到 Codeup 對應代碼庫内。
接下來的操作,将會幫助你批量完成 Gitlab 使用者在 Codeup 上同名使用者的建立和關聯。
# 假設已經CD到工具所在的目錄下,執行下面的指令
codeup repo generateUserMap --host=http://mygitlab.com --access_token=$gitlabToken --access_key=$aliyunAk --secret_key=$aliyunSk
...
#指令執行成功後,在你指定AK\SK的阿裡雲主賬号下,會批量建立出與Gitlab使用者同名的阿裡雲Ram子賬号,并會在目前目錄生成一個user-map.csv的檔案
打開user-map.csv,其内容的格式是每一行都是 [Gitlab的使用者名],[Codeup使用者的阿裡雲ID],形如:
zhangsan,11232342143245234
lisi,1231312312311
你可以手動編輯這個檔案,增加或删除使用者映射的配置(例如部分使用者不希望使用自動生成的賬号,可以手動将映射關系改為指定的阿裡雲賬号)。
說明
阿裡雲賬号 ID 擷取方式:在 https://www.aliyun.com 首頁右上角點選頭像-賬号ID
此時,你可以發現阿裡雲主賬号下對應 Gitlab 中的使用者名依次建立出了RAM子賬号,現在,需要在雲效目标企業中,同步這些子賬号成員。
使用目前阿裡雲主賬号,進入雲效企業成員管理,點選右上角添加成員,選擇邀請企業成員:
全選或勾選期望同步的RAM賬号,添加至雲效企業中:
至此,你已經完成了Gitlab使用者到Codeup使用者的建立和映射關系,得到了一個user-map.csv的檔案,并将新建立的RAM使用者導入至雲效的目标企業中了。
3.2 定義遷移的代碼庫範圍
你需要告知遷移工具要遷移的代碼庫清單範圍,這也需要一個配置檔案。
可以通過下面操作,自動分析出在Gitlab中的所有代碼庫并生成這個遷移庫範圍的配置檔案。
codeup repo generate --platform=gitlab --access_token=$gitlabToken --host=http://mygitlab.com
...
# 指令執行完成後會在目前目錄下生成一個 repo_list_config.csv 的配置檔案
打開repo_list_config.csv,其内容格式是每一行都是[庫克隆位址],[Codeup代碼庫路徑],[Codeup代碼庫可見性],形如
#庫克隆位址,Codeup代碼庫路徑,Codeup代碼庫可見性
http://mygitlab.com/xxxxx/stable.git,xxxxx/stable,10
你可以手動編輯這個檔案,增加或删除期望遷移的代碼庫範圍。
至此,你已經明确了遷移的代碼庫範圍,得到了一個 repo_list_config.csv 的檔案。
3.3 基于以上配置檔案批量遷移 Gitlab 資料到 Codeup
# 通過ls檢視目前的目錄的檔案(windons的話是dir指令),确認下有以上兩個配置檔案
ls
repo_list_config.csv
user-map.csv
# 執行下面指令開始遷移
codeup repo importGitlab --repo_list_path=repo_list_config.csv --organization=$orgId --access_key=$aliyunAk --secret_key=$aliyunSk --personal_access_token=$codeupToken --import_member=true --user_map_path=user-map.csv --import_merge_request=true --push_protocol=http
...
# 遷移過程中會展示遷移的細節,如果有問題會顯示報錯資訊
工具執行完後,如果一切正常,你便可以在Codeup上檢視遷移過來的代碼庫、庫設定、使用者成員和合并請求等資訊,以确認遷移無誤。
說明 :
如果不希望遷移人員權限、合并請求資料,可以将以上指令中的對應字段置為false:
--import_member=false
--import_merge_request=false