skip to Main Content

I am trying to setup continuous deployment of my golang backend using the Google documentation, but when my trigger fires, it fails with the following error:

starting build "eba3ce39-caad-43f0-a255-0a3cacec4913"

FETCHSOURCE
Initialized empty Git repository in /workspace/.git/
From https://source.developers.google.com/p/my-porject/r/github_myusername_myproject.com
 * branch            660796f575bae6860d6f96df60cfd631a730c3ae -> FETCH_HEAD
HEAD is now at 660796f cloudbuild.yaml
BUILD
Starting Step #0
Step #0: Already have image (with digest): gcr.io/cloud-builders/docker
Step #0: unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /workspace/Dockerfile: no such file or directory
Finished Step #0
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1

My project file structure looks like:

project
    frontend
    backend
        main.go
        cloudbuild.yaml
        Dockerfile

where my cloudbuild.yaml looks like:

steps:
  # Build the container image
  - name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "gcr.io/my-project/github.com/username/project.com:$COMMIT_SHA",
        ".",
      ]
  # Push the image to Container Registry
  - name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "gcr.io/my-project/github.com/username/project.com:$COMMIT_SHA",
      ]
  # Deploy image to Cloud Run
  - name: "gcr.io/cloud-builders/gcloud"
    args:
      - "run"
      - "deploy"
      - "[SERVICE_NAME]"
      - "--image"
      - "gcr.io/my-project/github.com/username/project.com:$COMMIT_SHA"
      - "--region"
      - "us-central1"
      - "--platform"
      - "managed"
images:
  - gcr.io/my-project/github.com/username/project.com

and my Dockerfile looks like

# Use the official Golang image to create a build artifact.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.13 as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary.
RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o server

# Use the official Alpine image for a lean production container.
# https://hub.docker.com/_/alpine
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM alpine:3
RUN apk add --no-cache ca-certificates

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /server

# Run the web service on container startup.
CMD ["/server"]

I got the Dockerfile from Quickstart: Build and Deploy
.

2

Answers


  1. The Cloud Build trigger is currently pointing to /project/ while your directory structure is as follows:

    project
        frontend
        backend
            main.go
            cloudbuild.yaml
            Dockerfile
    

    When you execute the trigger, the directory workspace is copied to /workspace/, thus it cannot find the Dockerfile therein.

    You can move everything to the same working directory.

      .
        ├── main.go
        ├── cloudbuild.yaml
        ├── Dockerfile
    

    If you would like to keep your current directory structure,your Cloud Build trigger will need to point to /project/backend/, instead. Note that you can check your directory structure using the ls -la linux command.

    Login or Signup to reply.
  2. When you execute a push command to your github repo, the Cloud Build will triggers and look for the cloudbuild.yaml file. You can specify the cloudbuild.yaml location when you create the build trigger by editing the Configuration section and Cloud Build configuration file (yaml or json) in which you can choose the cloudbuild.yaml location. in your case just make it backend/cloudbuild.yaml.

    Now, that’s not enough because when the build start, docker build command will initiate to build your image as per your first step. However, your build context for docker is . which should not be because all your repo was copied to GCP and the build context here is relational to the project and not where the cloud build is.

    To solve this issue just change the build context of docker to ./backend. Your cloudbuild final version should be something like:

    steps:
      # Build the container image
      - name: "gcr.io/cloud-builders/docker"
        args:
          [
            "build",
            "-t",
            "gcr.io/my-project/github.com/username/project.com:$COMMIT_SHA",
            "./backend",
          ]
        #Rest of the steps ...
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search