近期部門搭建了正式的 gitlab 服務(wù)器欠母,在安全性和可靠性等方面相較之前線下的服務(wù)器都有了很好的提升锚贱。所以仔戈,迫切需要將線下 gitlab 的用戶、項(xiàng)目等數(shù)據(jù)遷移到正式環(huán)境拧廊。關(guān)于項(xiàng)目遷移监徘,分為兩種情況,分別是全量備份和單 project 導(dǎo)入吧碾,本文不做詳細(xì)分享凰盔,在這里重點(diǎn)分享下 gitlab 賬戶遷移的問題。
1. 用戶信息準(zhǔn)備
用戶信息整理的方式有很多種倦春,這里省略户敬。我們最終拿到的是 excel 形式的用戶數(shù)據(jù)表,形如下圖的形式:
image.png
接下來溅漾,將 excel 轉(zhuǎn)換為 utf-8 形式文本 userinfo.txt山叮,方便我們后面通過腳本解析。導(dǎo)出的方式如下:
image.png
轉(zhuǎn)換后的形式如下:
image.png
2. 方式一:手工批量增加
通過web頁(yè)面增加用戶
http://172.20.5.36/admin/users/new
新增頁(yè)面如下:
image.png
此種方式費(fèi)時(shí)費(fèi)力添履,作為有逼格的技術(shù)人員當(dāng)然不會(huì)采用屁倔。。暮胧。
而且锐借,此種方式增加的用戶,還需要登錄之后強(qiáng)制修改密碼往衷,也是一件蛋疼的事情
3. 方式二:通過 gitlab api 寫入用戶
#!/bin/bash
#批量創(chuàng)建 gitlab 用戶
userinfo="userinfo.txt"
while read line
do
password=`echo $line | awk '{print $1}'`
mail=`echo $line | awk '{print $2}'`
username=`echo $line | awk '{print $3}'`
name=`echo $line | awk '{print $4}'`
curl -d "password=$password&email=$mail&username=$username&name=$name&private_token=AH2zvaHy8txyWtUxMvyz" "http://172.20.5.36/api/v3/users"
# v4接口調(diào)用失敗钞翔,不得已切換為 v3 接口,如果有朋友用 v4 接口 ok 的話席舍,請(qǐng)不吝賜教
done <$userinfo
問題:
用這種方法可以成功注冊(cè)用戶布轿,但注冊(cè)的用戶無(wú)法登陸,原因在于密碼中存在亂碼来颤,懷疑是 ascii 轉(zhuǎn)碼問題汰扭,時(shí)間有限沒有詳細(xì)去分析切換到了下面一種實(shí)現(xiàn)。
4. 方式三:通過 python-gitlab 庫(kù)寫入用戶
#!/bin/bash
# 安裝 python-gitlab 庫(kù)
git clone https://github.com/python-gitlab/python-gitlab
cd python-gitlab
sudo python setup.py install
安裝完成之后福铅,可以通過 python-gitlab 接口來實(shí)現(xiàn)與上面方案等價(jià)的功能萝毛,具體實(shí)現(xiàn)代碼如下:
# encoding: utf-8
import gitlab
import sys
#聲明 gitlab 實(shí)例,采用private_token的形式來實(shí)現(xiàn)連接
gl = gitlab.Gitlab('http://172.20.5.36', private_token='FFbQs12313123eauof_EpVmaPcz', api_version=3)
# 打開本地文件
f = open(r"/Users/xxxx/WorkSpace/temp/test/users.txt", "r")
line = f.readline()
while line:
# 分割每一行
temp = line.split(" ")
password = temp[0].decode('ascii','ignore').encode('utf-8')
email = temp[1]
username = temp[2]
name = temp[3]
user_data = {'email':email, 'username':username, 'name':name, 'password':password}
user = gl.users.create(user_data)
print(user)
line = f.readline()
f.close()
注:
# encoding: utf-8滑黔,這一行的作用在于聲明采用 utf-8 編碼