win-exe.yml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. name: Build Windows Installer
  2. on:
  3. release:
  4. types: [published]
  5. workflow_dispatch:
  6. inputs:
  7. version:
  8. description: 'Version'
  9. required: false
  10. isDebug:
  11. description: 'Build debug version with console output'
  12. type: boolean
  13. default: false
  14. push:
  15. branches-ignore:
  16. - 'dependabot/**'
  17. paths:
  18. - '.github/workflows/win-exe.yml'
  19. - 'dist/win/**'
  20. env:
  21. JAVA_DIST: 'zulu'
  22. JAVA_VERSION: '24.0.1+9'
  23. OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_windows-x64_bin-jmods.zip'
  24. OPENJFX_JMODS_AMD64_HASH: 'f13d17c7caf88654fc835f1b4e75a9b0f34a888eb8abef381796c0002e63b03f'
  25. WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi'
  26. WINFSP_MSI_HASH: '073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a'
  27. WINFSP_UNINSTALLER: 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
  28. defaults:
  29. run:
  30. shell: bash
  31. jobs:
  32. get-version:
  33. uses: ./.github/workflows/get-version.yml
  34. with:
  35. version: ${{ inputs.version }}
  36. build-msi:
  37. name: Build .msi Installer
  38. runs-on: windows-latest
  39. needs: [get-version]
  40. env:
  41. LOOPBACK_ALIAS: 'cryptomator-vault'
  42. WIN_CONSOLE_FLAG: ''
  43. steps:
  44. - uses: actions/checkout@v4
  45. - name: Setup Java
  46. uses: actions/setup-java@v4
  47. with:
  48. distribution: ${{ env.JAVA_DIST }}
  49. java-version: ${{ env.JAVA_VERSION }}
  50. check-latest: true
  51. cache: 'maven'
  52. - name: Install wix and extensions
  53. run: |
  54. dotnet tool install --global wix --version 6.0.0
  55. wix.exe extension add WixToolset.UI.wixext/6.0.0 --global
  56. wix.exe extension add WixToolset.Util.wixext/6.0.0 --global
  57. - name: Download and extract JavaFX jmods from Gluon
  58. #In the last step we move all jmods files a dir level up because jmods are placed inside a directory in the zip
  59. run: |
  60. curl --output openjfx-jmods.zip -L "${{ env.OPENJFX_JMODS_AMD64 }}"
  61. if(!(Get-FileHash -Path openjfx-jmods.zip -Algorithm SHA256).Hash.ToLower().equals("${{ env.OPENJFX_JMODS_AMD64_HASH }}")) {
  62. throw "Wrong checksum of JMOD archive downloaded from ${{ env.OPENJFX_JMODS_AMD64 }}.";
  63. }
  64. Expand-Archive -Path openjfx-jmods.zip -DestinationPath openjfx-jmods
  65. Get-ChildItem -Path openjfx-jmods -Recurse -Filter "*.jmod" | ForEach-Object { Move-Item -Path $_ -Destination $_.Directory.Parent}
  66. shell: pwsh
  67. - name: Ensure major jfx version in pom and in jmods is the same
  68. run: |
  69. JMOD_VERSION_AMD64=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
  70. JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64#*@}
  71. JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64%%.*}
  72. POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
  73. POM_JFX_VERSION=${POM_JFX_VERSION#*@}
  74. POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
  75. if [ $POM_JFX_VERSION -ne $JMOD_VERSION_AMD64 ]; then
  76. >&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION_AMD64})"
  77. exit 1
  78. fi
  79. - name: Set version
  80. run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
  81. - name: Run maven
  82. run: mvn -B clean package -Pwin -DskipTests -Djavafx.platform=win
  83. - name: Patch target dir
  84. run: |
  85. cp LICENSE.txt target
  86. cp target/cryptomator-*.jar target/mods
  87. - name: Run jlink with help option
  88. id: jep-493-check
  89. run: |
  90. JMOD_PATHS="openjfx-jmods"
  91. if ! $(${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"); then
  92. JMOD_PATHS="${JAVA_HOME}/jmods;${JMOD_PATHS}"
  93. fi
  94. echo "jmod_paths=${JMOD_PATHS}" >> "$GITHUB_OUTPUT"
  95. - name: Run jlink
  96. #Remark: no compression is applied for improved build compression later (here msi)
  97. run: >
  98. ${JAVA_HOME}/bin/jlink
  99. --verbose
  100. --output runtime
  101. --module-path "${{ steps.jep-493-check.outputs.jmod_paths }}"
  102. --add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.crypto.mscapi,jdk.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
  103. --strip-native-commands
  104. --no-header-files
  105. --no-man-pages
  106. --strip-debug
  107. --compress zip-0
  108. - name: Change win-console flag if debug is active
  109. if: ${{ inputs.isDebug }}
  110. run: echo "WIN_CONSOLE_FLAG=--win-console" >> $GITHUB_ENV
  111. - name: Run jpackage
  112. run: >
  113. ${JAVA_HOME}/bin/jpackage
  114. --verbose
  115. --type app-image
  116. --runtime-image runtime
  117. --input target/libs
  118. --module-path target/mods
  119. --module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
  120. --dest appdir
  121. --name Cryptomator
  122. --vendor "Skymatic GmbH"
  123. --copyright "(C) 2016 - 2025 Skymatic GmbH"
  124. --app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
  125. --java-options "--enable-preview"
  126. --java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
  127. --java-options "-Xss5m"
  128. --java-options "-Xmx256m"
  129. --java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
  130. --java-options "-Dfile.encoding=\"utf-8\""
  131. --java-options "-Djava.net.useSystemProxies=true"
  132. --java-options "-Dcryptomator.logDir=\"@{localappdata}/Cryptomator\""
  133. --java-options "-Dcryptomator.pluginDir=\"@{appdata}/Cryptomator/Plugins\""
  134. --java-options "-Dcryptomator.settingsPath=\"@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json\""
  135. --java-options "-Dcryptomator.p12Path=\"@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12\""
  136. --java-options "-Dcryptomator.ipcSocketPath=\"@{localappdata}/Cryptomator/ipc.socket\""
  137. --java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/Cryptomator\""
  138. --java-options "-Dcryptomator.loopbackAlias=\"${{ env.LOOPBACK_ALIAS }}\""
  139. --java-options "-Dcryptomator.showTrayIcon=true"
  140. --java-options "-Dcryptomator.buildNumber=\"msi-${{ needs.get-version.outputs.revNum }}\""
  141. --java-options "-Dcryptomator.integrationsWin.autoStartShellLinkName=\"Cryptomator\""
  142. --java-options "-Dcryptomator.integrationsWin.keychainPaths=\"@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json\""
  143. --java-options "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=\"@{appdata}/Cryptomator/windowsHelloKeychain.json\""
  144. --java-options "-Djavafx.verbose=${{ inputs.isDebug }}"
  145. --resource-dir dist/win/resources
  146. --icon dist/win/resources/Cryptomator.ico
  147. ${WIN_CONSOLE_FLAG}
  148. - name: Patch Application Directory
  149. run: |
  150. cp dist/win/contrib/* appdir/Cryptomator
  151. - name: Set LOOPBACK_ALIAS in patchWebDAV.bat
  152. shell: pwsh
  153. run: |
  154. $patchScript = "appdir\Cryptomator\patchWebDAV.bat"
  155. try {
  156. (Get-Content $patchScript ) -replace '::REPLACE ME', "SET LOOPBACK_ALIAS=`"${{ env.LOOPBACK_ALIAS}}`"" | Set-Content $patchScript
  157. } catch {
  158. Write-Host "Failed to set LOOPBACK_ALIAS for patchWebDAV.bat"
  159. exit 1
  160. }
  161. - name: Fix permissions
  162. run: attrib -r appdir/Cryptomator/Cryptomator.exe
  163. shell: pwsh
  164. - name: Extract jars with DLLs for Codesigning
  165. shell: pwsh
  166. run: |
  167. Add-Type -AssemblyName "System.io.compression.filesystem"
  168. $jarFolder = Resolve-Path ".\appdir\Cryptomator\app\mods"
  169. $jarExtractDir = New-Item -Path ".\appdir\jar-extract" -ItemType Directory
  170. #for all jars inspect
  171. Get-ChildItem -Path $jarFolder -Filter "*.jar" | ForEach-Object {
  172. $jar = [Io.compression.zipfile]::OpenRead($_.FullName)
  173. if (@($jar.Entries | Where-Object {$_.Name.ToString().EndsWith(".dll")} | Select-Object -First 1).Count -gt 0) {
  174. #jars containing dlls extract
  175. Set-Location $jarExtractDir
  176. Expand-Archive -Path $_.FullName
  177. }
  178. $jar.Dispose()
  179. }
  180. - name: Extract wixhelper.dll for Codesigning #see https://github.com/cryptomator/cryptomator/issues/3130
  181. shell: pwsh
  182. run: |
  183. New-Item -Path appdir/jpackage-jmod -ItemType Directory
  184. & $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod"
  185. Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir"
  186. - name: Codesign
  187. uses: skymatic/code-sign-action@v3
  188. with:
  189. certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
  190. password: ${{ secrets.WIN_CODESIGN_P12_PW }}
  191. certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
  192. description: Cryptomator
  193. timestampUrl: 'http://timestamp.digicert.com'
  194. folder: appdir
  195. recursive: true
  196. - name: Replace DLLs inside jars with signed ones
  197. shell: pwsh
  198. run: |
  199. $jarExtractDir = Resolve-Path ".\appdir\jar-extract"
  200. $jarFolder = Resolve-Path ".\appdir\Cryptomator\app\mods"
  201. Get-ChildItem -Path $jarExtractDir | ForEach-Object {
  202. $jarName = $_.Name
  203. $jarFile = "${jarFolder}\${jarName}.jar"
  204. Set-Location $_
  205. Get-ChildItem -Path $_ -Recurse -File "*.dll" | ForEach-Object {
  206. # update jar with signed dll
  207. jar --file="$jarFile" --update $(Resolve-Path -Relative -Path $_)
  208. }
  209. }
  210. - name: Generate license for MSI
  211. run: >
  212. mvn -B license:add-third-party "-Djavafx.platform=win"
  213. "-Dlicense.thirdPartyFilename=license.rtf"
  214. "-Dlicense.outputDirectory=dist/win/resources"
  215. "-Dlicense.fileTemplate=dist/win/resources/licenseTemplate.ftl"
  216. "-Dlicense.includedScopes=compile"
  217. "-Dlicense.excludedGroups=^org\.cryptomator"
  218. "-Dlicense.failOnMissing=true"
  219. "-Dlicense.licenseMergesUrl=file:///${{ github.workspace }}/license/merges"
  220. shell: pwsh
  221. - name: Create MSI
  222. run: >
  223. ${JAVA_HOME}/bin/jpackage
  224. --verbose
  225. --type msi
  226. --win-upgrade-uuid bda45523-42b1-4cae-9354-a45475ed4775
  227. --app-image appdir/Cryptomator
  228. --dest installer
  229. --name Cryptomator
  230. --vendor "Skymatic GmbH"
  231. --copyright "(C) 2016 - 2025 Skymatic GmbH"
  232. --app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum}}"
  233. --win-menu
  234. --win-dir-chooser
  235. --win-shortcut-prompt
  236. --win-update-url "https:\\cryptomator.org\downloads"
  237. --win-menu-group Cryptomator
  238. --resource-dir dist/win/resources
  239. --license-file dist/win/resources/license.rtf
  240. --file-associations dist/win/resources/FAvaultFile.properties
  241. env:
  242. JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs
  243. JP_WIXHELPER_DIR: ${{ github.workspace }}\appdir
  244. - name: Codesign MSI
  245. uses: skymatic/code-sign-action@v3
  246. with:
  247. certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
  248. password: ${{ secrets.WIN_CODESIGN_P12_PW }}
  249. certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
  250. description: Cryptomator Installer
  251. timestampUrl: 'http://timestamp.digicert.com'
  252. folder: installer
  253. - name: Add possible alpha/beta tags to installer name
  254. run: mv installer/Cryptomator-*.msi Cryptomator-${{ needs.get-version.outputs.semVerStr }}-x64.msi
  255. - name: Create detached GPG signature with key 615D449FE6E6A235
  256. run: |
  257. echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
  258. echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a Cryptomator-*.msi
  259. env:
  260. GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
  261. GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
  262. - name: Upload artifacts
  263. uses: actions/upload-artifact@v4
  264. with:
  265. name: msi
  266. path: |
  267. Cryptomator-*.msi
  268. Cryptomator-*.asc
  269. if-no-files-found: error
  270. build-exe:
  271. name: Build .exe installer
  272. runs-on: windows-latest
  273. needs: [get-version, build-msi]
  274. steps:
  275. - uses: actions/checkout@v4
  276. - name: Install wix and extensions
  277. run: |
  278. dotnet tool install --global wix --version 6.0.0
  279. wix.exe extension add WixToolset.BootstrapperApplications.wixext/6.0.0 --global
  280. wix.exe extension add WixToolset.Util.wixext/6.0.0 --global
  281. - name: Download .msi
  282. uses: actions/download-artifact@v4
  283. with:
  284. name: msi
  285. path: dist/win/bundle/resources
  286. - name: Strip version info from msi file name
  287. run: mv dist/win/bundle/resources/Cryptomator*.msi dist/win/bundle/resources/Cryptomator.msi
  288. - uses: actions/setup-java@v4
  289. with:
  290. distribution: ${{ env.JAVA_DIST }}
  291. java-version: ${{ env.JAVA_VERSION }}
  292. check-latest: true
  293. cache: 'maven'
  294. - name: Generate license for exe
  295. run: >
  296. mvn -B license:add-third-party "-Djavafx.platform=win"
  297. "-Dlicense.thirdPartyFilename=license.rtf"
  298. "-Dlicense.fileTemplate=dist/win/bundle/resources/licenseTemplate.ftl"
  299. "-Dlicense.outputDirectory=dist/win/bundle/resources"
  300. "-Dlicense.includedScopes=compile"
  301. "-Dlicense.excludedGroups=^org\.cryptomator"
  302. "-Dlicense.failOnMissing=true"
  303. "-Dlicense.licenseMergesUrl=file:///${{ github.workspace }}/license/merges"
  304. shell: pwsh
  305. - name: Download WinFsp
  306. run: |
  307. curl --output $env:WINFSP_PATH -L ${{ env.WINFSP_MSI }}
  308. $computedHash = (Get-FileHash -Path $env:WINFSP_PATH -Algorithm SHA256).Hash.ToLower()
  309. if ($computedHash -ne "${{ env.WINFSP_MSI_HASH }}") {
  310. throw "Checksum mismatch for $env:WINFSP_PATH (expected ${{ env.WINFSP_MSI_HASH }}, got $computedHash)."
  311. }
  312. env:
  313. WINFSP_PATH: 'dist/win/bundle/resources/winfsp.msi'
  314. shell: pwsh
  315. - name: Download Legacy-WinFsp uninstaller
  316. run: |
  317. curl --output dist/win/bundle/resources/winfsp-uninstaller.exe -L ${{ env.WINFSP_UNINSTALLER }}
  318. shell: pwsh
  319. - name: Create Wix Burn bundle
  320. working-directory: dist/win
  321. run: >
  322. wix build
  323. -define BundleName="Cryptomator"
  324. -define BundleVersion="${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum}}"
  325. -define BundleVendor="Skymatic GmbH"
  326. -define BundleCopyright="(C) 2016 - 2025 Skymatic GmbH"
  327. -define AboutUrl="https://cryptomator.org"
  328. -define HelpUrl="https://cryptomator.org/contact"
  329. -define UpdateUrl="https://cryptomator.org/downloads/"
  330. -ext "WixToolset.Util.wixext"
  331. -ext "WixToolset.BootstrapperApplications.wixext"
  332. ./bundle/bundleWithWinfsp.wxs
  333. -out "../../installer/unsigned/Cryptomator-Installer.exe"
  334. - name: Detach burn engine in preparation to sign
  335. run: >
  336. wix burn detach installer/unsigned/Cryptomator-Installer.exe -engine tmp/engine.exe
  337. - name: Codesign burn engine
  338. uses: skymatic/code-sign-action@v3
  339. with:
  340. certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
  341. password: ${{ secrets.WIN_CODESIGN_P12_PW }}
  342. certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
  343. description: Cryptomator Installer
  344. timestampUrl: 'http://timestamp.digicert.com'
  345. folder: tmp
  346. - name: Reattach signed burn engine to installer
  347. run: >
  348. wix burn reattach installer/unsigned/Cryptomator-Installer.exe -engine tmp/engine.exe -o installer/Cryptomator-Installer.exe
  349. - name: Codesign EXE
  350. uses: skymatic/code-sign-action@v3
  351. with:
  352. certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
  353. password: ${{ secrets.WIN_CODESIGN_P12_PW }}
  354. certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
  355. description: Cryptomator Installer
  356. timestampUrl: 'http://timestamp.digicert.com'
  357. folder: installer
  358. - name: Add possible alpha/beta tags to installer name
  359. run: mv installer/Cryptomator-Installer.exe Cryptomator-${{ needs.get-version.outputs.semVerStr }}-x64.exe
  360. - name: Create detached GPG signature with key 615D449FE6E6A235
  361. run: |
  362. echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
  363. echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a Cryptomator-*.exe
  364. env:
  365. GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
  366. GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
  367. - name: Upload artifacts
  368. uses: actions/upload-artifact@v4
  369. with:
  370. name: exe
  371. path: |
  372. Cryptomator-*.exe
  373. Cryptomator-*.asc
  374. if-no-files-found: error
  375. publish:
  376. name: Publish installers to the github release
  377. if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
  378. runs-on: ubuntu-latest
  379. needs: [build-msi, build-exe]
  380. outputs:
  381. download-url-msi: ${{ fromJSON(steps.publish.outputs.assets)[0].browser_download_url }}
  382. download-url-exe: ${{ fromJSON(steps.publish.outputs.assets)[1].browser_download_url }}
  383. steps:
  384. - name: Download installers
  385. uses: actions/download-artifact@v4
  386. with:
  387. merge-multiple: true
  388. - name: Publish .msi on GitHub Releases
  389. id: publish
  390. uses: softprops/action-gh-release@v2
  391. with:
  392. fail_on_unmatched_files: true
  393. token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
  394. # do not change ordering of filelist, required for correct job output
  395. files: |
  396. *.msi
  397. *.exe
  398. *.asc
  399. allowlist-msi:
  400. uses: ./.github/workflows/av-whitelist.yml
  401. needs: [publish]
  402. with:
  403. url: ${{ needs.publish.outputs.download-url-msi }}
  404. secrets: inherit
  405. allowlist-exe:
  406. uses: ./.github/workflows/av-whitelist.yml
  407. needs: [publish, allowlist-msi]
  408. with:
  409. url: ${{ needs.publish.outputs.download-url-exe }}
  410. secrets: inherit
  411. notify-winget:
  412. name: Notify for winget-release
  413. if: needs.get-version.outputs.versionType == 'stable'
  414. needs: [publish, get-version]
  415. runs-on: ubuntu-latest
  416. steps:
  417. - name: Slack Notification
  418. uses: rtCamp/action-slack-notify@v2
  419. env:
  420. SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
  421. SLACK_USERNAME: 'Cryptobot'
  422. SLACK_ICON: false
  423. SLACK_ICON_EMOJI: ':bot:'
  424. SLACK_CHANNEL: 'cryptomator-desktop'
  425. SLACK_TITLE: "MSI of ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} published."
  426. SLACK_MESSAGE: "Ready to <https://github.com/${{ github.repository }}/actions/workflows/winget.yml| release to winget>."
  427. SLACK_FOOTER: false
  428. MSG_MINIMAL: true