2021-11-08 14:20:26 +00:00
name : CI
# Controls when the action will run.
on :
# Triggers the workflow on push or pull request events but only for the main branch
push :
2023-10-11 01:00:22 +00:00
branches : [ main, 1.x]
2022-09-01 19:30:21 +00:00
pull_request :
2023-10-11 01:00:22 +00:00
branches : [ main, 1.x]
2021-11-08 14:20:26 +00:00
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch :
2024-02-05 05:47:57 +00:00
concurrency :
2024-02-29 21:45:10 +00:00
# Cancel previous actions from the same PR or branch except 'main' branch.
# See https://docs.github.com/en/actions/using-jobs/using-concurrency and https://docs.github.com/en/actions/learn-github-actions/contexts for more info.
group : concurrency-group::${{ github.workflow }}::${{ github.event.pull_request.number > 0 && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}${{ github.ref_name == 'main' && format('::{0}', github.run_id) || ''}}
cancel-in-progress : ${{ github.ref_name != 'main' }}
2024-02-05 05:47:57 +00:00
2021-11-08 14:20:26 +00:00
jobs :
2022-10-26 22:05:27 +00:00
# matrix-prep-* steps dynamically generate a bit of JSON depending on whether our action has
# access to repository secrets. When running on a pull_request from a fork, the author is
# untrusted so the secret will be absent. Insanely complex for how simple this requirement is...
# inspired from
2022-08-31 21:05:11 +00:00
# https://stackoverflow.com/questions/65384420/how-to-make-a-github-action-matrix-element-conditional
2022-10-26 22:05:27 +00:00
matrix-prep-config :
# Prepares the 'config' axis of the test matrix
2022-08-31 21:05:11 +00:00
runs-on : ubuntu-latest
env :
2023-08-29 21:24:59 +00:00
BUILDBUDDY_API_KEY : ${{ secrets.BUILDBUDDY_API_KEY }}
2022-08-31 21:05:11 +00:00
steps :
- id : local
2022-10-28 13:59:37 +00:00
run : echo "config=local" >> $GITHUB_OUTPUT
2022-10-26 22:05:27 +00:00
- id : rbe
2022-10-28 13:59:37 +00:00
run : echo "config=rbe" >> $GITHUB_OUTPUT
2023-08-29 21:24:59 +00:00
# Don't run RBE if there is no API key which is the case on forks
if : ${{ env.BUILDBUDDY_API_KEY != '' }}
2022-08-31 21:05:11 +00:00
outputs :
# Will look like '["local", "rbe"]'
configs : ${{ toJSON(steps.*.outputs.config) }}
2022-10-26 22:05:27 +00:00
matrix-prep-bazelversion :
# Prepares the 'bazelversion' axis of the test matrix
runs-on : ubuntu-latest
steps :
2023-09-16 01:18:05 +00:00
- uses : actions/checkout@v4
2022-10-26 22:05:27 +00:00
- id : bazel_6
2022-10-28 13:59:37 +00:00
run : echo "bazelversion=$(head -n 1 .bazelversion)" >> $GITHUB_OUTPUT
2023-06-13 23:26:33 +00:00
- id : bazel_7
2024-01-08 00:12:05 +00:00
run : echo "bazelversion=7.0.0" >> $GITHUB_OUTPUT
2022-10-26 22:05:27 +00:00
outputs :
2024-01-08 00:12:05 +00:00
# Will look like '["<version from .bazelversion>", "7.0.0"]'
2022-10-26 22:05:27 +00:00
bazelversions : ${{ toJSON(steps.*.outputs.bazelversion) }}
2023-02-17 19:56:56 +00:00
matrix-prep-os :
# Prepares the 'os' axis of the test matrix
runs-on : ubuntu-latest
steps :
2023-09-16 01:18:05 +00:00
- uses : actions/checkout@v4
2023-02-17 19:56:56 +00:00
- id : linux
run : echo "os=ubuntu-latest" >> $GITHUB_OUTPUT
- id : macos
run : echo "os=macos-latest" >> $GITHUB_OUTPUT
# Only run on main branch (or PR branches that contain 'macos') to minimize macOS minutes (billed at 10X)
# https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes
2023-09-25 20:13:49 +00:00
if : ${{ github.ref == 'refs/heads/main' || contains(github.head_ref, 'macos') }}
2023-02-17 19:56:56 +00:00
- id : windows
run : echo "os=windows-latest" >> $GITHUB_OUTPUT
# Only run on main branch (or PR branches that contain 'windows') to minimize Windows minutes (billed at 2X)
# https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes
2023-03-11 01:15:52 +00:00
if : ${{ github.ref == 'refs/heads/main' || contains(github.head_ref, 'windows') }}
2023-02-17 19:56:56 +00:00
outputs :
# Will look like ["ubuntu-latest", "macos-latest", "windows-latest"]
os : ${{ toJSON(steps.*.outputs.os) }}
2021-11-08 14:20:26 +00:00
test :
# The type of runner that the job will run on
2023-02-17 19:56:56 +00:00
runs-on : ${{ matrix.os }}
2022-10-26 22:05:27 +00:00
needs :
- matrix-prep-config
- matrix-prep-bazelversion
2023-02-17 19:56:56 +00:00
- matrix-prep-os
2021-11-08 14:20:26 +00:00
2022-04-27 04:07:17 +00:00
strategy :
2022-08-26 03:44:07 +00:00
fail-fast : false
2022-04-27 04:07:17 +00:00
matrix :
2022-10-26 22:05:27 +00:00
config : ${{ fromJSON(needs.matrix-prep-config.outputs.configs) }}
bazelversion : ${{ fromJSON(needs.matrix-prep-bazelversion.outputs.bazelversions) }}
2023-02-17 19:56:56 +00:00
os : ${{ fromJSON(needs.matrix-prep-os.outputs.os) }}
2023-03-10 17:37:57 +00:00
bzlmodEnabled : [ true , false ]
2022-04-27 04:07:17 +00:00
folder :
- "."
2023-11-19 03:00:40 +00:00
- "e2e/copy_action"
2022-08-11 23:25:51 +00:00
- "e2e/copy_to_directory"
2023-11-19 03:00:40 +00:00
- "e2e/coreutils"
2023-10-10 14:16:13 +00:00
- "e2e/external_copy_to_directory"
2023-03-10 17:37:57 +00:00
- "e2e/smoke"
2023-11-19 03:00:40 +00:00
- "e2e/write_source_files"
2022-09-13 03:52:13 +00:00
exclude :
2023-02-17 19:56:56 +00:00
# Don't test MacOS with RBE to minimize MacOS minutes (billed at 10X)
- config : rbe
os : macos-latest
2023-06-13 23:26:33 +00:00
# Don't test MacOS with Bazel 7 to minimize MacOS minutes (billed at 10X)
2024-01-08 00:12:05 +00:00
- bazelversion : 7.0 .0
2023-06-13 23:26:33 +00:00
os : macos-latest
2023-02-17 19:56:56 +00:00
# Don't test Windows with RBE to minimize Windows minutes (billed at 2X)
- config : rbe
os : windows-latest
2023-06-14 01:36:53 +00:00
# Don't test Windows with Bazel 7 to minimize Windows minutes (billed at 2X)
2024-01-08 00:12:05 +00:00
- bazelversion : 7.0 .0
2023-06-14 01:36:53 +00:00
os : windows-latest
2022-04-27 04:07:17 +00:00
2021-11-08 14:20:26 +00:00
# Steps represent a sequence of tasks that will be executed as part of the job
steps :
2023-02-17 19:56:56 +00:00
# Checks-out your repository under ${{ github.workspace }} , so your job can access it
2023-09-16 01:18:05 +00:00
- uses : actions/checkout@v4
2022-10-26 22:05:27 +00:00
2022-01-21 16:48:43 +00:00
- name : Mount bazel caches
2024-02-27 01:31:31 +00:00
uses : actions/cache@v4
2021-11-08 14:20:26 +00:00
with :
2022-01-21 16:48:43 +00:00
path : |
2022-08-04 00:05:22 +00:00
~/.cache/bazel
~/.cache/bazel-repo
2024-01-08 00:12:05 +00:00
key : bazel-cache-${{ matrix.os }}-${{ matrix.bazelversion }}-${{ matrix.folder }}-${{ matrix.bzlmodEnabled }}-${{ matrix.config }}-${{ hashFiles('.bazelrc', '.bazelversion', '.bazeliskrc', '**/BUILD', '**/BUILD.bazel', '**/*.bzl', 'WORKSPACE', 'WORKSPACE.bazel', 'WORKSPACE.bzlmod', 'MODULE.bazel', 'MODULE.bazel.lock') }}
restore-keys : bazel-cache-${{ matrix.os }}-${{ matrix.bazelversion }}-${{ matrix.folder }}-${{ matrix.bzlmodEnabled }}-${{ matrix.config }}-
2022-10-26 22:05:27 +00:00
- name : Configure Bazel version
2023-02-17 19:56:56 +00:00
if : ${{ matrix.os != 'windows-latest' }}
2022-10-26 22:05:27 +00:00
working-directory : ${{ matrix.folder }}
2023-11-07 22:01:45 +00:00
# - Overwrite the .bazelversion instead of using USE_BAZEL_VERSION so that Bazelisk
2022-11-12 15:31:19 +00:00
# still bootstraps Aspect CLI from configuration in .bazeliskrc. Aspect CLI will
2023-02-17 00:59:21 +00:00
# then use .bazelversion to determine which Bazel version to use.
2023-11-07 22:01:45 +00:00
# - Delete the .aspect/bazelrc/bazel6.bazelrc file if we are not testing
2023-02-17 00:59:21 +00:00
# against Bazel 6 which has a try-import in the root .bazelrc for local development.
run : |
BAZEL_VERSION=${{ matrix.bazelversion }}
echo "${{ matrix.bazelversion }}" > .bazelversion
if [ ${BAZEL_VERSION::1} != "6" ]; then rm -f .aspect/bazelrc/bazel6.bazelrc; fi
2022-10-26 22:05:27 +00:00
2023-02-17 19:56:56 +00:00
- name : Configure Bazel version (Windows)
if : ${{ matrix.os == 'windows-latest' }}
working-directory : ${{ matrix.folder }}
2023-11-07 22:01:45 +00:00
# - Overwrite the .bazelversion instead of using USE_BAZEL_VERSION so that Bazelisk
2023-02-17 19:56:56 +00:00
# still bootstraps Aspect CLI from configuration in .bazeliskrc. Aspect CLI will
# then use .bazelversion to determine which Bazel version to use.
2023-11-07 22:01:45 +00:00
# - Delete the .aspect/bazelrc/bazel6.bazelrc file if we are not testing
2023-02-17 19:56:56 +00:00
# against Bazel 6 which has a try-import in the root .bazelrc for local development.
2023-11-07 22:01:45 +00:00
# - Delete the .bazeliskrc file since Aspect CLI doesn't current ship Windows binaries
2023-02-17 19:56:56 +00:00
run : |
echo "${{ matrix.bazelversion }}" > .bazelversion
$BAZEL_MAJOR_VERSION = "${{ matrix.bazelversion }}".substring(0, 1)
if ($BAZEL_MAJOR_VERSION -ne "6") {
rm -Force .aspect/bazelrc/bazel6.bazelrc
}
2023-11-07 22:01:45 +00:00
rm -Force .bazeliskrc
2023-02-17 19:56:56 +00:00
2023-03-10 17:37:57 +00:00
- name : Set bzlmod flag
# Store the --enable_bzlmod flag that we add to the test command below
# only when we're running bzlmod in our test matrix.
id : set_bzlmod_flag
if : matrix.bzlmodEnabled
run : echo "bzlmod_flag=--enable_bzlmod" >> $GITHUB_OUTPUT
2023-03-11 00:31:54 +00:00
2023-08-29 21:24:59 +00:00
- name : Write rbe credentials
2022-08-18 21:18:33 +00:00
if : ${{ matrix.config == 'rbe' }}
working-directory : ${{ matrix.folder }}
run : |
2023-08-29 21:24:59 +00:00
touch $HOME/.bazelrc
chmod 0600 $HOME/.bazelrc
echo "build --remote_header=x-buildbuddy-api-key=$BUILDBUDDY_API_KEY" > $HOME/.bazelrc
2022-08-18 21:18:33 +00:00
env :
2023-08-29 21:24:59 +00:00
BUILDBUDDY_API_KEY : ${{ secrets.BUILDBUDDY_API_KEY }}
2022-10-26 22:05:27 +00:00
2021-11-08 14:20:26 +00:00
- name : bazel test //...
2023-02-17 19:56:56 +00:00
if : ${{ matrix.os != 'windows-latest' }}
2022-10-26 22:05:27 +00:00
working-directory : ${{ matrix.folder }}
2023-02-17 00:59:21 +00:00
run : |
BAZEL_VERSION=${{ matrix.bazelversion }}
2023-02-17 19:56:56 +00:00
bazel --bazelrc=${{ github.workspace }}/.aspect/bazelrc/ci.bazelrc \
--bazelrc=${{ github.workspace }}/.github/workflows/ci.bazelrc \
--bazelrc=${{ github.workspace }}/.aspect/bazelrc/bazel${BAZEL_VERSION::1}.bazelrc \
2023-11-15 23:07:03 +00:00
test --config=${{ matrix.config }} //... \
${{ steps.set_bzlmod_flag.outputs.bzlmod_flag }}
2021-11-08 14:20:26 +00:00
env :
# Bazelisk will download bazel to here
XDG_CACHE_HOME : ~/.cache/bazel-repo
2022-10-26 22:05:27 +00:00
2023-02-17 19:56:56 +00:00
- name : bazel test //... (Windows)
# A different run command is needed on Windows to account for differences between bash and Powershell
if : ${{ matrix.os == 'windows-latest' }}
working-directory : ${{ matrix.folder }}
run : |
$BAZEL_MAJOR_VERSION = "${{ matrix.bazelversion }}".substring(0, 1)
bazel --bazelrc=${{ github.workspace }}/.aspect/bazelrc/ci.bazelrc `
--bazelrc=${{ github.workspace }}/.github/workflows/ci.bazelrc `
--bazelrc=${{ github.workspace }}/.aspect/bazelrc/bazel$BAZEL_MAJOR_VERSION.bazelrc `
2023-11-15 23:07:03 +00:00
test --config=${{ matrix.config }} //... `
${{ steps.set_bzlmod_flag.outputs.bzlmod_flag }}
2023-02-17 19:56:56 +00:00
env :
# Bazelisk will download bazel to here
XDG_CACHE_HOME : ~/.cache/bazel-repo
2022-03-31 00:01:16 +00:00
- name : integration tests
2023-02-17 19:56:56 +00:00
# Don't run integration tests on Windows since they are bash scripts and Windows runs Powershell
if : ${{ matrix.folder == '.' && matrix.os != 'windows-latest' }}
2022-03-31 00:01:16 +00:00
# Find all shell scripts within e2e, echo the filename, execute, fail on error
2023-11-15 23:07:03 +00:00
run : find e2e/*.sh -maxdepth 1 -type f -exec sh -c 'echo "\n\n------------------------------- $0 -------------------------------" && BZLMOD_FLAG=${{ steps.set_bzlmod_flag.outputs.bzlmod_flag }} "$0" || kill $PPID' \{\} \;
2023-09-27 17:26:38 +00:00
- name : verify bcr patches
2023-09-29 21:21:49 +00:00
if : matrix.bzlmodEnabled && matrix.os == 'ubuntu-latest'
2023-09-27 17:26:38 +00:00
run : patch --dry-run -p1 < .bcr/patches/*.patch