162 lines
7.4 KiB
YAML
162 lines
7.4 KiB
YAML
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:
|
|
branches: [main, 1.x]
|
|
pull_request:
|
|
branches: [main, 1.x]
|
|
# Allows you to run this workflow manually from the Actions tab
|
|
workflow_dispatch:
|
|
concurrency:
|
|
# 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' }}
|
|
env:
|
|
HEAD_REF: ${{ github.head_ref }}
|
|
jobs:
|
|
# Prepares dynamic test matrix values
|
|
matrix-prep:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- id: bazel-version
|
|
name: Prepare 'bazel-version' matrix axis
|
|
run: |
|
|
v=$(head -n 1 .bazelversion)
|
|
m=${v::1}
|
|
a=(
|
|
"major:$m, version:\"$v\""
|
|
"major:6, version:\"6.5.0\""
|
|
)
|
|
printf -v j '{%s},' "${a[@]}"
|
|
echo "res=[${j%,}]" | tee -a $GITHUB_OUTPUT
|
|
- id: os
|
|
name: Prepare 'os' matrix axis
|
|
# Only run MacOS and Windows on main branch (not PRs) to minimize minutes (billed at 10X and 2X respectively)
|
|
# https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes
|
|
run: |
|
|
a=( ubuntu )
|
|
if [[ "${{ github.ref_name }}" == "main" ]] || [[ "$HEAD_REF" == *"macos"* ]]; then
|
|
a+=( macos )
|
|
fi
|
|
if [[ "${{ github.ref_name }}" == "main" ]] || [[ "$HEAD_REF" == *"windows"* ]]; then
|
|
a+=( windows )
|
|
fi
|
|
printf -v j '"%s",' "${a[@]}"
|
|
echo "res=[${j%,}]" | tee -a $GITHUB_OUTPUT
|
|
outputs:
|
|
bazel-version: ${{ steps.bazel-version.outputs.res }}
|
|
os: ${{ steps.os.outputs.res }}
|
|
test:
|
|
runs-on: ${{ matrix.os }}-latest
|
|
needs:
|
|
- matrix-prep
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
bazel-version: ${{ fromJSON(needs.matrix-prep.outputs.bazel-version) }}
|
|
bzlmod: [1, 0]
|
|
os: ${{ fromJSON(needs.matrix-prep.outputs.os) }}
|
|
folder:
|
|
- "."
|
|
- "e2e/copy_action"
|
|
- "e2e/copy_to_directory"
|
|
- "e2e/coreutils"
|
|
- "e2e/external_copy_to_directory"
|
|
- "e2e/smoke"
|
|
- "e2e/write_source_files"
|
|
exclude:
|
|
# Root workspace is bzlmod-only
|
|
- folder: .
|
|
bzlmod: 0
|
|
# Don't test MacOS and Windows against secondary bazel version to minimize minutes (billed at 10X and 2X respectively)
|
|
# https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes
|
|
- os: macos
|
|
bazel-version:
|
|
major: 6
|
|
- os: windows
|
|
bazel-version:
|
|
major: 6
|
|
# Don't run bzlmod tests with Bazel 6 to reduce the size of the test matrix
|
|
- bazel-version:
|
|
major: 6
|
|
bzlmod: 1
|
|
# TODO: green up root Workspace on MacOS & Windows
|
|
- folder: .
|
|
os: macos
|
|
- folder: .
|
|
os: windows
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Mount bazel caches
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.cache/bazel-disk-cache
|
|
~/.cache/bazel-repository-cache
|
|
key: bazel-cache-${{ matrix.bazel-version.version }}-${{ matrix.bzlmod }}-${{ matrix.os }}-${{ matrix.folder }}-${{ hashFiles('.bazelrc', '.bazelversion', '.bazeliskrc', '**/BUILD', '**/BUILD.bazel', '**/*.bzl', 'WORKSPACE', 'WORKSPACE.bazel', 'WORKSPACE.bzlmod', 'MODULE.bazel') }}
|
|
restore-keys: bazel-cache-${{ matrix.bazel-version.version }}-${{ matrix.bzlmod }}-${{ matrix.os }}-${{ matrix.folder }}-
|
|
- name: Configure Bazel version
|
|
working-directory: ${{ matrix.folder }}
|
|
shell: bash
|
|
run: |
|
|
# Overwrite the .bazelversion instead of using USE_BAZEL_VERSION so that Bazelisk
|
|
# still bootstraps Aspect CLI from configuration in .bazeliskrc. Aspect CLI will
|
|
# then use .bazelversion to determine which Bazel version to use.
|
|
echo "${{ matrix.bazel-version.version }}" > .bazelversion
|
|
# Delete all the version specific bazelrc files that are used for local development
|
|
# since the version we're testing against is dynamic. These are just symlinks and the
|
|
# root .bazelrc brings these in with try-imports. In this CI workflows, we explicitly
|
|
# bring in the version specific bazelrc file with --bazelrc when we invoke bazel.
|
|
rm ${GITHUB_WORKSPACE//\\/\/}/.aspect/bazelrc/local/*.bazelrc
|
|
# TODO: remove this block once we have Aspect CLI Windows releases
|
|
- name: Don't use Aspect CLI on Windows
|
|
if: matrix.os == 'windows'
|
|
working-directory: ${{ matrix.folder }}
|
|
shell: bash
|
|
run: rm -f .bazeliskrc
|
|
- name: bazel test //...
|
|
working-directory: ${{ matrix.folder }}
|
|
shell: bash
|
|
run: |
|
|
bazel \
|
|
--bazelrc=${GITHUB_WORKSPACE//\\/\/}/.aspect/bazelrc/bazel${{ matrix.bazel-version.major }}.bazelrc \
|
|
--bazelrc=${GITHUB_WORKSPACE//\\/\/}/.aspect/bazelrc/ci.bazelrc \
|
|
--bazelrc=${GITHUB_WORKSPACE//\\/\/}/.github/workflows/ci.bazelrc \
|
|
test \
|
|
--test_tag_filters=-skip-on-bazel${{ matrix.bazel-version.major }} \
|
|
--build_tag_filters=-skip-on-bazel${{ matrix.bazel-version.major }} \
|
|
--enable_bzlmod=${{ matrix.bzlmod }} \
|
|
//...
|
|
- name: Integration tests
|
|
# Don't run integration tests on Windows since they are bash scripts and Windows runs Powershell
|
|
if: matrix.folder == '.' && matrix.os != 'windows' && matrix.bazel-version.major != '6'
|
|
# Find all shell scripts within e2e, echo the filename, execute, fail on error
|
|
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' \{\} \;
|
|
- name: Verify bcr patches
|
|
if: matrix.folder == '.' && matrix.bzlmod == '1' && matrix.os == 'ubuntu' && matrix.bazel-version.major != '6'
|
|
run: patch --dry-run -p1 < .bcr/patches/*.patch
|
|
|
|
# For branch protection settings, this job provides a "stable" name that can be used to gate PR merges
|
|
# on "all matrix jobs were successful".
|
|
conclusion:
|
|
needs: test
|
|
runs-on: ubuntu-latest
|
|
if: always()
|
|
steps:
|
|
- uses: technote-space/workflow-conclusion-action@45ce8e0eb155657ab8ccf346ade734257fd196a5 # v3.0.3
|
|
|
|
# Note: possible conclusion values:
|
|
# https://github.com/technote-space/workflow-conclusion-action/blob/main/src/constant.ts
|
|
- name: report success
|
|
if: ${{ env.WORKFLOW_CONCLUSION == 'success' }}
|
|
working-directory: /tmp
|
|
run: echo ${{ env.WORKFLOW_CONCLUSION }} && exit 0
|
|
|
|
- name: report failure
|
|
if: ${{ env.WORKFLOW_CONCLUSION == 'failure' }}
|
|
working-directory: /tmp
|
|
run: echo ${{ env.WORKFLOW_CONCLUSION }} && exit 1
|