Skip to content

add app launcher in installer folder #210

add app launcher in installer folder

add app launcher in installer folder #210

name: Build executable for Windows
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
env:
OPENMS_VERSION: 3.2.0
# Define needed TOPP tools here
TOPP_TOOLS: "FeatureFinderMetabo FeatureLinkerUnlabeledKD SiriusExport"
jobs:
build-openms:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
repository: OpenMS/OpenMS
ref: release/${{ env.OPENMS_VERSION }}
path: 'OpenMS'
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '5.15.2' # 5.12.7 is broken https://bugreports.qt.io/browse/QTBUG-81715, > 5.15.2 is not available on official archives (https://github.com/miurahr/aqtinstall/issues/636)
host: 'windows' # default: win64_msvc2017_64
target: 'desktop'
install-deps: 'true'
cache: 'false'
aqtversion: '==3.1.*'
# https://github.com/marketplace/actions/visual-studio-shell
- name: Set up Visual Studio shell
uses: egor-tensin/vs-shell@v2
with:
arch: x64
- name: Setup build tools
shell: bash
run: |
choco install ccache ninja cmake
## GH CLI "SHOULD BE" installed. Sometimes I had to manually install nonetheless. Super weird.
# https://github.com/actions/runner-images/blob/main/images/win/scripts/Installers/Install-GitHub-CLI.ps1
echo "C:/Program Files (x86)/GitHub CLI" >> $GITHUB_PATH
- name: Extract branch/PR infos
shell: bash
run: |
cd OpenMS
RUN_NAME_LOCAL=$(echo ${GITHUB_REF#refs/heads/} | tr / -)
echo "RUN_NAME=${RUN_NAME_LOCAL}" >> $GITHUB_ENV
echo "BASE_REF=$(gh pr view --json baseRefName -q .baseRefName || echo ${RUN_NAME_LOCAL})" >> $GITHUB_ENV
id: extract_branch
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Cache contrib
id: cache-contrib-win
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/OpenMS/contrib
key: ${{ runner.os }}-contrib3
- name: Load contrib build
if: steps.cache-contrib-win.outputs.cache-hit != 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd OpenMS/contrib
# Download the file using the URL fetched from GitHub
gh release download -R OpenMS/contrib --pattern 'contrib_build-Windows.tar.gz'
# Extract the archive
7z x -so contrib_build-Windows.tar.gz | 7z x -si -ttar
rm contrib_build-Windows.tar.gz
ls
- name: Setup ccache cache
uses: actions/cache@v4
with:
path: .ccache
key: ${{ runner.os }}-ccache-${{ env.RUN_NAME }}-${{ github.run_number }}
# Restoring: From current branch, otherwise from base branch, otherwise from any branch.
restore-keys: |
${{ runner.os }}-ccache-${{ env.RUN_NAME }}
${{ runner.os }}-ccache-${{ env.BASE_REF }}
${{ runner.os }}-ccache-
- name: Add THIRDPARTY
shell: bash
run: |
# initialize THIRDPARTY
cd OpenMS
git submodule update --init THIRDPARTY
cd ..
# add third-party binaries to PATH
# use flat THIRDPARTY structure
mkdir -p _thirdparty
cp -R OpenMS/THIRDPARTY/Windows/64bit/* _thirdparty/
cp -R OpenMS/THIRDPARTY/All/* _thirdparty/
# add third-party binaries to PATH
for thirdpartytool in ${{ github.workspace }}/_thirdparty/*
do
echo $thirdpartytool >> $GITHUB_PATH
done
- name: Build Windows
shell: bash
run: |
mkdir $GITHUB_WORKSPACE/OpenMS/bld/
ctest --output-on-failure -V -S $GITHUB_WORKSPACE/OpenMS/tools/ci/cibuild.cmake
env:
#OS_PREFIX_PATH: "${{ env.Qt5_DIR }}/lib/cmake;${{ env.Qt5_DIR }}"
OPENMS_CONTRIB_LIBS: "${{ github.workspace }}/OpenMS/contrib"
CI_PROVIDER: "GitHub-Actions"
CMAKE_GENERATOR: "Ninja"
SOURCE_DIRECTORY: "${{ github.workspace }}/OpenMS"
BUILD_NAME: "${{ env.RUN_NAME }}-Win64-class-topp-${{ github.run_number }}"
ENABLE_STYLE_TESTING: "OFF"
ENABLE_TOPP_TESTING: "ON"
ENABLE_CLASS_TESTING: "ON"
WITH_GUI: "OFF"
ADDRESS_SANITIZER: "Off"
BUILD_TYPE: "Release"
OPENMP: "Off"
USE_STATIC_BOOST: "On"
# BUILD_FLAGS: "-p:CL_MPCount=2" # For VS Generator and MSBuild
BUILD_FLAGS: "-j2" # Ninja will otherwise use all cores (doesn't go well in GHA)
CMAKE_CCACHE_EXE: "ccache"
CCACHE_BASEDIR: ${{ github.workspace }}
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPRESS: true
CCACHE_COMPRESSLEVEL: 12
CCACHE_MAXSIZE: 400M
- name: Test Windows
shell: bash
run: ctest --output-on-failure -V -S $GITHUB_WORKSPACE/OpenMS/tools/ci/citest.cmake
env:
SOURCE_DIRECTORY: "${{ github.workspace }}/OpenMS"
CI_PROVIDER: "GitHub-Actions"
BUILD_NAME: "${{ env.RUN_NAME }}-Win64-class-topp-${{ github.run_number }}"
- name: Package
shell: bash
run: |
ctest --output-on-failure -V -S $GITHUB_WORKSPACE/OpenMS/tools/ci/cipackage.cmake
env:
SOURCE_DIRECTORY: "${{ github.workspace }}/OpenMS"
PACKAGE_TYPE: zip
SEARCH_ENGINES_DIRECTORY: "${{ github.workspace }}/_thirdparty"
CI_PROVIDER: "GitHub-Actions"
CPACK_PACKAGE_FILE_NAME: "openms-package"
- name: Upload package as artifact
uses: actions/upload-artifact@v4
with:
name: openms-package
path: ${{ github.workspace }}/OpenMS/bld/*.zip
build-executable:
runs-on: windows-latest
needs: build-openms
env:
PYTHON_VERSION: 3.11.0
APP_NAME: OpenMS-StreamlitTemplateApp
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download package as artifact
uses: actions/download-artifact@v4
with:
name: openms-package
path: openms-package
- name: Extract bin and share from package
run: |
cd openms-package
unzip "*.zip" -d .
cp -r openms-package/bin ../openms-bin
cp -r openms-package/share ../share
- name: Setup python embeddable version
run: |
mkdir python-${{ env.PYTHON_VERSION }}
curl -O https://www.python.org/ftp/python/${{ env.PYTHON_VERSION }}/python-${{ env.PYTHON_VERSION }}-embed-amd64.zip
unzip python-${{ env.PYTHON_VERSION }}-embed-amd64.zip -d python-${{ env.PYTHON_VERSION }}
rm python-${{ env.PYTHON_VERSION }}-embed-amd64.zip
- name: Install pip
run: |
curl -O https://bootstrap.pypa.io/get-pip.py
./python-${{ env.PYTHON_VERSION }}/python get-pip.py --no-warn-script-location
rm get-pip.py
- name: Uncomment 'import site' in python311._pth file
run: |
sed -i 's/#import site/import site/' python-${{ env.PYTHON_VERSION }}/python311._pth
- name: Install Required Packages
run: .\python-${{ env.PYTHON_VERSION }}\python -m pip install --force-reinstall -r requirements.txt --no-warn-script-location
- name: Set to offline deployment
run: |
$content = Get-Content -Raw settings.json | ConvertFrom-Json
$content.online_deployment = $false
$content | ConvertTo-Json -Depth 100 | Set-Content settings.json
- name: Create All-in-one executable folder
run: |
mkdir streamlit_exe
mv python-${{ env.PYTHON_VERSION }} streamlit_exe
cp -r src streamlit_exe
cp -r content streamlit_exe
cp -r docs streamlit_exe
cp -r assets streamlit_exe
cp -r example-data streamlit_exe
cp openms-bin/*.dll streamlit_exe
cp -r .streamlit streamlit_exe
cp -r share streamlit_exe/share
cp app.py streamlit_exe
cp settings.json streamlit_exe
cp default-parameters.json streamlit_exe
$files = $env:TOPP_TOOLS -split ' '
foreach ($file in $files) {
Copy-Item "openms-bin/${file}.exe" -Destination "streamlit_exe/${file}.exe"
}
- name: Install WiX Toolset
run: |
curl -LO https://github.com/wixtoolset/wix3/releases/download/wix3111rtm/wix311-binaries.zip
unzip wix311-binaries.zip -d wix
rm wix311-binaries.zip
- name: build .wxs for streamlit_exe folder
run: |
./wix/heat.exe dir streamlit_exe -gg -sfrag -sreg -srd -template component -cg StreamlitExeFiles -dr INSTALLFOLDER -out streamlit_exe_files.wxs
- name: Prepare SourceDir
run: |
mkdir SourceDir
mv streamlit_exe/* SourceDir
cp dummy_license.rtf SourceDir
cp assets/openms.ico SourceDir
- name: Generate WiX XML file
run: |
echo '<?xml version="1.0"?>' > streamlit_exe.wxs
echo '<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">' >> streamlit_exe.wxs
echo ' <Product Id="*" Name="${{ env.APP_NAME }}" Language="1033" Version="1.0.0.0" Manufacturer="OpenMS" UpgradeCode="8d28e8c7-45dc-446c-b889-99a6aea2f1a5">' >> streamlit_exe.wxs
echo ' <Package InstallerVersion="500" Compressed="yes" InstallScope="perMachine"/>' >> streamlit_exe.wxs
echo ' <Media Id="1" Cabinet="streamlit.cab" EmbedCab="yes" />' >> streamlit_exe.wxs
echo ' <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />' >> streamlit_exe.wxs
echo ' <Property Id="INSTALLFOLDER" Secure="yes" />' >> streamlit_exe.wxs
echo ' <Directory Id="TARGETDIR" Name="SourceDir">' >> streamlit_exe.wxs
echo ' <Directory Id="ProgramFilesFolder">' >> streamlit_exe.wxs
echo ' <Directory Id="INSTALLFOLDER" Name="StreamlitApp" />' >> streamlit_exe.wxs
echo ' </Directory>' >> streamlit_exe.wxs
echo ' <Directory Id="DesktopFolder" />' >> streamlit_exe.wxs
echo ' </Directory>' >> streamlit_exe.wxs
echo ' <Feature Id="MainFeature" Title="Main Application" Level="1">' >> streamlit_exe.wxs
echo ' <ComponentGroupRef Id="StreamlitExeFiles" />' >> streamlit_exe.wxs
echo ' <ComponentRef Id="DesktopShortcutComponent" />' >> streamlit_exe.wxs
echo ' <ComponentRef Id="InstallDirShortcutComponent" />' >> streamlit_exe.wxs
echo ' </Feature>' >> streamlit_exe.wxs
echo ' <Component Id="DesktopShortcutComponent" Guid="3597b243-9180-4d0b-b105-30d8b0d1a334" Directory="DesktopFolder">' >> streamlit_exe.wxs
echo ' <Shortcut Id="DesktopShortcut" Name="${{ env.APP_NAME }}" Description="Launch ${{ env.APP_NAME }}" Target="[INSTALLFOLDER]${{ env.APP_NAME }}.bat" WorkingDirectory="INSTALLFOLDER" Icon="AppIcon"/>' >> streamlit_exe.wxs
echo ' <RegistryValue Root="HKCU" Key="Software\OpenMS\${{ env.APP_NAME }}" Name="DesktopShortcut" Type="integer" Value="1" KeyPath="yes" />' >> streamlit_exe.wxs
echo ' </Component>' >> streamlit_exe.wxs
echo ' <Component Id="InstallDirShortcutComponent" Guid="c2df9472-3b45-4558-a56d-6034cf7c8b72" Directory="INSTALLFOLDER">' >> streamlit_exe.wxs
echo ' <Shortcut Id="DesktopShortcut" Name="${{ env.APP_NAME }}" Description="Launch ${{ env.APP_NAME }}" Target="[INSTALLFOLDER]${{ env.APP_NAME }}.bat" WorkingDirectory="INSTALLFOLDER" Icon="AppIcon"/>' >> streamlit_exe.wxs
echo ' <RegistryValue Root="HKCU" Key="Software\OpenMS\${{ env.APP_NAME }}" Name="InstallFolderShortcut" Type="integer" Value="1" KeyPath="yes" />' >> streamlit_exe.wxs
echo ' </Component>' >> streamlit_exe.wxs
echo ' <Icon Id="AppIcon" SourceFile="SourceDir/openms.ico" />' >> streamlit_exe.wxs
echo ' <CustomAction Id="ReadMeFile" Directory="INSTALLFOLDER" Execute="deferred" Return="check"' >> streamlit_exe.wxs
echo ' ExeCommand="cmd.exe /c echo Welcome to ${{ env.APP_NAME }}! > [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo To launch the application: >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo 1. Navigate to the installation directory. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo 2. Double-click on the file: ${{ env.APP_NAME }}.bat or ${{ env.APP_NAME }} shortcut. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo Additional Information: >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo - If multiple Streamlit apps are running on your computer and you encounter a port conflict, you can change the port in the .streamlit\config.toml file located in your user directory. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo Example: >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo [server] >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo port = 8502 >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo - For more details on Streamlit, visit: https://streamlit.io/ >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo Need Help? >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo - Join our Discord server for support and community discussions: >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo https://discord.com/invite/4TAGhqJ7s5 >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo. >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' &amp;&amp; echo Thank you for using ${{ env.APP_NAME }}! >> [INSTALLFOLDER]Readme.txt ^' >> streamlit_exe.wxs
echo ' <CustomAction Id="CreateBatFile" Directory="INSTALLFOLDER" Execute="deferred" Return="check"' >> streamlit_exe.wxs

Check failure on line 302 in .github/workflows/build-windows-executable-app.yaml

View workflow run for this annotation

GitHub Actions / .github/workflows/build-windows-executable-app.yaml

Invalid workflow file

You have an error in your yaml syntax on line 302
echo ' ExeCommand="cmd.exe /c echo @echo off &gt; [INSTALLFOLDER]${{ env.APP_NAME }}.bat &amp;&amp; echo [INSTALLFOLDER]python-${{ env.PYTHON_VERSION }}\\python.exe -m streamlit run [INSTALLFOLDER]app.py local &gt;&gt; [INSTALLFOLDER]${{ env.APP_NAME }}.bat" />' >> streamlit_exe.wxs
echo ' <CustomAction Id="RunApp" Directory="INSTALLFOLDER" Execute="deferred" Return="asyncNoWait"' >> streamlit_exe.wxs
echo ' ExeCommand="cmd.exe /c &quot;[INSTALLFOLDER]${{ env.APP_NAME }}.bat&quot;" />' >> streamlit_exe.wxs
echo ' <InstallExecuteSequence>' >> streamlit_exe.wxs
echo ' <Custom Action="ReadMeFile" After="InstallFiles">NOT REMOVE</Custom>' >> streamlit_exe.wxs
echo ' <Custom Action="CreateBatFile" After="InstallFiles">NOT REMOVE</Custom>' >> streamlit_exe.wxs
echo ' <Custom Action="RunApp" Before="InstallFinalize">NOT REMOVE</Custom>' >> streamlit_exe.wxs #todo remove these files during uninstallation
echo ' </InstallExecuteSequence>' >> streamlit_exe.wxs
echo ' <UI>' >> streamlit_exe.wxs
echo ' <UIRef Id="WixUI_InstallDir" />' >> streamlit_exe.wxs
echo ' <UIRef Id="WixUI_ErrorProgressText" />' >> streamlit_exe.wxs
echo ' </UI>' >> streamlit_exe.wxs
echo ' <WixVariable Id="WixUILicenseRtf" Value="SourceDir/dummy_license.rtf" />' >> streamlit_exe.wxs
echo ' </Product>' >> streamlit_exe.wxs
echo '</Wix>' >> streamlit_exe.wxs
- name: Build msi
run: |
./wix/candle.exe streamlit_exe.wxs streamlit_exe_files.wxs
./wix/light.exe -ext WixUIExtension -sice:ICE60 -o ${{ env.APP_NAME }}.msi streamlit_exe_files.wixobj streamlit_exe.wixobj
- name: Delete OpenMS bin artifact
uses: geekyeggo/delete-artifact@v5
with:
name: openms-package
- name: Archive build artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.APP_NAME }}
path: |
${{ env.APP_NAME }}.msi