From 207b0735003c00953863863ad3f0dd9449c23967 Mon Sep 17 00:00:00 2001 From: xoviat <49173759+xoviat@users.noreply.github.com> Date: Thu, 8 Apr 2021 01:06:30 -0500 Subject: [PATCH] ci: consolidate with github actions (#5700) Co-authored-by: Legorooj <50370070+Legorooj@users.noreply.github.com> --- .github/workflows/cancel.yml | 13 ++ .github/workflows/ci.yml | 112 ++++++++++++++++ .github/workflows/macos.yml | 64 --------- .travis.yml | 156 ---------------------- appveyor.yml | 250 ----------------------------------- 5 files changed, 125 insertions(+), 470 deletions(-) create mode 100644 .github/workflows/cancel.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/macos.yml delete mode 100644 .travis.yml delete mode 100644 appveyor.yml diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml new file mode 100644 index 0000000000..a9a3b7a69a --- /dev/null +++ b/.github/workflows/cancel.yml @@ -0,0 +1,13 @@ +name: Cancel Previous Runs +on: + workflow_run: + workflows: ["CI"] + types: + - requested +jobs: + cancel: + runs-on: ubuntu-latest + steps: + - uses: styfle/cancel-workflow-action@0.8.0 + with: + workflow_id: ${{ github.event.workflow.id }} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..2bac834377 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,112 @@ +name: CI + +# Controls when the action will run. Triggers the workflow on push or pull request +## events but only for the master branch +on: + push: + branches: + - 'develop' + pull_request: + branches: + - '**' + - '!master' + - '!pyup/**' + +jobs: + tests: + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [3.6, 3.7, 3.8, 3.9] + os: ['ubuntu-latest', 'macos-latest', 'windows-latest'] + fail-fast: false + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Install apt packages + if: startsWith(matrix.os, 'ubuntu') + run: | + sudo apt-get install -qq \ + libxml2-dev libxslt1-dev gfortran libatlas-base-dev \ + libespeak1 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 \ + libxkbcommon-x11-0 libxcb-icccm4 libxcb1 openssl \ + libxcb-randr0-dev libxcb-xtest0-dev libxcb-xinerama0-dev \ + libxcb-shape0-dev libxcb-xkb-dev xvfb + + - name: Download AppImage tool + if: startsWith(matrix.os, 'ubuntu') + run: | + wget \ + https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage \ + -O $HOME/appimagetool-x86_64.AppImage + chmod a+x $HOME/appimagetool-x86_64.AppImage + + - name: Set cache dir + run: echo "pip_cache_dir=$(pip cache dir)" >> $GITHUB_ENV + shell: bash + + - name: Fetch cache + id: cache-target + uses: actions/cache@v2 + with: + path: ${{ env.pip_cache_dir }} + key: ${{ runner.os }}-${{ matrix.python-version }} + + - name: Set up environment + run: | + # Update pip. + python -m pip install -U pip setuptools wheel + + # Install dependencies for tests. + pip install --progress-bar=off -U -r tests/requirements-tools.txt -r tests/requirements-libraries.txt + + # Install PyInstaller Hook Sample, to ensure that tests declared in + # entry-points are discovered. + pip install https://github.com/pyinstaller/hooksample/archive/v4.0rc1.zip + + # Compile bootloader + cd bootloader + python waf all + cd .. + + # Install PyInstaller. + pip install --progress-bar=off -e . + + # Make sure the help options print. + python -m pyinstaller -h + + - name: Start display server + if: startsWith(matrix.os, 'ubuntu') + run: | + Xvfb :99 & + echo "DISPLAY=:99" >> $GITHUB_ENV + echo "QT_DEBUG_PLUGINS=1" >> $GITHUB_ENV + + - name: Run tests + if: ${{ !startsWith(matrix.os, 'macos') }} + uses: xoviat/actions-pytest@0.1-alpha1 + with: + args: -n 3 --maxfail 3 --durations 10 tests/unit tests/functional --force-flaky --no-flaky-report + + - name: Run tests + if: startsWith(matrix.os, 'macos') + uses: xoviat/actions-pytest@0.1-alpha1 + with: + args: > + -n 3 --maxfail 3 --durations 10 tests/unit tests/functional --ignore tests/functional/test_libraries.py + --force-flaky --no-flaky-report + + - name: Run hooksample tests + if: startsWith(matrix.os, 'macos') + run: | + # The ``run_tests`` script is invoked with the ``-c`` option to + # specify a ``pytest.ini``, rather than allowing pytest to find + # something unexpected in the filesystem (it searches from the root + # dir all the way to the top of the filesystem per + # https://docs.pytest.org/en/latest/customize.html). + python -m PyInstaller.utils.run_tests -c PyInstaller/utils/pytest.ini --include_only=pyi_hooksample. diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml deleted file mode 100644 index 0e566c575a..0000000000 --- a/.github/workflows/macos.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: macOS CI - -# Controls when the action will run. Triggers the workflow on push or pull request -## events but only for the master branch -on: - push: - branches: - - 'develop' - pull_request: - branches: - - '**' - -jobs: - skip_ci: - runs-on: ubuntu-latest - outputs: - canSkip: ${{ steps.check.outputs.canSkip }} - steps: - - id: check - uses: Legorooj/skip-ci@main - - tests: - needs: skip_ci - if: ${{ needs.skip_ci.outputs.canSkip != 'true' }} - runs-on: macos-latest - strategy: - matrix: - python-version: [3.6, 3.7, 3.8, 3.9] - fail-fast: false - steps: - - uses: actions/checkout@v2 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up environment - run: | - # Update pip. - python -m pip install -U pip setuptools wheel - - # Install dependencies for tests. - pip install --progress-bar=off -U -r tests/requirements-tools.txt -r tests/requirements-libraries.txt - - # Install PyInstaller Hook Sample, to ensure that tests declared in - # entry-points are discovered. - pip install https://github.com/pyinstaller/hooksample/archive/v4.0rc1.zip - - # Compile bootloader - cd bootloader - python waf distclean all - cd .. - - # Install PyInstaller. - pip install --progress-bar=off -e . - - # Make sure the help options print. - python -m pyinstaller -h - - - name: Run tests - run: | - pytest -n 3 --maxfail 3 --durations 10 tests/unit tests/functional --ignore tests/functional/test_libraries.py \ - --force-flaky --no-flaky-report diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 143057738a..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,156 +0,0 @@ -language: python - -branches: - except: - - /pyup\/.*/ - - -dist: bionic - -# Cache pip packages. Explicitly name the pip-cache directory since we -# use a custom `install` step which annuls `cache: pip`. -cache: - directories: - - $HOME/.cache/pip - - $HOME/py37 - -os: - - linux - -services: - # PyQt5 tests require a GUI. See https://docs.travis-ci.com/user/gui-and-headless-browsers/#using-services-xvfb. - - xvfb - -env: - global: - # Obtain diagnostic information from Qt about each plugin it tries to load. - - QT_DEBUG_PLUGINS=1 - -jobs: - fast_finish: true - include: - - &test-pyinstaller - stage: Test - PyInstaller - python: 3.7 - before_install: - # Download the appimagetool binary for AppImage-specific tests - - > - wget - https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage - -O $HOME/appimagetool-x86_64.AppImage - - chmod a+x $HOME/appimagetool-x86_64.AppImage - script: - # -n 3 - # Run tests and speed them up by sending them to multiple CPUs. - # - # --maxfail 3 - # End tests after 3 failures. - # - # --durations 10 - # Print the 10 longest tests; see - # https://docs.pytest.org/en/latest/usage.html#profiling-test-execution-duration - - > - pytest -n 3 --maxfail 3 --durations 10 --force-flaky --no-flaky-report - tests/unit tests/functional - --ignore tests/functional/test_libraries.py - - - &test-libraries - stage: Test - Libraries - python: 3.7 - before_install: - # Install OpenSSL 1.1. This fixes dynamic linking problems when PyQt5.13 tries - # to link with OpenSSL 1.1 -- on Ubuntu 16 (xenial), the older OpenSSL - # produces errors like ``qt.network.ssl: QSslSocket: cannot resolve - # OPENSSL_init_ssl``. - - sudo add-apt-repository ppa:carsten-uppenbrink-net/openssl -y - - sudo apt-get update -q - - sudo apt install openssl -q - script: - - > - pytest -n 3 --maxfail 3 --durations 10 - tests/functional/test_libraries.py - # The ``run_tests`` script is invoked with the ``-c`` option to - # specify a ``pytest.ini``, rather than allowing pytest to find - # something unexpected in the filesystem (it searches from the root - # dir all the way to the top of the filesystem per - # https://docs.pytest.org/en/latest/customize.html). - - python -m PyInstaller.utils.run_tests -c PyInstaller/utils/pytest.ini --include_only=pyi_hooksample. - - - <<: *test-pyinstaller - python: 3.6 - - <<: *test-libraries - python: 3.6 - - - <<: *test-pyinstaller - python: 3.8 - - <<: *test-libraries - python: 3.8 - - - <<: *test-pyinstaller - python: 3.9 - - <<: *test-libraries - python: 3.9 - - - <<: *test-pyinstaller - python: nightly - - <<: *test-libraries - python: nightly - - allow_failures: - # Just tests how PyInstaller performs with upcoming Python - - python: "nightly" - -addons: - # Python packages should be installed by "pip" via the "test/requirements-library.txt" specification. - apt: - packages: - # lxml dependencies. - - libxml2-dev - - libxslt1-dev - # pyttsx dependencies. - - libespeak1 - # SciPy dependencies. - - gfortran - - libatlas-base-dev - # PyQt5 dependencies. - - libxkbcommon-x11-0 - - libxcb-icccm4 - - libxcb-image0 - - libxcb-keysyms1 - - libxcb1 - - libxcb-randr0 - - libxcb-render-util0 - - libxcb-xinerama0 - -install: - # Update pip. - - python -m pip install -U pip setuptools wheel | cat - - # Install dependencies for tests. - - pip install --progress-bar=off -U -r tests/requirements-tools.txt -r tests/requirements-libraries.txt - - # Install PyInstaller Hook Sample, to ensure that tests declared in - # entry-points are discovered. - - pip install https://github.com/pyinstaller/hooksample/archive/v4.0rc1.zip - - # Compile bootloader - - cd bootloader - - python waf distclean all - - cd .. - - # Install PyInstaller. - - pip install --progress-bar=off -e . - - # Make sure the help options print. - - python -m pyinstaller -h - -script: - - true - -notifications: - irc: - channels: - - "irc.freenode.org#pyinstaller" - use_notice: true - # skip_join: true would require +n mode *not to be set on #pyinstaller - skip_join: false diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 97ba79169a..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,250 +0,0 @@ -# As config was originally based on an example by Olivier Grisel. Thanks! -# https://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor.yml - -image: Visual Studio 2019 -clone_depth: 50 - - -branches: - except: - - /pyup\/.*/ - - -environment: - PYTEST: pytest -n2 --maxfail 5 --durations=10 --junitxml=junit-results.xml - # See https://www.appveyor.com/docs/build-cache/#saving-cache-for-failed-build. - APPVEYOR_SAVE_CACHE_ON_ERROR: true - - # Set this to one of "init", "pre-test", "post-test" or "end" to to enable - # Remote Desktop access to the build worker VM. This will pause the build - # until a special "lock" file on the VM desktop is deleted. 60 min time - # limit still applies, thus you might want to reduce the test cases to be - # processed. For details please refer to - # https://www.appveyor.com/docs/how-to/rdp-to-build-worker/. - ENABLE_RDP_ACCESS: false - - matrix: - - PYTHON: C:\Python39-x64 - PYTHON_VERSION: 3.9 - PYTHON_ARCH: 64 - TEST_PART: Libraries - - - PYTHON: C:\Python39-x64 - PYTHON_VERSION: 3.9 - PYTHON_ARCH: 64 - TEST_PART: Base - - - PYTHON: C:\Python39 - PYTHON_VERSION: 3.9 - PYTHON_ARCH: 32 - TEST_PART: Libraries - - - PYTHON: C:\Python39 - PYTHON_VERSION: 3.9 - PYTHON_ARCH: 32 - TEST_PART: Base - - - PYTHON: C:\Python38-x64 - PYTHON_VERSION: 3.8 - PYTHON_ARCH: 64 - TEST_PART: Libraries - - - PYTHON: C:\Python38-x64 - PYTHON_VERSION: 3.8 - PYTHON_ARCH: 64 - TEST_PART: Base - - - PYTHON: C:\Python38 - PYTHON_VERSION: 3.8 - PYTHON_ARCH: 32 - TEST_PART: Libraries - - - PYTHON: C:\Python38 - PYTHON_VERSION: 3.8 - PYTHON_ARCH: 32 - TEST_PART: Base - - - PYTHON: C:\Python37-x64 - PYTHON_VERSION: 3.7 - PYTHON_ARCH: 64 - TEST_PART: Libraries - - - PYTHON: C:\Python37-x64 - PYTHON_VERSION: 3.7 - PYTHON_ARCH: 64 - TEST_PART: Base - - - PYTHON: C:\Python37 - PYTHON_VERSION: 3.7 - PYTHON_ARCH: 32 - TEST_PART: Libraries - - - PYTHON: C:\Python37 - PYTHON_VERSION: 3.7 - PYTHON_ARCH: 32 - TEST_PART: Base - - - PYTHON: C:\Python36 - PYTHON_VERSION: 3.6 - PYTHON_ARCH: 32 - TEST_PART: Libraries - - - PYTHON: C:\Python36 - PYTHON_VERSION: 3.6 - PYTHON_ARCH: 32 - TEST_PART: Base - -init: - - ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH% - - ECHO \"%APPVEYOR_SCHEDULED_BUILD%\" - # If there is a newer build queued for the same PR, cancel this one. - # The AppVeyor 'rollout builds' option is supposed to serve the same - # purpose but it is problematic because it tends to cancel builds pushed - # directly to master instead of just PR builds (or the converse). - # credits: JuliaLang developers. - - ps: | - if ($env:ENABLE_RDP_ACCESS -eq "init" ) { - $blockRdp = $true; - iex ((new-object net.webclient).DownloadString( - 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) } - - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod ` - https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | ` - Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { ` - throw "There are newer queued builds for this pull request, failing early." } - # Free up some disk space; exceeding the limit of 90 GB results in a - # locked-out account. The Qt directory takes over 30 GB. Do this in the - # background. - - ps: Start-Process -FilePath "$env:comspec" -ArgumentList "/c rmdir C:\Qt /s /q" - - -cache: - # Cache downloaded pip packages and built wheels. - - '%LOCALAPPDATA%\pip\Cache\http' - - '%LOCALAPPDATA%\pip\Cache\wheels' - - -install: - # Enable long paths (needs reboot) - - ps: Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1 - - ps: Start-Sleep -s 10 - - ps: Restart-Computer -Force - - ps: Start-Sleep -s 10 - - - C:\cygwin\bin\du -hs "%LOCALAPPDATA%\pip\Cache" - # Prepend newly installed Python to the PATH of this build (this cannot be - # done from inside the powershell script as it would require to restart - # the parent CMD process). - - SET PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% - - # Check that we have the expected version and architecture for Python - - python --version - - python -c "import sys, platform, struct; - print(sys.platform, platform.machine(), struct.calcsize('P')*8)" - - tests\scripts\printShortLongCWD.cmd - - # Compile bootloader. - - cd bootloader - - python waf all --target-arch=%PYTHON_ARCH%bit - # Verify the bootloaders have the expected arch - - python ../tests/scripts/check-pefile-arch.py %PYTHON_ARCH% build/*/*.exe - - cd .. - - ### Install the PyInstaller dependencies. - - # Upgrade to the latest pip. - - python -m pip install -U pip setuptools wheel - - # Install the PyInstaller test dependencies. - - pip install -U -r tests/requirements-tools.txt -r tests/requirements-libraries.txt - - # Install PyInstaller Hook Sample, to ensure that tests declared in - # entry-points are discovered. - - pip install https://github.com/pyinstaller/hooksample/archive/v4.0rc1.zip - - # Install PyInstaller - - pip install -e . - - # Make sure the help options print. - - python -m pyinstaller -h - - -build: none - - -test_script: - # On Windows, the ``noarchive`` test re-compiles all ``.pyc`` or ``.pyo`` - # files. If run in parallel, one test will be trying to read a compiled file - # while the other is writing it, producing a ``PermissionError: [Errno 13] - # Permission denied`` exception. To avoid this, run these two tests in - # separate ``pytest`` invokations. - # - # The ``run_tests`` script is invoked with the ``-c`` option to specify a - # ``pytest.ini``, rather than allowing pytest to find something unexpected - # in the filesystem (it searches from the root dir all the way to the top of - # the filesystem per https://docs.pytest.org/en/latest/customize.html). - # - # In the Appveyor environment, the ``&&`` must be quoted when inside a set - # statement. - - if "%TEST_PART%" == "Libraries" ( - set PYTEST_CMD=%PYTEST% -k "test_noarchive[onefile]" ^&^& - %PYTEST% tests/functional/test_libraries.py --no-flaky-report --force-flaky - -k "not test_noarchive[onefile]" ^&^& - python -m PyInstaller.utils.run_tests -c PyInstaller\utils\pytest.ini - --include_only=pyi_hooksample. - ) else ( - set PYTEST_CMD=%PYTEST% tests/unit tests/functional - --ignore tests/functional/test_libraries.py - ) - - ps: | - if ($env:ENABLE_RDP_ACCESS -eq "pre-test" ) { - $blockRdp = $true; - iex ((new-object net.webclient).DownloadString( - 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) } - # Run the tests appropriate for this entry in the test matrix. Skip tests - # if we're just updating the cache; see https://www.appveyor.com/docs/environment-variables/. - - if not "%APPVEYOR_SCHEDULED_BUILD%" == "True" %PYTEST_CMD% - - ps: | - if ($env:ENABLE_RDP_ACCESS -eq "post-test" ) { - $blockRdp = $true; - iex ((new-object net.webclient).DownloadString( - 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) } - # create a dummy to make artifacs happy - - C:\cygwin\bin\touch test-output.tar.gz - -on_failure: - - C:\cygwin\bin\tar -czf test-output.tar.gz -C %TMP%\pytest-of-appveyor . - - echo You can find the tar-file at %APPVEYOR_BUILD_FOLDER% - - ps: | - if ($env:ENABLE_RDP_ACCESS -eq "end" ) { - $blockRdp = $true; - iex ((new-object net.webclient).DownloadString( - 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) } - -artifacts: - - path: test-output.tar.gz - name: test-output.tar.gz - -on_finish: - # Remove old or huge cache files to hopefully not exceed the 1GB cache limit. - # - # If the cache limit is reached, the cache will not be updated (of not even - # created in the first run). So this is a trade of between keeping the cache - # current and having a cache at all. - # NB: This is done only `on_success` since the cache in uploaded only on - # success anyway. - - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -mtime +360 -delete - - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -size +10M -delete - - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -empty -delete - # Show size of cache - - C:\cygwin\bin\du -hs "%LOCALAPPDATA%\pip\Cache" - - ps: | - (new-object net.webclient).UploadFile( - "https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", - (Resolve-Path .\junit-results.xml) - ) - $LastExitCode = 0 - - ps: | - if ($env:ENABLE_RDP_ACCESS -eq "post-test" ) { - $blockRdp = $true; - iex ((new-object net.webclient).DownloadString( - 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) }