我设法为这个问题找到了一个合理的解决方法。我希望它可以帮助其他在同样问题上苦苦挣扎的人。
必需的设置
在开始执行这些步骤之前,您需要在 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",
这是发生了什么:
- 您正在通过
git+ssh 在具有访问权限的系统上将私有存储库作为一个包安装。
- 您正在将其从
node_modules/ 目录重新打包到一个 tarball 文件 (.tgz) 中。
- 您正在使用
file: 从本地 tarball 文件安装相同的包
- 因为包名相同,所以将
package.json中的git+ssh条目替换为file:条目。
您的 Cloud Functions 部署现在应该可以顺利进行,并且包含您的私有包。祝您好运,如果您对这些说明有任何疑问,请告诉我 - 我很乐意纠正任何错误并重写任何不清楚的地方。
替代方法
如果您不介意额外的工作或私有存储库的更改频率不足以证明 CI/CD 中的额外复杂性是合理的,您还可以使用 npm pack/yarn pack 创建一个 tarball 文件,运行上面列出的相同的 yarn add file:... 命令来修改您的 package.json 并将 tarball 文件签入您的存储库。
注意:请注意,如果您将 tarball 文件签入的 repo 是公开的,那么您的私有 repo/包的来源也将公开。
参考资料: