| 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.head_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) }} |
| bzlmodEnabled: [true, false] |
| folder: |
| - "." |
| - "e2e/coreutils" |
| - "e2e/copy_to_directory" |
| - "e2e/smoke" |
| exclude: |
| # this e2e meant to work under bzlmod |
| - bzlmodEnabled: false |
| folder: bzlmod_write_source_files_external |
| |
| # Don't test Bazel 5.3 with bzlmod. (Unrecognized option: --enable_bzlmod) |
| - bzlmodEnabled: true |
| bazelversion: 5.3.2 |
| # 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: 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 |
| |
| - 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 ` |
| ${{ steps.set_bzlmod_flag.outputs.bzlmod_flag }} ` |
| 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' \{\} \; |