[分享] 利用python-gitlab完成项目批量导出的示例

通常在管理Gitlab时,常常会进行导出项目操作,Gitlab本身提供了页面上的导出按钮以及API来完成。但是有时导出操作的要求,是需要批量的、满足一定条件的。这时通过页面导出或调用API就变成了一件费时又容易出错的操作。那么还有什么办法能够更快的完成这种工作呢?这里抛砖引玉,尝试利用Gitlab周边的SDK client开发脚本完成上述操作。

这里就以一个示例例进行说明,示例要求是:导出最近一个月内有动作的项目。我们采用了python作为开发语言,利用python-gitlab项目完成该示例。更多的关于python-gitlab的使用说明,请参见:python-gitlab v3.2.0

环境的准备就不赘述了。基本上包括以下步骤:

  1. 安装python3环境
  2. 安装gitlab-python包。pip install python-gitlab

直接上代码:

import os
import gitlab
import time
import datetime

os.environ['TZ'] = 'Asia/Shanghai'

# 在您的GitLab上生成一个token
private_token='xxxxxxxxxxxxxxx'
# 改成您的GitLab的url
url='https://gitlab.cn'
# 改成要导出备份的目录,默认输出到运行脚本的目录下
output_dir='.'

def to_datetime(time_str, time_pattern):
    return datetime.datetime.strptime(time_str, time_pattern)

def main():
    # 得到gl实例
    gl = gitlab.Gitlab(url, private_token=private_token)

    need_export_projects = []

    now_time = datetime.datetime.now()
    before_one_month_time = now_time + datetime.timedelta(days=-30)

    # 遍历GitLab实例上的所有项目
    for project in gl.projects.list(all=True):
        # 将最后活动时间在一个月内的项目过滤出来
        if to_datetime(project.last_activity_at, '%Y-%m-%dT%H:%M:%S.%fZ') > before_one_month_time:
            need_export_projects.append(project)
            
    # 遍历要导出的项目(当然写到一个循环中可以)
    for project in need_export_projects:
        print("name:" + project.name + " id:" + str(project.id) + "项目导出")
        # 调用API创建项目导出请求
        export = project.exports.create()
		# 定时刷新项目导出的当前状态,直到导出状态为 finished
        export.refresh()
        while export.export_status != 'finished':
            time.sleep(1)
            export.refresh()
		
        # 导出项目到指定路径
        with open(output_dir + '/' + project.name + '_' + str(project.id) + '_' + 'export.tar.gz', 'wb') as f:
            export.download(streamed=True, action=f.write)
        
if __name__ == "__main__":
    main()        

执行步骤:

  1. 修改export.py中的相关配置,比如token、gitlab的url、导出备份的路径。
  2. 执行导出:python export.py

供大家参考,谢谢。