vignettes/git.Rmd
git.Rmd
A lot of the features of Cloud Build rely on connection with git workflows.
Cloud Build can use two different sources created via cr_build_source()
- RepoSource()
is from Google Cloud Source Repostitories - StorageSource()
is from Google Cloud Storage buckets.
RepoSource()
could be a mirror of your GitHub or other git provider. If you are using a Build Trigger (next section) then the source is automatically configured to be your trigger source.
Once your repo is mirrored it gives you a Cloud Repository name which is of the form github_username_repo
- this you can add to a RepoSource()
:
# this repo mirrored on Google Source repos
my_repo <- cr_build_source(
RepoSource("github_markedmondson1234_googlecloudrunner",
branchName="master"))
Cloud Build triggers let you automate builds based on git pushes or pull requests via cr_buildtrigger_repo()
- cr_buildtrigger_repo(type="github")
lets you link to push and pull events on GitHub repositories you have given permission for GCP to access via the GitHub Cloud Build app - cr_buildtrigger_repo(type="cloud_source")
lets you link to push events to Google Cloud Source Repostitories - this can include a mirror of GitHub or other git providers such as BitBucket
An example setting up cr_buildtrigger_repo()
with GitHub is shown below - this will trigger builds when you push to the master branch:
cloudbuild <- system.file("cloudbuild/cloudbuild.yaml",
package = "googleCloudRunner")
bb <- cr_build_make(cloudbuild, projectId = "test-project")
# setting up the trigger event
github <- cr_buildtrigger_repo("MarkEdmondson1234/googleCloudRunner", branch = "master")
cr_buildtrigger(bb, name = "trig1", trigger = github)
By default the above will act via cloning your repo at the start of any build. You may want to use git further within your cloud build steps, such as commiting the results of your build back to the repository.
This can be done within your build by using cr_buildstep_gitsetup()
and cr_buildstep_git()
. If you are doing non-public operations (such as committing and pushing) then you will need to set up GitHub authorization for the build to do so - the easiest method is to use Google Secret Manager to save a ssh key for your git securely, and then accessible via cr_buildstep_secret()
. This can be set up once and then used for any future builds you create.
Cloud Build needs permission to commit to git, so the first step is to create an ssh key secret that it will use to work on your behalf.
The guide is for GitHub, adapt it if you use another git provider:
https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
.pub
) to GitHub’s SSH keys.pub
) to Google Secret Manager - https://console.cloud.google.com/security/secret-manager
and call it a name such as github-ssh
Secret Manager Secret Accessor
IAM role assigned to the cloudbuild service email ({project-number}@cloudbuild.gserviceaccount.com
)In general the secret can be downloaded via cr_buildstep_secret()
which takes two arguments - the name of the secret and the location of where the decrypted file should be within your workspace.
cr_buildstep_gitsetup()
wraps cr_buildstep_secret()
when you supply it the Secret Manager name:
# assumes you have previously saved git ssh key called "github-ssh"
cr_build_yaml(
steps = c(
cr_buildstep_gitsetup("github-ssh"),
cr_buildstep_git(c("clone",
"git@github.com:github_name/repo_name"))
)
)
A rundown on some common workflows and connections are detailed here.
A common use case is creating a pkgdown website of your package. This involves building the website upon each git commit, creating the new pkgdown HTML then committing that back to the GitHub repo so it can display the page using GitHub page hosting.
cr_deploy_pkgdown()
:
cr_deploy_pkgdown("MarkEdmondson1234/googleCloudRunner", secret = "my_git_secret")
By default this will create a cloudbuild-pkgdown.yml file in your repo that holds the buildsteps to build and commit your website, and create the buildtrigger that will run this build upon each commit to the master branch.
If you want the Docker image to rebuild each git commit, then you also need a build trigger. This can be enabled using cr_deploy_docker_trigger()
cr_buildtrigger_repo()
cr_deploy_docker_trigger()
and point it at your Dockerfile folderThe cr_deploy_docker_trigger()
will create a buildtrigger that will build the Dockerfile upon each commit.
The below example builds this package’s GitHub repo and its Dockerfile upon each commit, for a Dockerfile located in the cloud_build/
folder.
repo <- cr_buildtrigger_repo("MarkEdmondson1234/googleCloudRunner")
cr_deploy_docker_trigger(repo, "googleCloudRunner", dir = "cloud_build")