avocado-framework/avocado

View on GitHub
.github/workflows/ci.yml

Summary

Maintainability
Test Coverage
name: GH Actions

on:
  pull_request:
  workflow_dispatch:

jobs:
  static-checks:

    name: Static checks
    runs-on: ubuntu-20.04
    container:
      image: quay.io/avocado-framework/avocado-ci-fedora-38

    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}
      - name: Allow git to operate on directory checked out by GH Actions
        run: git config --global --add safe.directory `pwd`
      - name: Installing Avocado development dependencies
        run: make requirements-dev
      - name: Installing Avocado in develop mode
        run: python3 setup.py develop --user
      - name: Run static checks
        env:
          COMMIT_COUNT: ${{ github.event.pull_request.commits  }}
        run: python3 setup.py test --select=static-checks
      - name: Archive failed tests logs
        if: failure()
        uses: actions/upload-artifact@v3
        with:
          name: static-checks-logs
          path: /home/runner/avocado/job-results/
          retention-days: 1
      - run: echo "🥑 This job's status is ${{ job.status }}."

  smokecheck-linux:

    name: Smokecheck on Linux with Python ${{ matrix.python-version }}
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        python-version: [3.8, 3.9, 3.10.0, 3.11, 3.12.0]
      fail-fast: false

    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install setuptools on Python 3.12
        run: python3 -c 'import setuptools' || python3 -m pip install setuptools
      - name: Avocado smokecheck
        run: make smokecheck

  check-linux:

    name: Linux with Python ${{ matrix.python-version }}
    runs-on: ubuntu-20.04
    needs: smokecheck-linux

    strategy:
      matrix:
        python-version: [3.8, 3.9, 3.10.0, 3.11, 3.12.0]
      fail-fast: false

    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Display Python version
        run: python -V --version
      - name: Install dependencies
        run: pip install -r requirements-dev.txt
      - name: Install setuptools on Python 3.12
        run: python3 -c 'import setuptools' || python3 -m pip install setuptools
      - name: Installing Avocado in develop mode
        run: python3 setup.py develop --user
      - name: Avocado version
        run: avocado --version
      - name: Unittests and fast functional tests
        run: python3 setup.py test --skip=static-checks
      - name: Archive failed tests logs
        if: failure()
        uses: actions/upload-artifact@v3
        with:
          name: linux-logs-${{ matrix.python-version }}
          path: /home/runner/avocado/job-results/
          retention-days: 1
      - run: echo "🥑 This job's status is ${{ job.status }}."

  code-coverage:

    name: Code Coverage
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        python-version: [3.11]
    env:
      CC_TEST_REPORTER_ID: "387887b88a76f31c2c376219fc749689ea5975c8fe7fcd9609f1dcc139e053a6"

    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install
        run: |
         pip install -r requirements-dev.txt
         curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
         chmod +x ./cc-test-reporter
      - name: Run pre script
        run: ./cc-test-reporter before-build
      - name: Run script
        run: make develop && ./selftests/run_coverage
      - name: Run post script
        run: ./cc-test-reporter after-build
      - run: echo "🥑 This job's status is ${{ job.status }}."


# macOS check on latest Python

  check-macos:

    name: macOS with Python ${{ matrix.python-version }}
    runs-on: macos-12

    strategy:
      matrix:
        python-version: [3.11.1]

    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Display Python version
        run: python -V --version
      - name: Install avocado
        run: |
          python3 -m pip install -r requirements-dev.txt
          python setup.py develop --user
      - name: Show avocado help
        run: python -m avocado --help
      - name: Example test
        run: python -m avocado run examples/tests/passtest.py
      - name: List test
        run: python -m avocado --verbose list selftests/unit/* selftests/functional/* selftests/*sh
      - name: Run a subset of avocado's selftests
        run: PATH=~/Library/Python/3.11/bin:$PATH ./selftests/check.py --skip=static-checks
      - run: echo "🥑 This job's status is ${{ job.status }}."


# Windows checks on latest Python

  smokecheck-windows:

    name: Windows with Python ${{ matrix.python-version }}
    runs-on: windows-2019

    strategy:
      matrix:
        python-version: [3.9, 3.10.0, 3.11, 3.12.0]

    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Display Python version
        run: python -V --version
      - name: Install setuptools on Python 3.12
        run: python -c 'import setuptools' || python -m pip install setuptools
      - name: Install avocado
        run: python setup.py develop --user
      - name: Show avocado help
        run: python -m avocado --help
      - name: Example test
        run: python -m avocado run examples\tests\passtest.py
      - run: echo "🥑 This job's status is ${{ job.status }}."


# Checks that Python packages builds succeeds

  package-build:
    name: Build Package (wheel/tarball) for Python ${{ matrix.python-version }}
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        python-version: [3.8, 3.9, 3.10.0, 3.11, 3.12.0]
      fail-fast: false

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install setuptools on Python 3.12
      run: python3 -c 'import setuptools' || python3 -m pip install setuptools
    - name: Build tarballs and wheels
      run: make -f Makefile.gh build-wheel check-wheel
    - name: Save tarballs and wheels as artifacts
      uses: actions/upload-artifact@v3
      with:
        name: tarballs_and_wheels-${{ matrix.python-version }}
        path: ${{github.workspace}}/PYPI_UPLOAD/
        retention-days: 1
    - run: echo "🥑 This job's status is ${{ job.status }}."

  egg-build:
    name: Build Egg for Python ${{ matrix.python-version }}
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        python-version: [3.8, 3.9, 3.10.0, 3.11, 3.12.0]
      fail-fast: false

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install setuptools on Python 3.12
      run: python3 -c 'import setuptools' || python3 -m pip install setuptools
    - name: Build eggs
      run: make -f Makefile.gh build-egg
    - name: Save eggs as artifacts
      uses: actions/upload-artifact@v3
      with:
        name: eggs-${{ matrix.python-version }}
        path: ${{github.workspace}}/EGG_UPLOAD/
        retention-days: 1
    - run: echo "🥑 This job's status is ${{ job.status }}."

  experimental-checks:
    name: Experimental checks
    runs-on: ubuntu-20.04
    steps:
      - run: echo "Job triggered by a ${{ github.event_name }} event on branch is ${{ github.ref }} in repository is ${{ github.repository }}, runner on ${{ runner.os }}"
      - name: Check out repository code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Run Codespell Check
        run: make -f Makefile.gh codespell
      - name: Run bandit check
        run: make -f Makefile.gh bandit
        continue-on-error: True
      - name: Save bandit output as artifacts
        uses: actions/upload-artifact@v3
        with:
          name: bandit-results
          path: /home/runner/work/avocado/avocado/bandit-output.txt
          retention-days: 1
      - run: echo "🥑 This job's status is ${{ job.status }}."

  version_task_fedora_37:

    name: Version task fedora:37
    runs-on: ubuntu-20.04
    container:
      image: fedora:37
    steps:
      - name: Install Python dependencies
        run: dnf -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_fedora_38:

    name: Version task fedora:38
    runs-on: ubuntu-20.04
    container:
      image: fedora:38
    steps:
      - name: Install Python dependencies
        run: dnf -y install python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_ubi_8:

    name: Version task ubi:8.8
    runs-on: ubuntu-20.04
    container:
      image: registry.access.redhat.com/ubi8/ubi:8.8
    steps:
      - name: Install Python dependencies
        run: dnf -y install python3.11 python3.11-setuptools python3.11-setuptools-rust
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_ubi_9:

    name: Version task ubi:9.2
    runs-on: ubuntu-20.04
    container:
      image: registry.access.redhat.com/ubi9/ubi:9.2
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_debian_12:

    name: Version task debian:12.4
    runs-on: ubuntu-20.04
    container:
      image: debian:12.4
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_debian_11:

    name: Version task debian:11.0
    runs-on: ubuntu-20.04
    container:
      image: debian:11.0
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_ubuntu_22:

    name: Version task ubuntu:22.04
    runs-on: ubuntu-20.04
    container:
      image: ubuntu:22.04
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools ca-certificates
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  version_task_ubuntu_20:

    name: Version task ubuntu:20.04
    runs-on: ubuntu-20.04
    container:
      image: ubuntu:20.04
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools ca-certificates
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/version

  egg_task_fedora_37:

    name: Egg task fedora:37
    runs-on: ubuntu-20.04
    container:
      image: fedora:37
    steps:
      - name: Install Python dependencies
        run: dnf -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_fedora_38:

    name: Egg task fedora:38
    runs-on: ubuntu-20.04
    container:
      image: fedora:38
    steps:
      - name: Install Python dependencies
        run: dnf -y install python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_ubi_8:

    name: Egg task ubi:8.8
    runs-on: ubuntu-20.04
    container:
      image: registry.access.redhat.com/ubi8/ubi:8.8
    steps:
      - name: Install Python dependencies
        run: dnf -y install python38 python38-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_ubi_9:

    name: Egg task ubi:9.2
    runs-on: ubuntu-20.04
    container:
      image: registry.access.redhat.com/ubi9/ubi:9.2
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_debian_12:

    name: Egg task debian:12.4
    runs-on: ubuntu-20.04
    container:
      image: debian:12.4
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_debian_11:

    name: Egg task debian:11.0
    runs-on: ubuntu-20.04
    container:
      image: debian:11.0
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_ubuntu_22:

    name: Egg task ubuntu:22.04
    runs-on: ubuntu-20.04
    container:
      image: ubuntu:22.04
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  egg_task_ubuntu_20:

    name: Egg task ubuntu:20.04
    runs-on: ubuntu-20.04
    container:
      image: ubuntu:20.04
    steps:
      - name: Install Python dependencies
        run: apt update && apt -y install python3 python3-setuptools
      - name: Check out repository code
        uses: actions/checkout@v3
      - uses: ./.github/actions/egg

  podman_egg_task:

    name: Podman Egg task
    runs-on: ubuntu-22.04
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Test running avocado from eggs under Podman spawner
        run: |
         apt update && apt -y install python3 python3-setuptools
         python3 setup.py bdist_egg
         mv dist/avocado_framework-*egg /tmp/avocado_framework.egg
         python3 setup.py clean --all
         python3 -c 'import sys; sys.path.insert(0, "/tmp/avocado_framework.egg"); from avocado.core.main import main; sys.exit(main())' run --spawner=podman --spawner-podman-image=fedora:38 --spawner-podman-avocado-egg=file:///tmp/avocado_framework.egg -- /bin/true

  podman_external_runner_task:

    name: Podman spawner with 3rd party runner plugin
    runs-on: ubuntu-22.04
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Test running avocado from released eggs under Podman spawner with 3rd party plugins
        run: |
         apt update && apt -y install python3 python3-setuptools
         python3 setup.py develop --user
         cd examples/plugins/tests/magic
         python3 setup.py develop --user
         cd ../../../../
         python3 -m avocado -V list -- magic:pass magic:fail | grep "magic: 2"
         podman pull quay.io/avocado-framework/avocado-ci-magic
         python3 -m avocado run --spawner=podman --spawner-podman-image=quay.io/avocado-framework/avocado-ci-magic -- magic:pass
         tail -n1 ~/avocado/job-results/latest/results.tap | grep "ok 1 magic:pass"
         python3 -m avocado run --spawner=podman --spawner-podman-image=quay.io/avocado-framework/avocado-ci-magic -- magic:fail || true
         tail -n1 ~/avocado/job-results/latest/results.tap | grep "not ok 1 magic:fail"

  fedora_develop_install_uninstall_task:
    name: Fedora develop install/uninstall task
    runs-on: ubuntu-latest
    container:
      image: fedora:38
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Test avocado install/uninstall
        run: |
         python3 -c 'import setuptools' || dnf -y install python3 python3-setuptools
         python3 setup.py develop --user
         test `python3 -m avocado plugins | grep ^html | wc -l` -eq "3"
         test `python3 -m avocado plugins | grep ^robot | wc -l` -eq "2"
         python3 setup.py develop --user --uninstall
         python3 setup.py clean --all
         python3 setup.py develop --user --skip-optional-plugins
         python3 -m avocado --version
         test `python3 -m avocado plugins | grep ^html | wc -l` -eq "0"
         test `python3 -m avocado plugins | grep ^robot | wc -l` -eq "0"


  fedora_selftests_task:
    name: Fedora selftests
    runs-on: ubuntu-latest
    container:
      image: quay.io/avocado-framework/avocado-ci-fedora-36
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Run unittests and functional tests
        run: |
         make develop
         PATH=$HOME/.local/bin:$PATH LANG=en_US.UTF-8 AVOCADO_CHECK_LEVEL=0 python3 selftests/check.py  --skip static-checks