Jenkins 使用 multiple SCMs 代替 git submudule 部署

Hexo 如何安装主题

使用 Hexo 作为博客之后, 选择了比较流行的 Next 主题.

要使用一个主题, 需要把主题文件夹整个下载到 themes 文件夹下, 然后修改配置文件启用主题.

这就带来了一个问题, 直接 clonethemes 文件夹的 next 仓库, 是不能直接纳入我博客的仓库的版本控制的. 换句话说, 虽然 next 主题的文件处于 hexo 的子目录下, 但是这两个仓库还是互相独立的. 这就需要使用 git submodule 将他们建立关联关系, 让 hexo 中的一个引用指向 next 的仓库. 这样就可以分别控制两个仓库的更新和提交了.

Jenkins 部署失败

按照正常的部署流程, 在博客或主题更新之后, git pullgit submodule update 即可获取更新.

但是在部署 Jenkins 时, 缺在更新子仓库步骤上出了问题.

不知道为什么, Jenkins 在尝试拉取 submodule 时, 可能没有使用正确的凭据, 没能成功更新 next 仓库. 在网上搜索发现很多人遇到了相同的问题. 也有很多人提出了多种解决方案, 尝试了几种配置 Jenkins 的方案, 都没成功. 有人说是 Jenkins 旧版本的 bug, 但我比较新的版本貌似也没解决

Stack Overflow - git-submodules-not-updating-in-jenkins-build

Stack Overflow - why-is-jenkins-getting-authentication-failed-error-for-git-submodule-update

Stack Overflow - jenkins-and-updating-git-submodules

不过最后看到了一个没有太多人采纳的方案:
Stack Overflow

multiple SCMs

一般来说, Jenkins 一个项目只有一个 SCM, 但 multiple SCMs 这个插件, 允许在工作目录下的任意目录checkout另外的仓库, 这样就(在一定程度上)起到了和 git submodule 相同的作用.

  1. 首先删掉 hexo 中的 submodule, 使两个仓库独立
  2. 安装并配置multiple SCMs, 将 next 仓库拉到 themes/next 目录下
  3. next 主题的仓库也添加一个 webhook 指向 Jenkins , 不论主题还是博客有修改, 都能触发构建.

总结

  • 对于部署 hexo 的主题而言, 多个仓库直接嵌套就可以了, 博客和主题完全解耦, 可以独立维护.
  • 其实 git submodule 这种工作方式本身就很繁琐, 不管是对子仓库做添加, 更新, 还是删除的操作, 都很麻烦.
  • 有方便的 CI 的话, git submodule 很多时候都可以不用了, 当然如果项目复杂, 依赖很多, 在开发环境下使用手动管理方式还是不够高效.