Google announces Cloud Build, its new continuous integration platform
techcrunch.com
techcrunch.com
Is there anything actually new here? I can't find any indication in their documentation that its different; seems like it's just a different name?
We have a monorepo in GitLab and that works nicely. Many Dockerfiles are present in this repo in various folders. They all build private docker images pushed to AWS ECR. They all depend on each other and some have multiple parents, so this sort of forms a family tree.
It is a major pain to know what docker images are stale and need to be rebuilt, and to ensure that it's parents are also up to date. We do all this manually and it sucks.
Some images take hours to build and we only want to rebuild them when necessary. It would be great if the build server cached build-steps so that the resulting images could share more layers with previously downloaded images, saving hugely on disk space, time and bandwidth for people and servers.
We make sure to have one Dockerfile per folder and a file called "destination.txt" indicating the final image name adjacent to it, this allows scripts to easily build the entire tree of images and parents by scanning our repo.
We want nice automation. I don't even know what the best practices are here.
What should I do?
So if container A is a dependency for container B, then make container B's task trigger be whenever the Dockerfile for container A changes.
My first thought since you say you’re having issues with build caching, you might want to look into multi-stage builds[1], if you haven’t already. I haven’t gotten any “heavy” use from these since I mostly do web stuff in non compiled languages, so I can’t benefit from this feature as much as a compiled language than can just copy binaries around. But, it has been useful for like compiling JS, since it’s done in a separate stage, I a) don’t ever have to contaminate my final image with a node_modules at any point and b) can rebuild the image and used the cached stage if there are no changes in the front end, and that’s usually the longest parts of my builds anyway.
However, if you’re in a compiled language (which from the sounds of it, I have a feeling you might be — long builds and multiple dependent components that have to be rebuilt), you can compile some core component in the first stage (A), then have multiple stages (B, C) that depend on that component’s compiled files, and then maybe a final stage (D) that depends on B & C. So then, if you make changes to just C, you’ll only have to rebuild the C & D stages, while the other two are cached. Each stage itself is just an intermediary image, so you can use them as you would the final, and you can even tell Docker to just build up to stage B, if you only need that image.
[1] https://docs.docker.com/develop/develop-images/multistage-bu...
We're starting to use multi stage builds here and there. Seems like an essential building block.
The main pain point seems to be knowing when an image needs to be rebuilt and to ensure any dependent images also get rebuilt.
Those allow to define multi-stage builds with custom triggers, which should allow you to trigger rebuilding dependent images.
Basically, I have one trigger to always build from master but the rest are triggered by tag, for example, "1.2.5" and it builds the same image, then Keel updates affected workloads. So far I have never had to pay for it, apparently managing to stay in the free tier :)
Works way faster than automated Docker cloud builds either.
There's benefits to smaller, hungrier teams building things, but unless they have paying customers on day one they're also buying their way into the market one way or another...
Also, the big cloud platforms aren't shy about acquiring smaller players, and that's an exit that a lot of the people building tools for cloud platforms are looking for. I think it's safe to say that without GCP, AWS, and Azure there'd be a lot fewer companies building CI tools.
[1] https://cloud.google.com/cloud-build/docs/configuring-builds...
I never really considered that. Perhaps it'd be profitable to actually use that capacity for something when it's idle...
The price is actually $0.00005/second. :)
disclosure: I'm an engineer on the GCB team
I am hoping to see Concourse come in through the Pipelines proposal on Knative, but it will be necessary to digest a Concourse-on-Kubernetes epic first.
(Please come and sing the Concourse-is-amazing hymn with me on Knative, we both know it's for the good)
Disclosure: for those who don't know, I work for Pivotal and I'm a bit of a Concourse fan.
Pretty nice product, but missing some LAUGHABLE features.
Specifically:
- Ability to start builds based on github pull requests
- Ability to send messages to slack on successful / failed builds
- Ability to update github PRs with build status
- Conditional build steps AT ALL
- Ability to start parameterized builds from GUI ( What if I want to deploy to a specific environment? )
- Any outside integrations AT. ALL.
- No story on how to store secrets
I've been running this product for about a year. I have a Jenkins job that detects github PRs, and then launches these builds. I would LOVE to delete that Jenkins VM, but for some reason a lot of basic functionality has been ignored.
edit:
People have informed me that Github PR building is in alpha! PRAISED BE THE GOOGLE!
https://cloud.google.com/cloud-build/docs/run-builds-on-gith...
https://cloud.google.com/cloud-build/
"Set up triggers to automatically build, test, or deploy source code when you push changes to GitHub, Cloud Source Repositories, or a Bitbucket repository."
https://cloud.google.com/cloud-build/docs/configure-third-pa...
I looked at Container Builder before and, like you, was not impressed, but this is something else.
Edit: I found the changelog (https://cloud.google.com/cloud-build/release-notes), which confirms that this is both a rebranding and update, but also points to a new alpha GitHub app: https://cloud.google.com/cloud-build/docs/run-builds-on-gith...
"Observe that the Google Cloud Build app builds your code on creating a pull request."
"Go to the Checks tab. You'll see that Cloud Build has built your changes and you should see that your build has succeded. You'll also see other build details such as the time it took to build your code, the build ID, etc."
There might be hope...
We've been using https://drone.io/ for some time, which is very, very similar, but if we weren't I'd give it some serious consideration.
That should be easy enough, request a new cloud builder Slack. Currently this is possible though using the curl cloud builder and constructing a custom curl request to the Slack API.
> No story on how to store secrets
Agree, need a way to mark variables as sensitive/secure. Don't show them in the build history in plain text and make the input field of password type. Encrypt somehow when stored as well.
> Conditional build steps AT ALL
Agree, this is a biggest missing piece.
When we first launched Container Builder a year ago we always had a plan to support more CI use cases. With the launch today we've added a few new features such as:
- Built-in support for pushing non-container artifacts to Google Cloud Storage
- Filepath triggers for invoking builds only on changes to certain subdirectories or files
- Updates to the Cloud Console UI and of the Cloud SDK (from `gcloud container builds...` to `gcloud builds...`)
We have more updates in alpha now including built-in support for GitHub pull requests, status/Checks API support, and programmatic triggers, which we agree is one of the biggest missing pieces for many people. That GitHub app is the first step with more granular control over PR triggers coming soon.
We try not to comment on roadmap items but looking ahead a little, this rebrand is also an indication of the product's focus on broader CI/CD use cases, which many of our users are already using Cloud Build for, and an evolution towards bringing DevOps and Continuous Integration best practices to Google Cloud users. Feature requests like built-in conditional steps and notifications are on our radar and we always appreciate hearing from users what they'd like to see us prioritize.
Release notes are published here for anyone interested in updates on new features. https://cloud.google.com/cloud-build/release-notes
There's a public Slack channel as well where GCB users and the Cloud Build team discuss features an different use cases. Happy to see anyone on there. https://googlecloud-community.slack.com/messages/C4KCRJL4D/c...
We appreciate all the positive feedback on the thread as well. We're excited about what's ahead for Cloud Build and that it's helping people be more productive!
A few suggestions from my experience using the product for the last few months:
- Setting the machine type on a per-step basis instead of for the entire job. For example, I'd like to use a large box to compile my scala, but can use a smaller one to test each package.
- Showing the status of each step before everything ends.
- Showing the elapsed time for a job on the page for the job in addition to the start time.
- Failing a single step without stopping the build (for example, a single project in a ci build fails.)
- Speeding up the web view (it's very frustratingly laggy when you have a significant logs in your build.)
- Using the dataflow visualization for cloud builder.
- JUnit support
Or do you need to have a "card on file" to run the free tier at all, with the chance that you'll have to pay if you somehow exceed the free tier (stuck build, etc)?
The only feature request I have is a way to mark variables as sensitive/secure and not show them in the build history step in plain text (mask the value) and change the input type from text to password.
It's limited to 10 Concurrent Build for obvious reason, making it impossible for startup who want to create CI services on top of this product due to limitation.
https://cloud.google.com/cloud-build/docs/configuring-builds...