脚本方式 迁移 老GITLAB项目到新GITLAB
背景
老gitlab 上面项目比较多, 新老GITLab 版本相差比较大,不能通过配置一键更新。
方案一:升级老gitlab代价大
方案二:手动导入导出比较耗时
方案三:脚本方式导入导出
脚本方式
1.导出项目
说明:GITLAB_TOKEN/GITLAB_URL需要替换为实际的老gitlab 地址
导出脚本:export-gitlab.sh
#!/bin/bash
function export(){
echo "導入中"
# 设置 GitLab 令牌和 URL
GITLAB_TOKEN="admin accessToken"
GITLAB_URL="oldGitlabUrl"
# 获取项目列表
#projects=$(curl -s -H "PRIVATE-TOKEN: $GITLAB_TOKEN" "$GITLAB_URL/api/v4/projects?simple=true" | jq -r '.[].id')
GROUP_ID=`curl -s --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$GITLAB_URL/api/v4/groups/$1" | jq '.id'`
projects=$(curl -s -H "PRIVATE-TOKEN: $GITLAB_TOKEN" "$GITLAB_URL/api/v4/groups/$GROUP_ID/projects?simple=true&per_page=1000" | jq -r '.[].id')
echo $projects
# 导出项目
for project in $projects; do
echo "开始导出$project"
curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$GITLAB_URL/api/v4/projects/$project/export"
sleep 20
echo "开始下载$projects"
curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" --remote-header-name --remote-name "$GITLAB_URL/api/v4/projects/$project/export/download"
done
}
if [ $# -lt 1 ]; then
echo "请输入需要导出的namespace"
exit 1
fi
# 根据输入参数执行不同的操作
case "$1" in
*)
echo "导出的namespace--$1"
export $1
esac
执行命令:其中 $groupName 为需要导出的groupName
./export-gitlab.sh $groupName
2.导入项目
导入脚本:import-gitlab.sh
说明:GITLAB_TOKEN/GITLAB_URL需要替换为实际的新的gitlab 地址
#!/bin/bash
# 设置 GitLab 令牌和 URL
function import(){
# 设置 GitLab 令牌和 URL
GITLAB_TOKEN="access Token"
GITLAB_URL="newGitLanUrl"
for file in *.tar.gz; do
PROJECT_NAME=`ls $file | grep -i gz | tr '_' '\n' | grep -v '^$' | head -4 | tail -1`
echo "开始导入"$PROJECT_NAME
curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" --form "path=$PROJECT_NAME" --form "namespace=$1" --form "file=@$file" "$GITLAB_URL/api/v4/projects/import"
done
}
if [ $# -lt 1 ]; then
echo "请输入需要导入的groupName"
exit 1
fi
# 根据输入参数执行不同的操作
case "$1" in
*)
echo "导入的groupName--$1"
import $1
;;
esac
执行命令:其中 $groupName 为需要导入的groupName
./import-gitlab.sh $groupName
3.本地批量切换gitlab
切换gitlab地址脚本:update_gitlab_url.sh
#!/bin/bash
# 确保提供了组名和开始日期
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <project_dir>"
exit 1
fi
# 定义旧的和新的 GitLab 地址
OLD_URL="OLD_URL"
NEW_URL="NEW_URL"
# 定义包含多个项目的目录路径
BASE_DIR=$1
# 遍历所有项目文件夹
for project_dir in "$BASE_DIR"/*; do
if [ -d "$project_dir/.git" ]; then
cd "$project_dir" || continue
# 获取当前的远程 URL
current_url=$(git remote get-url origin)
# 判断是否需要替换
if [[ "$current_url" == "$OLD_URL"* ]]; then
# 更新远程 URL
new_url="${current_url/$OLD_URL/$NEW_URL}"
git remote set-url origin "$new_url"
echo "Updated $project_dir: $current_url -> $new_url"
else
echo "No update needed for $project_dir"
fi
fi
done
执行命令:其中 $project_dir 为需要导入的项目的绝对地址
./update_gitlab_url.sh $project_dir