您使用什么工具或技术来同步存储库之间的配置?

jdf*_*the 5 git config repository microservices

我们有几个基础存储库,用于快速搭建新项目。其中包括以下内容的基础存储库:

  • TypeScript + Node 库
  • TypeScript + Node 微服务/工作人员
  • 角度应用
  • gRPC 存根/protobuf 库
  • ETC。

基础存储库包含启动新项目所需的所有配置和文件夹结构,类似于ng newcreate-react-app、 yeoman 生成器等。这包括 CI 配置、测试配置、linting 配置、tsconfig、带有脚本和开发依赖项的 package.json 等内容,用于设置、扩展建议、启动配置等的 VSCode 文件。基本上,存储库包含您需要在这些类似存储库之间共享的所有内容(代码除外)

有一些工具可以在存储库之间共享代码,例如 bit,或者您也可以发布库来共享代码,我们广泛使用了这些工具。但是,我还没有找到在许多存储库之间共享配置文件的好方法。我们可以简单地从基础存储库克隆或编写我们自己的生成器,但问题是保持配置同步。例如,如果我们更改 CI 配置,我不想记住哪 50 个存储库基于也需要更改的存储库。

我们不可能是唯一一家拥有超过 100 个存储库的公司,而且随着我们分成越来越多的分布式服务和库,增长没有尽头。我们可以采用单一存储库模式,但它仍然不会改变这样一个事实:单一存储库中的每个项目仍然需要自己的配置,并且必须在所有项目之间保持同步。

所以问题是,我缺少什么工具或技术可以使这些配置在许多不同的存储库之间保持同步?

jdf*_*the 0

目前我们的做法如下:

  • 创建一个新文件夹并git init在其中运行
  • origin您的存储库添加远程 ( )
  • 将辅助远程 ( base) 添加到基本存储库
  • 将推送 url 设置为无效 URL,以便您无法推送到基本存储库(例如git remote set-url --push base NOPUSHALLOWED
  • 获取基础存储库
  • 将基地的 master 分支检出到本地 master 分支,并带有--no-track中断跟踪链接的标志
  • 替换项目配置文件中的一些占位符(例如 README.md 中的存储库名称、docker build npm 脚本中的存储库名称等)
  • 提交并将本地 master 推送到 origin 并将其设置为跟踪 origin 的 master

作为我们构建脚本的一部分,在推送分支并创建 PR 之前,脚本会检查此存储库是否是从基础存储库创建的(基于存储库中的文件工件),如果是,它会检查是否有更改在你的仓库中不存在的基地git fetch base && git log --oneline --exit-code master..base/master > /dev/null。如果有任何更改,您的构建将失败,并且会提示您运行单独的脚本以从基础进行更新。

这样做的好处是自动同步,因为如果不将配置更新到最新版本,您就无法对项目进行更改,并且配置需要更新的唯一时间是当您要进行更改并重新构建时。

另一方面,它也有缺点。至少可以说,令人烦恼的是,您只有在进行更改并运行构建脚本后才发现必须与基础同步。您可以记得在进行更改之前手动运行检查,但说实话,这不会发生。现在您需要提交更改,运行脚本以从基础更新,推送并创建 PR,等待合并,拉下新的主版本,然后重新设置/合并以更新您的分支 - 所有这些都在您可以之前完成推动你的简单改变。当变更至关重要并且需要投入生产时,这确实是一个痛苦的事情。

另一个缺点是遥控器无法在机器之间同步。因此,如果我只是git clone其中一个应用程序,则没有设置基本远程,因此构建脚本将失败,因为它无法检查它不知道的远程。我们已经使用内部 CLI 应用程序中的另一个脚本解决了这个问题,该脚本用于克隆并自动设置基本远程,但我不知道有什么方法可以允许开发人员对存储库具有写访问权限,但无法克隆它(并且只允许以编程方式)- 无论如何,不​​在 GitHub 上。

我希望有人有更好的答案。