Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CI: Test on several Bazel and Ubuntu versions. #521

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 70 additions & 8 deletions .github/workflows/ci-build-proto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,92 @@ on:

jobs:
build:
runs-on: ubuntu-22.04

strategy:
matrix:
# We only test on the oldest version we want to support and latest.
# We trust that things also work for versions in the middle.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's brave ;)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A lot less brave than what we have today, which is to only test a single version.

os: [ubuntu-22.04, ubuntu-latest]
# See Bazelisk README for legal values.
bazel_version: [7.x, latest]
# Don't abort other runs when one of them fails, to ease debugging.
fail-fast: false

runs-on: ${{ matrix.os }}

env:
BAZEL: bazelisk-linux-amd64
# This tells Bazelisk (installed as `bazel`) to use specified version.
# https://github.com/bazelbuild/bazelisk?tab=readme-ov-file#how-does-bazelisk-know-which-bazel-version-to-run
USE_BAZEL_VERSION: ${{ matrix.bazel_version }}
CACHE_KEY: ${{ matrix.os }}_bazel-${{ matrix.bazel_version }}

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Mount bazel cache
uses: actions/cache@v2
uses: actions/cache/restore@v4
with:
# See https://docs.bazel.build/versions/master/output_directories.html
path: "~/.cache/bazel"
# Create a new cache entry whenever Bazel files change.
# See https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows
key: bazel-${{ runner.os }}-build-${{ hashFiles('**/*.bzl', '**/*.bazel') }}
key: ${{ env.CACHE_KEY }}-${{ hashFiles('**/*.bazel*', '**/*.bzl') }}
restore-keys: |
bazel-${{ runner.os }}-build-
${{ env.CACHE_KEY }}

- name: Save start time
uses: josStorer/get-current-time@v2
id: start-time
with:
# Unix timestamp -- seconds since 1970.
format: X

- name: Build proto/
run: cd proto && bazel build //... && bazel test //...

- name: Build bazel/example/using-bzlmod/
run: cd bazel/example/using-bzlmod && bazel build //...

- name: Build bazel/example/using-workspace/
run: cd bazel/example/using-workspace && bazel build //...
# This is a legacy example that doesn't work beyond Bazel 7.x.
if: ${{ env.USE_BAZEL_VERSION == '7.x' }}

- name: Build bazel/example/using-bzlmod/
run: cd bazel/example/using-bzlmod && bazel build //...
- name: Save end time
# Always save the end time so we can calculate the build duration.
if: always()
uses: josStorer/get-current-time@v2
id: end-time
with:
# Unix timestamp -- seconds since 1970.
format: X

- name: Calculate build duration
# Always calculate the build duration so we can update the cache if needed.
if: always()
run: |
START=${{ steps.start-time.outputs.formattedTime }}
END=${{ steps.end-time.outputs.formattedTime }}
DURATION=$(( $END - $START ))
echo "duration=$DURATION" | tee "$GITHUB_ENV"

- name: Compress cache
# Always compress the cache so we can update the cache if needed.
if: always()
run: rm -rf $(bazel info repository_cache)

- name: Save bazel cache
uses: actions/cache/save@v4
# Only create a new cache entry if we're on the main branch or the build takes >3mins.
#
# NOTE: Even though `always()` evaluates to true, and `true && x == x`,
# the `always() &&` prefix is not redundant! The call to `always()` has a
# side effect, which is to override the default behavior of automagically
# canceling this step if a previous step failed.
# (Don't blame me, blame GitHub Actions!)
if: always() && (github.ref_name == 'main' || env.duration > 180)
with:
path: "~/.cache/bazel"
key: ${{ env.CACHE_KEY }}-${{ hashFiles('**/*.bazel*', '**/*.bzl') }}-${{ github.run_id }}
Loading