首页 > 解决方案 > 谷歌云构建,在 monorepo 中引用父文件夹

问题描述

我们有一个monorepo设置,其中每个文件夹都有一个typescript/node服务。还有一个共享/types文件夹,我们使用 typescript 项目引用将其拉入每个项目。

由于您无法复制父文件夹,因此我们在本地使用:

docker build -f Dockerfile ..

哪个工作正常,但是使用 docker builder 尝试相同的操作cloudbuild.yaml会引发以下错误,关于缺少文件描述符?

docker.io/library/docker:latest                                         
error checking context: 'file ('/proc/1/fd/5') not found or excluded by .dockerignore'.                                                         
ERROR                                                                                                                                           
ERROR: build step 0 "docker" failed: step exited with non-zero status: 1                                                                        
------------------------------------------------------------------------------------------------------------------------------------------------
ERROR: (gcloud.builds.submit) build dc31344a-b836-4089-87ab-e6ce7c69cab3 completed with status "FAILURE"

那么,我们如何才能gcloud build在单一存储库中使用云运行服务,并且仍然拉入我们的共享类型呢?

标签: typescriptdockergoogle-cloud-platformgoogle-cloud-runmonorepo

解决方案


当您运行 Cloud Build 作业时,它会从当前目录复制所有文件。如果您位于子目录中,则不会上传所有兄弟目录或父目录,因此不会在 Cloud Build 上知道。

为此,您必须在父目录级别运行 Cloud Build 作业,并在命令中引用 CloudBuild.yaml 文件(并指向正确的子目录)。

想想也改变你的 cloudbuild.yaml 步骤定义,因为你的根文件夹不再是子目录,而是根目录。您可以使用该directory参数指定每一步的工作目录。

编辑 1

如果您不想在每个组件构建上上传整个 monorepo,您​​可以在手动触发 gcloud builds Summit 命令时忽略文件。

但是,您不能使用触发器执行此操作。您可以忽略文件,但这一次,这意味着必须在构建作业触发条件中忽略文件(例如,自述文件,当您推送它时,触发新构建是没有用的)。但是,如果构建是由其他文件触发的,这些“忽略的文件”仍然会出现在运行作业中。


推荐阅读