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] pull_request: branches: [main] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: # 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 # https://stackoverflow.com/questions/65384420/how-to-make-a-github-action-matrix-element-conditional matrix-prep-config: # Prepares the 'config' axis of the test matrix runs-on: ubuntu-latest env: ENGFLOW_PRIVATE_KEY: ${{ secrets.ENGFLOW_PRIVATE_KEY }} steps: - id: local run: echo "config=local" >> $GITHUB_OUTPUT - id: rbe run: echo "config=rbe" >> $GITHUB_OUTPUT # Don't run RBE if there are no EngFlow creds which is the case on forks if: ${{ env.ENGFLOW_PRIVATE_KEY != '' }} outputs: # Will look like '["local", "rbe"]' configs: ${{ toJSON(steps.*.outputs.config) }} matrix-prep-bazelversion: # Prepares the 'bazelversion' axis of the test matrix runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - id: bazel_6 run: echo "bazelversion=$(head -n 1 .bazelversion)" >> $GITHUB_OUTPUT - id: bazel_5 run: echo "bazelversion=5.3.2" >> $GITHUB_OUTPUT outputs: # Will look like '["6.0.0", "5.3.2"]' bazelversions: ${{ toJSON(steps.*.outputs.bazelversion) }} matrix-prep-os: # Prepares the 'os' axis of the test matrix runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - 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 if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'macos') }} - 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 if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'windows') }} outputs: # Will look like ["ubuntu-latest", "macos-latest", "windows-latest"] os: ${{ toJSON(steps.*.outputs.os) }} test: # The type of runner that the job will run on runs-on: ${{ matrix.os }} needs: - matrix-prep-config - matrix-prep-bazelversion - matrix-prep-os strategy: fail-fast: false matrix: config: ${{ fromJSON(needs.matrix-prep-config.outputs.configs) }} bazelversion: ${{ fromJSON(needs.matrix-prep-bazelversion.outputs.bazelversions) }} os: ${{ fromJSON(needs.matrix-prep-os.outputs.os) }} folder: - "." - "e2e/bzlmod" - "e2e/copy_to_directory" - "e2e/workspace" exclude: # bzlmod broken at 5.3.2 which the RBE: # ``` # ERROR: /home/runner/work/bazel-lib/bazel-lib/e2e/bzlmod/BUILD.bazel:37:10: While resolving # toolchains for target //:test: com.google.devtools.build.lib.packages.BuildFileNotFoundException: # no such package '@aspect_bazel_lib//platforms': The repository '@aspect_bazel_lib' could not be # resolved: Repository '@aspect_bazel_lib' is not defined # ``` - config: rbe bazelversion: 5.3.2 folder: e2e/bzlmod # Don't test MacOS with RBE to minimize MacOS minutes (billed at 10X) - config: rbe os: macos-latest # Don't test MacOS with Bazel 5 to minimize MacOS minutes (billed at 10X) - bazelversion: 5.3.2 os: macos-latest # Don't test Windows with RBE to minimize Windows minutes (billed at 2X) - config: rbe os: windows-latest # Don't test Windows with Bazel 5 to minimize Windows minutes (billed at 2X) - bazelversion: 5.3.2 os: windows-latest # TODO: fix or disable the following build & test on Windows # //lib/tests/coreutils:test_sha256sum FAILED in 2 out of 2 in 0.2s # //lib/tests/coreutils:test_sha512sum FAILED in 2 out of 2 in 0.2s # //docs:update_0_test FAILED TO BUILD # //docs:update_10_test FAILED TO BUILD # //docs:update_11_test FAILED TO BUILD # //docs:update_12_test FAILED TO BUILD # //docs:update_13_test FAILED TO BUILD - folder: . os: windows-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under ${{ github.workspace }} , so your job can access it - uses: actions/checkout@v3 - name: Mount bazel caches uses: actions/cache@v3 with: path: | ~/.cache/bazel ~/.cache/bazel-repo key: bazel-cache-${{ hashFiles('**/BUILD.bazel', '**/*.bzl', 'WORKSPACE') }} restore-keys: bazel-cache- - name: Configure Bazel version if: ${{ matrix.os != 'windows-latest' }} working-directory: ${{ matrix.folder }} # 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. # Also delete the .aspect/bazelrc/bazel6.bazelrc file if we are not testing # 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 - name: Configure Bazel version (Windows) if: ${{ matrix.os == 'windows-latest' }} working-directory: ${{ matrix.folder }} # 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. # Also delete the .aspect/bazelrc/bazel6.bazelrc file if we are not testing # against Bazel 6 which has a try-import in the root .bazelrc for local development. 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 } - name: Write engflow credentials if: ${{ matrix.config == 'rbe' }} working-directory: ${{ matrix.folder }} run: | touch engflow.crt engflow.key chmod 0600 engflow.crt engflow.key echo "$ENGFLOW_CLIENT_CRT" > engflow.crt echo "$ENGFLOW_PRIVATE_KEY" > engflow.key env: ENGFLOW_CLIENT_CRT: ${{ secrets.ENGFLOW_CLIENT_CRT }} ENGFLOW_PRIVATE_KEY: ${{ secrets.ENGFLOW_PRIVATE_KEY }} - name: bazel test //... if: ${{ matrix.os != 'windows-latest' }} working-directory: ${{ matrix.folder }} run: | BAZEL_VERSION=${{ matrix.bazelversion }} 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 \ --bazelrc=.bazelrc \ test --config=${{ matrix.config }} //... env: # Bazelisk will download bazel to here XDG_CACHE_HOME: ~/.cache/bazel-repo - 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 ` --bazelrc=.bazelrc ` test --config=${{ matrix.config }} //... env: # Bazelisk will download bazel to here XDG_CACHE_HOME: ~/.cache/bazel-repo - 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-latest' }} # 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 -------------------------------" && "$0" || kill $PPID' \{\} \;