Skip to content

Fix structure viewer rendering on macOS and add basic GUI tests based on screenshot comparison #198

Fix structure viewer rendering on macOS and add basic GUI tests based on screenshot comparison

Fix structure viewer rendering on macOS and add basic GUI tests based on screenshot comparison #198

Workflow file for this run

name: Build Installer
on:
push:
branches:
- "**"
pull_request:
branches:
- "**"
jobs:
build-installer:
timeout-minutes: 80
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [Ubuntu-20.04, Ubuntu-22.04, macOS-13, Windows-2022]
steps:
- name: Check-out repository
uses: actions/checkout@v4
- name: Set up Python environment
uses: actions/setup-python@v5
with:
python-version: 3.11
- name: Upgrade package installer for Python
run: python -m pip install --upgrade pip
- name: Add extra info to pyproject.toml
run: python utils.py --update
- name: Declare env variables on push only
if: github.event_name == 'push'
shell: bash
run: echo "BRANCH_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Declare env variables on pull_request only
if: github.event_name == 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$GITHUB_HEAD_REF" >> $GITHUB_ENV
- name: Declare env variables on push and pull_request
shell: bash
run: |
echo "APP_NAME=$(python utils.py --get release.app_name)" >> $GITHUB_ENV
echo "PACKAGE_NAME=$(python utils.py --get project.name)" >> $GITHUB_ENV
echo "PACKAGE_PATH=$GITHUB_WORKSPACE/$(python utils.py --get project.name)" >> $GITHUB_ENV
echo "RELEASE_TAG=$(python utils.py --get ci.app.info.release_tag)" >> $GITHUB_ENV
echo "RELEASE_TITLE=$(python utils.py --get ci.app.info.release_title)" >> $GITHUB_ENV
echo "SCRIPTS_PATH=$(python utils.py --get ci.project.subdirs.scripts)" >> $GITHUB_ENV
echo "DISTRIBUTION_PATH=$(python utils.py --get ci.project.subdirs.distribution)" >> $GITHUB_ENV
echo "DOWNLOAD_PATH=$(python utils.py --get ci.project.subdirs.download)" >> $GITHUB_ENV
echo "QTIFW_PATH=$(python utils.py --get ci.qtifw.setup.installation_path.${{ runner.os }})" >> $GITHUB_ENV
echo "PYTHON_PACKAGES_PATH=$(python utils.py --get ci.cache.python_packages_path)" >> $GITHUB_ENV
echo "GIT_INSTALL_URL=git+$GITHUB_SERVER_URL/$GITHUB_REPOSITORY@${{ env.BRANCH_NAME }}" >> $GITHUB_ENV
- name: Install Python dependences
run: |
python -m pip install flit
flit install --only-deps # Install the dependencies, but not the EasyDiffractionApp package itself
- name: Create python resources file
run: pyside6-rcc ${{ env.PACKAGE_PATH }}/resources.qrc -o ${{ env.PACKAGE_PATH }}/resources.py
- name: Set up screen (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xfixes0 libxcb-shape0 libxcb-cursor0
sudo apt-get install libpulse-mainloop-glib0
sudo apt-get install libxkbcommon-x11-0
sudo apt-get install libegl1-mesa
Xvfb :0 -screen 0 1920x1080x24 -ac &
echo "DISPLAY=:0" >> $GITHUB_ENV
# Method 1:
# Not working since Oct 2023. VMware is replaced by VirtualBox
# "/Library/Application Support/VMware Tools/vmware-resolutionSet" 1920 1080
# system_profiler SPDisplaysDataType | grep Resolution
# Method 2:
# Worked on macOS 12.6.9, but the default resolution already was 1920x1080: https://github.com/easyScience/EasyDiffractionBeta/actions/runs/6575129372/job/17861583655
# Fails on macOS 12.7, where default resolution is 1176x885: https://github.com/easyScience/EasyDiffractionBeta/actions/runs/6576347514/job/17865526935
# Works on macOS 13.6, where default resolution is again 1920x1080: https://github.com/easyScience/EasyDiffractionBeta/actions/runs/6576486407/job/17866007760
# brew install screenresolution
# screenresolution list
# screenresolution get
# screenresolution set 1920x1080x32@30
# screenresolution get
- name: Set up screen (macOS)
if: runner.os == 'macOS'
run: |
system_profiler SPDisplaysDataType | grep Resolution
- name: Set up screen (Windows)
if: runner.os == 'Windows'
run: |
Set-DisplayResolution -Width 1920 -Height 1080 -Force
Get-DisplayResolution
- name: Run app in testmode and quit
shell: bash
run: python ${{ env.PACKAGE_NAME }}/main.py --testmode
- name: Run screenshots comparison tests
run: pytest tests/gui --color=yes
- name: Upload zipped GUI tests screenshots
if: always()
uses: actions/upload-artifact@v4
with:
name: build-installer_screenshots_${{ matrix.os }} # desired name (without .zip) of the zip file to be uploaded
path: | # all files from these paths are zipped into file with name from above
tests/gui/screenshots
.tests/image_diff
if-no-files-found: 'error'
compression-level: 0
- name: Create freezed python app bundle with PyInstaller
run: python ${{ env.SCRIPTS_PATH }}/FreezeApp.py
#- name: Create both online and offline app installer from freezed app bundle
- name: Create offline app installer from freezed app bundle with QtIFW
run: >
python ${{ env.SCRIPTS_PATH }}/MakeInstaller.py
${{ env.BRANCH_NAME }} ${{ matrix.os }}
- name: Sign offline app installer
if: github.event_name == 'push' && env.BRANCH_NAME == 'master'
run: >
python ${{ env.SCRIPTS_PATH }}/SignAppInstaller.py
${{ env.BRANCH_NAME }} ${{ matrix.os }}
${{ secrets.MACOS_CERTIFICATE_ENCODED }} ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
${{ secrets.APPSTORE_NOTARIZATION_USERNAME }} ${{ secrets.APPSTORE_NOTARIZATION_PASSWORD }}
- name: Create zip archive of offline app installer for distribution
run: >
python ${{ env.SCRIPTS_PATH }}/ZipAppInstaller.py
${{ env.BRANCH_NAME }} ${{ matrix.os }}
- name: Upload zipped offline app installer to GitHub releases (non-master branch)
if: github.event_name == 'push' && env.BRANCH_NAME != 'master'
uses: ncipollo/release-action@v1
with:
draft: true
prerelease: true
allowUpdates: true
replacesArtifacts: true
token: ${{ secrets.GITHUB_TOKEN }}
artifacts: "${{ env.DISTRIBUTION_PATH }}/*.zip"
tag: ${{ env.BRANCH_NAME }}
name: ${{ env.BRANCH_NAME }}
bodyFile: "RELEASE.md"
- name: Upload zipped offline app installer to GitHub releases (master branch)
if: github.event_name == 'push' && env.BRANCH_NAME == 'master'
uses: ncipollo/release-action@v1
with:
draft: true
prerelease: true
allowUpdates: true
replacesArtifacts: true
token: ${{ secrets.GITHUB_TOKEN }}
artifacts: "${{ env.DISTRIBUTION_PATH }}/*.zip"
tag: ${{ env.RELEASE_TAG }}
name: ${{ env.RELEASE_TITLE }}
bodyFile: "RELEASE.md"
#- name: Upload online app installer to repository via FTP (master branch)
# if: github.event_name == 'push' && env.BRANCH_NAME == 'master'
# run: >
# python ${{ env.SCRIPTS_PATH }}/UploadToFtp.py
# ${{ env.BRANCH_NAME }} ${{ matrix.os }}
# ${{ secrets.APP_REPO_FTP_PASSWORD }}
- name: Upload zipped offline app installer for the next job step
uses: actions/upload-artifact@v3
with:
name: zipped-app-installer
path: ${{ env.DISTRIBUTION_PATH }}/*.zip
test-installer:
needs: build-installer
timeout-minutes: 15
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [Ubuntu-20.04, Ubuntu-22.04, macOS-13, Windows-2022]
steps:
- name: Check-out repository
uses: actions/checkout@v4
- name: Set up Python environment
uses: actions/setup-python@v5
with:
python-version: 3.11
- name: Upgrade package installer for Python
run: python -m pip install --upgrade pip
- name: Declare env variables on push only
if: github.event_name == 'push'
shell: bash
run: echo "BRANCH_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Declare env variables on pull_request only
if: github.event_name == 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$GITHUB_HEAD_REF" >> $GITHUB_ENV
- name: Add extra info to pyproject.toml
run: python utils.py --update
- name: Declare env variables on push and pull_request
shell: bash
run: |
echo "SCRIPTS_PATH=$(python utils.py --get ci.project.subdirs.scripts)" >> $GITHUB_ENV
- name: Install Python dependences
run: |
python -m pip install flit
flit install --only-deps # Install the dependencies, but not the EasyDiffractionApp package itself
- name: Set up screen (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xfixes0 libxcb-shape0 libxcb-cursor0
sudo apt-get install libpulse-mainloop-glib0
sudo apt-get install libxkbcommon-x11-0
sudo apt-get install libegl1-mesa
Xvfb :0 -screen 0 1920x1080x24 -ac &
echo "DISPLAY=:0" >> $GITHUB_ENV
# Method 1:
# Not working since Oct 2023. VMware is replaced by VirtualBox
# "/Library/Application Support/VMware Tools/vmware-resolutionSet" 1920 1080
# system_profiler SPDisplaysDataType | grep Resolution
# Method 2:
# Worked on macOS 12.6.9, but the default resolution already was 1920x1080: https://github.com/easyScience/EasyDiffractionBeta/actions/runs/6575129372/job/17861583655
# Fails on macOS 12.7, where default resolution is 1176x885: https://github.com/easyScience/EasyDiffractionBeta/actions/runs/6576347514/job/17865526935
# Works on macOS 13.6, where default resolution is again 1920x1080: https://github.com/easyScience/EasyDiffractionBeta/actions/runs/6576486407/job/17866007760
# brew install screenresolution
# screenresolution list
# screenresolution get
# screenresolution set 1920x1080x32@30
# screenresolution get
- name: Set up screen (macOS)
if: runner.os == 'macOS'
run: |
system_profiler SPDisplaysDataType | grep Resolution
- name: Set up screen (Windows)
if: runner.os == 'Windows'
run: |
Set-DisplayResolution -Width 1920 -Height 1080 -Force
Get-DisplayResolution
- name: Download zipped offline app installer from from the previous job step
uses: actions/download-artifact@v3
with:
name: zipped-app-installer
- name: Unzip archive with offline app installer for distribution
run: >
python ${{ env.SCRIPTS_PATH }}/UnzipAppInstaller.py
${{ env.BRANCH_NAME }} ${{ matrix.os }}
- name: Make dir for .desktop file (Linux)
if: runner.os == 'Linux'
run: mkdir -p ~/.local/share/applications/
- name: Install app
run: >
python ${{ env.SCRIPTS_PATH }}/InstallApp.py
${{ env.BRANCH_NAME }} ${{ matrix.os }}
- name: Check app istallation is done
run: python ${{ env.SCRIPTS_PATH }}/CheckAppExists.py
- name: Run app in testmode and quit (macOS & Linux)
if: runner.os != 'Windows' # disabled because it can't exit app and one can't see what is going on there (no GitHub logging)...
run: python ${{ env.SCRIPTS_PATH }}/RunApp.py --testmode
- name: Run screenshots comparison tests
if: runner.os != 'Windows' # disabled as didn't run app in test in the previous step
run: pytest tests/gui --color=yes
- name: Upload zipped GUI tests screenshots
if: always()
uses: actions/upload-artifact@v4
with:
name: test-installer_screenshots_${{ matrix.os }} # desired name (without .zip) of the zip file to be uploaded
path: | # all files from these paths are zipped into file with name from above
tests/gui/screenshots
.tests/image_diff
if-no-files-found: 'error'
compression-level: 0