We are happy to announce that the macOS tasks on Cirrus CI Cloud have switched to a new virtualization technology as well as overall architecture of the orchestration. This switch should be unnoticeable for the end users except that the tasks should become much faster since now each macos_instance of the Cirrus CI Cloud offering will utilize a full Mac Mini with 12 virtual CPUs and 24G of RAM.

The new architecture is built on top of the recently announced Persistent Workers functionality and can be easily replicated with on-premise Mac hardware by any Cirrus CI user or on any…

Cirrus CI pioneered an idea of directly using compute services instead of requiring users to manage their own infrastructure, configuring servers for running CI jobs, performing upgrades, etc. Instead, Cirrus CI just uses APIs of cloud providers to create virtual machines or containers on demand. This fundamental design difference has multiple benefits comparing to more traditional CIs:

  1. Ephemeral environment. Each Cirrus CI task starts in a fresh VM or a container without any state left by previous tasks.
  2. Infrastructure as code. All VM versions and container tags are specified in .cirrus.yml configuration file in your Git repository. For any revision…

Cirrus CLI is a tool for running containerized tasks reproducibly in any environment. Most commonly, Cirrus tasks are used as part of continuous integration workflows but Cirrus tasks can also be used as part of the local development process as a hermetic replacement of helper scripts/Makefiles that don’t rely on locally installed packages. In this post we’ll see how the boilerplate of generating gRPC definitions for Go can benefit from using Cirrus CLI.

First, let’s start with taking a closer look at the recommended way of generating gRPC definitions from the official documentation. It seems like a lot of boilerplate.

Most Continuous Integration vendors try to lock you not only by providing some unique features that were attractive in the first place but also by making you write hundreds of lines of YAML configuration unique to this particular CI or by making you configure all your scripts in the UI. No wonder it’s always a pain to migrate to another CI and it’s hard to justify the effort! There are so many things to rewrite from one YAML format into another YAML format.

Today we are happy to announce Cirrus CLI — an open source tool to run isolated tasks…

Effective caching is by far the best option for speeding up your CI builds. You can optimize some computations and throw more CPUs on the problem but nothing is more efficient than just not doing the work at all by reusing cached results from some previous CI builds.

All popular CI systems including GitHub Actions allows you to do some basic caching by persisting folders and reusing them in the next runs. Here is a configuration example from the official GitHub Docs for caching Gradle’s caches:

- name: Cache Gradle packages uses: actions/cache@v2 with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{…

Google has a numerous Java libraries for almost all APIs on Google Cloud. Most of the libraries are using gRPC APIs which are very easy to integrate with Kotlin Coroutines since gRPC clients return ListenableFutures.

Unfortunately, Google Storage doesn’t have a gRPC API and its Java library uses a blocking HTTP client under the hood. 😪

Luckily there is an elegant way to work around the issue! 😉

First, let’s start with how Google Storage library is normally used. See the following code sample of reading a blob in chunks using a buffer:

val storage = ... // instance of…

TLDR: Cirrus CI will start limiting how many CPUs user’s tasks are using simultaneously and not limiting how many tasks are actually running in parallel. Nothing will change if you are using the default 2CPUs/4G configuration for your tasks. But you can also get 2X parallelism if your tasks don’t benefit from more CPUs. The new limits mechanism will replace the current one at 10am EST on Sunday, May 31st.

Cirrus CI had a free tier for Open Source projects with a limitation of how many tasks a user can run for different platforms. …

Imagine you are loading some objects via an API. For example, you are loading values from a key-value storage. Most likely, your underlying implementation is using Dispatcher.IO or a custom dispatcher to execute the actual calls to the key-value store’s API. In any case, dispatcher of your choice has an upper bound on how many API requests it can perform in parallel.

What if you’ll end up in a situation when a throughput of you dispatcher where you execute API requests is not enough and new requests will queue up? In this blog post we’ll see how we can use…

It’s always hard to hear that fellow DevTools startups have difficulties and had to close partially or fully. Last week GolangCI announced that they are going to shutdown their SaaS offering of GolangCI Lint (golangci.com).

Congrats Denis Isaev and everyone involved on the run! 🙌

Cirrus CI already supported GitHub Annotations for providing rich reports right in GitHub UI and we just added support for GolangCI Lint report format for easier migration.

GolangCI Lint reporting via Cirrus CI

Here is an example of a Cirrus CI task that uses the official golangci-lint Docker image to generate a JSON report and store it as a Cirrus CI…

While working on a new functionality or fixing an issue it’s crucial to get CI feedback as soon as possible. Fast CI builds are important but it’s also important how fast one can find a reason of a failing build. Usual flow requires to open a separate page for the failing CI build and scroll through all the logs to finally find a relevant error message. How inefficient!

Today Cirrus CI starts supporting GitHub Annotations to provide inline feedback right where you review your code. No need to switch context anymore!

Example of JUnit Annotations

This became possible as a result of recently added…

Fedor Korotkov

Chief Typing Officer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store