From 6c233fcc3f0321742489a6fffa7c6bc080587774 Mon Sep 17 00:00:00 2001 From: Maycon Santos Date: Mon, 6 Sep 2021 10:20:26 +0200 Subject: [PATCH] Add windows installer (#109) * windows installer * unpack function in local dir * working-directory client * using env var plugin * test tag and publishing * getting version from tag * using version number * remove unnecessary commands and add description * using long version outputs * uncomment docker steps --- .github/workflows/release.yml | 27 ++++++- client/installer.nsis | 118 ++++++++++++++++++++++++++++ manifest.xml => client/manifest.xml | 0 client/ui/banner.bmp | Bin 0 -> 26494 bytes client/ui/wiretrustee.ico | Bin 0 -> 101387 bytes 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 client/installer.nsis rename manifest.xml => client/manifest.xml (100%) create mode 100644 client/ui/banner.bmp create mode 100644 client/ui/wiretrustee.ico diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4f3fbae9f..a14727116 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,4 +49,29 @@ jobs: version: latest args: release --rm-dist env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - + id: get_version + uses: battila7/get-version-action@v2 + - + name: Install makensis + run: sudo apt update && sudo apt install -y nsis nsis-pluginapi + - + name: Download EnvVar Plugin + run: curl -L -o EnVar_plugin.zip https://nsis.sourceforge.io/mediawiki/images/7/7f/EnVar_plugin.zip + - + name: Extract EnVar plugin + run: sudo 7z x -o"/usr/share/nsis/" EnVar_plugin.zip + - + name: Generate Windows installer + run: makensis -V4 client/installer.nsis + env: + APPVER: ${{ steps.get_version.outputs.major }}.${{ steps.get_version.outputs.minor }}.${{ steps.get_version.outputs.patch }}.${{ github.run_id }} + - + name: Upload windows installer to release page + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: wiretrustee-installer.exe + asset_name: wiretrustee_installer_${{ steps.get_version.outputs.version-without-v }}_windows_amd64.exe + tag: ${{ github.ref }} \ No newline at end of file diff --git a/client/installer.nsis b/client/installer.nsis new file mode 100644 index 000000000..721742b7f --- /dev/null +++ b/client/installer.nsis @@ -0,0 +1,118 @@ +!define APP_NAME "Wiretrustee" +!define COMP_NAME "Wiretrustee" +!define WEB_SITE "wiretrustee.com" +!define VERSION $%APPVER% +!define COPYRIGHT "Wiretrustee Authors, 2021" +!define DESCRIPTION "A WireGuard®-based mesh network that connects your devices into a single private network" +!define INSTALLER_NAME "wiretrustee-installer.exe" +!define MAIN_APP_EXE "Wiretrustee" +!define ICON "ui\\wiretrustee.ico" +!define BANNER "ui\\banner.bmp" +!define LICENSE_DATA "..\\LICENSE" + +!define INSTALL_DIR "$PROGRAMFILES64\${APP_NAME}" +!define INSTALL_TYPE "SetShellVarContext all" +!define REG_ROOT "HKLM" +!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" +!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" +Unicode True + +###################################################################### + +VIProductVersion "${VERSION}" +VIAddVersionKey "ProductName" "${APP_NAME}" +VIAddVersionKey "CompanyName" "${COMP_NAME}" +VIAddVersionKey "LegalCopyright" "${COPYRIGHT}" +VIAddVersionKey "FileDescription" "${DESCRIPTION}" +VIAddVersionKey "FileVersion" "${VERSION}" + +###################################################################### + +SetCompressor /SOLID Lzma +Name "${APP_NAME}" +Caption "${APP_NAME}" +OutFile "..\\${INSTALLER_NAME}" +BrandingText "${APP_NAME}" +InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" +InstallDir "${INSTALL_DIR}" +LicenseData "${LICENSE_DATA}" +ShowInstDetails Show + +###################################################################### + +!define MUI_ICON "${ICON}" +!define MUI_UNICON "${ICON}" +!define MUI_WELCOMEFINISHPAGE_BITMAP "${BANNER}" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${BANNER}" + +###################################################################### + +!include "MUI2.nsh" + +!define MUI_ABORTWARNING +!define MUI_UNABORTWARNING + +!insertmacro MUI_PAGE_WELCOME + +!insertmacro MUI_PAGE_LICENSE "${LICENSE_DATA}" + +!insertmacro MUI_PAGE_DIRECTORY + +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM + +!insertmacro MUI_UNPAGE_INSTFILES + +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" + +###################################################################### + +Section -MainProgram + ${INSTALL_TYPE} + SetOverwrite ifnewer + SetOutPath "$INSTDIR" + File /r "..\\dist\\wiretrustee_windows_amd64\\" + +SectionEnd + +###################################################################### + +Section -Icons_Reg +SetOutPath "$INSTDIR" +WriteUninstaller "$INSTDIR\wiretrustee_uninstall.exe" + +WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayName" "${APP_NAME}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "UninstallString" "$INSTDIR\wiretrustee_uninstall.exe" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" + +EnVar::SetHKLM +EnVar::AddValueEx "path" "$INSTDIR" + +Exec '"$INSTDIR\${MAIN_APP_EXE}" service install' +# sleep a bit for visibility +Sleep 1000 +SectionEnd + +###################################################################### + +Section Uninstall +${INSTALL_TYPE} + +Exec '"$INSTDIR\${MAIN_APP_EXE}" service uninstall' +# wait the service uninstall take unblock the executable +Sleep 3000 +RmDir /r "$INSTDIR" + +DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" +DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" +EnVar::SetHKLM +EnVar::DeleteValue "path" "$INSTDIR" +SectionEnd \ No newline at end of file diff --git a/manifest.xml b/client/manifest.xml similarity index 100% rename from manifest.xml rename to client/manifest.xml diff --git a/client/ui/banner.bmp b/client/ui/banner.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5524eef945119e421d076d8fa9f8ded1205c1021 GIT binary patch literal 26494 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 Dp19ST literal 0 HcmV?d00001 diff --git a/client/ui/wiretrustee.ico b/client/ui/wiretrustee.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ec2fb4f68845f956b87fd1f09067e84b3bb6de7 GIT binary patch literal 101387 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 literal 0 HcmV?d00001