【问题标题】:How to set up one GitHub repo for multiple Google Cloud Functions?如何为多个 Google Cloud Functions 设置一个 GitHub 存储库?
【发布时间】:2021-07-31 23:39:28
【问题描述】:

我想设置一个 GitHub 存储库,用于保存所有后端 Google Cloud 功能。但我有两个问题:

  1. 如何进行设置,让 GCP 知道有多个 Cloud Functions 需要部署?
  2. 如果我只更改一个 Cloud Functions 的代码,如何设置让 GCP 只部署修改后的 Cloud Functions,而不重新部署未更改的一次?

【问题讨论】:

  • 简单的答案是你不能。 Cloud Functions 不会尝试找出对存储库进行了哪些更改。更新存储库并重新部署整个功能。您的问题缺少有关如何部署 Cloud Functions 和您创建的 CD 管道的详细信息。提示:您可以在桌面上开发常用的函数代码。为每个函数部署单独的存储库。
  • 当使用单一存储库时,您可能需要将 bazel 之类的工具集成到您的管道中以拆分独立构建
  • @JohnHanley,我计划将 GCP Cloud Build 用于 CI/CD 管道,以便在有新签入时启动构建。

标签: github google-cloud-platform google-cloud-functions


【解决方案1】:

将您的云功能保存到 github 存储库时,只需确保在 gitignore 文件中具有正确的设置。排除 node_modules 以及您不想提交的此类文件夹和文件。

通常所有云功能都通过单个 index.js 文件部署。所以在这里您需要确保您拥有该文件以及您导入其中的所有文件。

如果你想部署一个函数,你可以使用这个命令:

firebase deploy --only functions:your_function_name

如果您想要更结构化的解决方案,您可以阅读此article 以了解更多信息。

【讨论】:

  • 我计划将 GCP Cloud Build 用于 CI/CD 管道,以便在有新签入时启动构建。但我不希望构建重新部署 10功能,如果我只修改一个。
  • 如果您按照答案中的说明部署一个功能,则只会部署一个,而另一个将保持原样(它们不会被重新部署)
  • 你的文章写得很好,很清晰!它解释了如何形成 index.js 以自动获取所有功能。但是,假设我有 10 个函数,它们都部署在 Firebase 中。现在,如果我只更改一个函数并签入,Cloud Build 仍将部署所有 10 个函数,对吗?如果是这样,如何配置使其只部署修改后的?
  • 如果您运行命令firebase deploy --only functions,它将部署所有(但我认为 Firebase 会检查是否有更改并且不部署那些没有任何更改的 - 但我不是100% 确定)。如果您运行firebase deploy --only functions:your_function_name,它将仅部署该功能,而另一个将保持不变。如果您想自动化该过程,您需要设置您的 CD 系统以检测女巫功能已更改并仅为更改的功能运行这些命令。
  • 感谢@Tarik Huber,这很有意义。有什么方法可以检查 Firebase 是否不会部署未更改的功能?另外,如果真的需要CD,你有什么材料可以设置吗?
【解决方案2】:

据我了解,您希望将云功能代码存储在 GitHub 中,并且我假设您希望在某些操作上触发部署 - 推送或拉取请求。同时,您希望只重新部署修改后的云功能,而无需重新部署其他功能。

您设置的每个云功能都单独(重新)部署 - 我的意思是,您可能需要为每个云功能提供大量特定参数,并且这些参数对于不同的功能是不同的。 gcloud functions deploy command documentation page 中描述了这些参数的详细信息。

--entry-point(源代码中定义的云函数的名称)很可能对它们中的每一个都不同。因此,您可能会在所有云功能中使用某种“循环”,以使用不同的参数(包括名称、入口点等)进行部署。

这种“循环”(或“集合”)可以通过使用 Cloud Build 或 Terraform 或两者一起使用或其他一些工具来实现。

How can I deploy google cloud functions in CI/CD without redeploying unchanged SO 问题/答案中提供了如何仅部署修改后的云功能的示例。该示例可以扩展到任意数量的云功能。如果您不想使用 Terraform,可以使用纯 Cloud Build 来实现类似的机制(基于不同的想法)。

【讨论】:

  • 我认为您分享的帖子符合我想要实现的方向。但是,我仍然缺少一些细节。假设我在 GitHub 存储库中有 10 个云函数,而在此签入中我只有 1 个修改过的函数。如果我手动部署,我当然知道我需要为那个功能运行什么部署命令。但是如果我在 GitHub 中签入并依赖一个触发器来部署 Cloud Build,那么 Cloud Build 怎么知道哪一个是修改后的呢?
  • 我认为有几个选择。取决于您的上下文和要求。例如 - (a) 在云构建触发器中处理相关包含掩码(但这意味着对于每个云功能,您需要一个专用触发器); (b) 使用 TF 集和列表(即,而不是一个 zip 文件 - 您会根据云函数的数量获得一组具有基数的 zip 文件)。
  • 感谢@al-dann,但选项 a) 不可扩展。你能详细说明一下选项b)吗?要求是,构建过程(Cloud Build)可以自动检测哪些函数发生了变化,哪些函数没有变化,从而只部署修改后的函数。
  • 由于我们事先不知道,哪些云功能(来自整个流形)被修改了,应该有一个“过程”来检查所有这些(就代码而言)并检查.要遍历所有这些-意味着应该有一个变量(例如)-一组它们的名称。所以我们遍历那个集合 - (1) 一组 zip 档案,然后 (2) 一组 SHA 哈希,所以我们得到一组 GCS 名称,然后 (3) 上传所有它们(再次作为 terraform 集)放入桶中。最后 - TF云功能也是一套... - 这很短。缺点 - 每个 CF 的单独配置空间很小
  • 谢谢@al-dann!那么,处理这个问题的最佳实践是什么?组织只重新部署所有云功能是否正常,即使其中大部分没有更改?
猜你喜欢
  • 2019-07-18
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2011-08-16
相关资源
最近更新 更多