mirror of
https://github.com/navidrome/navidrome.git
synced 2025-12-23 23:18:05 -05:00
feat(build): MSI installer improvements (#3376)
* feat(build): add a make target to build a msi installer locally
* Testing wrapping the executable in cmd
* build(ci): build msis in parallel
* feat(server): add LogFile config option
* Revert "Testing wrapping the executable in cmd"
This reverts commit be29592254.
* Adding --log-file for service executable
* feat(ini): wip
* feat(ini): parse nested ini section
* fix(conf): fix fatal error messages
* Now navidrome supports INI, we can use the built-in msi ini system
and not require the VBScript to convert it into toml
* File needs to be called .ini to be parsed as an INI and correct filename
needs to be passed to the service
* fix(msi): build msi locally
* fix(msi): pipeline
* fix(msi): pipeline
* fix(msi): pipeline
* fix(msi): pipeline
* fix(msi): pipeline
* fix(msi): Makefile
* fix(msi): more clean up
* fix(log): convert LF to CRLF on Windows
* fix(msi): config filename should be case-insensitive
* fix(msi): make it a little more idiomatic
* Including the latest windows release of ffmpeg into the msi
as built by https://www.gyan.dev/ffmpeg/builds/ (linked
to on the official ffmpeg source)
* This should version independent
* Need bash expansion for the * to work
* This will run twice, once for x86 and once for x64, I'll make it cache
the executable for now as it'll be quicker
* Silencing wget
* Add ffmpeg path to the config so Navidrome knows where to find it
* refactor: download ffmpeg from our repository
* When going back from the "Are you ready to install?" it should go back to the
Settings dialogue that you just came from
* fix: comments
---------
Co-authored-by: Deluan <deluan@navidrome.org>
This commit is contained in:
41
release/wix/Navidrome_UI_Flow.wxs
Normal file
41
release/wix/Navidrome_UI_Flow.wxs
Normal file
@@ -0,0 +1,41 @@
|
||||
<Fragment>
|
||||
<UI Id="Navidrome_UI_Flow">
|
||||
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
|
||||
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
|
||||
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
|
||||
|
||||
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
|
||||
<Property Id="WixUI_Mode" Value="Minimal" />
|
||||
|
||||
<DialogRef Id="ErrorDlg" />
|
||||
<DialogRef Id="FatalError" />
|
||||
<DialogRef Id="FilesInUse" />
|
||||
<DialogRef Id="MsiRMFilesInUse" />
|
||||
<DialogRef Id="PrepareDlg" />
|
||||
<DialogRef Id="ProgressDlg" />
|
||||
<DialogRef Id="ResumeDlg" />
|
||||
<DialogRef Id="UserExit" />
|
||||
<DialogRef Id="WelcomeDlg" />
|
||||
|
||||
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999" />
|
||||
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MyCustomPropertiesDlg" />
|
||||
|
||||
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" />
|
||||
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" />
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" />
|
||||
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" />
|
||||
|
||||
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Condition="Installed AND PATCH" />
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2" Condition="Installed AND PATCH" />
|
||||
|
||||
<InstallUISequence>
|
||||
<Show Dialog="WelcomeDlg" Before="ProgressDlg" Condition="Installed AND PATCH" />
|
||||
</InstallUISequence>
|
||||
|
||||
<Property Id="ARPNOMODIFY" Value="1" />
|
||||
</UI>
|
||||
|
||||
<UIRef Id="WixUI_Common" />
|
||||
</Fragment>
|
||||
44
release/wix/SettingsDlg.wxs
Normal file
44
release/wix/SettingsDlg.wxs
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Fragment>
|
||||
<UI>
|
||||
<Dialog Id="MyCustomPropertiesDlg" Width="370" Height="270" Title="[ProductName] Setup" NoMinimize="yes">
|
||||
<!--Header-->
|
||||
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" />
|
||||
<Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
|
||||
<Text>{\WixUI_Font_Title}Configuration</Text>
|
||||
</Control>
|
||||
<Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
|
||||
<Text>Please enter configuration settings</Text>
|
||||
</Control>
|
||||
<Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
|
||||
|
||||
<!--Properties-->
|
||||
|
||||
<!-- Install directory -->
|
||||
<Control Id="NameLabel1" Type="Text" X="30" Y="60" Width="220" Height="15" TabSkip="no" Text="&Installation Folder (executable and configuration file):" />
|
||||
<Control Id="NameEdit1" Type="Edit" X="30" Y="75" Width="220" Height="18" Property="INSTALLDIR" Text="[INSTALLDIR]" />
|
||||
|
||||
<!-- NAVIDROME_PORT -->
|
||||
<Control Id="NameLabel2" Type="Text" X="30" Y="93" Width="100" Height="15" TabSkip="no" Text="&Port:" />
|
||||
<Control Id="NameEdit2" Type="Edit" X="30" Y="108" Width="220" Height="18" Property="ND_PORT" Text="[ND_PORT]" />
|
||||
|
||||
<!-- NAVIDROME_MUSICDIR -->
|
||||
<Control Id="NameLabel3" Type="Text" X="30" Y="126" Width="100" Height="15" TabSkip="no" Text="&Music Folder:" />
|
||||
<Control Id="NameEdit3" Type="Edit" X="30" Y="141" Width="220" Height="18" Property="ND_MUSICFOLDER" Text="[ND_MUSICFOLDER]" />
|
||||
|
||||
<!-- NAVIDROME_DATADIR -->
|
||||
<Control Id="NameLabel4" Type="Text" X="30" Y="159" Width="100" Height="15" TabSkip="no" Text="&Data Folder:" />
|
||||
<Control Id="NameEdit5" Type="Edit" X="30" Y="174" Width="220" Height="18" Property="ND_DATAFOLDER" Text="[ND_DATAFOLDER]" />
|
||||
|
||||
<!--Footer-->
|
||||
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
|
||||
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&Next">
|
||||
<Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
|
||||
<Publish Event="NewDialog" Value="VerifyReadyDlg"></Publish>
|
||||
</Control>
|
||||
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="Cancel">
|
||||
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
|
||||
</Control>
|
||||
</Dialog>
|
||||
</UI>
|
||||
</Fragment>
|
||||
BIN
release/wix/bmp/banner.bmp
Normal file
BIN
release/wix/bmp/banner.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
BIN
release/wix/bmp/dialogue.bmp
Normal file
BIN
release/wix/bmp/dialogue.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 451 KiB |
60
release/wix/build_msi.sh
Executable file
60
release/wix/build_msi.sh
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/bin/sh
|
||||
|
||||
FFMPEG_VERSION="7.1"
|
||||
FFMPEG_REPOSITORY=navidrome/ffmpeg-windows-builds
|
||||
DOWNLOAD_FOLDER=/tmp
|
||||
|
||||
#Exit if GIT_TAG is not set
|
||||
if [ -z "$GIT_TAG" ]; then
|
||||
echo "GIT_TAG is not set, exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
WORKSPACE=$1
|
||||
ARCH=$2
|
||||
NAVIDROME_BUILD_VERSION=$(echo "$GIT_TAG" | sed -e 's/^v//' -e 's/-SNAPSHOT/.1/')
|
||||
|
||||
echo "Building MSI package for $ARCH, version $NAVIDROME_BUILD_VERSION"
|
||||
|
||||
MSI_OUTPUT_DIR=$WORKSPACE/binaries/msi
|
||||
mkdir -p "$MSI_OUTPUT_DIR"
|
||||
BINARY_DIR=$WORKSPACE/binaries/windows_${ARCH}
|
||||
|
||||
if [ "$ARCH" = "386" ]; then
|
||||
PLATFORM="x86"
|
||||
WIN_ARCH="win32"
|
||||
else
|
||||
PLATFORM="x64"
|
||||
WIN_ARCH="win64"
|
||||
fi
|
||||
|
||||
BINARY=$BINARY_DIR/navidrome.exe
|
||||
if [ ! -f "$BINARY" ]; then
|
||||
echo
|
||||
echo "$BINARY not found!"
|
||||
echo "Build it with 'make single GOOS=windows GOARCH=${ARCH}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Download static compiled ffmpeg for Windows
|
||||
FFMPEG_FILE="ffmpeg-n${FFMPEG_VERSION}-latest-${WIN_ARCH}-gpl-${FFMPEG_VERSION}"
|
||||
wget --quiet --output-document="${DOWNLOAD_FOLDER}/ffmpeg.zip" \
|
||||
"https://github.com/${FFMPEG_REPOSITORY}/releases/download/latest/${FFMPEG_FILE}.zip"
|
||||
rm -rf "${DOWNLOAD_FOLDER}/extracted_ffmpeg"
|
||||
unzip -d "${DOWNLOAD_FOLDER}/extracted_ffmpeg" "${DOWNLOAD_FOLDER}/ffmpeg.zip" "*/ffmpeg.exe"
|
||||
cp "${DOWNLOAD_FOLDER}"/extracted_ffmpeg/${FFMPEG_FILE}/bin/ffmpeg.exe "$MSI_OUTPUT_DIR"
|
||||
|
||||
cp "$WORKSPACE"/LICENSE "$WORKSPACE"/README.md "$MSI_OUTPUT_DIR"
|
||||
cp "$BINARY" "$MSI_OUTPUT_DIR"
|
||||
|
||||
# workaround for wixl WixVariable not working to override bmp locations
|
||||
cp "$WORKSPACE"/release/wix/bmp/banner.bmp /usr/share/wixl-*/ext/ui/bitmaps/bannrbmp.bmp
|
||||
cp "$WORKSPACE"/release/wix/bmp/dialogue.bmp /usr/share/wixl-*/ext/ui/bitmaps/dlgbmp.bmp
|
||||
|
||||
cd "$MSI_OUTPUT_DIR"
|
||||
rm -f "$MSI_OUTPUT_DIR"/navidrome_"${ARCH}".msi
|
||||
wixl "$WORKSPACE"/release/wix/navidrome.wxs -D Version="$NAVIDROME_BUILD_VERSION" -D Platform=$PLATFORM --arch $PLATFORM \
|
||||
--ext ui --output "$MSI_OUTPUT_DIR"/navidrome_"${ARCH}".msi
|
||||
|
||||
3
release/wix/msitools.dockerfile
Normal file
3
release/wix/msitools.dockerfile
Normal file
@@ -0,0 +1,3 @@
|
||||
FROM public.ecr.aws/docker/library/alpine
|
||||
RUN apk update && apk add jq msitools
|
||||
WORKDIR /workspace
|
||||
86
release/wix/navidrome.wxs
Normal file
86
release/wix/navidrome.wxs
Normal file
@@ -0,0 +1,86 @@
|
||||
<?xml version='1.0' encoding='windows-1252'?>
|
||||
<?if $(var.Platform) = x64 ?>
|
||||
<?define ProductName = "Navidrome" ?>
|
||||
<?define UpgradeCode = "2f154974-1443-41b6-b808-b8be530291b3" ?>
|
||||
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
|
||||
<?define Win64 = 'yes' ?>
|
||||
<?else ?>
|
||||
<?define ProductName = "Navidrome (x86)" ?>
|
||||
<?define UpgradeCode = "2f0572e4-7e8c-42e7-a186-77f70ec0911a" ?>
|
||||
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
|
||||
<?define Win64 = "no" ?>
|
||||
<?endif ?>
|
||||
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
|
||||
<?include SettingsDlg.wxs?>
|
||||
<?include Navidrome_UI_Flow.wxs?>
|
||||
<Product Name="$(var.ProductName)" Id="*" UpgradeCode="$(var.UpgradeCode)" Language='1033' Codepage='1252' Version='$(var.Version)' Manufacturer='Deluan'>
|
||||
|
||||
<Package Id='*' Keywords='Installer' Description="$(var.ProductName)" Comments='' Manufacturer='Deluan' InstallerVersion='200' Languages='1033' Compressed='yes' SummaryCodepage='1252' InstallScope='perMachine' />
|
||||
|
||||
<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of $(var.ProductName) is already installed." />
|
||||
|
||||
<Media Id='1' Cabinet='main.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
|
||||
<Property Id='DiskPrompt' Value="Navidrome Install [1]" />
|
||||
<Property Id="REBOOT" Value="ReallySuppress" />
|
||||
|
||||
<Property Id="ND_PORT" Value="4533" />
|
||||
<Property Id="ND_MUSICFOLDER" Value="C:\Music" />
|
||||
<Property Id="ND_DATAFOLDER" Value="C:\ProgramData\Navidrome" />
|
||||
|
||||
<UIRef Id="Navidrome_UI_Flow"/>
|
||||
|
||||
<Directory Id='TARGETDIR' Name='SourceDir'>
|
||||
<Directory Id="$(var.PlatformProgramFilesFolder)">
|
||||
<Directory Id='INSTALLDIR' Name='Navidrome'>
|
||||
|
||||
<Component Id='LICENSEFile' Guid='eb5610a4-e3f3-4f36-ae2c-e96914e460c2' Win64="$(var.Win64)">
|
||||
<File Id='LICENSE' Name='LICENSE' DiskId='1' Source='LICENSE' KeyPath='yes' />
|
||||
</Component>
|
||||
|
||||
<Component Id='README.mdFile' Guid='d1ee412b-2ebc-4b0b-9fa7-0228ab707686' Win64="$(var.Win64)">
|
||||
<File Id='README.md' Name='README.md' DiskId='1' Source='README.md' KeyPath='yes' />
|
||||
</Component>
|
||||
|
||||
<Component Id="Configuration" Guid="9e17ed4b-ef13-44bf-a605-ed4132cff7f6" Win64="$(var.Win64)">
|
||||
<IniFile Id="ConfigurationPort" Name="navidrome.ini" Action="createLine" Directory="INSTALLDIR" Key="Port" Section="default" Value="'[ND_PORT]'" />
|
||||
<IniFile Id="ConfigurationMusicDir" Name="navidrome.ini" Action="addLine" Directory="INSTALLDIR" Key="MusicFolder" Section="default" Value="'[ND_MUSICFOLDER]'" />
|
||||
<IniFile Id="ConfigurationDataDir" Name="navidrome.ini" Action="addLine" Directory="INSTALLDIR" Key="DataFolder" Section="default" Value="'[ND_DATAFOLDER]'" />
|
||||
<IniFile Id="FFmpegPath" Name="navidrome.ini" Action="addLine" Directory="INSTALLDIR" Key="FFmpegPath" Section="default" Value="'[INSTALLDIR]ffmpeg.exe'" />
|
||||
</Component>
|
||||
|
||||
<Component Id='MainExecutable' Guid='e645aa06-8bbc-40d6-8d3c-73b4f5b76fd7' Win64="$(var.Win64)">
|
||||
<File Id='NavidromeExe' Name='Navidrome.exe' DiskId='1' Source='navidrome.exe' KeyPath='yes' />
|
||||
<ServiceInstall
|
||||
Description='Navidrome is a self-hosted music server and streamer'
|
||||
ErrorControl='ignore'
|
||||
Name = '$(var.ProductName)'
|
||||
Id='NavidromeService'
|
||||
Start='auto'
|
||||
Type='ownProcess'
|
||||
Vital='yes'
|
||||
Arguments='service execute --configfile "[INSTALLDIR]navidrome.ini" --logfile "[ND_DATAFOLDER]\navidrome.log"'
|
||||
/>
|
||||
<ServiceControl Id='StartNavidromeService' Start='install' Stop='both' Remove='uninstall' Name='$(var.ProductName)' Wait='yes' />
|
||||
</Component>
|
||||
|
||||
<Component Id='FFMpegExecutable' Guid='d17358f7-abdc-4080-acd3-6427903a7dd8' Win64="$(var.Win64)">
|
||||
<File Id='ffmpeg.exe' Name='ffmpeg.exe' DiskId='1' Source='ffmpeg.exe' KeyPath='yes' />
|
||||
</Component>
|
||||
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
|
||||
<InstallUISequence>
|
||||
<Show Dialog="MyCustomPropertiesDlg" After="WelcomeDlg">Not Installed AND NOT WIX_UPGRADE_DETECTED</Show>
|
||||
</InstallUISequence>
|
||||
|
||||
<Feature Id='Complete' Level='1'>
|
||||
<ComponentRef Id='LICENSEFile' />
|
||||
<ComponentRef Id='README.mdFile' />
|
||||
<ComponentRef Id='Configuration'/>
|
||||
<ComponentRef Id='MainExecutable' />
|
||||
<ComponentRef Id='FFMpegExecutable' />
|
||||
</Feature>
|
||||
</Product>
|
||||
</Wix>
|
||||
Reference in New Issue
Block a user