diff options
Diffstat (limited to '.github/workflows/unit_tests.yaml')
-rw-r--r-- | .github/workflows/unit_tests.yaml | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/.github/workflows/unit_tests.yaml b/.github/workflows/unit_tests.yaml new file mode 100644 index 0000000000..7fcd61d9f4 --- /dev/null +++ b/.github/workflows/unit_tests.yaml @@ -0,0 +1,337 @@ +name: linux 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@v2 + - uses: actions/setup-python@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 --backport typing -t=2.6- -t=3.5- -v lib/spack/spack/ lib/spack/llnl/ bin/ + - name: vermin (Repositories) + run: vermin --backport argparse --backport typing -t=2.6- -t=3.5- -v var/spack/repos + # Run style checks on the files that have been changed + style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install Python packages + run: | + pip install --upgrade pip six setuptools flake8 mypy>=0.800 black + - 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 + # Build the documentation + documentation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install System packages + run: | + sudo apt-get -y update + sudo apt-get install -y coreutils ninja-build graphviz + - name: Install Python packages + run: | + pip install --upgrade pip six setuptools + pip install --upgrade -r lib/spack/docs/requirements.txt + - name: Build documentation + run: | + share/spack/qa/run-doc-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: + # For pull requests it's not necessary to checkout the code + - uses: dorny/paths-filter@v2 + 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 this is a PR and core has been modified + # or if this workflow is triggered by a push event (this means that once a PR is + # merged we'll perform a full run with CI on develop even though the PR was only + # modifying packages) + run: | + echo Core changes: ${{ steps.filter.outputs.core }} + echo Event name: ${{ github.event_name }} + if [ "${{ steps.filter.outputs.core }}" == "true" ] || [ "${{ github.event_name }}" == 'push' ] + then + echo "::set-output name=with_coverage::true" + else + echo "::set-output name=with_coverage::false" + fi + + # Run unit tests with different configurations on linux + unittests: + needs: [ validate, style, documentation, changes ] + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9] + concretizer: ['original', 'clingo'] + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install System packages + run: | + sudo apt-get -y update + # Needed for unit tests + sudo apt-get install -y coreutils gfortran graphviz gnupg2 mercurial + sudo apt-get install -y ninja-build patchelf + # Needed for kcov + sudo apt-get -y install cmake binutils-dev libcurl4-openssl-dev + sudo apt-get -y install zlib1g-dev libdw-dev libiberty-dev + - name: Install Python packages + run: | + pip install --upgrade pip six setuptools codecov coverage + - name: Setup git configuration + run: | + # Need this for the git tests to succeed. + git --version + . .github/workflows/setup_git.sh + - name: Install kcov for bash script coverage + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + env: + KCOV_VERSION: 34 + run: | + KCOV_ROOT=$(mktemp -d) + wget --output-document=${KCOV_ROOT}/${KCOV_VERSION}.tar.gz https://github.com/SimonKagstrom/kcov/archive/v${KCOV_VERSION}.tar.gz + tar -C ${KCOV_ROOT} -xzvf ${KCOV_ROOT}/${KCOV_VERSION}.tar.gz + mkdir -p ${KCOV_ROOT}/build + cd ${KCOV_ROOT}/build && cmake -Wno-dev ${KCOV_ROOT}/kcov-${KCOV_VERSION} && cd - + make -C ${KCOV_ROOT}/build && sudo make -C ${KCOV_ROOT}/build install + - name: Bootstrap clingo from sources + if: ${{ matrix.concretizer == 'clingo' }} + run: | + . share/spack/setup-env.sh + spack external find --not-buildable cmake bison + spack -v solve zlib + - name: Run unit tests (full suite with coverage) + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + env: + COVERAGE: true + SPACK_TEST_SOLVER: ${{ matrix.concretizer }} + run: | + share/spack/qa/run-unit-tests + coverage combine + coverage xml + - name: Run unit tests (reduced suite without coverage) + if: ${{ needs.changes.outputs.with_coverage == 'false' }} + env: + ONLY_PACKAGES: true + SPACK_TEST_SOLVER: ${{ matrix.concretizer }} + run: | + share/spack/qa/run-unit-tests + - uses: codecov/codecov-action@v1 + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + with: + flags: unittests,linux,${{ matrix.concretizer }} + # Test shell integration + shell: + needs: [ validate, style, documentation, changes ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install System packages + run: | + sudo apt-get -y update + # Needed for shell tests + sudo apt-get install -y coreutils csh zsh tcsh fish dash bash + # Needed for kcov + sudo apt-get -y install cmake binutils-dev libcurl4-openssl-dev + sudo apt-get -y install zlib1g-dev libdw-dev libiberty-dev + - name: Install Python packages + run: | + pip install --upgrade pip six setuptools codecov coverage + - name: Setup git configuration + run: | + # Need this for the git tests to succeed. + git --version + . .github/workflows/setup_git.sh + - name: Install kcov for bash script coverage + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + env: + KCOV_VERSION: 38 + run: | + KCOV_ROOT=$(mktemp -d) + wget --output-document=${KCOV_ROOT}/${KCOV_VERSION}.tar.gz https://github.com/SimonKagstrom/kcov/archive/v${KCOV_VERSION}.tar.gz + tar -C ${KCOV_ROOT} -xzvf ${KCOV_ROOT}/${KCOV_VERSION}.tar.gz + mkdir -p ${KCOV_ROOT}/build + cd ${KCOV_ROOT}/build && cmake -Wno-dev ${KCOV_ROOT}/kcov-${KCOV_VERSION} && cd - + make -C ${KCOV_ROOT}/build && sudo make -C ${KCOV_ROOT}/build install + - 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' }} + env: + COVERAGE: true + run: | + share/spack/qa/run-shell-tests + - uses: codecov/codecov-action@v1 + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + with: + flags: shelltests,linux + # Test for Python2.6 run on Centos 6 + centos6: + needs: [ validate, style, documentation ] + runs-on: ubuntu-latest + container: spack/github-actions:centos6 + steps: + - name: Run unit tests + env: + HOME: /home/spack-test + run: | + whoami && echo $HOME && cd $HOME + git clone https://github.com/spack/spack.git && cd spack + git fetch origin ${{ github.ref }}:test-branch + git checkout test-branch + share/spack/qa/run-unit-tests + + # Test RHEL8 UBI with platform Python + rhel8-platform-python: + needs: [ validate, style, documentation ] + runs-on: ubuntu-latest + container: registry.access.redhat.com/ubi8/ubi + steps: + - name: Install dependencies + run: | + dnf install -y \ + bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \ + make patch tcl unzip which xz + - uses: actions/checkout@v2 + - name: Setup repo and non-root user + run: | + git --version + git fetch --unshallow + . .github/workflows/setup_git.sh + useradd spack-test + chown -R spack-test . + - name: Run unit tests + env: + SPACK_PYTHON: /usr/libexec/platform-python + shell: runuser -u spack-test -- bash {0} + run: | + source share/spack/setup-env.sh + spack unit-test -k 'not svn and not hg' -x --verbose + # Test for the clingo based solver (using clingo-cffi) + clingo-cffi: + needs: [ validate, style, documentation, changes ] + runs-on: ubuntu-latest + container: spack/github-actions:clingo-cffi + steps: + - name: Run unit tests + run: | + whoami && echo PWD=$PWD && echo HOME=$HOME && echo SPACK_TEST_SOLVER=$SPACK_TEST_SOLVER + python3 -c "import clingo; print(hasattr(clingo.Symbol, '_rep'), clingo.__version__)" + git clone https://github.com/spack/spack.git && cd spack + git fetch origin ${{ github.ref }}:test-branch + git checkout test-branch + . share/spack/setup-env.sh + spack compiler find + spack solve mpileaks%gcc + coverage run $(which spack) unit-test -v + coverage combine + coverage xml + - uses: codecov/codecov-action@v1 + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + with: + flags: unittests,linux,clingo + # Run unit tests on MacOS + build: + needs: [ validate, style, documentation, changes ] + runs-on: macos-latest + strategy: + matrix: + python-version: [3.8] + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install Python packages + run: | + pip install --upgrade pip six setuptools + pip install --upgrade codecov coverage + pip install --upgrade flake8 pep8-naming mypy + - name: Setup Homebrew packages + run: | + brew install dash fish gcc gnupg2 kcov + - name: Run unit tests + run: | + git --version + . .github/workflows/setup_git.sh + . share/spack/setup-env.sh + if [ "${{ needs.changes.outputs.with_coverage }}" == "true" ] + then + coverage run $(which spack) unit-test -x + coverage combine + coverage xml + else + echo "ONLY PACKAGE RECIPES CHANGED [skipping coverage]" + $(which spack) unit-test -x -m "not maybeslow" + fi + - uses: codecov/codecov-action@v1 + if: ${{ needs.changes.outputs.with_coverage == 'true' }} + with: + file: ./coverage.xml + flags: unittests,macos |