本文是[链接]的一个章节,该系列文章将介绍 [链接] 这款 Java 博客系统是如何从无到有的,希望大家能通过它对 Solo 从设计到实现有个直观地了解、能为想参与贡献的人介绍清楚项目,也希望能为给重复发明重新定义博客系统的人做个参考 自动同步 GitHub 仓库 自动同步仓库包含了两个功能: 每 24 小时定时拉取用 ..

Solo 自动同步 GitHub 仓库

本文是《Solo 从设计到实现》的一个章节,该系列文章将介绍 Solo 这款 Java 博客系统是如何从无到有的,希望大家能通过它对 Solo 从设计到实现有个直观地了解、能为想参与贡献的人介绍清楚项目,也希望能为给重复发明重新定义博客系统的人做个参考 ❤️

自动同步 GitHub 仓库

自动同步仓库包含了两个功能:

  1. 每 24 小时定时拉取用户 GitHub 账号下的公有仓库,然后生成一篇文章并在加入到导航中,实际效果请参看这里
  2. 每 24 小时定时导出用户的公开文章到用户的 GitHub 仓库(solo-blog),实际效果请参考这里

拉取并展示仓库

仓库数据是通过社区接口获取的,GitHubs#getGitHubRepos

public static JSONArray getGitHubRepos(final String githubUserId) {
    try {
        final HttpResponse res = HttpRequest.get("https://hacpai.com/github/repos?id=" + githubUserId).trustAllCerts(true).
                connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).send();
        if (HttpServletResponse.SC_OK != res.statusCode()) {
            return null;
        }
        res.charset("UTF-8");
        final JSONObject result = new JSONObject(res.bodyText());
        if (0 != result.optInt(Keys.STATUS_CODE)) {
            return null;
        }
        final JSONObject data = result.optJSONObject(Common.DATA);
        final JSONArray ret = data.optJSONArray("githubrepos");

        return ret;
    } catch (final Exception e) {
        LOGGER.log(Level.ERROR, "Gets GitHub repos failed", e);

        return null;
    }
}

社区会定时调用 GitHub Repos API 获取用户仓库数据,然后持久化到数据库中,Solo 请求数据时查库返回。

导出文章到仓库

应用场景与动机:

使用说明:

  1. 登录博客后台,在工具 -> 偏好设定 -> 参数设置中勾选允许同步 GitHub 仓库
  2. 启动后 10 分钟进行第一次同步,后续每 24 小时触发一次

请注意:不需要 fork 我的那个仓库,程序会自动创建名为 solo-blog 的仓库。

实现流程:

  1. 博客端定时触发同步请求,将所有公开(非加密)文章导出 md 打 zip 包
  2. 将包发送至社区服务器,由社区服务器完成仓库创建/更新、文件提交

由社区服务器进行 GitHub 操作主要考虑到两点:

凭证授权

目前博客端在进行 GitHub 登录时申请的权限包括:

具体细节可以通过该文档了解。我们仅在用户同意授权使用该功能的情况下做操作(博客端会在设置中增加是否需要同步仓库的选项,默认进行同步),大家进行公开监督,避免产生不必要的误会。

凭证使用

凭证统一在社区存储,由社区统一进行运维操作,尽量避免潜在的安全泄露。所以博客端不进行凭证相关的任何存储和操作以降低风险。如果发现安全问题,我们会在 GitHub 上注销所有凭证,将安全问题产生的影响降到最低程度。

代码实现

请参考 ExportService#exportGitHubRepo


回到全文目录:《Solo 从设计到实现》

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。

    Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
    具体细节请浏览 B3log 构思

    786 引用 • 5857 回帖 • 686 关注
  • 设计
    89 引用 • 576 回帖 • 1 关注
  • 文档
    51 引用 • 996 回帖 • 1 关注
5 回帖   
请输入回帖内容...
  • mmzsblog  

    使用 Tomcat 部署的项目,但是没有自动同步到 GitHub 社区?是不是因为我设置了多个管理员的原因呢?

    1 回复
  • 88250      

    可以看下日志中是否有报错或者其他信息。

    1 回复
  • mmzsblog        

    日志打印了 GitHub repo syncing....这句话;将 GitHub 的公开仓库同步到了博客;但是博客的文章没有同步到 GitHub

    1 回复
  • 88250      

    社区服务器上的日志能找到最近一次同步成功的记录是 8 月 5 号,后面就没有同步请求过来了。我估计是因为 Solo 博客端没有发出同步推送请求,你看下是不是如下几个原因导致没有发送同步请求:

    • 设置中是否勾选“允许同步 GitHub 仓库”
    • server host 不能是 localhost 或者 IP
    • runtime mode 必须是生产模式
    1 回复
  • mmzsblog        

    谢谢您,解决了;

    原因是 runtime mode 没有修改成生产模式