python脚本实现gitlab代码库自动迁移

场景:公司服务器升级,需要把gitlab代码库迁移另一台gitlab,由于代码库众多,手动操作起来极其麻烦,所以去网上找了找大佬的解决方案。但是由于gitlab版本等一些前提条件不同,所以决定自己动手。

前提

1. gitlab上生成Account Token

2. 服务器上要有git应用

3. 本人操作环境centos7.5 python2.7(应该也是支持3,没试过)

一、 Gitlab API操作文档

地址:http://git.xxxxx.com//help/api/README.md

在熟悉一些api参数以后咱们可以试着用postman获取项目列表

python脚本实现gitlab代码库自动迁移_第1张图片

如果有如图所示输出,表示api访问是正常的

python脚本实现gitlab代码库自动迁移_第2张图片

通过Headers信息就能看到共多少项目,和共多少页,根据本人的经验在通过Headers信息知道多少项目后,可直接在url里配置per_page=自己的项目数,这样不需要再添加分页信息就能获取全部项目

二、代码

# -*- coding: UTF-8 -*-
# 在centos7.5 Python2.7测试通过
# 1. 需要在gitlab里面新建一个AccessToken填入gitlabToken
# 2. 服务器上要有git应用
 
import sys
import json
import requests
import time
import os
 
gitlabAddr  = 'git.xxxnno.com'
gitlabToken = 'WrWk_gxxzcbBgsG4xSVn'
gitlabAddr2 = '172.16.106.190:3343'
gitlabAddr3 = '172.16.106.190:20803'
gitlabToken2 = 'nEszLnFVNFSaxzh-y'

url = "http://%s/api/v4/projects?private_token=%s&per_page=83" % (gitlabAddr, gitlabToken)
allProjects = requests.get(url)
allProjects.encoding = 'utf-8'
allProjectsDict = json.loads(allProjects.text)

if len(allProjectsDict) == 0:
    break
for thisProject in allProjectsDict: 
    try:
        thisProjectURL  = thisProject['ssh_url_to_repo']
        thisProjectPath = thisProject['path_with_namespace']
        thisProjectName = thisProject['name']
        #在需要迁移过去的gitlab上创建项目
        url2 = "http://%s/api/v3/projects?private_token=%s&name=%s&namespace_id=45" % (gitlabAddr2, gitlabToken2, thisProjectName)
        rain = requests.post(url2)
        print("创建Project状态码%s") % (rain.status_code)

        pathname = "%s.git" % (thisProjectName)
        if os.path.exists(pathname):
            command = 'cd "%s.git" &&  git status' % (thisProjectName)
        else:
            command = 'git clone --mirror %s' % (thisProjectURL)
            print(command)
            os.system(command)
            print("代码拉取完成")
        #如果创建失败则跳过代码迁移
        if rain.status_code == 400 :
            continue
        else:
            command = 'cd "%s.git" && git remote set-url origin http://%s/PTT/%s' % (thisProjectName, gitlabAddr2, thisProjectName.lower())
            print(command)
            os.system(command)
            print("修改远程代码库地址")            
            command = 'cd "%s.git" && git push --mirror ssh://git@%s/PTT/%s.git' % (thisProjectName, gitlabAddr3, thisProjectName.lower())
            print(command)
            os.system(command)
            print("push到远程代码库") 
        time.sleep(1)
    except Exception as e:
        print("Error on %s: %s" % (thisProjectURL, e))

以上就是全部代码,环境不同脚本里的配置也会有些差异,大家可根据自身情况修改

三、结语

其实实现的功能跟简单、分为三个阶段,1. 从gitlab拉取代码到本地 2. 修改远程仓库地址 3. push本地地址到远程。比较难的地方应该就是gitlab版本不同,可能你们所用的git命令和我的有些差异,只要多调试就好

参考链接:https://blog.csdn.net/wwwsq/article/details/97106096

你可能感兴趣的:(gitlab,python)