How to change the version of bundler used in Cloud Functions deployment?

Viewed 361

Context

Deployments to Cloud Functions have been failing since a few days ago.

Gemfile

source "https://rubygems.org"

ruby "~> 2.7.0"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "google-cloud-firestore"

Deployment script

$ gcloud functions deploy my_func --region=us-central1 --memory=128MB --runtime=ruby27

(snip)

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Bundler found conflicting requirements for the Ruby version:
  In Gemfile:
    Ruby (~> 2.7.0)

    google-cloud-firestore was resolved to 2.4.1, which depends on
      google-cloud-firestore-v1 (~> 0.0) was resolved to 0.4.0, which depends on
        gapic-common (~> 0.3) was resolved to 0.4.0, which depends on
google-protobuf (~> 3.15, >= 3.15.2) was resolved to 3.15.5, which
depends on
            Ruby (< 3.1.dev, >= 2.3)

    google-cloud-firestore was resolved to 2.4.1, which depends on
      google-cloud-firestore-v1 (~> 0.0) was resolved to 0.4.0, which depends on
        gapic-common (~> 0.3) was resolved to 0.4.0, which depends on
          grpc (~> 1.36) was resolved to 1.36.0, which depends on
            Ruby (< 3.1.dev, >= 2.4); Error ID: af32a539

Why?

This is bundler's regression since bundler v2.2.8.

And this is fixed at bundler v2.2.10

So I want the bundler version to be less than v2.2.8 or more than v2.2.10.

Cloud Functions deployment ( gcloud functions deploy ) automatically runs bundle install and uses bundler which installed in deployment task.

Current bundler version in deployment task is v2.2.9

Verification code

Gemfile

source "https://rubygems.org"

ruby "~> 2.7.0"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }


gem "bundler", "!= 2.2.8", "!= 2.2.9" 

Deployment script

$ gcloud functions deploy my_func --region=us-central1 --memory=128MB --runtime=ruby27

(snip)

Resolving dependencies...
Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    bundler (!= 2.2.8, != 2.2.9)

  Current Bundler version:
    bundler (2.2.9)

Main subject

gcloud functions deploy doesn't have some arguments to change bundler version...

https://cloud.google.com/sdk/gcloud/reference/functions/deploy?hl=ja

How to change the version of bundler used in Cloud Functions deployment?

2 Answers

I ran into a similar issue as well, however the error output was slightly different. One thing in common was the line:

Bundler found conflicting requirements for the Ruby version:

After doing some digging and troubleshooting, I found that Google Cloud Functions locks the bundled platform on our behalf. I'm not a ruby expert, but I suspect this will impact how information from the Gemfile will be read along with the Ruby version.

Example Log from Google Cloud Functions:

2021-03-10 13:13:01.764 PST
Step #4 - "builder": Done "bundle lock --add-platform x86_64-linux" 

Solution: Update bundler locally (I updated to 2.2.14). Delete your Gemfile.lock file and rerun bundle install to generate Gemfile.lock. This should fix dependencies if there is anything to fix.

Most importantly, it will update the Platforms section in your Gemfile.lock to match what Google expects.

In my case, the platform was updated from Ruby to x86_64-darwin-19.

Or the other approach may be to just update the platform with bundle if possible.

Eventually I have successfully deployed with followings.

  1. gem install bundler --no-doc
  2. Delete Gemfile.lock
  3. re-create Gemfile.lock ( bundle install )

diff

$ git --no-pager diff main

diff --git a/Gemfile.lock b/Gemfile.lock
index 5e7502b..b5642ab 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -57,7 +57,6 @@ GEM
       gapic-common (~> 0.3)
       google-cloud-errors (~> 1.0)
       grpc-google-iam-v1 (>= 0.6.10, < 2.0)
-    google-protobuf (3.15.5)
     google-protobuf (3.15.5-universal-darwin)
     googleapis-common-protos (1.3.11)
       google-protobuf (~> 3.14)
@@ -72,9 +71,6 @@ GEM
       multi_json (~> 1.11)
       os (>= 0.9, < 2.0)
       signet (~> 0.14)
-    grpc (1.36.0)
-      google-protobuf (~> 3.14)
-      googleapis-common-protos-types (~> 1.0)
     grpc (1.36.0-universal-darwin)
       google-protobuf (~> 3.14)
       googleapis-common-protos-types (~> 1.0)
@@ -160,7 +156,6 @@ GEM

 PLATFORMS
   ruby
-  x86_64-darwin-17

 DEPENDENCIES
   dotenv
@@ -180,4 +175,4 @@ RUBY VERSION
    ruby 2.7.2p137

 BUNDLED WITH
-   2.1.4
+   2.2.14
Related