这是我在SO上的第一个问题,我会尽我所能把它做好。
我的团队使用一些公共类部署了多个Java云函数(GCP((使用maven来管理依赖关系(。现在,这些类在每个函数中都是重复的,并且必须在每次代码编辑时处处更新。每个云功能都是从源代码部署的。为了避免重复这些类,我将它们打包在一个jar中,本地运行一切都很好。我在每个Cloud Function pom文件中添加了这个jar作为本地依赖项,并试图通过构建一个具有所有依赖项的jar并在gcloud deploy
的--source
选项中提供它来从jar进行部署。这导致了一个似乎是jar上传的超时错误。
错误跟踪:
DEBUG: Starting new HTTPS connection (1): storage.googleapis.com:443
DEBUG: Caught socket error, retrying: ('Connection aborted.', timeout('The write operation timed out',))
到目前为止我尝试了什么:
- 使用
gcloud config set app/cloud_build_timeout 10000
设置更高的部署超时,但这似乎不适用于上传步骤,因为它总是在几分钟后失败 - 像以前一样,将我的本地依赖项上传到一个私有的nexus存储库,以从源代码部署我的功能,但当我运行
mvn package
时,由于Wagon错误,拉取失败,我也没有找到任何解决方案:WagonTransporterFactory: Unsupported transport protocol
详细错误:
[ERROR] Failed to execute goal on project get-content: Could not resolve dependencies for project project:cf:jar:1.0: Failed to collect dependencies at project:pipeline:jar:0.0.1: Failed to read artifact descriptor for project:pipeline:jar:0.0.1: Could not transfer artifact project:pipeline:pom:0.0.1 from/to project-nexus (XXX): Cannot access XXX with type default using the available connector factories: BasicRepositoryConnectorFactory: Cannot access XXX using the registered transporter factories: WagonTransporterFactory: Unsupported transport protocol -> [Help 1]
我认为这只是因为我的jar依赖关系太大,无法上传,因为我实际上首先错误地部署了没有依赖关系的jar(部署成功,但在执行过程中缺少类定义(。我的问题是,如何使用一个本地/私有依赖项来部署我的云功能?
注:
- 我无法将依赖项上传到公共maven存储库
- 每个云函数还依赖于公共maven依赖项,这些依赖项似乎太大,无法打包在单个jar中进行部署
我通过从Maven切换到Gradle解决了这个问题。问题是Maven将存储库身份验证参数存储在本地文件~/.m2/settings.xml
中,Google Build在构建我的云功能进行部署时无法访问该文件。我切换到Gradle,在这个问题之后直接在gradle.build
文件中提供身份验证。