Skip to content

Merge pull request #119 from ericpre/update_version #229

Merge pull request #119 from ericpre/update_version

Merge pull request #119 from ericpre/update_version #229

Workflow file for this run

name: Release
on:
workflow_dispatch:
push:
branches: ['*']
tags: ['*']
paths-ignore:
- 'docs/**'
pull_request:
branches: [main]
paths-ignore:
- 'docs/**'
permissions:
# needs write permission at workflow level to create release and upload artifacts
contents: write
env:
MPLBACKEND: agg
QT_API: pyqt5
# pytest-qt doesn't seem to be playing well when pyqt5 and pyside6
# are installed in the same environment
PYTEST_QT_API: pyqt5
TEST_DEPS: pytest pytest-qt pytest-xdist pytest-rerunfailures pytest-mpl filelock
jobs:
create_release_job:
name: Create Release (on tag only)
runs-on: ubuntu-latest
outputs:
ID: ${{ steps.create_release.outputs.id }}
VERSION: ${{ env.VERSION }}
steps:
- uses: actions/checkout@v4
- name: Get version (on tag)
if: startsWith(github.ref, 'refs/tags/')
run: |
echo "VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Get version (short hash)
if: ${{ startsWith(github.ref, 'refs/tags/') == false }}
run: |
# Use git short hash instead of tag
echo "VERSION=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Display version
run: |
echo ${{ env.VERSION }}
- name: Find and Replace
uses: jacobtomlinson/gha-find-replace@a51bbcd94d000df9ca0fcb54ec8be69aad8374b0
if: startsWith(github.ref, 'refs/tags/')
with:
find: "__TAG__"
replace: ${{ env.VERSION }}
include: "RELEASE_TEXT.md" # Will match all RELEASE_TEXT.md files in any nested directory
- name: Create Release
if: startsWith(github.ref, 'refs/tags/')
id: create_release
uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions
with:
body_path: "RELEASE_TEXT.md"
draft: true
build:
name: ${{ matrix.TARGET_PLATFORM }}-${{ matrix.BLAS_IMPL }}
needs: create_release_job
runs-on: ${{ matrix.os }}-${{ matrix.os_version }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu
os_version: latest
INSTALLER_EXTENSION: sh
BLAS_IMPL: mkl
ARCH: x86_64
TARGET_PLATFORM: linux-64
- os: ubuntu
os_version: latest
INSTALLER_EXTENSION: sh
BLAS_IMPL: openblas
ARCH: x86_64
TARGET_PLATFORM: linux-64
- os: windows
os_version: latest
INSTALLER_EXTENSION: exe
BLAS_IMPL: mkl
ARCH: x86_64
TARGET_PLATFORM: win-64
- os: windows
os_version: latest
INSTALLER_EXTENSION: exe
BLAS_IMPL: openblas
ARCH: x86_64
TARGET_PLATFORM: win-64
- os: macos
os_version: '13'
INSTALLER_EXTENSION: pkg
BLAS_IMPL: mkl
ARCH: x86_64
TARGET_PLATFORM: osx-64
- os: macos
os_version: latest
INSTALLER_EXTENSION: pkg
BLAS_IMPL: accelerate
ARCH: arm64
TARGET_PLATFORM: osx-arm64
env:
DISPLAY: ':0'
defaults:
run:
shell: bash -el {0}
steps:
- uses: actions/checkout@v4
- uses: conda-incubator/setup-miniconda@v3
with:
miniforge-version: latest
channels: conda-forge
channel-priority: strict
- name: Install constructor
run: |
conda install constructor
- name: Conda info
run: |
conda info
conda list
- name: Build distribution
env:
VERSION: ${{ needs.create_release_job.outputs.VERSION }}
BLAS_IMPL: ${{ matrix.BLAS_IMPL }}
CONDA_SOLVER: 'libmamba'
run: |
constructor -v conda_distribution
- name: Set asset name
env:
ext: ${{ matrix.INSTALLER_EXTENSION }}
run: |
installer_name=(HyperSpy-*.${{ env.ext }})
echo "Original installer name: " $installer_name
# Rename installer name according to BLAS_IMPL
if [ ${{ matrix.TARGET_PLATFORM }} = osx-arm64 ]; then
CPU=Silicon
elif [ ${{ matrix.BLAS_IMPL }} = mkl ]; then
CPU=Intel
else
CPU=AMD
fi
new_installer_name=$(basename $installer_name .${{ env.ext }})-$CPU.${{ env.ext }}
mv $installer_name $new_installer_name
echo "asset_name=$new_installer_name" >> $GITHUB_ENV
echo "Installer name: "$new_installer_name
ls
- name: Get hash
run: |
shasum -a 256 ${{ env.asset_name }}
- name: Install new distribution (Linux)
if: runner.os == 'linux'
env:
install_dir: '${{ github.workspace }}/new_distribution'
run: |
echo "install_dir=${{ env.install_dir }}" >> $GITHUB_ENV
bash ${{ env.asset_name }} -b -p ${{ env.install_dir }}
- name: Install new distribution (MacOS)
if: runner.os == 'macos'
run: |
echo "install_dir=/Users/runner/hyperspy-bundle" >> $GITHUB_ENV
installer -pkg ${{ env.asset_name }} -target CurrentUserHomeDirectory
- name: Install new distribution (Windows)
if: runner.os == 'windows'
env:
install_dir: '${{ github.workspace }}\nd'
run: |
echo "install_dir=${{ env.install_dir }}" >> $GITHUB_ENV
- name: Install new distribution (Windows)
if: runner.os == 'windows'
shell: powershell
run: |
Start-Process -Wait -FilePath ${{ env.asset_name }} -ArgumentList "/S /AddToPath=0 /RegisterPython=0 /NoScripts=1 /D=${{ env.install_dir }}"
- name: Upload artifact
if: startsWith(github.ref, 'refs/tags/') != true
uses: actions/upload-artifact@v4
with:
path: ${{ env.asset_name }}
name: ${{ env.asset_name }}
- name: Show install folder content
run : |
ls "${{ env.install_dir }}"
- name: Info new distribution
run: |
conda activate "${{ env.install_dir }}"
conda info
conda config --show channels
conda config --show channel_priority
conda list
- name: Check latest available hyperspy version
run: |
conda activate "${{ env.install_dir }}"
python check_hyperspy_latest.py
- name: Install xvfb
if: runner.os == 'linux' && always()
run: |
sudo apt-get install -y xvfb libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xinput0 libxcb-xfixes0
- name: Start xvfb
if: runner.os == 'linux' && always()
run: |
sudo /usr/bin/Xvfb ${{ env.DISPLAY }} -screen 0 1280x1024x24 &
- name: Install test dependencies
if: always()
run: |
conda activate "${{ env.install_dir }}"
mamba install ${{ env.TEST_DEPS }}
- if: always()
name: Test new distribution (HyperSpyUI)
run: |
conda activate "${{ env.install_dir }}"
# Error on closing figure, not critical
pytest --pyargs hyperspyui -k "not plotting"
- name: Test RosettaSciIO
if: always()
run: |
conda activate "${{ env.install_dir }}"
pytest --pyargs rsciio --reruns 3 -n 1 -k "not TestOperate"
- name: Test hyperspy
if: always()
run: |
conda activate "${{ env.install_dir }}"
pytest --pyargs hyperspy --reruns 3 -n 2
- name: Test hyperspy_gui_ipywidgets
if: always()
run: |
conda activate "${{ env.install_dir }}"
pytest --pyargs hyperspy_gui_ipywidgets
- name: Test hyperspy_gui_traitsui
if: runner.os != 'linux' && always()
run: |
conda activate "${{ env.install_dir }}"
# test_image_contrast_tool not supported with agg backend
pytest --pyargs hyperspy_gui_traitsui -k "not test_image_contrast_tool"
- name: Run test exspy
if: always()
run: |
conda activate "${{ env.install_dir }}"
pytest --pyargs exspy
- name: Run test holospy
if: always()
run: |
conda activate "${{ env.install_dir }}"
pytest --pyargs holospy
- name: Run test lumispy
if: always()
run: |
conda activate "${{ env.install_dir }}"
pytest --pyargs lumispy
- name: Run test pyxem
if: always()
run: |
conda activate "${{ env.install_dir }}"
# cause of the TestAddEllipseArrayAsMarkers failure is unknown (seems to be on blas mkl only)
pytest --pyargs pyxem -k "not TestAddEllipseArrayAsMarkers"
- name: Run test atomap
if: always()
run: |
conda activate "${{ env.install_dir }}"
# Skip interactive test
pytest --pyargs atomap -k "not TestSelectAtomsWithGui"
# - name: Run test kikuchipy
# if: always()
# env:
# # Need to specify pyside6 to avoid segmentation fault when running the kikuchipy test suite
# # quite brittle but there is currently alternative since kikuchipy install pysista and pyside6
# # which causes the segmentation when pyqt5 is imported before pyvista
# QT_API: pyside6
# PYTEST_QT_API: pyside6
# run: |
# conda activate "${{ env.install_dir }}"
# pytest --pyargs kikuchipy -k "not test_spherical_pyvista and not test_not_allow_download_raises"
- name: Upload Release Asset
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
files: ${{ env.asset_name }}
draft: true
build_portable:
name: windows (Portable)
needs: create_release_job
runs-on: windows-latest
env:
WP_URL: https://github.com/winpython/winpython/releases/download/11.2.20241228final/Winpython64-3.12.8.0slim.exe
WP_SHA256: c4c59403370e62169bbeba06f140f0da76b2ee5a5a51ebcfdb3d3ad663b2688a
WP_EXE: winpython.exe
WP_DIR_NAME: WPy64-31280
steps:
- uses: actions/checkout@v4
- name: Download Winpython
run: |
Invoke-WebRequest -OutFile ${{ env.WP_EXE }} ${{ env.WP_URL }}
ls
$file_hash = (Get-FileHash ${{ env.WP_EXE }} ).Hash
$file_hash
if ($file_hash -ne "${{ env.WP_SHA256 }}") { exit(1) }
- name: Install Winpython
run: |
.\${{ env.WP_EXE }} -y | Out-Null
ls
ls ${{ env.WP_DIR_NAME }}
- name: Install libraries
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
where python
where pip
pip install -r requirement_portable_distribution.txt
- name: Pip list
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pip list
- shell: bash -l {0}
name: Set installer name
env:
VERSION: ${{ needs.create_release_job.outputs.VERSION }}
run: |
installer_name=HyperSpy-bundle-${{ env.VERSION }}-Windows-x86_64-Portable.exe
echo "asset_name=$installer_name" >> $GITHUB_ENV
echo $installer_name
- name: Run pyclean in distribution folder
shell: cmd
run: |
where pip
pip install pyclean
where pyclean
pyclean ${{ env.WP_DIR_NAME }}
- name: Create installer
run: |
7z -mx5 -sfx a ${{ env.asset_name }} ${{ env.WP_DIR_NAME }}
ls
- name: Upload artifact
if: startsWith(github.ref, 'refs/tags/') != true
uses: actions/upload-artifact@v4
with:
path: ${{ env.asset_name }}
name: ${{ env.asset_name }}
- name: Install new distribution
run: |
Remove-Item -recurse ${{ env.WP_DIR_NAME }}
ls
.\${{ env.asset_name }} -y | Out-Null
echo "After installation"
ls
echo ${{ env.asset_name }}
- name: Check latest available hyperspy version
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
python check_hyperspy_latest.py
- name: Install testing libraries
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pip install ${{ env.TEST_DEPS }}
- name: Run test suite (HyperSpyUI)
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
# Error on closing figure, not critical
pytest --pyargs hyperspyui -k "not plotting"
- name: Run test hyperspy
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pytest --pyargs hyperspy --reruns 3 -n 2
- name: Run test RosettaSciIO
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pytest --pyargs rsciio --reruns 3 -n 2 -k "not test_mrcz.py and not test_usid.py and not TestOperate"
- name: Run test hyperspy_gui_ipywidgets
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pytest --pyargs hyperspy_gui_ipywidgets
- name: Run test hyperspy_gui_traitsui --reruns 3
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
# test_image_contrast_tool not supported with agg backend
pytest --pyargs hyperspy_gui_traitsui -k "not test_image_contrast_tool"
- name: Run test exspy
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pytest --pyargs exspy
- name: Run test holospy
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pytest --pyargs holospy
- name: Run test lumispy
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
pytest --pyargs lumispy
- name: Run test pyxem
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
# cause of the TestAddEllipseArrayAsMarkers failure is unknown (seems to be on blas mkl only)
pytest --pyargs pyxem -k "not TestAddEllipseArrayAsMarkers"
- name: Run test atomap
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
# Skip interactive test
pytest --pyargs atomap -k "not TestSelectAtomsWithGui"
- name: Run test kikuchipy
if: always()
shell: cmd
run: |
call "${{ env.WP_DIR_NAME }}\scripts\env.bat"
# Skip these tests until there are fixed
pytest --pyargs kikuchipy -k "not test_spherical_pyvista and not test_not_allow_download_raises and not test_save_load_0d_nav"
- name: Upload Release Asset
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
files: ${{ env.asset_name }}
draft: true
publish_release_job:
# Set build, build_portable are needed, so that it runs when they are finished
needs: [create_release_job, build, build_portable]
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- name: Finalise release
# Publish draft release
uses: eregon/publish-release@01df127f5e9a3c26935118e22e738d95b59d10ce
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
release_id: ${{ needs.create_release_job.outputs.ID }}