ḫpr - 最好用的 git 仓库镜像同步工具

icon

ḫpr 是一个把任意 git 仓库的镜像到 gitlab 服务的同步工具,还支持定期同步的功能。

特性:

  • 支持 Web API 接口,可用于远程控制不仅限于终端使用
  • 支持终端命令控制,方便临时使用
  • 定时更新镜像的仓库,时间可调,告别不靠谱的 crontab
  • 几乎支持所有的 git 托管的仓库
  • 使用可独立部署的 Gitlab 作为镜像平台

本工具可以用到的地方:

  • 任意 git 仓库源码的定期同步
  • Cocoapods 的境内加速和同步

契子

如果关注我博客的用户或者曾经看到过另外一篇文章极速化 CocoaPods的话且实践的用户会明白为什么会有它的产生。 在我发布那篇文章的时候那套体系已经在我们公司的服务器上运行且截至目前已经持续运行了 3 年多!

那个方案并不完美,除了调用必须通过脚本的蹩脚的方案外出问题最多的主要是 gitlab-mirrors 只能使用 crontab 做定时任务这样会因多个镜像在同步未完成的情况下重复开启新的同步任务,一个任务不明显一旦积攒多了起来还会慢慢的蚕食内存因此又不得不 ssh 到服务器 开始杀进程相当于重置。

当时想重新做一个的想法其实 2017 年就产生了用 ruby 写了个头当时项目命名为 nightwing 但 ruby 的问题在部署上面有比较麻烦需要各种依赖环境, 当时也考虑过 Go 但由于在断断续续学习没有持续,这个时候就开始将注意力转移到了类 Ruby 语法的 Crystal 语言,通过业余时间慢慢的了解和确定其性能后虽然和 Go 来比打包还没有那么高的集成度但完成核心功能已经完全足够,也就开始了封装 gitlabhalite 网络库直到最近基本完成了核心功能。

ḫpr 就这样诞生了。项目名和 Logo 出处来源于圣甲虫

快速上手

鉴于 Docker 的便利性,目前教程只提供此种方法进行安装部署,首先克隆本项目:

$ git clone https://github.com/icyleaf/hpr.git
$ cd hpr

复制 config/hpr.json.example 并改名 config/config.json 后可修改

{
  "schedule_in": "1.day",
  "basic_auth": {
    "enable": false,
    "user": "hpr",
    "password": "[email protected]"
  },
  "gitlab": {
    "ssh_port": 22,
    "endpoint": "http://gitlab.example.com/api/v3",
    "private_token": "abc",

    "group_name": "mirrors",

    "project_public": false,
    "project_issue": false,
    "project_wiki": false,
    "project_merge_request": false,
    "project_snippet": false
  }
}

核心需要修改的参数有如下四项:

  • endpoint: Gitlab API 的地址,无需修改后面部分
  • private_token: 在个人设置的 Account 页面获得
  • group_name: 项目镜像的项目都会归属到这个组内,务必确保你的账户拥有创建组的权限 (如果是管理员请忽略加粗字样)
  • ssh_port: 如果 SSH 不是 22 端口的话需要根据你的实际情况修改

配置文件修改保存后还需要在 docker-compose.yml 文件中配置下:

version: '2'

services:
  hpr:
    image: icyleafcn/hpr
    ports:
      - 8848:8848
    volumes:
      - ./config:/app/config
      - ./repositories:/app/repositories
    environment:
      REDIS_URL: tcp://redis:6379
      REDIS_PROVIDER: REDIS_URL

      HPR_SSH_HOST: git.example.com
      HPR_SSH_PORT: 22
    depends_on:
      - redis
  redis:
    image: redis:alpine

其中 HPR_SSH_HOSTHPR_SSH_PORT 变量用于设置 Docker 实例中的 SSH 配置。如果 SSH 端口是 22 的可忽略设置这俩参数。

编辑完成后运行下面命令快完成了!

$ docker-compose up
...
hpr_1      | Generating public/private rsa key pair ...
hpr_1      |
hpr_1      | GENERATED SSH PUBLIC KEY:
hpr_1      | ##################################################################
hpr_1      | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDq8O3HbLn9x8Uy8RUotlpOnxdakrmCyDpZrGBeLARmEbd6BOIBQ+UWm8NUKthQ7UOavmlsq4j8lY4kyFW2eFX2qWcbvI+s2gI+05MXax+mAukSszaNSnpAoTyJCRipilSkqiOV99V8JIJhrHPtTO0o/Ui
9WiyyWsUM4M9lEKHpZ486lDGk3IM2XQW+pxAoMKb0TYzqCsrduHUtjzy0M0BqgMPe9EtVQqCbnTMzDLXmRONoTYyTV51NQ12mMwEQcDaLQ28e5gqouQJKS81JaoRpQWa7pHsOCki6Fk9TB+EQFrGz5nOrmYYM+O1MKnFkzmVHv7Fh50Sz7d2nYzzOKAkR [email protected]
hpr_1      | ##################################################################
hpr_1      |
hpr_1      | Configuring ssh config ...
hpr_1      | Starting hpr server ...
hpr_1      |   _
hpr_1      |  | |__  _ __  _ __
hpr_1      |  | '_ \| '_ \| '__|
hpr_1      |  | | | | |_) | |
hpr_1      |  |_| |_| .__/|_|
hpr_1      |        |_|

最后从执行命令的输出找到生成的 SSH PUBLIC KEY(两个井号中间的部分,以 ssh-rsa 开头,[email protected] 结尾), 复制添加到 gitlab 的账户 SSH Keys 页面中。

更多资源

再多的内容我已经整理到文档中,欢迎移步浏览:https://icyleaf.github.io/hpr/

icyleaf

热爱户外的码农、下厨初心者

Beijing, China http://icyleaf.com