【问题标题】:Auto deploy Google Cloud Functions from Google Cloud Source Control从 Google Cloud Source Control 自动部署 Google Cloud Functions
【发布时间】:2018-05-18 12:14:36
【问题描述】:

我不知道如何从 Cloud Source Control 或直接从 GitHub 自动部署新推送的 Cloud Functions 提交。我通过创建另一个函数和 GitHub webhook 找到了类似的解决方案,但由于 Functions 不能 SSH(并且安装了 SSH 密钥),它只适用于公共存储库。 (https://cloud.google.com/community/tutorials/cloud-functions-github-auto-deployer)

任何想法如何实现这一目标?谢谢

【问题讨论】:

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


    【解决方案1】:

    您可以使用 Google Cloud Builder 来实现这一目标。在您的代码库上创建一个触发器,触发的构建会将新代码部署到 Google Cloud Function。

    我做了一个简单的例子:https://github.com/Philmod/auto-deploy-gcf

    干杯, 菲尔莫德

    【讨论】:

      【解决方案2】:

      我设法为这个问题找到了一个合理的解决方法。我希望它可以帮助其他在同样问题上苦苦挣扎的人。

      必需的设置

      在开始执行这些步骤之前,您需要在 CI/CD 系统上设置 SSH 密钥。这就是授予您的构建系统 ssh 访问您的私人仓库的权限。这里有几篇文章讨论了如何做到这一点。

      您还需要通过git+ssh 安装该软件包,以便它包含在您的package.json(以及可选的yarn.lock)中。

      yarn add git+ssh://git@gitlab.com:erichiggins/top_secret.git
      

      此时,您应该在package.json 中看到以下条目:

      ...
      "dependencies": {
        "top_secret": "git+ssh://git@gitlab.com:erichiggins/top_secret.git"
      },
      ...
      

      安装包(两次)

      这是我在部署阶段之前在 CI/CD 设置的 shell 脚本中运行的命令,以便使用 git+ssh 将私有存储库安装为包。为了更清楚,我将使用 top_secret 的假包名作为示例。

      我在这个例子中使用了yarn 和 GitLab,但如果你愿意的话,npm 和 GitHub 也是如此。

      yarn install
      cd node_modules/top_secret
      yarn pack
      mv top_secret-v*.tgz ../../
      cd ../../
      yarn add file:top_secret-v1.0.0.tgz
      

      注意:yarn pack 命令将生成一个包含版本号的文件名,但您不能在yarn add 中使用通配符 (*)。我在使用带有通用、无版本文件名的 yarn pack --filename 时遇到了问题,因此您可能需要对此进行硬编码或找到使用 yarn pack 生成的文件名的创造性解决方案。

      结果

      如果您尝试在本地运行这两个命令,您会注意到在您的 dependencies 文件的 dependencies 部分中只有一个新的 top_secret 条目,如下所示:

      "top_secret": "file:node_modules/top_secret",
      

      这是发生了什么:

      1. 您正在通过git+ssh 在具有访问权限的系统上将私有存储库作为一个包安装。
      2. 您正在将其从 node_modules/ 目录重新打包到一个 tarball 文件 (.tgz) 中。
      3. 您正在使用 file: 从本地 tarball 文件安装相同的包
      4. 因为包名相同,所以将package.json中的git+ssh条目替换为file:条目。

      您的 Cloud Functions 部署现在应该可以顺利进行,并且包含您的私有包。祝您好运,如果您对这些说明有任何疑问,请告诉我 - 我很乐意纠正任何错误并重写任何不清楚的地方。

      替代方法

      如果您不介意额外的工作或私有存储库的更改频率不足以证明 CI/CD 中的额外复杂性是合理的,您还可以使用 npm pack/yarn pack 创建一个 tarball 文件,运行上面列出的相同的 yarn add file:... 命令来修改您的 package.json 并将 tarball 文件签入您的存储库。

      注意:请注意,如果您将 tarball 文件签入的 repo 是公开的,那么您的私有 repo/包的来源也将公开。

      参考资料:

      【讨论】:

      • 我似乎无法让它工作 - 每次部署都失败,因为它没有上传 node_modules 文件夹,因此它找不到我的私有模块。你用什么来部署函数?
      • @Tom 此代码 sn-p 可能需要调整——我似乎记得它对我有用,但稍后会出现问题。我今天将通过它并修复它,然后让您知道需要进行哪些更改。希望我们能让它为您工作。
      • @Tom 我更新了说明以反映应该可行的解决方案,并添加了一个更简单的替代解决方案。希望这会有所帮助!
      • 我使用通用脚本中的 PACKED=ls ${NAME}-*.tgz。但是,如果我从一个空的 node_modules 目录开始,npm install ./${PACKED} --ignore-scripts --offline 会下载一半的互联网,而我只想编辑 package.json
      • sed -E -i -e "s/\"${NAME}\": ?\"[^\"]*\"(,?)$/\"${NAME} \": \"file:${PACKED}\"\1/" package.json
      猜你喜欢
      • 2020-11-03
      • 2019-10-06
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多