#!/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("-----------没有可备份的工程---------------")