| name: Bazel |
| |
| on: |
| workflow_call: |
| inputs: |
| name: |
| description: Name of workflow |
| required: false |
| type: string |
| ref: |
| description: Git ref to checkout (branch, tag, or SHA) |
| required: false |
| type: string |
| default: '' |
| run: |
| description: Bazel command to run |
| required: true |
| type: string |
| os: |
| description: One of ubuntu, windows or macos |
| required: false |
| type: string |
| default: ubuntu |
| browser: |
| description: One of chrome, firefox, or edge |
| required: false |
| type: string |
| default: '' |
| caching: |
| description: Toggle caching of Bazel |
| required: false |
| type: boolean |
| default: true |
| node-version: |
| description: Custom Node version to install |
| required: false |
| type: string |
| default: '' |
| python-version: |
| description: Custom Python version to use |
| required: false |
| type: string |
| default: '' |
| ruby-version: |
| description: Custom Ruby version to use |
| required: false |
| type: string |
| default: '' |
| artifact-name: |
| description: Name of artifact to upload |
| required: false |
| type: string |
| default: '' |
| artifact-path: |
| description: Path/glob of files to upload (if empty, uploads git diff as changes.patch) |
| required: false |
| type: string |
| default: '' |
| rerun-with-debug: |
| description: Rerun failing tests with debugging enabled |
| required: false |
| type: boolean |
| default: false |
| gpg-sign: |
| description: Import GPG key for signing (Java releases) |
| required: false |
| type: boolean |
| default: false |
| fetch-depth: |
| description: Number of commits to fetch (0 for full history) |
| required: false |
| type: number |
| default: 1 |
| |
| jobs: |
| bazel: |
| name: ${{ inputs.name }} |
| runs-on: ${{ contains(inputs.os, '-') && inputs.os || format('{0}-latest', inputs.os) }} |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| SEL_M2_USER: ${{ secrets.SEL_M2_USER }} |
| SEL_M2_PASS: ${{ secrets.SEL_M2_PASS }} |
| TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} |
| GEM_HOST_API_KEY: ${{ secrets.GEM_HOST_API_KEY }} |
| NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} |
| NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} |
| steps: |
| - name: Checkout source tree |
| uses: actions/checkout@v4 |
| with: |
| ref: ${{ inputs.ref || github.ref }} |
| fetch-depth: ${{ inputs.fetch-depth }} |
| - name: Pull latest changes from head ref for PRs |
| if: contains(github.head_ref, 'renovate/') |
| run: git pull origin "$HEAD_REF" |
| env: |
| HEAD_REF: ${{ github.head_ref }} |
| - name: Pull latest changes from ref for branch pushes |
| if: contains(github.ref, 'renovate/') |
| run: git pull origin "$GIT_REF" |
| env: |
| GIT_REF: ${{ github.ref }} |
| - name: Free space |
| if: inputs.os != 'windows' |
| run: ./scripts/github-actions/free-disk-space.sh |
| - name: Remove driver directories Windows |
| if: inputs.os == 'windows' |
| run: | |
| rm "$env:ChromeWebDriver" -r -v |
| rm "$env:EdgeWebDriver" -r -v |
| rm "$env:GeckoWebDriver" -r -v |
| - name: Remove driver directories Non-Windows |
| if: inputs.os != 'windows' |
| run: | |
| sudo rm -rf "$CHROMEWEBDRIVER" "$EDGEWEBDRIVER" "$GECKOWEBDRIVER" |
| - name: Set Python version |
| if: inputs.python-version != '' |
| run: echo '${{ inputs.python-version }}' > py/.python-version |
| - name: Set Ruby version |
| if: inputs.ruby-version != '' |
| run: echo '${{ inputs.ruby-version }}' > rb/.ruby-version |
| - name: Disable prebuilt Ruby |
| if: inputs.ruby-version != '' && inputs.os != 'windows' |
| run: sed '/^[[:space:]]*rv_version/d' MODULE.bazel > MODULE.bazel.tmp && mv MODULE.bazel.tmp MODULE.bazel |
| - name: Setup Node |
| if: inputs.node-version != '' |
| uses: actions/setup-node@v4 |
| with: |
| node-version: ${{ inputs.node-version }} |
| - name: Setup Bazel with caching |
| if: inputs.caching |
| uses: bazel-contrib/setup-bazel@0.18.0 |
| with: |
| cache-save: ${{ github.ref_name == 'trunk' }} |
| bazelisk-cache: true |
| bazelrc: common --color=yes |
| # Workaround for long path issues: https://github.com/bazelbuild/bazel/pull/22532 |
| output-base: ${{ inputs.os == 'windows' && 'D://b' || '' }} |
| cache-version: 2 |
| disk-cache: false |
| external-cache: | |
| manifest: |
| crates: rust/Cargo.Bazel.lock |
| rules_ruby++ruby+ruby: ${{ inputs.os == 'windows' && 'false' || 'rb/.ruby-version' }} |
| "+pin_browsers_extension+linux_beta_chrome": false |
| "+pin_browsers_extension+linux_beta_chromedriver": true |
| "+pin_browsers_extension+linux_beta_firefox": false |
| "+pin_browsers_extension+linux_chrome": false |
| "+pin_browsers_extension+linux_chromedriver": true |
| "+pin_browsers_extension+linux_edge": false |
| "+pin_browsers_extension+linux_edgedriver": true |
| "+pin_browsers_extension+linux_firefox": false |
| "+pin_browsers_extension+linux_geckodriver": true |
| "+pin_browsers_extension+mac_beta_chrome": false |
| "+pin_browsers_extension+mac_beta_chromedriver": false |
| "+pin_browsers_extension+mac_beta_firefox": false |
| "+pin_browsers_extension+mac_chrome": false |
| "+pin_browsers_extension+mac_chromedriver": false |
| "+pin_browsers_extension+mac_edge": false |
| "+pin_browsers_extension+mac_edgedriver": false |
| "+pin_browsers_extension+mac_firefox": false |
| "+pin_browsers_extension+mac_geckodriver": false |
| repository-cache: true |
| - name: Setup Bazel without caching |
| if: inputs.caching == false |
| uses: bazel-contrib/setup-bazel@0.18.0 |
| with: |
| cache-save: false |
| bazelisk-cache: true |
| external-cache: | |
| manifest: |
| crates: rust/Cargo.Bazel.lock |
| rules_ruby++ruby+ruby: rb/.ruby-version |
| repository-cache: true |
| bazelrc: common --color=yes |
| - name: Setup curl for Ubuntu |
| if: inputs.os == 'ubuntu' |
| run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev |
| - name: Setup Fluxbox and Xvfb |
| if: inputs.os == 'ubuntu' && inputs.browser != '' |
| run: | |
| sudo apt-get -y install fluxbox |
| Xvfb :99 & |
| fluxbox -display :99 & |
| echo "DISPLAY=:99" >> "$GITHUB_ENV" |
| - name: Set resolution |
| if: inputs.os == 'windows' && inputs.browser != '' |
| run: Set-DisplayResolution -Width 1920 -Height 1080 -Force |
| - name: Disable 8dot3 short names |
| if: inputs.os == 'windows' |
| run: fsutil 8dot3name set 0 |
| - name: Setup Safari |
| if: inputs.browser == 'safari' |
| run: sudo safaridriver --enable |
| - name: Import GPG key |
| if: inputs.gpg-sign |
| uses: crazy-max/ghaction-import-gpg@v6 |
| with: |
| gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} |
| passphrase: ${{ secrets.GPG_PASSPHRASE }} |
| - name: Run Bazel |
| shell: bash |
| env: |
| MSYS_NO_PATHCONV: 1 |
| MSYS2_ARG_CONV_EXCL: "*" |
| run: | |
| mkdir -p build |
| { |
| ${{ inputs.run }} |
| } 2>&1 | tee build/bazel-console.log |
| - name: Rerun failures with debug |
| if: failure() |
| shell: bash |
| run: ./scripts/github-actions/rerun-failures.sh '${{ inputs.run }}' '${{ inputs.rerun-with-debug }}' |
| - name: Collect failed test logs |
| if: failure() |
| shell: bash |
| run: ./scripts/github-actions/collect-test-logs.sh |
| - name: Upload failed test logs |
| if: failure() |
| uses: actions/upload-artifact@v5 |
| with: |
| name: test-logs-${{ inputs.os }}-${{ inputs.name }}-${{ inputs.browser }} |
| retention-days: 7 |
| path: build/failures/** |
| - name: Start SSH session |
| if: failure() && runner.debug == '1' |
| uses: mxschmitt/action-tmate@v3 |
| with: |
| limit-access-to-actor: false |
| - name: Save git diff |
| if: always() && inputs.artifact-name != '' && inputs.artifact-path == '' |
| run: git diff --binary > changes.patch |
| - name: Upload artifact |
| if: always() && inputs.artifact-name != '' |
| uses: actions/upload-artifact@v5 |
| with: |
| name: ${{ inputs.artifact-name }} |
| path: ${{ inputs.artifact-path || 'changes.patch' }} |
| retention-days: 6 |
| if-no-files-found: ${{ inputs.artifact-path != '' && 'error' || 'warn' }} |