Google云构建,在monorepo中引用父文件夹

问题描述

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

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

docker build -f Dockerfile ..

哪个可以正常工作,但是使用cloudbuild.yaml尝试相同的操作,并且docker构建器会引发以下错误,有关丢失的文件描述符?

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与云运行服务一起使用,又仍然提取我们的共享类型?

解决方法

当您运行Cloud Build作业时,它将复制当前目录中的所有文件。如果您在子目录中,则不会上载所有同级或上级目录,因此在Cloud Build上是已知的。

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

请考虑也更改cloudbuild.yaml步骤定义,因为您的根文件夹不再是子目录,而是根目录。您可以使用directory参数在每个步骤中指定工作目录。

编辑1

如果您不想在每个组件版本上上传整个monorepo,则可以在手动触发gcloud builds summit命令时ignore files

但是您不能使用触发器来做到这一点。您可以忽略文件,但这一次,这意味着在构建作业触发条件下必须忽略文件(例如,自述文件,当您将其推送时,触发新的构建是无用的)。但是,如果构建是由其他文件触发的,则这些“被忽略的文件”仍将存在于运行作业中。