From 5ce828de663fc575b28d568922d4907b2ea8944a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 13:36:41 +0000 Subject: [PATCH] build(deps): bump actions/checkout from 3.0.2 to 3.1.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.2 to 3.1.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/2541b1294d2704b0964813337f33b291d3f8596b...93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/audit.yaml | 44 +++++ .github/workflows/bootstrap.yml | 212 +++++++++++++------- .github/workflows/build-containers.yml | 65 +++++-- .github/workflows/ci.yaml | 92 +++++++++ .github/workflows/unit_tests.yaml | 260 +++++++------------------ .github/workflows/valid-style.yml | 60 ++++++ .github/workflows/windows_python.yml | 160 +++++++++++++++ 7 files changed, 606 insertions(+), 287 deletions(-) create mode 100644 .github/workflows/audit.yaml create mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/valid-style.yml create mode 100644 .github/workflows/windows_python.yml diff --git a/.github/workflows/audit.yaml b/.github/workflows/audit.yaml new file mode 100644 index 00000000000000..54eb3107ecdd2a --- /dev/null +++ b/.github/workflows/audit.yaml @@ -0,0 +1,44 @@ +name: audit + +on: + workflow_call: + inputs: + with_coverage: + required: true + type: string + python_version: + required: true + type: string + +concurrency: + group: audit-${{inputs.python_version}}-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true + +jobs: + # Run audits on all the packages in the built-in repository + package-audits: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 + with: + python-version: ${{inputs.python_version}} + - name: Install Python packages + run: | + pip install --upgrade pip six setuptools pytest codecov 'coverage[toml]<=6.2' + - name: Package audits (with coverage) + if: ${{ inputs.with_coverage == 'true' }} + run: | + . share/spack/setup-env.sh + coverage run $(which spack) audit packages + coverage combine + coverage xml + - name: Package audits (without coverage) + if: ${{ inputs.with_coverage == 'false' }} + run: | + . share/spack/setup-env.sh + $(which spack) audit packages + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # @v2.1.0 + if: ${{ inputs.with_coverage == 'true' }} + with: + flags: unittests,linux,audits diff --git a/.github/workflows/bootstrap.yml b/.github/workflows/bootstrap.yml index ec7d9a3898be33..dcd6761f689868 100644 --- a/.github/workflows/bootstrap.yml +++ b/.github/workflows/bootstrap.yml @@ -3,24 +3,16 @@ name: Bootstrapping on: # This Workflow can be triggered manually workflow_dispatch: - pull_request: - branches: - - develop - - releases/** - paths-ignore: - # Don't run if we only modified packages in the - # built-in repository or documentation - - 'var/spack/repos/builtin/**' - - '!var/spack/repos/builtin/packages/clingo-bootstrap/**' - - '!var/spack/repos/builtin/packages/python/**' - - '!var/spack/repos/builtin/packages/re2c/**' - - 'lib/spack/docs/**' + workflow_call: schedule: # nightly at 2:16 AM - cron: '16 2 * * *' -jobs: +concurrency: + group: bootstrap-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true +jobs: fedora-clingo-sources: runs-on: ubuntu-latest container: "fedora:latest" @@ -31,19 +23,26 @@ jobs: bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \ make patch unzip which xz python3 python3-devel tree \ cmake bison bison-devel libstdc++-static - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - name: Setup repo and non-root user + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - name: Setup non-root user + run: | + # See [1] below + git config --global --add safe.directory /__w/spack/spack + useradd spack-test && mkdir -p ~spack-test + chown -R spack-test . ~spack-test + - name: Setup repo + shell: runuser -u spack-test -- bash {0} run: | git --version - git fetch --unshallow . .github/workflows/setup_git.sh - useradd spack-test - chown -R spack-test . - name: Bootstrap clingo shell: runuser -u spack-test -- bash {0} run: | source share/spack/setup-env.sh - spack bootstrap untrust github-actions + spack bootstrap untrust github-actions-v0.2 spack external find cmake bison spack -d solve zlib tree ~/.spack/bootstrap/store/ @@ -61,19 +60,26 @@ jobs: bzip2 curl file g++ gcc gfortran git gnupg2 gzip \ make patch unzip xz-utils python3 python3-dev tree \ cmake bison - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - name: Setup repo and non-root user + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - name: Setup non-root user + run: | + # See [1] below + git config --global --add safe.directory /__w/spack/spack + useradd spack-test && mkdir -p ~spack-test + chown -R spack-test . ~spack-test + - name: Setup repo + shell: runuser -u spack-test -- bash {0} run: | git --version - git fetch --unshallow . .github/workflows/setup_git.sh - useradd -m spack-test - chown -R spack-test . - name: Bootstrap clingo shell: runuser -u spack-test -- bash {0} run: | source share/spack/setup-env.sh - spack bootstrap untrust github-actions + spack bootstrap untrust github-actions-v0.2 spack external find cmake bison spack -d solve zlib tree ~/.spack/bootstrap/store/ @@ -90,14 +96,21 @@ jobs: apt-get install -y \ bzip2 curl file g++ gcc gfortran git gnupg2 gzip \ make patch unzip xz-utils python3 python3-dev tree - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - name: Setup repo and non-root user + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - name: Setup non-root user + run: | + # See [1] below + git config --global --add safe.directory /__w/spack/spack + useradd spack-test && mkdir -p ~spack-test + chown -R spack-test . ~spack-test + - name: Setup repo + shell: runuser -u spack-test -- bash {0} run: | git --version - git fetch --unshallow . .github/workflows/setup_git.sh - useradd -m spack-test - chown -R spack-test . - name: Bootstrap clingo shell: runuser -u spack-test -- bash {0} run: | @@ -105,7 +118,6 @@ jobs: spack -d solve zlib tree ~/.spack/bootstrap/store/ - opensuse-clingo-sources: runs-on: ubuntu-latest container: "opensuse/leap:latest" @@ -118,16 +130,20 @@ jobs: bzip2 curl file gcc-c++ gcc gcc-fortran tar git gpg2 gzip \ make patch unzip which xz python3 python3-devel tree \ cmake bison - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - name: Setup repo and non-root user + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - name: Setup repo run: | + # See [1] below + git config --global --add safe.directory /__w/spack/spack git --version - git fetch --unshallow . .github/workflows/setup_git.sh - name: Bootstrap clingo run: | source share/spack/setup-env.sh - spack bootstrap untrust github-actions + spack bootstrap untrust github-actions-v0.2 spack external find cmake bison spack -d solve zlib tree ~/.spack/bootstrap/store/ @@ -138,57 +154,81 @@ jobs: - name: Install dependencies run: | brew install cmake bison@2.7 tree - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 - name: Bootstrap clingo run: | source share/spack/setup-env.sh export PATH=/usr/local/opt/bison@2.7/bin:$PATH - spack bootstrap untrust github-actions + spack bootstrap untrust github-actions-v0.2 spack external find --not-buildable cmake bison spack -d solve zlib tree ~/.spack/bootstrap/store/ macos-clingo-binaries: - runs-on: macos-latest + runs-on: ${{ matrix.macos-version }} strategy: matrix: - python-version: ['3.5', '3.6', '3.7', '3.8', '3.9'] + macos-version: ['macos-11', 'macos-12'] steps: - name: Install dependencies run: | brew install tree - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 - with: - python-version: ${{ matrix.python-version }} + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 - name: Bootstrap clingo run: | - source share/spack/setup-env.sh - spack bootstrap untrust spack-install - spack -d solve zlib - tree ~/.spack/bootstrap/store/ + set -ex + for ver in '3.6' '3.7' '3.8' '3.9' '3.10' ; do + not_found=1 + ver_dir="$(find $RUNNER_TOOL_CACHE/Python -wholename "*/${ver}.*/*/bin" | grep . || true)" + echo "Testing $ver_dir" + if [[ -d "$ver_dir" ]] ; then + if $ver_dir/python --version ; then + export PYTHON="$ver_dir/python" + not_found=0 + old_path="$PATH" + export PATH="$ver_dir:$PATH" + ./bin/spack-tmpconfig -b ./.github/workflows/bootstrap-test.sh + export PATH="$old_path" + fi + fi + # NOTE: test all pythons that exist, not all do on 12 + done ubuntu-clingo-binaries: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['2.7', '3.5', '3.6', '3.7', '3.8', '3.9'] + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 with: - python-version: ${{ matrix.python-version }} - - name: Setup repo and non-root user + fetch-depth: 0 + - name: Setup repo run: | git --version - git fetch --unshallow . .github/workflows/setup_git.sh - name: Bootstrap clingo run: | - source share/spack/setup-env.sh - spack bootstrap untrust spack-install - spack -d solve zlib - tree ~/.spack/bootstrap/store/ + set -ex + for ver in '2.7' '3.6' '3.7' '3.8' '3.9' '3.10' ; do + not_found=1 + ver_dir="$(find $RUNNER_TOOL_CACHE/Python -wholename "*/${ver}.*/*/bin" | grep . || true)" + echo "Testing $ver_dir" + if [[ -d "$ver_dir" ]] ; then + if $ver_dir/python --version ; then + export PYTHON="$ver_dir/python" + not_found=0 + old_path="$PATH" + export PATH="$ver_dir:$PATH" + ./bin/spack-tmpconfig -b ./.github/workflows/bootstrap-test.sh + export PATH="$old_path" + fi + fi + if (($not_found)) ; then + echo Required python version $ver not found in runner! + exit 1 + fi + done ubuntu-gnupg-binaries: runs-on: ubuntu-latest @@ -202,14 +242,21 @@ jobs: apt-get install -y \ bzip2 curl file g++ gcc patchelf gfortran git gzip \ make patch unzip xz-utils python3 python3-dev tree - - uses: actions/checkout@v2 - - name: Setup repo and non-root user + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - name: Setup non-root user + run: | + # See [1] below + git config --global --add safe.directory /__w/spack/spack + useradd spack-test && mkdir -p ~spack-test + chown -R spack-test . ~spack-test + - name: Setup repo + shell: runuser -u spack-test -- bash {0} run: | git --version - git fetch --unshallow . .github/workflows/setup_git.sh - useradd -m spack-test - chown -R spack-test . - name: Bootstrap GnuPG shell: runuser -u spack-test -- bash {0} run: | @@ -231,20 +278,27 @@ jobs: bzip2 curl file g++ gcc patchelf gfortran git gzip \ make patch unzip xz-utils python3 python3-dev tree \ gawk - - uses: actions/checkout@v2 - - name: Setup repo and non-root user + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - name: Setup non-root user + run: | + # See [1] below + git config --global --add safe.directory /__w/spack/spack + useradd spack-test && mkdir -p ~spack-test + chown -R spack-test . ~spack-test + - name: Setup repo + shell: runuser -u spack-test -- bash {0} run: | git --version - git fetch --unshallow . .github/workflows/setup_git.sh - useradd -m spack-test - chown -R spack-test . - name: Bootstrap GnuPG shell: runuser -u spack-test -- bash {0} run: | source share/spack/setup-env.sh spack solve zlib - spack bootstrap untrust github-actions + spack bootstrap untrust github-actions-v0.2 spack -d gpg list tree ~/.spack/bootstrap/store/ @@ -256,7 +310,8 @@ jobs: brew install tree # Remove GnuPG since we want to bootstrap it sudo rm -rf /usr/local/bin/gpg - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 - name: Bootstrap GnuPG run: | source share/spack/setup-env.sh @@ -272,11 +327,20 @@ jobs: brew install gawk tree # Remove GnuPG since we want to bootstrap it sudo rm -rf /usr/local/bin/gpg - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 - name: Bootstrap GnuPG run: | source share/spack/setup-env.sh spack solve zlib - spack bootstrap untrust github-actions + spack bootstrap untrust github-actions-v0.2 spack -d gpg list tree ~/.spack/bootstrap/store/ + + +# [1] Distros that have patched git to resolve CVE-2022-24765 (e.g. Ubuntu patching v2.25.1) +# introduce breaking behaviorso we have to set `safe.directory` in gitconfig ourselves. +# See: +# - https://github.blog/2022-04-12-git-security-vulnerability-announced/ +# - https://github.com/actions/checkout/issues/760 +# - http://changelogs.ubuntu.com/changelogs/pool/main/g/git/git_2.25.1-1ubuntu3.3/changelog diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml index 1e996111b8e8ad..9e395974d3405d 100644 --- a/.github/workflows/build-containers.yml +++ b/.github/workflows/build-containers.yml @@ -13,10 +13,16 @@ on: paths: - '.github/workflows/build-containers.yml' - 'share/spack/docker/*' + - 'share/templates/container/*' + - 'lib/spack/spack/container/*' # Let's also build & tag Spack containers on releases. release: types: [published] +concurrency: + group: build_containers-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true + jobs: deploy-images: runs-on: ubuntu-latest @@ -29,15 +35,22 @@ jobs: # A matrix of Dockerfile paths, associated tags, and which architectures # they support. matrix: - dockerfile: [[amazon-linux, amazonlinux-2.dockerfile, 'linux/amd64,linux/arm64'], - [centos7, centos-7.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le'], - [leap15, leap-15.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le'], - [ubuntu-xenial, ubuntu-1604.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le'], - [ubuntu-bionic, ubuntu-1804.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le']] + # Meaning of the various items in the matrix list + # 0: Container name (e.g. ubuntu-bionic) + # 1: Platforms to build for + # 2: Base image (e.g. ubuntu:18.04) + dockerfile: [[amazon-linux, 'linux/amd64,linux/arm64', 'amazonlinux:2'], + [centos7, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:7'], + [centos-stream, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:stream'], + [leap15, 'linux/amd64,linux/arm64,linux/ppc64le', 'opensuse/leap:15'], + [ubuntu-bionic, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:18.04'], + [ubuntu-focal, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:20.04'], + [ubuntu-jammy, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:22.04']] name: Build ${{ matrix.dockerfile[0] }} + if: github.repository == 'spack/spack' steps: - name: Checkout - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 - name: Set Container Tag Normal (Nightly) run: | @@ -52,40 +65,54 @@ jobs: versioned="${{matrix.dockerfile[0]}}:${GITHUB_REF##*/}" echo "versioned=${versioned}" >> $GITHUB_ENV - - name: Check ${{ matrix.dockerfile[1] }} Exists + - name: Generate the Dockerfile + env: + SPACK_YAML_OS: "${{ matrix.dockerfile[2] }}" run: | - printf "Preparing to build ${{ env.container }} from ${{ matrix.dockerfile[1] }}" - if [ ! -f "share/spack/docker/${{ matrix.dockerfile[1]}}" ]; then - printf "Dockerfile ${{ matrix.dockerfile[0]}} does not exist" + .github/workflows/generate_spack_yaml_containerize.sh + . share/spack/setup-env.sh + mkdir -p dockerfiles/${{ matrix.dockerfile[0] }} + spack containerize --last-stage=bootstrap | tee dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile + printf "Preparing to build ${{ env.container }} from dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile" + if [ ! -f "dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile" ]; then + printf "dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile does not exist" exit 1; fi + - name: Upload Dockerfile + uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 + with: + name: dockerfiles + path: dockerfiles + - name: Set up QEMU - uses: docker/setup-qemu-action@27d0a4f181a40b142cce983c5393082c365d1480 # @v1 + uses: docker/setup-qemu-action@8b122486cedac8393e77aa9734c3528886e4a1a8 # @v1 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@94ab11c41e45d028884a99163086648e898eed25 # @v1 + uses: docker/setup-buildx-action@dc7b9719a96d48369863986a06765841d7ea23f6 # @v1 - name: Log in to GitHub Container Registry - uses: docker/login-action@42d299face0c5c43a0487c477f595ac9cf22f1a7 # @v1 + uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b # @v1 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Log in to DockerHub - if: ${{ github.event_name != 'pull_request' }} - uses: docker/login-action@42d299face0c5c43a0487c477f595ac9cf22f1a7 # @v1 + if: github.event_name != 'pull_request' + uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b # @v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build & Deploy ${{ matrix.dockerfile[1] }} - uses: docker/build-push-action@a66e35b9cbcf4ad0ea91ffcaf7bbad63ad9e0229 # @v2 + - name: Build & Deploy ${{ matrix.dockerfile[0] }} + uses: docker/build-push-action@c84f38281176d4c9cdb1626ffafcd6b3911b5d94 # @v2 with: - file: share/spack/docker/${{matrix.dockerfile[1]}} - platforms: ${{ matrix.dockerfile[2] }} + context: dockerfiles/${{ matrix.dockerfile[0] }} + platforms: ${{ matrix.dockerfile[1] }} push: ${{ github.event_name != 'pull_request' }} + cache-from: type=gha + cache-to: type=gha,mode=max tags: | spack/${{ env.container }} spack/${{ env.versioned }} diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000000000..46dfbd572dbf4a --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,92 @@ +name: ci + +on: + push: + branches: + - develop + - releases/** + pull_request: + branches: + - develop + - releases/** + +concurrency: + group: ci-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true + +jobs: + prechecks: + needs: [ changes ] + uses: ./.github/workflows/valid-style.yml + with: + with_coverage: ${{ needs.changes.outputs.core }} + audit-ancient-python: + uses: ./.github/workflows/audit.yaml + needs: [ changes ] + with: + with_coverage: ${{ needs.changes.outputs.core }} + python_version: 2.7 + all-prechecks: + needs: [ prechecks ] + runs-on: ubuntu-latest + steps: + - name: Success + run: "true" + # Check which files have been updated by the PR + changes: + runs-on: ubuntu-latest + # Set job outputs to values from filter step + outputs: + bootstrap: ${{ steps.filter.outputs.bootstrap }} + core: ${{ steps.filter.outputs.core }} + packages: ${{ steps.filter.outputs.packages }} + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 + if: ${{ github.event_name == 'push' }} + with: + fetch-depth: 0 + # For pull requests it's not necessary to checkout the code + - uses: dorny/paths-filter@b2feaf19c27470162a626bd6fa8438ae5b263721 + id: filter + with: + # See https://github.com/dorny/paths-filter/issues/56 for the syntax used below + # Don't run if we only modified packages in the + # built-in repository or documentation + filters: | + bootstrap: + - 'var/spack/repos/builtin/packages/clingo-bootstrap/**' + - 'var/spack/repos/builtin/packages/clingo/**' + - 'var/spack/repos/builtin/packages/python/**' + - 'var/spack/repos/builtin/packages/re2c/**' + - 'lib/spack/**' + - 'share/spack/**' + - '.github/workflows/bootstrap.yml' + - '.github/workflows/ci.yaml' + core: + - './!(var/**)/**' + packages: + - 'var/**' + # Some links for easier reference: + # + # "github" context: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context + # job outputs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs + # setting environment variables from earlier steps: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + # + bootstrap: + if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.bootstrap == 'true' }} + needs: [ prechecks, changes ] + uses: ./.github/workflows/bootstrap.yml + unit-tests: + if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.core == 'true' }} + needs: [ prechecks, changes ] + uses: ./.github/workflows/unit_tests.yaml + windows: + if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.core == 'true' }} + needs: [ prechecks ] + uses: ./.github/workflows/windows_python.yml + all: + needs: [ windows, unit-tests, bootstrap, audit-ancient-python ] + runs-on: ubuntu-latest + steps: + - name: Success + run: "true" diff --git a/.github/workflows/unit_tests.yaml b/.github/workflows/unit_tests.yaml index a1cd2bbd42076b..14ec9b149c4cc0 100644 --- a/.github/workflows/unit_tests.yaml +++ b/.github/workflows/unit_tests.yaml @@ -1,115 +1,46 @@ -name: linux tests +name: unit tests on: - push: - branches: - - develop - - releases/** - pull_request: - branches: - - develop - - releases/** -jobs: - # Validate that the code can be run on all the Python versions - # supported by Spack - validate: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 - with: - python-version: 3.9 - - name: Install Python Packages - run: | - pip install --upgrade pip - pip install --upgrade vermin - - name: vermin (Spack's Core) - run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.5- -vvv lib/spack/spack/ lib/spack/llnl/ bin/ - - name: vermin (Repositories) - run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.5- -vvv var/spack/repos - # Run style checks on the files that have been changed - style: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - with: - fetch-depth: 0 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 - with: - python-version: 3.9 - - name: Install Python packages - run: | - pip install --upgrade pip six setuptools types-six - - name: Setup git configuration - run: | - # Need this for the git tests to succeed. - git --version - . .github/workflows/setup_git.sh - - name: Run style tests - run: | - share/spack/qa/run-style-tests - # Check which files have been updated by the PR - changes: - runs-on: ubuntu-latest - # Set job outputs to values from filter step - outputs: - core: ${{ steps.filter.outputs.core }} - packages: ${{ steps.filter.outputs.packages }} - with_coverage: ${{ steps.coverage.outputs.with_coverage }} - steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - if: ${{ github.event_name == 'push' }} - with: - fetch-depth: 0 - # For pull requests it's not necessary to checkout the code - - uses: dorny/paths-filter@b2feaf19c27470162a626bd6fa8438ae5b263721 - id: filter - with: - # See https://github.com/dorny/paths-filter/issues/56 for the syntax used below - filters: | - core: - - './!(var/**)/**' - packages: - - 'var/**' - # Some links for easier reference: - # - # "github" context: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context - # job outputs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs - # setting environment variables from earlier steps: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable - # - - id: coverage - # Run the subsequent jobs with coverage if core has been modified, - # regardless of whether this is a pull request or a push to a branch - run: | - echo Core changes: ${{ steps.filter.outputs.core }} - echo Event name: ${{ github.event_name }} - if [ "${{ steps.filter.outputs.core }}" == "true" ] - then - echo "::set-output name=with_coverage::true" - else - echo "::set-output name=with_coverage::false" - fi + workflow_dispatch: + workflow_call: +concurrency: + group: unit_tests-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true + +jobs: # Run unit tests with different configurations on linux - unittests: - needs: [ validate, style, changes ] + ubuntu: runs-on: ubuntu-latest strategy: matrix: - python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9] + python-version: ['2.7', '3.6', '3.7', '3.8', '3.9', '3.10'] concretizer: ['clingo'] + on_develop: + - ${{ github.ref == 'refs/heads/develop' }} include: - python-version: 2.7 concretizer: original - - python-version: 3.6 - concretizer: original - - python-version: 3.9 + on_develop: ${{ github.ref == 'refs/heads/develop' }} + - python-version: '3.10' concretizer: original + on_develop: ${{ github.ref == 'refs/heads/develop' }} + exclude: + - python-version: '3.7' + concretizer: 'clingo' + on_develop: false + - python-version: '3.8' + concretizer: 'clingo' + on_develop: false + - python-version: '3.9' + concretizer: 'clingo' + on_develop: false + steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 with: fetch-depth: 0 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 with: python-version: ${{ matrix.python-version }} - name: Install System packages @@ -121,12 +52,16 @@ jobs: patchelf cmake bison libbison-dev kcov - name: Install Python packages run: | - pip install --upgrade pip six setuptools pytest codecov coverage[toml] + pip install --upgrade pip six setuptools pytest codecov[toml] pytest-cov pytest-xdist # ensure style checks are not skipped in unit tests for python >= 3.6 # note that true/false (i.e., 1/0) are opposite in conditions in python and bash if python -c 'import sys; sys.exit(not sys.version_info >= (3, 6))'; then - pip install --upgrade flake8 isort>=4.3.5 mypy>=0.900 black + pip install --upgrade flake8 "isort>=4.3.5" "mypy>=0.900" "click==8.0.4" "black<=21.12b0" fi + - name: Pin pathlib for Python 2.7 + if: ${{ matrix.python-version == 2.7 }} + run: | + pip install -U pathlib2==2.3.6 - name: Setup git configuration run: | # Need this for the git tests to succeed. @@ -140,39 +75,30 @@ jobs: . share/spack/setup-env.sh spack bootstrap untrust spack-install spack -v solve zlib - - name: Run unit tests (full suite with coverage) - if: ${{ needs.changes.outputs.with_coverage == 'true' }} + - name: Run unit tests env: SPACK_PYTHON: python - COVERAGE: true SPACK_TEST_SOLVER: ${{ matrix.concretizer }} + SPACK_TEST_PARALLEL: 2 + COVERAGE: true + UNIT_TEST_COVERAGE: ${{ (matrix.concretizer == 'original' && matrix.python-version == '2.7') || (matrix.python-version == '3.10') }} run: | share/spack/qa/run-unit-tests - coverage combine + coverage combine -a coverage xml - - name: Run unit tests (reduced suite without coverage) - if: ${{ needs.changes.outputs.with_coverage == 'false' }} - env: - SPACK_PYTHON: python - ONLY_PACKAGES: true - SPACK_TEST_SOLVER: ${{ matrix.concretizer }} - run: | - share/spack/qa/run-unit-tests - - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0 - if: ${{ needs.changes.outputs.with_coverage == 'true' }} + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 with: flags: unittests,linux,${{ matrix.concretizer }} # Test shell integration shell: - needs: [ validate, style, changes ] runs-on: ubuntu-latest steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 with: fetch-depth: 0 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 with: - python-version: 3.9 + python-version: '3.10' - name: Install System packages run: | sudo apt-get -y update @@ -180,33 +106,25 @@ jobs: sudo apt-get install -y coreutils kcov csh zsh tcsh fish dash bash - name: Install Python packages run: | - pip install --upgrade pip six setuptools pytest codecov coverage[toml] + pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2 pytest-xdist - name: Setup git configuration run: | # Need this for the git tests to succeed. git --version . .github/workflows/setup_git.sh - - name: Run shell tests (without coverage) - if: ${{ needs.changes.outputs.with_coverage == 'false' }} - run: | - share/spack/qa/run-shell-tests - - name: Run shell tests (with coverage) - if: ${{ needs.changes.outputs.with_coverage == 'true' }} + - name: Run shell tests env: COVERAGE: true run: | share/spack/qa/run-shell-tests - - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0 - if: ${{ needs.changes.outputs.with_coverage == 'true' }} + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 with: flags: shelltests,linux # Test RHEL8 UBI with platform Python. This job is run # only on PRs modifying core Spack rhel8-platform-python: - needs: [ validate, style, changes ] runs-on: ubuntu-latest - if: ${{ needs.changes.outputs.with_coverage == 'true' }} container: registry.access.redhat.com/ubi8/ubi steps: - name: Install dependencies @@ -214,7 +132,7 @@ jobs: dnf install -y \ bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \ make patch tcl unzip which xz - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 - name: Setup repo and non-root user run: | git --version @@ -230,15 +148,14 @@ jobs: spack unit-test -k 'not cvs and not svn and not hg' -x --verbose # Test for the clingo based solver (using clingo-cffi) clingo-cffi: - needs: [ validate, style, changes ] runs-on: ubuntu-latest steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 with: fetch-depth: 0 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 with: - python-version: 3.9 + python-version: '3.10' - name: Install System packages run: | sudo apt-get -y update @@ -248,105 +165,60 @@ jobs: patchelf kcov - name: Install Python packages run: | - pip install --upgrade pip six setuptools pytest codecov coverage[toml] clingo + pip install --upgrade pip six setuptools pytest codecov coverage[toml] pytest-cov clingo pytest-xdist - name: Setup git configuration run: | # Need this for the git tests to succeed. git --version . .github/workflows/setup_git.sh - name: Run unit tests (full suite with coverage) - if: ${{ needs.changes.outputs.with_coverage == 'true' }} env: COVERAGE: true SPACK_TEST_SOLVER: clingo run: | share/spack/qa/run-unit-tests - coverage combine + coverage combine -a coverage xml - - name: Run unit tests (reduced suite without coverage) - if: ${{ needs.changes.outputs.with_coverage == 'false' }} - env: - ONLY_PACKAGES: true - SPACK_TEST_SOLVER: clingo - run: | - share/spack/qa/run-unit-tests - - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0 - if: ${{ needs.changes.outputs.with_coverage == 'true' }} + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # @v2.1.0 with: flags: unittests,linux,clingo # Run unit tests on MacOS - build: - needs: [ validate, style, changes ] + macos: runs-on: macos-latest strategy: matrix: python-version: [3.8] steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 with: fetch-depth: 0 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 with: python-version: ${{ matrix.python-version }} - name: Install Python packages run: | pip install --upgrade pip six setuptools - pip install --upgrade pytest codecov coverage[toml] + pip install --upgrade pytest codecov coverage[toml] pytest-xdist pytest-cov - name: Setup Homebrew packages run: | brew install dash fish gcc gnupg2 kcov - name: Run unit tests env: SPACK_TEST_SOLVER: clingo + SPACK_TEST_PARALLEL: 4 run: | git --version . .github/workflows/setup_git.sh . share/spack/setup-env.sh $(which spack) bootstrap untrust spack-install $(which spack) solve zlib - if [ "${{ needs.changes.outputs.with_coverage }}" == "true" ] - then - coverage run $(which spack) unit-test -x - coverage combine - coverage xml - # Delete the symlink going from ./lib/spack/docs/_spack_root back to - # the initial directory, since it causes ELOOP errors with codecov/actions@2 - rm lib/spack/docs/_spack_root - else - echo "ONLY PACKAGE RECIPES CHANGED [skipping coverage]" - $(which spack) unit-test -x -m "not maybeslow" -k "package_sanity" - fi - - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0 - if: ${{ needs.changes.outputs.with_coverage == 'true' }} + common_args=(--dist loadfile --tx '4*popen//python=./bin/spack-tmpconfig python -u ./bin/spack python' -x) + $(which spack) unit-test --cov --cov-config=pyproject.toml "${common_args[@]}" + coverage combine -a + coverage xml + # Delete the symlink going from ./lib/spack/docs/_spack_root back to + # the initial directory, since it causes ELOOP errors with codecov/actions@2 + rm lib/spack/docs/_spack_root + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 with: - files: ./coverage.xml flags: unittests,macos - - # Run audits on all the packages in the built-in repository - package-audits: - needs: [ validate, style, changes ] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2 - - uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2 - with: - python-version: 3.9 - - name: Install Python packages - run: | - pip install --upgrade pip six setuptools pytest codecov coverage[toml] - - name: Package audits (with coverage) - if: ${{ needs.changes.outputs.with_coverage == 'true' }} - run: | - . share/spack/setup-env.sh - coverage run $(which spack) audit packages - coverage combine - coverage xml - - name: Package audits (wwithout coverage) - if: ${{ needs.changes.outputs.with_coverage == 'false' }} - run: | - . share/spack/setup-env.sh - $(which spack) audit packages - - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0 - if: ${{ needs.changes.outputs.with_coverage == 'true' }} - with: - flags: unittests,linux,audits diff --git a/.github/workflows/valid-style.yml b/.github/workflows/valid-style.yml new file mode 100644 index 00000000000000..f6562a8d724aa8 --- /dev/null +++ b/.github/workflows/valid-style.yml @@ -0,0 +1,60 @@ +name: style + +on: + workflow_call: + inputs: + with_coverage: + required: true + type: string + +concurrency: + group: style-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true + + +jobs: + # Validate that the code can be run on all the Python versions + # supported by Spack + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 + with: + python-version: '3.10' + cache: 'pip' + - name: Install Python Packages + run: | + pip install --upgrade pip + pip install --upgrade vermin + - name: vermin (Spack's Core) + run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.6- -vvv lib/spack/spack/ lib/spack/llnl/ bin/ + - name: vermin (Repositories) + run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.6- -vvv var/spack/repos + # Run style checks on the files that have been changed + style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # @v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 # @v2 + with: + python-version: '3.10' + cache: 'pip' + - name: Install Python packages + run: | + python3 -m pip install --upgrade pip six setuptools types-six click==8.0.2 'black==21.12b0' mypy isort clingo flake8 + - name: Setup git configuration + run: | + # Need this for the git tests to succeed. + git --version + . .github/workflows/setup_git.sh + - name: Run style tests + run: | + share/spack/qa/run-style-tests + audit: + uses: ./.github/workflows/audit.yaml + with: + with_coverage: ${{ inputs.with_coverage }} + python_version: '3.10' diff --git a/.github/workflows/windows_python.yml b/.github/workflows/windows_python.yml new file mode 100644 index 00000000000000..91abe6d3f5f0fb --- /dev/null +++ b/.github/workflows/windows_python.yml @@ -0,0 +1,160 @@ +name: windows + +on: + workflow_call: + +concurrency: + group: windows-${{github.ref}}-${{github.event.pull_request.number || github.run_number}} + cancel-in-progress: true + +defaults: + run: + shell: + powershell Invoke-Expression -Command ".\share\spack\qa\windows_test_setup.ps1"; {0} +jobs: + unit-tests: + runs-on: windows-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 + with: + python-version: 3.9 + - name: Install Python packages + run: | + python -m pip install --upgrade pip six pywin32 setuptools codecov pytest-cov + - name: Create local develop + run: | + .\spack\.github\workflows\setup_git.ps1 + - name: Unit Test + run: | + echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml + cd spack + dir + (Get-Item '.\lib\spack\docs\_spack_root').Delete() + spack unit-test --verbose --cov --cov-config=pyproject.toml --ignore=lib/spack/spack/test/cmd + coverage combine -a + coverage xml + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 + with: + flags: unittests,windows + unit-tests-cmd: + runs-on: windows-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 + with: + python-version: 3.9 + - name: Install Python packages + run: | + python -m pip install --upgrade pip six pywin32 setuptools codecov coverage pytest-cov + - name: Create local develop + run: | + .\spack\.github\workflows\setup_git.ps1 + - name: Command Unit Test + run: | + echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml + cd spack + (Get-Item '.\lib\spack\docs\_spack_root').Delete() + spack unit-test --verbose --cov --cov-config=pyproject.toml lib/spack/spack/test/cmd + coverage combine -a + coverage xml + - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 + with: + flags: unittests,windows + build-abseil: + runs-on: windows-latest + steps: + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 + with: + python-version: 3.9 + - name: Install Python packages + run: | + python -m pip install --upgrade pip six pywin32 setuptools codecov coverage + - name: Build Test + run: | + spack compiler find + echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml + spack external find cmake + spack external find ninja + spack install abseil-cpp + make-installer: + runs-on: windows-latest + steps: + - name: Disable Windows Symlinks + run: | + git config --global core.symlinks false + shell: + powershell + - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 + with: + fetch-depth: 0 + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 + with: + python-version: 3.9 + - name: Install Python packages + run: | + python -m pip install --upgrade pip six pywin32 setuptools + - name: Add Light and Candle to Path + run: | + $env:WIX >> $GITHUB_PATH + - name: Run Installer + run: | + .\spack\share\spack\qa\setup_spack.ps1 + spack make-installer -s spack -g SILENT pkg + echo "installer_root=$((pwd).Path)" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + env: + ProgressPreference: SilentlyContinue + - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 + with: + name: Windows Spack Installer Bundle + path: ${{ env.installer_root }}\pkg\Spack.exe + - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 + with: + name: Windows Spack Installer + path: ${{ env.installer_root}}\pkg\Spack.msi + execute-installer: + needs: make-installer + runs-on: windows-latest + defaults: + run: + shell: pwsh + steps: + - uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5 + with: + python-version: 3.9 + - name: Install Python packages + run: | + python -m pip install --upgrade pip six pywin32 setuptools + - name: Setup installer directory + run: | + mkdir -p spack_installer + echo "spack_installer=$((pwd).Path)\spack_installer" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + - uses: actions/download-artifact@v3 + with: + name: Windows Spack Installer Bundle + path: ${{ env.spack_installer }} + - name: Execute Bundled Installer + run: | + $proc = Start-Process ${{ env.spack_installer }}\spack.exe "/install /quiet" -Passthru + $handle = $proc.Handle # cache proc.Handle + $proc.WaitForExit(); + $LASTEXITCODE + env: + ProgressPreference: SilentlyContinue + - uses: actions/download-artifact@v3 + with: + name: Windows Spack Installer + path: ${{ env.spack_installer }} + - name: Execute MSI + run: | + $proc = Start-Process ${{ env.spack_installer }}\spack.msi "/quiet" -Passthru + $handle = $proc.Handle # cache proc.Handle + $proc.WaitForExit(); + $LASTEXITCODE