当前位置:首页 > 技术 > 正文内容

使用Python-GitLab实现仓库信息采集系统

访客 技术 2026年6月16日 1

系统需求

构建Git仓库数据采集系统,需收集以下信息至数据库供前端展示:

  • 仓库基础信息
  • 所有者与成员列表
  • 提交记录与活跃状态
  • 支持定时任务与API触发

技术方案

  • GitLab REST API v4 接口
  • Python-GitLab库(兼容GitLab 10.0+版本)
  • Flask框架提供API接口
  • Requests处理HTTP请求
  • datetime/dateutil转换时间格式
  • Docker容器化部署

核心实现

项目信息处理


class ProjectProcessor(DataHandler):
    def __init__(self, project):
        super().__init__()
        self.repo = project
        self.attrs = project.attributes
        self.log(f"处理项目: {self._get_attr('name')} ID:{project.id}")
        
        # 初始化字段映射
        self.FIELDS = {
            'id': 'identifier',
            'name': 'repo_name',
            'desc': 'description',
            'owner': 'maintainer'
        }
        
        self.members = []
        self.primary_user = None
        self._initialize_data()

    def _format_time(self, timestamp):
        try:
            return parser.parse(timestamp).strftime("%Y-%m-%d %H:%M:%S")
        except Exception:
            self.log_warning(f"时间格式转换失败: {timestamp}")

    def _determine_activity(self, last_active):
        cutoff = datetime.now() - timedelta(days=30)
        return 1 if parser.parse(last_active) > cutoff else 0

    def _initialize_data(self):
        last_active = self._format_time(self._get_attr('last_activity_at'))
        
        self.project_data = {
            self.FIELDS['id']: self.repo.id,
            self.FIELDS['name']: self._get_attr('name'),
            self.FIELDS['desc']: self._get_attr('description'),
            'last_active': last_active,
            'created': self._format_time(self._get_attr('created_at')),
            'is_active': self._determine_activity(last_active),
            'members': self._fetch_member_usernames()
        }
        
        self._sync_to_database()

    def _fetch_members(self):
        if not self.members:
            self.members = self.repo.members.list(all=True) or self.repo.members.all(all=True)
        return self.members

    def _fetch_member_usernames(self):
        return [m.attributes.get('username') for m in self._fetch_members()]

成员数据处理


def _fetch_member_usernames(self):
    member_records = self.repo.members.list(all=True) 
    return [member.attrs.get('username') for member in member_records]

用户数据结构示例


用户属性示例:
{ 
  'access_level': 50,
  'username': 'dev_user',
  'name': 'Developer',
  'web_url': 'http://git.example.com/user'
}

系统集成


app = Flask(__name__)

@app.route('/api/fetch-projects/<token>')
def get_projects(token):
    gl = gitlab.Gitlab(API_URL, token)
    gl.auth()
    
    projects = gl.projects.list(all=True)
    processors = [ProjectProcessor(p) for p in projects]
    
    return jsonify({
        'user': gl.user.username,
        'project_count': len(processors)
    })

def create_http_pool():
    session = requests.Session()
    adapter = HTTPAdapter(pool_connections=5, pool_maxsize=10)
    session.mount('http://', adapter)
    return session

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。