在单一存储库中构建微服务的最佳策略是什么?

What is the best strategy for building microservices in a mono repo?

我有一个单声道存储库 (git),其中包含我正在处理的多个微服务。在推送时,第 3 方构建服务检测到此推送并开始处理构建和部署。

效果很好。但现在我正在尝试优化这个过程,我只希望它能够构建我一直在努力的特定服务。这意味着构建服务必须检测哪些文件夹已被更改并仅构建这些服务。

我已经让这个过程在 Travis 上运行得很好,因为它有一个 GIT_COMMIT_RANGE 环境变量。所以我可以在我最新的推送中获取所有提交,然后在所有这些提交中获取已更改的文件夹。这非常有效。但是 ONLY 在 travis 上。

我希望删除 travis 并直接在 GCP 或我正在使用的任何其他第 3 方容器构建器上构建我的 docker 图像,但我只想构建已更改的文件夹。

我认为可以使用 git 提交挂钩来完成此操作。通过这个挂钩,我可以开始生成文件夹列表以标记要构建的构建服务器,甚至可以开始生成构建文件 (cloudbuild.yaml)。然后在一些 git push hook 上,(甚至有 post-push hook)我在本地重置 cloudbuild.yaml 文件的内容。

实际上,我已经使用 github 操作

在不同的回购协议中解决了这个问题

我很幸运,有人创建了一个 github 操作来过滤已更改的文件夹

- uses: dorny/paths-filter@v2
    id: changes
    with:
      filters: |
        src:
          - '<folder to check>/**'

在接下来的构建步骤中,如果路径过滤器 return 为真,您可以使用 if 语句触发该步骤:

- name: Build node
    if: steps.changes.outputs.src == 'true'
    run: |
      <command goes here>

如您所见,如果子文件夹中的任何内容发生更改,src 将 return 为真。

此处提供操作回购 https://github.com/dorny/paths-filter