This page explains how to use Cloud Build to build, test, and deploy Go applications.
Before you begin
The instructions on this page assume that you are familiar with Go. In addition:
-
Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.
- To run the
gcloud
commands on this page, install Google Cloud CLI. - Have your Go project handy.
- If you want to containerize your Go app using Cloud Build, you'll
need a
Dockerfile
along with your source code. - If you want to store the built container in Artifact Registry, create a Docker repository in Artifact Registry.
- If you want to store test logs in Cloud Storage, create a bucket in Cloud Storage.
Required IAM permissions
To store test logs in Logging, grant the Storage Object Creator (
roles/storage.objectCreator
) role for the Cloud Storage bucket to your build service account.To store built images in Artifact Registry, grant the Artifact Registry Writer (
roles/artifactregistry.writer
) role to your build service account.
For instructions on granting these roles see Granting a role using the IAM page.
Configuring Go builds
The public golang
image from Docker Hub supports building using Go modules. Using
this image as a build step in your Cloud Build config file enables you to invoke
go
commands within the image. Arguments passed to this build step are passed
to the golang
tool directly, allowing you to run any go
command in this image.
This section walks through an example build config file for a Go app. It has build steps to build the app, add unit tests, and after the tests pass, containerize, and deploy the app.
To build your Go application:
In your project root directory, create a Cloud Build config file named
cloudbuild.yaml
.Build and test: If you've defined unit tests in your application, you can configure Cloud Build to run the tests by adding the following fields in a build step:
name
: Set the value of this field togolang
to use the golang image from Docker Hub for your task.entrypoint
: Set the value of this field to/bin/bash
. This enables you to run multi-line bash commands directly from the build step.args
: Theargs
field of a build step takes a list of arguments and passes them to the image referenced by thename
field. In the following example, theargs
field takes the arguments for:- Running the test log formatter to download the test log output.
- Printing the log output.
- Saving test results in
sponge.log
. - Outputting the results in
sponge.log
to a JUNIT XML file. The name of the JUNIT XML file is constructed using the short version of the commit ID associated with your build. A subsequent build step will save the logs in this file to Cloud Storage.
Containerize the app: After adding the build step to ensure that the tests have passed, you can build the application. Cloud Build provides a pre-built Docker image that you can use to containerize your Go application. To containerize your app, add the following fields in a build step:
name
: Set the value of this field togcr.io/cloud-builders/docker
to use the prebuilt docker image for your task.args
: Add the arguments for thedocker build
command as values for this field.
The following build step builds the image
myimage
and tags it with the short version of your commit ID. The build step uses substitutions for project ID, repository name, and short SHA values therefore these values are automatically substituted at build time. Note that you will need to create or have an existing Docker repository in Artifact Registry to store the image.Push the container to Artifact Registry: You can store the built container in Artifact Registry, which is a Google Cloud service that you can use to store, manage, and secure build artifacts. To do this, you'll need to have an existing Docker repository in Artifact Registry. To configure Cloud Build to store the image in an Artifact Registry Docker repository, add a build step with the following fields:
name
: Set the value of this field togcr.io/cloud-builders/docker
to use the officialdocker
builder image for your task.args
: Add the arguments for thedocker push
command as values of this field. For the destination URL, enter the Artifact Registry Docker repository where you want to store the image.
The following build step pushes the image that you built in the previous step to Artifact Registry:
Deploy the container to Cloud Run: To deploy the image on Cloud Run, add a build step with the following fields:
name
: Set the value of this field togoogle/cloud-sdk
to use the gcloud CLI image to invoke thegcloud
command to deploy the image on Cloud Run.args
: Add the arguments for thegcloud run deploy
command as the values of this field.
The following build step deploys the previously built image to Cloud Run:
Save test logs to Cloud Storage: You can configure Cloud Build to store any test logs in Cloud Storage by specifying an existing bucket location and path to the test logs.
The following build step stores the test logs that you saved in the JUNIT XML file to a Cloud Storage bucket:
The following snippet shows the complete build config file for the all the steps described above:
Start the build using the gcloud CLI or build triggers. You must specify the Artifact Registry repository name when starting the build.
To specify the Artifact Registry repository when starting the build using the gcloud CLI:
gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \ --substitutions=_AR_REPO_NAME="AR_REPO_NAME"
Replace
AR_REPO_NAME
with the name of your Artifact Registry repository.To specify the Artifact Registry repository when building with build triggers, specify the name of your Artifact Registry repository in the Substitution variables field when creating the build trigger.
What's next
- Learn how to perform blue/green deployments on Compute Engine.
- Learn how to build container images.
- Learn how to troubleshoot build errors.