拿来即用-gitlab迁移

随着时代的发展,在刚入行时想都不敢想的场景,现在都有了非常成熟稳定的解决方案,比如:容器开发,完全解放程序猿运维的手、完全消除环境不一致带来的痛苦,程序猿专注“搬砖”即可,无需再被这些能力之外的事情烦扰,当然了,如果程序员懂“新时代的运维”,也是锦上添花的事情。

从传统的运维到现代化运维转化,万里长城第一步:gitlab升级。由于gitlab服务器是在5年前搭建的,太过古老,对新技术的支持和集成稍差些意思,所以gitlab升级就成了摆在面前的第一个问题。

避坑

如果现有gitlab的版本与最新版本gitlab相隔久远(比如跨了3个大版本),我就不建议逐步升级了,我亲测时遇到了比较棘手的问题,需要充分阅读gitlab的官方文档,限于英文水平和耐心,我果断放弃。

我的方案

概述

  1. python+python-gitlab
  2. 我的代码只做了用户和仓库的迁移
  3. 仓库中给用户的权限分配未实现,需要的朋友可自行完善

直接上代码

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()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值