| name: MacOS |
| |
| on: |
| workflow_call: |
| inputs: |
| profile: |
| required: false |
| default: "release" |
| type: string |
| build-args: |
| default: "" |
| required: false |
| type: string |
| wpt-args: |
| default: "" |
| required: false |
| type: string |
| wpt: |
| required: false |
| type: boolean |
| unit-tests: |
| required: false |
| default: false |
| type: boolean |
| build-libservo: |
| required: false |
| default: false |
| type: boolean |
| upload: |
| required: false |
| default: false |
| type: boolean |
| github-release-id: |
| required: false |
| type: string |
| force-github-hosted-runner: |
| required: false |
| type: boolean |
| default: false |
| bencher: |
| required: false |
| default: false |
| type: boolean |
| workflow_dispatch: |
| inputs: |
| profile: |
| required: false |
| default: "release" |
| type: choice |
| options: ["release", "debug", "production"] |
| wpt-args: |
| default: "" |
| required: false |
| type: string |
| wpt: |
| required: false |
| type: boolean |
| unit-tests: |
| required: false |
| default: false |
| type: boolean |
| build-libservo: |
| required: false |
| default: false |
| type: boolean |
| upload: |
| required: false |
| default: false |
| type: boolean |
| force-github-hosted-runner: |
| required: false |
| type: boolean |
| default: false |
| bencher: |
| required: false |
| default: false |
| type: boolean |
| |
| env: |
| RUST_BACKTRACE: 1 |
| SHELL: /bin/bash |
| CARGO_INCREMENTAL: 0 |
| |
| jobs: |
| # Runs the underlying job (“workload”) on a self-hosted runner if available, |
| # with the help of a `runner-select` job and a `runner-timeout` job. |
| runner-select: |
| uses: ./.github/workflows/self-hosted-runner-select.yml |
| secrets: inherit |
| with: |
| github-hosted-runner-label: macos-13 |
| self-hosted-image-name: servo-macos13 |
| force-github-hosted-runner: ${{ inputs.force-github-hosted-runner }} |
| runner-timeout: |
| needs: |
| - runner-select |
| runs-on: ubuntu-22.04 |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v4 |
| with: |
| sparse-checkout: '.github' |
| - name: Runner timeout |
| uses: ./.github/actions/runner-timeout |
| if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }} |
| with: |
| github_token: '${{ secrets.GITHUB_TOKEN }}' |
| unique-id: '${{ needs.runner-select.outputs.unique-id }}' |
| |
| build: |
| needs: |
| - runner-select |
| name: MacOS Build [${{ needs.runner-select.outputs.unique-id }}] |
| runs-on: ${{ needs.runner-select.outputs.selected-runner-label }} |
| steps: |
| # XProtect can cause random failures if it decides that the DMG we create |
| # during the packaging phase is malware. |
| # TODO(mrobinson): Is there a way we can do things in a less suspicious way so |
| # we don't have to kill this service? |
| - name: Kill XProtectBehaviorService |
| run: | |
| echo Killing XProtect.; sudo pkill -9 XProtect >/dev/null || true; |
| - uses: actions/checkout@v4 |
| if: runner.environment != 'self-hosted' && github.event_name != 'pull_request_target' |
| # This is necessary to checkout the pull request if this run was triggered via a |
| # `pull_request_target` event. |
| - uses: actions/checkout@v4 |
| if: runner.environment != 'self-hosted' && github.event_name == 'pull_request_target' |
| with: |
| ref: ${{ github.event.pull_request.head.sha }} |
| # Faster checkout for self-hosted runner that uses prebaked repo. |
| - if: ${{ runner.environment == 'self-hosted' && github.event_name != 'pull_request_target' }} |
| run: git fetch --depth=1 origin $GITHUB_SHA |
| - if: ${{ runner.environment == 'self-hosted' && github.event_name == 'pull_request_target' }} |
| run: git fetch --depth=1 origin ${{ github.event.pull_request.head.sha }} |
| - if: ${{ runner.environment == 'self-hosted' }} |
| # Same as `git switch --detach FETCH_HEAD`, but fixes up dirty working |
| # trees, in case the runner image was baked with a dirty working tree. |
| run: | |
| git switch --detach |
| git reset --hard FETCH_HEAD |
| |
| - if: runner.environment != 'self-hosted' |
| name: Setup Python |
| uses: ./.github/actions/setup-python |
| |
| # Always install crown, even on self-hosted runners, because it is tightly |
| # coupled to the rustc version, and we may have the wrong version if the |
| # commit we are building uses a different rustc version. |
| - name: Install crown |
| run: cargo install --path support/crown |
| |
| - if: runner.environment != 'self-hosted' |
| name: Bootstrap |
| run: | |
| ./mach bootstrap --skip-lints |
| brew install gnu-tar |
| - name: Build (${{ inputs.profile }}) |
| run: | |
| ./mach build --use-crown --locked --${{ inputs.profile }} ${{ inputs.build-args }} |
| cp -r target/cargo-timings target/cargo-timings-macos |
| - name: Smoketest |
| uses: nick-fields/retry@v3 |
| with: # See https://github.com/servo/servo/issues/30757 |
| timeout_minutes: 5 |
| max_attempts: 2 |
| command: ./mach smoketest --${{ inputs.profile }} |
| - name: Script tests |
| run: ./mach test-scripts |
| - name: Unit tests |
| if: ${{ inputs.unit-tests }} |
| uses: nick-fields/retry@v3 |
| with: |
| timeout_minutes: 40 # https://github.com/servo/servo/issues/30275 |
| max_attempts: 3 # https://github.com/servo/servo/issues/30683 |
| command: ./mach test-unit --${{ inputs.profile }} |
| - name: Build mach package |
| run: ./mach package --${{ inputs.profile }} |
| - name: Run DMG smoketest |
| uses: nick-fields/retry@v3 |
| with: # See https://github.com/servo/servo/issues/30757 |
| timeout_minutes: 5 |
| max_attempts: 2 |
| command: ./etc/ci/macos_package_smoketest.sh target/${{ inputs.profile }}/servo-tech-demo.dmg |
| - name: Archive build timing |
| uses: actions/upload-artifact@v4 |
| with: |
| name: cargo-timings-macos-${{ inputs.profile }} |
| # Using a wildcard here ensures that the archive includes the path. |
| path: target/cargo-timings-* |
| - name: Upload artifact for mach package |
| uses: actions/upload-artifact@v4 |
| with: |
| name: ${{ inputs.profile }}-binary-mac |
| path: target/${{ inputs.profile }}/servo-tech-demo.dmg |
| - name: Upload nightly |
| if: ${{ inputs.upload }} |
| run: | |
| ./mach upload-nightly mac --secret-from-environment \ |
| --github-release-id ${{ inputs.github-release-id }} |
| env: |
| S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }} |
| GITHUB_HOMEBREW_TOKEN: ${{ secrets.HOMEBREW_TOKEN }} |
| NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} |
| NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds |
| - name: Build package for target |
| run: gtar -czf target.tar.gz target/${{ inputs.profile }}/servo target/${{ inputs.profile }}/lib/*.dylib resources |
| - name: Upload package for target |
| uses: actions/upload-artifact@v4 |
| with: |
| name: ${{ inputs.profile }}-binary-macos |
| path: target.tar.gz |
| |
| wpt-2020: |
| if: ${{ inputs.wpt }} |
| name: MacOS WPT |
| needs: ["build"] |
| uses: ./.github/workflows/mac-wpt.yml |
| with: |
| profile: ${{ inputs.profile }} |
| wpt-args: ${{ inputs.wpt-args }} |
| secrets: inherit |
| |
| bencher: |
| needs: ["build"] |
| if: ${{ inputs.bencher && inputs.profile != 'debug' && github.event_name != 'workflow_dispatch' && github.event_name != 'merge_group' }} |
| uses: ./.github/workflows/bencher.yml |
| with: |
| target: 'macos' |
| profile: ${{ inputs.profile }} |
| compressed-file-path: ${{ inputs.profile }}-binary-macos/target.tar.gz |
| binary-path: target/${{ inputs.profile }}/servo |
| file-size: true |
| speedometer: false |
| dromaeo: false |
| secrets: inherit |
| |
| build-libservo: |
| if: ${{ inputs.build-libservo }} |
| name: Build libservo and MSRV check |
| runs-on: macos-latest |
| steps: |
| - uses: actions/checkout@v4 |
| if: github.event_name != 'pull_request_target' |
| with: |
| fetch-depth: 1 |
| # This is necessary to checkout the pull request if this run was triggered via a |
| # `pull_request_target` event. |
| - uses: actions/checkout@v4 |
| if: github.event_name == 'pull_request_target' |
| with: |
| ref: ${{ github.event.pull_request.head.sha }} |
| fetch-depth: 1 |
| - name: Setup Python |
| uses: ./.github/actions/setup-python |
| - name: Determine MSRV |
| id: msrv |
| uses: ./.github/actions/parse_msrv |
| - name: Install MSRV |
| uses: dtolnay/rust-toolchain@master |
| with: |
| toolchain: ${{ steps.msrv.outputs.rust_version }} |
| - name: Compile libservo with MSRV |
| run: | |
| cargo +${{ steps.msrv.outputs.rust_version }} build -p libservo --locked --all-targets |