随着时代的发展,在刚入行时想都不敢想的场景,现在都有了非常成熟稳定的解决方案,比如:容器开发,完全解放程序猿运维的手、完全消除环境不一致带来的痛苦,程序猿专注“搬砖”即可,无需再被这些能力之外的事情烦扰,当然了,如果程序员懂“新时代的运维”,也是锦上添花的事情。
从传统的运维到现代化运维转化,万里长城第一步:gitlab升级。由于gitlab服务器是在5年前搭建的,太过古老,对新技术的支持和集成稍差些意思,所以gitlab升级就成了摆在面前的第一个问题。
避坑
如果现有gitlab的版本与最新版本gitlab相隔久远(比如跨了3个大版本),我就不建议逐步升级了,我亲测时遇到了比较棘手的问题,需要充分阅读gitlab的官方文档,限于英文水平和耐心,我果断放弃。
我的方案
概述
- python+python-gitlab
- 我的代码只做了用户和仓库的迁移
- 仓库中给用户的权限分配未实现,需要的朋友可自行完善
直接上代码
pip install python-gitlab
import gitlab
import os
import subprocess
# 在此处替换为原服务器和新服务器的GitLab URL和访问令牌
# 原gitlab
server_source_url = 'http://192.168.111.6:8090/'
server_source_token = '1Hfgage888666kX8AnyTTqop'
# 新gitlab
server_target_url = 'http://172.20.215.99:80'
server_target_token = 'glpat-hRF_pgadga7_RA7To_'
# 连接到原服务器的GitLab实例
source_gitlab = gitlab.Gitlab(server_source_url, private_token=server_source_token)
# 连接到新服务器的GitLab实例
target_gitlab = gitlab.Gitlab(server_target_url, private_token=server_target_token)
# 将原服务器上的每个项目的成员和权限同步到新服务器
# 请注意:此方法未经实际测试
def create_target_members():
# 获取原服务器上的所有项目
source_projects = source_gitlab.projects.list(all=True)
# 将原服务器上的每个项目的成员和权限同步到新服务器
for source_project in source_projects:
# 获取原项目的成员
source_members = source_project.members.list(all=True)
# 获取新项目
target_project = target_gitlab.projects.get(source_project.id)
# 将每个原项目的成员和权限同步到新项目
for source_member in source_members:
member_data = {
'user_id': source_member.id,
'access_level': source_member.access_level
}
target_project.members.create(member_data)
# 在新服务器上创建相同的用户
# 这里需要自行完善每个账户的密码和邮箱
def create_target_users_by_source_users():
# 获取原服务器上的所有用户
source_users = source_gitlab.users.list(all=True)
# 在新服务器上创建相同的用户
for source_user in source_users:
pwd = ''
email = ''
if (source_user.username == 'root'):
continue
# 打印用户信息
print(source_user.email, source_user.username, source_user.name)
user_data = {
'email': email,
'password': pwd, # 在此处替换为新用户的密码
'username': source_user.username,
'name': source_user.name
}
target_gitlab.users.create(user_data)
# 把 原gitlab 中的项目上传到 目标gitlab
def create_target_projects_by_source_projects():
# 从原服务器 上下载所有的代码项目
source_projects = source_gitlab.projects.list(all=True)
# 遍历下载的项目,推送到新服务器 中的 GitLab 仓库
for source_project in source_projects:
try:
# 打印项目信息
print(source_project.name, source_project.id)
# 在 新GitLab 中创建同名仓库
target_project = target_gitlab.projects.create(
{'name': source_project.name})
# 打印 JSON
# project_json = target_project.attributes
# project_json = json.dumps(project_json, indent=4)
# print(project_json)
# 克隆 原GitLab 项目及所有分支到本地
# --mirror 参数会将所有分支都克隆下来,包括分支、历史提交版本信息
local_path = f'E:\copy_gitlab_code\{source_project.name}'
subprocess.run(['git', 'clone', '--mirror', source_project.http_url_to_repo, local_path])
# 进入本地项目目录
# 这是windows系统的写法,mac系统的写法貌似不同
os.chdir(local_path)
# 将本地项目推送到 新GitLab 的仓库
subprocess.run(['git', 'remote', 'add', 'destination',
target_project.http_url_to_repo])
subprocess.run(['git', 'push', 'destination', '--all'])
subprocess.run(['git', 'push', 'destination', '--tags'])
except Exception as e:
print("####################"+source_project.name +
"发生异常,异常内容如下####################")
print(f"{str(e)}")
continue
# 判断每个代码仓库是否有test分支,如果没有则从master创建test分支
# 也适用于创建其他分支
def create_test_branch():
# 获取原服务器上的所有项目
projects = target_gitlab.projects.list(all=True)
# 循环遍历每个项目
for project in projects:
# 获取当前项目的分支列表
branches = project.branches.list()
# 检查test分支是否存在
test_branch_exists = False
for branch in branches:
if branch.name == 'test':
test_branch_exists = True
break
# 如果test分支不存在,则从master分支创建test分支
if not test_branch_exists:
try:
project.branches.create({'branch': 'test', 'ref': 'master'})
print(f"Created 'test' branch in project: {project.name}")
except gitlab.exceptions.GitlabCreateError as e:
print(f"Failed to create 'test' branch in project: {project.name}. Error: {e}")
# 在新服务器上创建相同的用户
# create_target_users_by_source_users()
# 把 原gitlab 中的项目上传到 目标gitlab
# create_target_projects_by_source_projects()