使用 github 操作从 monorepo 部署单个服务
Posted
技术标签:
【中文标题】使用 github 操作从 monorepo 部署单个服务【英文标题】:Deploy individual services from a monorepo using github actions 【发布时间】:2020-01-27 20:55:28 【问题描述】:我有大约 10 个单独的微服务,其中大部分是用于各种数据处理作业的云功能,它们都位于一个 github 存储库中。
目标是在推送到分支时触发这些服务选择性部署到 Google Cloud Functions - 当单个功能已更新时。
我必须避免单个服务的更新导致部署所有云功能的情况。
我当前的存储库结构:
/repo
--/service_A
----/function
----/notebook
--/service_B
----/function
----/notebook
附带说明一下,使用 Github Actions VS Google Cloud Build 进行此类自动化的优缺点是什么?
【问题讨论】:
【参考方案1】:GitHub Actions 支持带有工作流路径过滤的 monorepos。您可以创建一个工作流,以便在特定路径上的文件发生更改时选择性地触发。
https://help.github.com/en/articles/workflow-syntax-for-github-actions#onpushpull_requestpaths
例如,当路径 service_A/
下的任何文件发生更改时,此工作流将在推送时触发(注意 **
glob 以匹配嵌套目录中的文件)。
on:
push:
paths:
- 'service_A/**'
【讨论】:
好的,谢谢,这可行,但要求每个服务本质上都有自己的工作流程。 @dendog 是的,完全正确。我认为在许多情况下,monorepo 中的不同服务将由不同的团队拥有,因此每个团队都有自己的工作流程是有意义的。虽然可能有很多重复的工作流程步骤,但我认为 GitHub Actions 没有任何功能可以在工作流程之间共享步骤,例如 CircleCI orbs。 我知道这是一个旧线程,我们发现您可以通过创建自定义操作来做到这一点。例如,我们在 IBM Cloud 上托管并使用 IBMCloud 容器注册表,因此我们有一个用于登录到 IBMCloud CLI 的自定义操作,该操作可跨多个作业使用。【参考方案2】:您还可以运行一些脚本来发现基于git diff
更改了哪些服务并通过GitHub REST API 触发相应的作业。
可能有两个工作流main.yml
和services.yml
。
主工作流程将配置为始终在推送时启动,它只会启动脚本以找出哪些服务已更改。对于每个更改的服务repository dispatch event,将在有效负载中使用服务名称触发。
服务工作流程将配置为在 repository_dispatch 上启动,并且每个服务都包含一个作业。作业将根据事件有效负载具有附加条件。
查看具有类似设置的展示: https://github.com/zladovan/monorepo
【讨论】:
以上是关于使用 github 操作从 monorepo 部署单个服务的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 GitHub 操作以发布 Lerna Monorepo
Github 操作似乎无法在带有纱线工作区和 lerna 的 monorepo 中找到私有包