Gitlab代码仓库备份脚本(py)

#!/usr/bin/env python3
# encoding: utf-8
#

__Author__ = 'Zwg'
__Date__ = '2019-01-01'

import gitlab
import os
import time  # 引入time模块
import subprocess
import platform  # 平台信息

'''

你的gitlab地址,需要生成一个access_token
''

GITLAB_URL = "http://127.0.0.1:8080/"

ACCESS_TOKEN = "st5QSMgf7bvQroBKRYT9"  # accecss_token 2019-01-31過期
AUTH_WAY = "oauth2"
'''
备份说明: 
    在此脚本执行目录生成以当前日期为名的文件夹(
        ex: 2019-01-01 在D:/执行备份操作,则生成D:/2019-01-01文件夹,工程备份文件名为 projectName-branchName-2019-01-01)
        
        pip install  gitlab需要下载gitlab模块
        
        直接编译器执行main  或者  cmd  python backFromGitLab.py
'''


class GitlabAPI(object):
    # 构造方法
    def __init__(self, *args, **kwargs):
        gitlab_url = args[0]
        access_token = args[1]
        self.gl = gitlab.Gitlab(gitlab_url, private_token=access_token)
        print("认证成功。。。。。")

    # 获取所有的工程名字和分支名称,采取一周一次备份,每次备份按照当前日期重新生成文件夹(全量备份)
    # 返回一個字典,key is project_info,contain project_url & project name&..  ,value is project branches info
    def get_all_projects(self):
        projects = self.gl.projects.list(all=True)
        print("开始获取所有工程信息。。。。")
        project_info = {}  # key is project_info,contain project_url & project name&..  ,value is project branches info
        for project in projects:
            branches = project.branches.list()
            if len(branches) > 0:
                project_info[project] = branches
            else:
                print("o~O~!!,这个工程 %s 分支总数等于0,算了不备份了" % (project.name))
        return project_info


# 组装下载url  通过oauth2方式认证 git clone 下载
def packageing_gitproject_downurl(project_url, branch_name):
    new_url_pre = "http://{0}:{1}@".format(AUTH_WAY, ACCESS_TOKEN)
    down_url = str(project_url).replace("http://", new_url_pre)
    down_url_cmd = "git clone -b {0} {1}".format(branch_name, down_url)
    return down_url_cmd


##组装備份工程文件名
def packageing_git_project_foldername(project_name, branch_name, timeDate):
    # ticks = time.strftime("%Y-%m-%d", time.localtime())  # -%H:%M:%S
    project_folder_name = "{0}-{1}-{2}".format(project_name, branch_name, timeDate)
    return project_folder_name


##創建文件夾
def mkdir(path):
    # 去除首位空格
    path = path.strip()
    # 去除尾部 \ 符號
    path = path.rstrip("\\")
    # 判斷路徑是否存在,存在True 不存在False
    isExists = os.path.exists(path)
    # 判斷結果
    if not isExists:
        # 如果不存在則創建目錄
        # 創建目錄操作函數
        os.makedirs(path)
        print(path + ' 創建成功')
        return True
    else:
        # 如果目錄存在則不創建,並提示目錄已存在
        print(path + ' 目錄已存在')
        return False


# 开始备份 周期全量备份
def readyBackUp(project_infos):
    # 創建備份日期的文件夾
    timeDate = time.strftime("%Y-%m-%d", time.localtime())

    # 解决文件分隔符的问题
    root_path_windows = "{0}\{1}"
    root_path_linux = "{0}/{1}"
    system = platform.system()
    print(system)
    if "Windows" == system:
        root_path = root_path_windows.format(os.getcwd(), timeDate)
        project_path_org = root_path_windows  # 後續格式化
    elif "Linux" == system:
        root_path = root_path_linux.format(os.getcwd(), timeDate)
        project_path_org = root_path_linux 
    elif "Darwin" == system:
        root_path = root_path_linux.format(os.getcwd(), timeDate)
        project_path_org = root_path_linux
    else:
        print("不支持的系统")
        return

    mkdir(root_path)

    for project_info in project_infos:
        # 創建工程備份日期的文件夾
        for i in range(len(project_infos[project_info])):
            project_branches = project_infos[project_info]
            # 文件夹名字为工程名-分支名-执行日期
            project_path = project_path_org.format(root_path, packageing_git_project_foldername(project_info.name,
                                                                                                project_branches[
                                                                                                    i].name, timeDate))
            mkdir(project_path)
            # 更換執行git clone的目錄
            os.chdir(project_path)
            # 獲取git clone的url (命令)
            git_clone_url = packageing_gitproject_downurl(project_info.http_url_to_repo, project_branches[i].name)
            print("dir is \" %s \", cmd is \" %s \" " % (project_path, git_clone_url))
            # 不阻塞執行命令
            subprocess.Popen(git_clone_url)


if __name__ == '__main__':
    # 開始連接gitlab
    git = GitlabAPI(GITLAB_URL, ACCESS_TOKEN)
    # 獲取所有可備份工程信息
    project_infos = git.get_all_projects()
    print("--------获取工程信息成功,开始备份------------")
    if len(project_infos) > 0:
        readyBackUp(project_infos)
    else:
        print("-----------没有可备份的工程---------------")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值