name: Windows on: workflow_call: inputs: profile: required: false default: "release" type: string unit-tests: 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 workflow_dispatch: inputs: profile: required: false default: "release" options: ["release", "debug", "production"] type: choice unit-tests: required: false default: false type: boolean upload: required: false default: false type: boolean force-github-hosted-runner: required: false type: boolean default: false env: RUST_BACKTRACE: 1 SHELL: /bin/bash CCACHE: "ccache" CARGO_TARGET_DIR: C:\\a\\servo\\servo\\target # clang_sys will search msys path before Program Files\LLVM # so we need to override this behaviour until we update clang-sys # https://github.com/KyleMayes/clang-sys/issues/150 LIBCLANG_PATH: C:\Program Files\LLVM\bin RUSTUP_WINDOWS_PATH_ADD_BIN: 1 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: windows-2022 self-hosted-image-name: servo-windows10 force-github-hosted-runner: ${{ inputs.force-github-hosted-runner }} runner-timeout: needs: - runner-select uses: ./.github/workflows/self-hosted-runner-timeout.yml secrets: inherit with: unique-id: ${{ needs.runner-select.outputs.unique-id }} is-self-hosted: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }} build: needs: - runner-select name: Windows Build [${{ needs.runner-select.outputs.unique-id }}] runs-on: ${{ needs.runner-select.outputs.selected-runner-label }} steps: - if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) && github.event_name != 'pull_request_target' }} uses: actions/checkout@v4 - if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) && github.event_name == 'pull_request_target' }} uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 1 # Faster checkout for self-hosted runner that uses prebaked repo. - if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) && github.event_name != 'pull_request_target' }} run: git fetch --depth=1 origin $env:GITHUB_SHA - if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) && github.event_name == 'pull_request_target' }} run: git fetch --depth=1 origin ${{ github.event.pull_request.head.sha }} - if: ${{ fromJSON(needs.runner-select.outputs.is-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 - name: ccache # FIXME: “Error: Restoring cache failed: Error: Unable to locate executable file: sh.” if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} uses: hendrikmuhs/ccache-action@v1.2 # Install missing tools in a GitHub-hosted runner. # Workaround for https://github.com/actions/runner-images/issues/10001: - name: Upgrade llvm if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: choco upgrade llvm - name: Install wixtoolset if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: | choco install wixtoolset echo "C:\\Program Files (x86)\\WiX Toolset v3.11\\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - uses: actions/setup-python@v5 - name: Setup Python uses: ./.github/actions/setup-python with: skip-python-setup: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }} - name: Bootstrap if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: | python mach fetch python mach bootstrap-gstreamer # For some reason WiX isn't currently on the GitHub runner path. This is a # temporary workaround until that is fixed. - name: Add WiX to Path if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: | "$env:WIX\bin" >> $env:GITHUB_PATH # 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 --force - name: Debug logging for incremental builds if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: | cat C:\init\incremental_build_debug.txt echo "`$env:LIBCLANG_PATH now = $env:LIBCLANG_PATH" echo "`$env:PATH now = $env:PATH" - name: Build (${{ inputs.profile }}) run: | python mach build --use-crown --locked --${{ inputs.profile }} cp C:\a\servo\servo\target\cargo-timings C:\a\servo\servo\target\cargo-timings-windows -Recurse - name: Copy resources if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} # GitHub-hosted runners check out the repo on D: drive. run: cp D:\a\servo\servo\resources C:\a\servo\servo -Recurse - name: Smoketest run: python mach smoketest --${{ inputs.profile }} - name: Unit tests if: ${{ inputs.unit-tests }} uses: nick-fields/retry@v3 with: timeout_minutes: 30 max_attempts: 3 # https://github.com/servo/servo/issues/30683 command: python mach test-unit --${{ inputs.profile }} -- -- --test-threads=1 - name: Archive build timing uses: actions/upload-artifact@v4 with: name: cargo-timings-windows # Using a wildcard here ensures that the archive includes the path. path: C:\\a\\servo\\servo\\target\\cargo-timings-* - name: Build mach package run: python mach package --${{ inputs.profile }} - name: Upload artifact for mach package uses: actions/upload-artifact@v4 with: name: win # These files are available # MSI Installer: C:\a\servo\servo\target\${{ inputs.profile }}\msi\Installer.msi # Bundle: C:\a\servo\servo\target\${{ inputs.profile }}\msi\Servo.exe # Zip: C:\a\servo\servo\target\${{ inputs.profile }}\msi\Servo.zip path: C:\\a\\servo\\servo\\target\\${{ inputs.profile }}\\msi\\Servo.exe - name: Upload nightly if: ${{ inputs.upload }} run: | python mach upload-nightly windows-msvc --secret-from-environment ` --github-release-id ${{ inputs.github-release-id }} env: S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }} NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds