无法在Windows上提交gcloud构建,因临时文件file.tgz权限错误

0 投票
1 回答
72 浏览
提问于 2025-04-14 16:25

我在Windows上运行以下命令时遇到了问题:

gcloud builds submit --timeout=3600s --region=europe-west1 --tag europe-west1-docker.pkg.dev/project/project-appengine/project-image:latest

之前运行得很好,但几天前我的部署脚本突然停止工作。这个命令返回了以下内容:

Creating temporary tarball archive of 3571 file(s) totalling 25.3 MiB before compression.
ERROR: gcloud crashed (PermissionError): [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\user\\AppData\\Local\\Temp\\tmp5i8xwo38\\file.tgz'

If you would like to report this issue, please run the following command:
  gcloud feedback

To check gcloud for common problems, please run the following command:
  gcloud info --run-diagnostics

我在Windows 10上安装了最新版本的Google Cloud CLI。

是不是文件权限出了问题?归档文件在目录中,没问题。看起来SDK无法访问它。可能和使用的Python版本有关?

我试过Process Explorer,但没有找到任何进程锁定这个文件。

追踪信息:最近的调用失败: 文件 "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\api_lib\cloudbuild\snapshot.py", 第102行,在CopyTarballToGCS中 tf = self._MakeTarball(archive_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\api_lib\cloudbuild\snapshot.py", 第77行,在_MakeTarball中 tf.add(path, filter=_ResetOwnership) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\tarfile.py", 第2002行,在add中 self.addfile(tarinfo, f) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\tarfile.py", 第2030行,在addfile中 copyfileobj(fileobj, self.fileobj, tarinfo.size, bufsize=bufsize) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\tarfile.py", 第254行,在copyfileobj中 buf = src.read(remainder) ^^^^^^^^^^^^^^^^^^^ 权限错误:[错误号 13] 权限被拒绝

在处理上述异常时,发生了另一个异常:

追踪信息:最近的调用失败: 文件 "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\command_lib\crash_handling.py", 第199行,在Wrapper中 target_function(*args, **kwargs) 文件 "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\gcloud_main.py",第 193行,在main中 gcloud_cli.Execute() 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\cli.py",第 1024行,在Execute中 self._HandleAllErrors(exc, command_path_string, specified_arg_names) 文件 "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\cli.py",第 1061行,在_HandleAllErrors中 exceptions.HandleError(exc, command_path_string, self._known_error_handler) 文件 "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\exceptions.py",第 557行,在HandleError中 core_exceptions.reraise(exc) 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\exceptions.py",第 146行,在reraise中 six.reraise(type(exc_value), exc_value, tb) 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\third_party\six_init.py",第 719行,在reraise中 raise value 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\cli.py",第 998行,在Execute中 resources = calliope_command.Run(cli=self, args=args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\backend.py",第 815行,在Run中 resources = command_instance.Run(args) ^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\surface\builds\submit.py",第234行, 在Run中 build_config = submit_util.SetSource( ^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\command_lib\builds\submit_util.py",第428行,在SetSource中 staged_source_obj = staging_bucket_util.Upload( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\command_lib\builds\staging_bucket_util.py",第109行,在Upload中 return source_snapshot.CopyTarballToGCS( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\api_lib\cloudbuild\snapshot.py",第100行,在CopyTarballToGCS中 with files.TemporaryDirectory() as tmp: 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",第599行,在exit exceptions.RaiseWithContext( 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\exceptions.py",第180行,在RaiseWithContext中 raise curr_exc 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",第597行,在exit self.Close() 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",第608行,在Close中 RmTree(self.path) 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",第262行,在RmTree中 shutil.rmtree(path, onerror=_HandleRemoveError) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\shutil.py",第759行,在rmtree中 return _rmtree_unsafe(path, onerror) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\shutil.py",第622行,在_rmtree_unsafe中 onerror(os.unlink, fullname, sys.exc_info()) 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",第244行,在HandleRemoveError exceptions.reraise(exc_info[1], tb=exc_info[2]) 文件 "C:\Program Files (x86)\Google Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\exceptions.py",第146行,在reraise中 six.reraise(type(exc_value), exc_value, tb) 文件 "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\shutil.py",第620行,在_rmtree_unsafe中 os.unlink(fullname) 权限错误:[WinError 32] 该进程无法访问文件,因为它正被另一个进程使用: 'C:\Users\user\AppData\Local\Temp\tmp2j_tooam\file.tgz'

我该如何让这个命令正常工作?无法部署到Google App Engine。

更新:通过手动将源文件打包成tgz并提交构建解决了问题,如下所示:

gcloud builds submit file.tgz ...

1 个回答

1

@PiotrMarkielau,根据你最近对帖子所做的编辑,我看到你找到了一种解决办法,解决了你的问题。我将这个回答标记为社区维基,以便让更多人看到。如果我遗漏了什么,欢迎你进行编辑。解决办法是:

手动将源文件打包成tgz格式,然后像这样提交构建:

 gcloud builds submit file.tgz --timeout=3600s --region=europe-west1--tag europe-west1-docker.pkg.dev/project/project-appengine/project-image:latest

另外,我还找到一个问题跟踪器,上面有1个赞。根据那里的描述,这看起来是云构建端的问题。你可以考虑把你的问题也添加上去,看看能否得到比你找到的解决办法更好的方案。

撰写回答