Repository: mottosso/Qt.py (language: python)

Issue:
Convert CI/CD to GitHub actions.
# Objective

**Convert CI/CD** setup from **Travis-CI** to **GitHub Actions**.

<br>

# Motivation

**@mottosso commented [here](https://github.com/mottosso/Qt.py/pull/376#issuecomment-1299723370), in [PR #376](https://github.com/mottosso/Qt.py/pull/376):**
>*Calling in all assists!*
>*(...) We're currently on Travis-CI, because in the past it used to be free.. So part of the challenge would be converting it into GitHub Actions. (...)."*

My **long term goal** is to have **PySide6 support** in `Qt.py`.

**I see this PR as the first step before we can:**
- modernise/extend the test suite.
- add test coverage to any future PySide6 support.
- run the test suite against more modern VFX reference platform versions.
  *(Potentially using the official ASWF docker containers?)*

<br>

# Details 

The configurations for GitHub Actions live in `.github/workflows/`.

I have separated the previous Travis-CI configuration into **two separate workflows**.
### 1. Run the test suite
→ `.github/workflows/run-tests.yml`

- Runs the test suite matrix on `ubuntu-latest` GitHub runners, using the same docker images.
- Runs on **every push to any branch**.
### 2. Release to PyPi
→ `.github/workflows/release-to-pypi.yml`

- Releases to `PyPi`, using PyPi's own official GitHub PyPi Publish actions.
- Runs **on every push of a tag**, as long as repository owner is `mottosso`.
- ℹ️ Expects the **GitHub repo** to be set up as a **"Trusted Publisher"** against the PyPi `Qt.py` project.
- ℹ️ PR is currently set up to publish to `test.pypi.org`, for testing purposes.

<br>

# Test instructions

Testing this PR requires a bit more effort, because it needs to be pushed to `mottosso/Qt.py` in order to be able to test GitHub Actions.

## Preparation
#### 1. Check out `mottosso/Qt.py`:
```bash
mkdir -p ~/review-PR-391/
cd ~/review-PR-391/

git clone git@github.com:mottosso/Qt.py.git
cd Qt.py/
```

#### 2. Add `martin-chatterjee/Qt.py` as a remote named `"review"`, and fetch:
```bash
git remote add review git@github.com:martin-chatterjee/Qt.py.git
git fetch review
```

## Test "Run test suite".

#### 1. Check out PR branch, push to `origin`:
```bash
git checkout -b pr-391-review review/convert-to-github-actions
git push origin pr-391-review
```

#### → Visit https://github.com/mottosso/Qt.py/actions, to see the resulting workflow run.


##  Test "Release to PyPi".

#### ℹ️ This PR is set up to release to `test.pypi.org`. 

→ This must be changed after all tests, and before a potential merge into `main`.

#### 1. Make sure that `mottosso/Qt.py` is registered as a "Trusted Publisher". 

In a nutshell, a specific GitHub repo can be registered as a "Trusted Publisher" for a specific PyPi project.
*(→ More details [here](https://docs.pypi.org/trusted-publishers/adding-a-publisher/))*

❗️ Please make sure to register `mottosso/Qt.py` for PyPi project `Qt.py` on **both** `pypi.org` and `test.pypi.org`.

#### 2. Change project version to a unique version.
ℹ️ `test.pypi.org` and `pypi.org` only accept uploads for unique versions that have never been uploaded before.

→ **Change version** in `Qt.py` to something like:
```python
__version__ = "1.3.9.dev1"
 ```

#### 3. Commit and push.
```bash
git add .
git commit -m "Qt.py: Update version to '1.3.9.dev1'."  
git push origin pr-391-review
```

#### 4. Create a test release tag, and push.
```bash
git tag 1.3.9.dev1-test-release
git push origin 1.3.9.dev1-test-release
```

#### → Visit https://github.com/mottosso/Qt.py/actions, to see the resulting workflow run.

#### → Visit https://test.pypi.org/project/Qt.py/, to see the released version.




Convert CI/CD to GitHub actions.
# Objective

**Convert CI/CD** setup from **Travis-CI** to **GitHub Actions**.

<br>

# Motivation

**@mottosso commented [here](https://github.com/mottosso/Qt.py/pull/376#issuecomment-1299723370), in [PR #376](https://github.com/mottosso/Qt.py/pull/376):**
>*Calling in all assists!*
>*(...) We're currently on Travis-CI, because in the past it used to be free.. So part of the challenge would be converting it into GitHub Actions. (...)."*

My **long term goal** is to have **PySide6 support** in `Qt.py`.

**I see this PR as the first step before we can:**
- modernise/extend the test suite.
- add test coverage to any future PySide6 support.
- run the test suite against more modern VFX reference platform versions.
  *(Potentially using the official ASWF docker containers?)*

<br>

# Details 

The configurations for GitHub Actions live in `.github/workflows/`.

I have separated the previous Travis-CI configuration into **two separate workflows**.
### 1. Run the test suite
→ `.github/workflows/run-tests.yml`

- Runs the test suite matrix on `ubuntu-latest` GitHub runners, using the same docker images.
- Runs on **every push to any branch**.
### 2. Release to PyPi
→ `.github/workflows/release-to-pypi.yml`

- Releases to `PyPi`, using PyPi's own official GitHub PyPi Publish actions.
- Runs **on every push of a tag**, as long as repository owner is `mottosso`.
- ℹ️ Expects the **GitHub repo** to be set up as a **"Trusted Publisher"** against the PyPi `Qt.py` project.
- ℹ️ PR is currently set up to publish to `test.pypi.org`, for testing purposes.

<br>

# Test instructions

Testing this PR requires a bit more effort, because it needs to be pushed to `mottosso/Qt.py` in order to be able to test GitHub Actions.

## Preparation
#### 1. Check out `mottosso/Qt.py`:
```bash
mkdir -p ~/review-PR-391/
cd ~/review-PR-391/

git clone git@github.com:mottosso/Qt.py.git
cd Qt.py/
```

#### 2. Add `martin-chatterjee/Qt.py` as a remote named `"review"`, and fetch:
```bash
git remote add review git@github.com:martin-chatterjee/Qt.py.git
git fetch review
```

## Test "Run test suite".

#### 1. Check out PR branch, push to `origin`:
```bash
git checkout -b pr-391-review review/convert-to-github-actions
git push origin pr-391-review
```

#### → Visit https://github.com/mottosso/Qt.py/actions, to see the resulting workflow run.


##  Test "Release to PyPi".

#### ℹ️ This PR is set up to release to `test.pypi.org`. 

→ This must be changed after all tests, and before a potential merge into `main`.

#### 1. Make sure that `mottosso/Qt.py` is registered as a "Trusted Publisher". 

In a nutshell, a specific GitHub repo can be registered as a "Trusted Publisher" for a specific PyPi project.
*(→ More details [here](https://docs.pypi.org/trusted-publishers/adding-a-publisher/))*

❗️ Please make sure to register `mottosso/Qt.py` for PyPi project `Qt.py` on **both** `pypi.org` and `test.pypi.org`.

#### 2. Change project version to a unique version.
ℹ️ `test.pypi.org` and `pypi.org` only accept uploads for unique versions that have never been uploaded before.

→ **Change version** in `Qt.py` to something like:
```python
__version__ = "1.3.9.dev1"
 ```

#### 3. Commit and push.
```bash
git add .
git commit -m "Qt.py: Update version to '1.3.9.dev1'."  
git push origin pr-391-review
```

#### 4. Create a test release tag, and push.
```bash
git tag 1.3.9.dev1-test-release
git push origin 1.3.9.dev1-test-release
```

#### → Visit https://github.com/mottosso/Qt.py/actions, to see the resulting workflow run.

#### → Visit https://test.pypi.org/project/Qt.py/, to see the released version.




Convert CI/CD to GitHub actions.
# Objective

**Convert CI/CD** setup from **Travis-CI** to **GitHub Actions**.

<br>

# Motivation

**@mottosso commented [here](https://github.com/mottosso/Qt.py/pull/376#issuecomment-1299723370), in [PR #376](https://github.com/mottosso/Qt.py/pull/376):**
>*Calling in all assists!*
>*(...) We're currently on Travis-CI, because in the past it used to be free.. So part of the challenge would be converting it into GitHub Actions. (...)."*

My **long term goal** is to have **PySide6 support** in `Qt.py`.

**I see this PR as the first step before we can:**
- modernise/extend the test suite.
- add test coverage to any future PySide6 support.
- run the test suite against more modern VFX reference platform versions.
  *(Potentially using the official ASWF docker containers?)*

<br>

# Details 

The configurations for GitHub Actions live in `.github/workflows/`.

I have separated the previous Travis-CI configuration into **two separate workflows**.
### 1. Run the test suite
→ `.github/workflows/run-tests.yml`

- Runs the test suite matrix on `ubuntu-latest` GitHub runners, using the same docker images.
- Runs on **every push to any branch**.
### 2. Release to PyPi
→ `.github/workflows/release-to-pypi.yml`

- Releases to `PyPi`, using PyPi's own official GitHub PyPi Publish actions.
- Runs **on every push of a tag**, as long as repository owner is `mottosso`.
- ℹ️ Expects the **GitHub repo** to be set up as a **"Trusted Publisher"** against the PyPi `Qt.py` project.
- ℹ️ PR is currently set up to publish to `test.pypi.org`, for testing purposes.

<br>

# Test instructions

Testing this PR requires a bit more effort, because it needs to be pushed to `mottosso/Qt.py` in order to be able to test GitHub Actions.

## Preparation
#### 1. Check out `mottosso/Qt.py`:
```bash
mkdir -p ~/review-PR-391/
cd ~/review-PR-391/

git clone git@github.com:mottosso/Qt.py.git
cd Qt.py/
```

#### 2. Add `martin-chatterjee/Qt.py` as a remote named `"review"`, and fetch:
```bash
git remote add review git@github.com:martin-chatterjee/Qt.py.git
git fetch review
```

## Test "Run test suite".

#### 1. Check out PR branch, push to `origin`:
```bash
git checkout -b pr-391-review review/convert-to-github-actions
git push origin pr-391-review
```

#### → Visit https://github.com/mottosso/Qt.py/actions, to see the resulting workflow run.


##  Test "Release to PyPi".

#### ℹ️ This PR is set up to release to `test.pypi.org`. 

→ This must be changed after all tests, and before a potential merge into `main`.

#### 1. Make sure that `mottosso/Qt.py` is registered as a "Trusted Publisher". 

In a nutshell, a specific GitHub repo can be registered as a "Trusted Publisher" for a specific PyPi project.
*(→ More details [here](https://docs.pypi.org/trusted-publishers/adding-a-publisher/))*

❗️ Please make sure to register `mottosso/Qt.py` for PyPi project `Qt.py` on **both** `pypi.org` and `test.pypi.org`.

#### 2. Change project version to a unique version.
ℹ️ `test.pypi.org` and `pypi.org` only accept uploads for unique versions that have never been uploaded before.

→ **Change version** in `Qt.py` to something like:
```python
__version__ = "1.3.9.dev1"
 ```

#### 3. Commit and push.
```bash
git add .
git commit -m "Qt.py: Update version to '1.3.9.dev1'."  
git push origin pr-391-review
```

#### 4. Create a test release tag, and push.
```bash
git tag 1.3.9.dev1-test-release
git push origin 1.3.9.dev1-test-release
```

#### → Visit https://github.com/mottosso/Qt.py/actions, to see the resulting workflow run.

#### → Visit https://test.pypi.org/project/Qt.py/, to see the released version.






Discussion / hints:

Fix patch:
diff --git a/.github/workflows/release-to-pypi.yml b/.github/workflows/release-to-pypi.yml
new file mode 100644
index 00000000..e58d0bba
--- /dev/null
+++ b/.github/workflows/release-to-pypi.yml
@@ -0,0 +1,32 @@
+name: Release to PyPi
+
+on:
+  push:
+    tags:
+      - "*"
+
+jobs:
+  build-and-release:
+    name: Build and Release
+    runs-on: ubuntu-latest
+    if: github.repository_owner == 'mottosso'
+
+    environment:
+      name: pypi
+      url: https://pypi.org/p/Qt.py
+    permissions:
+      id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+      - name: Set up Python
+        uses: actions/setup-python@v4
+        with:
+          python-version: "3.7.x"
+      - name: Install build dependency
+        run: python3 -m pip install --upgrade build
+      - name: Build a binary wheel and a source tarball
+        run: python3 -m build
+      - name: Release to PyPi
+        uses: pypa/gh-action-pypi-publish@release/v1
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 66e50988..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-matrix:
-  include:
-
-  # VFX Platform 2018
-  - os: linux
-    env:
-    - VFXPLATFORM=2018
-    - PYTHON=2.7
-    - RELEASE=true
-  - os: linux
-    env:
-    - VFXPLATFORM=2018
-    - PYTHON=3.4
-  - os: linux
-    env:
-    - VFXPLATFORM=2018
-    - PYTHON=3.5
-  - os: linux
-    env:
-    - VFXPLATFORM=2018
-    - PYTHON=3.6
-
-  # VFX Platform 2017
-  - os: linux
-    env:
-    - VFXPLATFORM=2017
-    - PYTHON=2.7
-  - os: linux
-    env:
-    - VFXPLATFORM=2017
-    - PYTHON=3.4
-  - os: linux
-    env:
-    - VFXPLATFORM=2017
-    - PYTHON=3.5
-
-
-language: python
-sudo: required
-dist: focal
-
-services:
-  - docker
-
-script:
-  - docker run --rm -v $(pwd):/Qt.py -e PYTHON=${PYTHON} fredrikaverpil/qt.py:${VFXPLATFORM}
-
-deploy:
-  provider: pypi
-  user: mottosso
-  password:
-    secure: kDHKpxgDtn6PoS2Hs0jKd3Xeq+ArFwcOKNW+NkZB2S8+MVxwkzsXBWsvK5Bo14GU/Xoo/PPQKMZi61GNXLJdb/5yGUo9hmuRH/UVCBuFar30pROzHLc2slUL1vbAw82pGa3UCpVLDPi/RVyfUWY4KOnlvr7Hb29IMg/NzfibP4cIEUGFqwp9F1KtE9N8oq6aK5rLznJJwq9Hjj564Zqo4JvEUzucLHnNS4WHFEURuF9gxxQ1E4EZXAnIDGEKmKvBRGKXpDGIJ7hIG9+6fEltZRBdb5jevHxbIjBHKbcK780XnR7gYOQwiCUWaQF90CPbHQA3ff9lKZVDAbQiuYhiqCEVnFCTfgB6D8rL2XQYe/A/pRN8eB2m++ft+v+zYAfmPK+wkNga8wXWMLkc7z+n+aEmeWxopj9MoQqzzKqJeRZ6wgqXWL1YB8TAbUiCRkpcxuMJVu5qIOuWw9eKp+yo6zHjxh6a4MxN50107ZR05ZDEdkU3PgJik5IScWDegJGRQALMCU2Wlis1cdbV8qSosrnMYMdcrpd0R3Bpl/2q9WtUZhZJ7z3GN4YV+d/l0fIUXbrHmOzWjoyW9U8zY2oL+5glCahA6IHBDD+Na47TT93EyMkJ5MxukqNi/rnqUvVdqzgG+tX/HeehNiZkPcN+CWSQoOt1Oeo9pkixpVbjmxA=
-  distributions: "sdist bdist_wheel"
-  on:
-    tags: true
-    repo: mottosso/Qt.py
-    condition: $RELEASE = true
diff --git a/DOCKER.md b/DOCKER.md
index 1c8d0467..fccc98ab 100644
--- a/DOCKER.md
+++ b/DOCKER.md
@@ -1,6 +1,6 @@
 ## Docker
 
-In order to successfully test Qt.py against the different bindings of different versions, we use Travis-CI to run Docker containers based on [pre-built CentOS-based images](https://hub.docker.com/r/fredrikaverpil/qt.py/tags/).
+In order to successfully test Qt.py against the different bindings of different versions, we use [Github Actions](https://docs.github.com/en/actions/automating-builds-and-tests/about-continuous-integration) to run Docker containers based on [pre-built CentOS-based images](https://hub.docker.com/r/fredrikaverpil/qt.py/tags/).
 
 The Docker images follow the [VFX Reference Platform specifications](http://www.vfxplatform.com/) with some additionals, and are quite jam-packed.
 
@@ -24,10 +24,10 @@ The Docker images follow the [VFX Reference Platform specifications](http://www.
 * PyQt5<sup>1</sup>
 * PySide2<sup>1</sup>
 
-<sup>1</sup> Per specification from VFX Platform  
-<sup>2</sup> Adds possibility to faster clone large repositories  
-<sup>3</sup> cmake 3.x required to build PySide2  
-<sup>4</sup> Required for Qt.py testing  
+<sup>1</sup> Per specification from VFX Platform
+<sup>2</sup> Adds possibility to faster clone large repositories
+<sup>3</sup> cmake 3.x required to build PySide2
+<sup>4</sup> Required for Qt.py testing
 <sup>5</sup> Required for `PySide2.QtUiTools`
 
 <br>
diff --git a/README.md b/README.md
index 71552bf1..1460b0b6 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,10 @@
-<img width=260 src=logo.svg>
+<img width=260 src=https://raw.githubusercontent.com/mottosso/Qt.py/master/logo.svg>
 
-[![Downloads](https://pepy.tech/badge/qt-py)](https://pepy.tech/project/qt-py) [![Build Status](https://travis-ci.org/mottosso/Qt.py.svg?branch=master)](https://travis-ci.org/mottosso/Qt.py) [![PyPI version](https://badge.fury.io/py/Qt.py.svg)](https://pypi.python.org/pypi/Qt.py)
-[![Anaconda-Server Badge](https://anaconda.org/conda-forge/qt.py/badges/version.svg)](https://anaconda.org/conda-forge/qt.py) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Qt-py/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Downloads](https://pepy.tech/badge/qt-py)](https://pepy.tech/project/qt-py)
+[![Run Tests](https://github.com/mottosso/Qt.py/actions/workflows/run-tests.yml/badge.svg)](https://github.com/mottosso/Qt.py/actions)
+[![PyPI version](https://badge.fury.io/py/Qt.py.svg)](https://pypi.python.org/pypi/Qt.py)
+[![Anaconda-Server Badge](https://anaconda.org/conda-forge/qt.py/badges/version.svg)](https://anaconda.org/conda-forge/qt.py)
+[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Qt-py/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 [![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)
 
 Qt.py enables you to write software that runs on any of the 4 supported bindings - PySide2, PyQt5, PySide and PyQt4.
@@ -12,6 +15,7 @@ Qt.py enables you to write software that runs on any of the 4 supported bindings
 
 | Date     | Version   | Event
 |:---------|:----------|:----------
+| Jan 2024 | [1.3.9][] | Run CI on Github Actions, instead of Travis CI.
 | Sep 2020 | [1.3.0][] | Stability improvements and greater ability for `QtCompat.wrapInstance` to do its job
 | Jun 2019 | [1.2.1][] | Bugfixes and [additional members](https://github.com/mottosso/Qt.py/releases/tag/1.2.0)
 | Jan 2018 | [1.1.0][] | Adds new test suite, new members
@@ -29,6 +33,7 @@ Qt.py enables you to write software that runs on any of the 4 supported bindings
 [1.1.0]: https://github.com/mottosso/Qt.py/releases/tag/1.1.0
 [1.2.1]: https://github.com/mottosso/Qt.py/releases/tag/1.2.1
 [1.3.0]: https://github.com/mottosso/Qt.py/releases/tag/1.3.0
+[1.3.9]: https://github.com/mottosso/Qt.py/releases/tag/1.3.9
 
 ##### Guides
 
@@ -569,7 +574,7 @@ docker run --rm -v %CD%:/Qt.py -e PYTHON=3.6 fredrikaverpil/qt.py:2018
 # OK
 ```
 
-Now both you and Travis are operating on the same assumptions which means that when the tests pass on your machine, they pass on Travis. And everybody wins!
+Now both you and Github Actions are operating on the same assumptions which means that when the tests pass on your machine, they pass on Github Actions. And everybody wins!
 
 For details on the Docker image for testing, see [`DOCKER.md`](DOCKER.md).
 
diff --git a/entrypoint.sh b/entrypoint.sh
index b104f7d3..bed3c6b5 100644
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -5,19 +5,17 @@ set -e
 
 # Start Xvfb
 Xvfb :99 -screen 0 1024x768x16 2>/dev/null &
-while ! ps aux | grep -q '[0]:00 Xvfb :99 -screen 0 1024x768x16'; do
+counter=0
+while ! pgrep 'Xvfb' &> /dev/null; do
     echo "Waiting for Xvfb..."
     sleep 1
+    ((counter+=1))
+    if [[ $counter -ge 60 ]]; then
+      echo "Xvfb: Exceeded timeout."
+        exit 124
+    fi
 done
 
-if [ -n "$RELEASE" ]; then
-  wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
-  python${PYTHON} ./get-pip.py
-  printf "#\n# Installed pip for Python 2.7\n"
-else
-  printf "#\n# Skipped pip, RELEASE not set\n"
-fi
-
 printf "#\n# Running tests in Python ${PYTHON}\n"
 export NOSETESTS_BINARY=nosetests${PYTHON}
 printf "#\n# Testing implementation..\n"
diff --git a/run_docker.sh b/run_docker.sh
old mode 100644
new mode 100755
diff --git a/setup.py b/setup.py
index af72d08c..d6b85cfb 100644
--- a/setup.py
+++ b/setup.py
@@ -16,16 +16,28 @@
     "Programming Language :: Python :: 3",
     "Programming Language :: Python :: 3.3",
     "Programming Language :: Python :: 3.5",
+    "Programming Language :: Python :: 3.6",
+    "Programming Language :: Python :: 3.7",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
     "Topic :: Software Development :: Libraries :: Python Modules",
     "Topic :: Utilities"
 ]
 
+DESCRIPTION=(
+    "Python 2 & 3 compatibility wrapper around all Qt bindings - "
+    "PySide, PySide2, PyQt4 and PyQt5."
+)
+ROOT_PATH = os.path.dirname(os.path.realpath(__file__))
+README_PATH = os.path.join(ROOT_PATH, "README.md")
 
 setup(
     name="Qt.py",
     version=version,
-    description="Python 2 & 3 compatibility wrapper around all Qt bindings - "
-                "PySide, PySide2, PyQt4 and PyQt5.",
+    description=DESCRIPTION,
+    long_description=open(README_PATH).read(),
+    long_description_content_type="text/markdown",
     author="Marcus Ottosson",
     author_email="konstruktion@gmail.com",
     url="https://github.com/mottosso/Qt",


Test patch:
diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml
new file mode 100644
index 00000000..783ed953
--- /dev/null
+++ b/.github/workflows/run-tests.yml
@@ -0,0 +1,45 @@
+name: Run Tests
+
+on:
+  push:
+    branches:
+      - "*"
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        include:
+          - os: ubuntu-latest
+            VFXPLATFORM: "2018"
+            PYTHON: "2.7"
+          - os: ubuntu-latest
+            VFXPLATFORM: "2018"
+            PYTHON: "3.4"
+          - os: ubuntu-latest
+            VFXPLATFORM: "2018"
+            PYTHON: "3.5"
+          - os: ubuntu-latest
+            VFXPLATFORM: "2018"
+            PYTHON: "3.6"
+          - os: ubuntu-latest
+            VFXPLATFORM: "2017"
+            PYTHON: "2.7"
+          - os: ubuntu-latest
+            VFXPLATFORM: "2017"
+            PYTHON: "3.4"
+          - os: ubuntu-latest
+            VFXPLATFORM: "2017"
+            PYTHON: "3.5"
+
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Run tests in Docker container
+        run: |
+          docker run --rm \
+            -v $(pwd):/Qt.py \
+            -e PYTHON=${{ matrix.PYTHON }} \
+            fredrikaverpil/qt.py:${{ matrix.VFXPLATFORM }}