Files
carbon-lang/.github/workflows/tests.yaml
T
Chandler Carruth 4034fa223d Update LLVM (and llvm-bazel). (#550)
This picks up a newer version of LLVM and the LLVM Bazel integration.
The big change here is that we can configure the LLVM targets that are
built, which allows us to dramatically reduce the build costs by
focusing on a couple of CPUs for the time being.

There are a few API updates needed as well.

This also rotates the cache version so we start with a clean Bazel cache
from here. Otherwise we'd potentially pay the cost of carrying around
stale bits of LLVM endlessly.
2021-05-25 15:21:57 -07:00

135 lines
5.0 KiB
YAML

# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
name: test
on:
push:
branches: [trunk]
paths:
# Conservatively run the tests. However, skip them if the only paths in
# the pull request match files that we know don't impact the build.
- '**'
- '!**/*.md'
- '!LICENSE'
- '!CODEOWNERS'
- '!.git*'
pull_request:
paths:
# Conservatively run the tests. However, skip them if the only paths in
# the pull request match files that we know don't impact the build.
- '**'
- '!**/*.md'
- '!LICENSE'
- '!CODEOWNERS'
- '!.git*'
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
build_mode: [fastbuild, opt]
runs-on: ${{ matrix.os }}
steps:
- name: Create environment variables
run: |
echo "BAZEL_OUTPUT_BASE_PATH=$HOME/.cache/bazel-output-base" >> $GITHUB_ENV
echo "BAZEL=bazelisk --output_base=$HOME/.cache/bazel-output-base" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
# Setup Python and related tools.
- uses: actions/setup-python@v2
with:
# Match the min version listed in docs/project/contribution_tools.md
python-version: '3.6'
# On macOS we need Go and to use it to install Bazelisk.
- uses: actions/setup-go@v2
if: matrix.os == 'macos-latest'
- name: Install bazelisk
if: matrix.os == 'macos-latest'
run: |
go get github.com/bazelbuild/bazelisk
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
# Print the various tool versions to help in debugging.
- name: Print tool versions
run: |
bazelisk --version
python --version
# Make the date available to subsequent steps.
- name: Get date
id: date
shell: bash
run: |
echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")"
# Preserve and restore the Bazel cache across builds.
#
# These cached entries are keyed on this file (which configures the
# command and other inputs) as well as the date. Because Bazel is
# hermetic, it doesn't matter if we get a "stale" entry here, but it makes
# the cache less efficient. So we use the date to get a fresh baseline
# cache once per day. We include this file so that changing the build
# structure itself returns us to a clean state. We can also increment the
# counter in this comment to forcibly rotate this hash in the event we get
# a corrupted cache that breaks Bazel. This is a risk because we very
# selectively prune directories out of the internals of the Bazel output
# base to reduce the storage of the cache. At any point, this might break
# invariants and require us to clear our caches. There is no way to
# actually delete them and so instead we can simply bump the counter here.
#
# Current cache version: 2
- name: Cache Bazel build data
uses: actions/cache@v2
with:
# We exclude the install symlink so that Bazel reconnects to the
# current installation. This helps repair any damage done by other
# exclusions as well. Then we exclude the `external` tree because
# those are all downloaded and rapidly rebuilt, so no benefit from
# downloading them with the cached state.
path: |
${{ env.BAZEL_OUTPUT_BASE_PATH }}
!${{ env.BAZEL_OUTPUT_BASE_PATH }}/install
!${{ env.BAZEL_OUTPUT_BASE_PATH }}/external
key: |
bazel-${{ matrix.os }}-${{ matrix.build_mode }}-${{ hashFiles('.github/workflows/tests.yaml')
}}-${{ steps.date.outputs.date }}
# When we get a cache miss, try finding the most recent previous day's
# cache to start.
restore-keys: |
bazel-${{ matrix.os }}-${{ matrix.build_mode }}-${{ hashFiles('.github/workflows/tests.yaml')
}}-
# Print Bazel diagnostics to make debugging easier.
- name: Print Bazel info
run: |
${{ env.BAZEL }} info
# Build all targets first to isolate build failures.
- name: Build (${{ matrix.build_mode }})
run: |
${{ env.BAZEL }} build -c ${{ matrix.build_mode }} --verbose_failures \
--deleted_packages=migrate_cpp,migrate_cpp/cpp_refactoring \
//...:all
# Run all test targets.
- name: Test (${{ matrix.build_mode }})
run: |
${{ env.BAZEL }} test -c ${{ matrix.build_mode }} --test_output errors \
--deleted_packages=migrate_cpp,migrate_cpp/cpp_refactoring \
--verbose_failures //...:all
# We manually shut down the Bazel server to make sure the cached files
# don't interact with it.
- name: Shutdown Bazel
run: |
${{ env.BAZEL }} shutdown