Windows下执行gcloud builds submit遇临时文件权限错误如何解决?
在Windows 10系统执行以下命令时出现问题:
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
已使用最新版本Google Cloud CLI,怀疑是文件权限或Python版本问题,但通过Process Explorer未找到锁定文件的进程,报错堆栈信息如下:
Trace: Traceback (most recent call last): File "C:\Program Files
(x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\api_lib\cloudbuild\snapshot.py",
line 102, in CopyTarballToGCS
tf = self._MakeTarball(archive_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\api_lib\cloudbuild\snapshot.py",
line 77, in _MakeTarball
tf.add(path, filter=_ResetOwnership) File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\tarfile.py",
line 2002, in add
self.addfile(tarinfo, f) File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\tarfile.py",
line 2030, in addfile
copyfileobj(fileobj, self.fileobj, tarinfo.size, bufsize=bufsize) File
"C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\tarfile.py",
line 254, in copyfileobj
buf = src.read(remainder)
^^^^^^^^^^^^^^^^^^^ PermissionError: [Errno 13] Permission deniedDuring handling of the above exception, another exception occurred:
Traceback (most recent call last): File "C:\Program Files
(x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\command_lib\crash_handling.py",
line 199, in Wrapper
target_function(*args, **kwargs) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\gcloud_main.py", line
193, in main
gcloud_cli.Execute() File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\cli.py", line
1024, in Execute
self._HandleAllErrors(exc, command_path_string, specified_arg_names) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\cli.py", line
1061, in HandleAllErrors
exceptions.HandleError(exc, command_path_string, self.known_error_handler) File "C:\Program Files
(x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\exceptions.py",
line 557, in HandleError
core_exceptions.reraise(exc) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\exceptions.py",
line 146, in reraise
six.reraise(type(exc_value), exc_value, tb) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\third_party\six___init.py", line
719, in reraise
raise value File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\cli.py", line
998, in Execute
resources = calliope_command.Run(cli=self, args=args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\calliope\backend.py",
line 815, in Run
resources = command_instance.Run(args)
^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\surface\builds\submit.py", line 234,
in Run
build_config = submit_util.SetSource(
^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\command_lib\builds\submit_util.py",
line 428, in SetSource
staged_source_obj = staging_bucket_util.Upload(
^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\command_lib\builds\staging_bucket_util.py",
line 109, in Upload
return source_snapshot.CopyTarballToGCS(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\api_lib\cloudbuild\snapshot.py",
line 100, in CopyTarballToGCS
with files.TemporaryDirectory() as tmp: File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",
line 599, in exit
exceptions.RaiseWithContext( File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\exceptions.py",
line 180, in RaiseWithContext
raise curr_exc File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",
line 597, in exit
self.Close() File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",
line 608, in Close
RmTree(self.path) File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",
line 262, in RmTree
shutil.rmtree(path, onerror=_HandleRemoveError) File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\shutil.py",
line 759, in rmtree
return rmtree_unsafe(path, onerror)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\shutil.py",
line 622, in rmtree_unsafe
onerror(os.unlink, fullname, sys.exc_info()) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\util\files.py",
line 244, in HandleRemoveError
exceptions.reraise(exc_info[1], tb=exc_info[2]) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\googlecloudsdk\core\exceptions.py",
line 146, in reraise
six.reraise(type(exc_value), exc_value, tb) File "C:\Program Files (x86)\Google\Cloud
SDK\google-cloud-sdk\bin..\lib\third_party\six___init.py", line
719, in reraise
raise value File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\shutil.py",
line 620, in _rmtree_unsafe
os.unlink(fullname) PermissionError: [WinError 32] The process cannot access the file because it is being used by another process:
'C:\Users\user\AppData\Local\Temp\tmp2j_tooam\file.tgz'
解决方法
手动将源文件打包为tgz格式后,再执行提交构建命令:
gcloud builds submit file.tgz --timeout=3600s --region=europe-west1 --tag europe-west1-docker.pkg.dev/project/project-appengine/project-image:latest
内容的提问来源于stack exchange,提问作者Piotr Markielau

