Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Cloud build always deploys my cloud-function with previous commit

I have a problem with my automated cloud function deployment

I have a cloud function stored in a Google Cloud repository

Git code includes a cloudbuild.yaml file with this content :

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["functions", "deploy", "myfunction", "--region=europe-west1"]
timeout: "1600s"

I only have a branch Master.

When i push my commit, cloudbuild triggers and deploys the cloud function

The problem is that it always deploys the previous commit, not the last

For example : 2:23 : I push my source code to Google Source repository

Here is the result :

Commit from local source

At 2:23:33, cloudbuild triggers and deploys successfully the cloud function

enter image description here

Here is the log of Cloudbuild :

starting build "e3a0e735-50fc-4315-bafd-03128156d69f"

FETCHSOURCE
Initialized empty Git repository in /workspace/.git/
From https://source.developers.google.com/p/myproject/r/myrepo
 * branch            1b67729b8498c35fc19a45b14b8d674635300594 -> FETCH_HEAD
HEAD is now at 1b67729 PrayingforCommit
BUILD
Already have image (with digest): gcr.io/cloud-builders/gcloud
Deploying function (may take a while - up to 2 minutes)...
...............................................done.
availableMemoryMb: 256
entryPoint: process_gcs
eventTrigger:
  eventType: google.storage.object.finalize
  failurePolicy: {}
  resource: projects/_/buckets/mybucket
  service: storage.googleapis.com
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/myproject/locations/europe-west1/functions/myfunction
runtime: python37
serviceAccountEmail: [email protected]
sourceRepository:
  deployedUrl: https://source.developers.google.com/projects/myproject/repos/myrepo/revisions/2ed14c3225e7fcc089f2bc6a0ae29c7564ec12b9/paths/
  url: https://source.developers.google.com/projects/myproject/repos/myrepo/moveable-aliases/master/paths/
status: ACTIVE
timeout: 60s
updateTime: '2020-04-15T00:24:55.184Z'
versionId: '2'
PUSH
DONE

As you can see, the commit that triggers is the 1b67729, but the DeployedUrl line says 2ed14c3 which is the previous commit

Operation ended at 2:24:55, i see the same time in my cloud function source tab

enter image description here

If i just click the edit button, then deploy button, to manually force the cloud function rebuild, it deploys the correct commit (1b67729)

enter image description here

Here are the parameters of the cloud-function :

enter image description here

Where is my mistake with cloudbuild, and how to always deploy the last commit ???

Thanks for your help

like image 510
Ftagn Avatar asked Apr 15 '20 01:04

Ftagn


1 Answers

I have run into this same issue (though I was using GitHub mirrors rather than native Cloud Source Repositories).

Cloud Functions does not check for updates to source repos when the --source flag is omitted

Your function was previously deployed directly from a source repository and you are not passing a --source flag to gcloud. Under these circumstances gcloud ignores the code in the local directory.

The easiest fix is to explicitly specify the source in your cloudbuild.yaml:

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["functions", "deploy", "myfunction", "--region=europe-west1", "--source=."]
timeout: "1600s"

You would not hit this if the function had never been configured to fetch its source directly from the repository.

Your Cloud Function has previously been deployed from a source repository

When configuring a Cloud Function, there is an option to fetch source code from a Cloud Source Repository. You are prompted with this as an option when creating a function through the console, but could also have used gcloud:

gcloud functions deploy NAME \
    --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/master/paths/SOURCE \
    [... other gcloud options ...]

This is the 'sourceRepository' setting that you can see in the build output.

However, as you can see in the console (resolved to 1b67729b) Cloud Functions is not updating its code from there.

Omitting the --source flag to gcloud leads to potentially confusing behaviour

When you leave out the --source flag to gcloud, if the function was previously deployed directly from a repository, specific behaviour applies. From the documentation for gcloud functions deploy:

If you do not specify the --source flag:

  • The current directory will be used for new function deployments.
  • If the function was previously deployed using a local filesystem path, then the function's source code will be updated using the current directory.
  • If the function was previously deployed using a Google Cloud Storage location or a source repository, then the function's source code will not be updated.

You are hitting the third option.

When deploying through Cloud Build, it is better not to link Cloud Functions directly to the source repository

Cloud Build is configured to run gcloud in a directory containing a copy of your source code. You can therefore deploy directly from the local filesystem - this packages up the function in a zip file, uploads it to Cloud Storage, and tells Cloud Functions to fetch it.

If you tell Cloud Functions to fetch its code from a repository, then a second checkout of the repo is made and a zip file created from there, which will be slightly slower (and potentially prone to a race condition if the branch has updated in the background).

like image 157
diocles Avatar answered Oct 23 '22 23:10

diocles