feat: add flatpak builds (#1230)

This commit is contained in:
Jabster28 2024-10-08 18:26:49 +01:00 committed by woodser
parent a53e6a0e3d
commit 662eaee7c3
9 changed files with 240 additions and 20 deletions

View file

@ -3,20 +3,23 @@ Follow these instructions to create installers for the Haveno Java desktop appli
> **Note**
> These steps will delete the previously built Haveno binaries, so they'll need rebuilt after.
### Linux
## Linux
From x86_64 machine:
1. `sudo apt-get update`
2. `sudo apt install -y rpm fuse`
2. `sudo apt install -y rpm fuse flatpak flatpak-builder`
1. `./gradlew clean build --refresh-keys --refresh-dependencies` (or `make clean && skip-tests` after refreshed)
2. `./gradlew packageInstallers`
3. Confirm prompts.
4. Path to installer is printed at the end. Execute to install, e.g.: `sudo dpkg -i <path>.deb` or open `<path>.deb` with Software Install.
Note: Please see [flatpak.md](../../docs/flatpak.md) for information on
distributing Haveno via Flatpak.
Haveno data folder on Linux: `/home/<username>/.local/share/Haveno/`
### macOS
## macOS
From x86_64 machine:
@ -31,7 +34,7 @@ From x86_64 machine:
Haveno data folder on Mac: `/Users/<username>/Library/Application Support/Haveno/`
### Windows
## Windows
1. Enable .NET Framework 3.5:
1. Open the Control Panel on your Windows system.
@ -42,7 +45,7 @@ Haveno data folder on Mac: `/Users/<username>/Library/Application Support/Haveno
6. Click "OK" to save the changes and exit the dialog box.
7. Windows will download and install the required files and components to enable the .NET Framework 3.5. This may take several minutes, depending on your internet connection speed and system configuration.
8. Once the installation is complete, you will need to restart your computer to apply the changes.
2. Install Wix Toolset 3: https://github.com/wixtoolset/wix3/releases/tag/wix314rtm
2. Install Wix Toolset 3: <https://github.com/wixtoolset/wix3/releases/tag/wix314rtm>
3. Open MSYS2 for the following commands.
4. `export PATH=$PATH:$JAVA_HOME/bin:"C:\Program Files (x86)\WiX Toolset v3.14\bin"`
5. `./gradlew clean build --refresh-keys --refresh-dependencies` (or `make clean && skip-tests` after refreshed)
@ -52,32 +55,32 @@ Haveno data folder on Mac: `/Users/<username>/Library/Application Support/Haveno
Haveno data folder on Windows: `~\AppData\Roaming\Haveno\`
## Copy installer and rebuild Haveno binaries
## Copying installer and rebuilding Haveno binaries
1. Copy the installer to a safe location because it will be deleted in the next step.
2. `make clean && make` (or `make clean && make skip-tests`) to rebuild Haveno apps.
## Additional Notes
### Icons
Icons (Haveno.zip) were obtained from https://github.com/haveno-dex/haveno-meta/issues/1#issuecomment-819741689.
Icons (Haveno.zip) were obtained from <https://github.com/haveno-dex/haveno-meta/issues/1#issuecomment-819741689>.
#### Linux
### Building for Linux
The linux package requires the correct packaging tools installed. You may run into the following errors:
```
```sh
Error: Invalid or unsupported type: [deb]
```
```
```sh
Error: Invalid or unsupported type: [rpm]
```
On Ubuntu, resolve by running `sudo apt install rpm`. For deb, ensure dpkg is installed.
```
```sh
Exception in thread "main" java.io.IOException: Failed to rename /tmp/Haveno-stripped15820156885694375398.tmp to /storage/src/haveno/desktop/build/libs/fatJar/desktop-1.0.0-SNAPSHOT-all.jar
at haveno.tools.Utils.renameFile(Utils.java:36)
at io.github.zlika.reproducible.StipZipFile.strip(StipZipFile.java:35)
@ -87,20 +90,21 @@ Exception in thread "main" java.io.IOException: Failed to rename /tmp/Haveno-str
This may happen if the source folder is on a different hard drive than the system `tmp` folder. The tools-1.0.jar calls renameTo to rename the deterministic jar back to the fat jar location. You can temporarily change your temp directory on linux:
```
```sh
export _JAVA_OPTIONS="-Djava.io.tmpdir=/storage/tmp"
```
#### MacOs
### Building for macOS
Svg was converted into a 1024x1024 pixel PNG using https://webkul.github.io/myscale/, then converted to icns for macosx
here https://cloudconvert.com/png-to-icns
Svg was converted into a 1024x1024 pixel PNG using
<https://webkul.github.io/myscale/>, then converted to icns for macosx
here <https://cloudconvert.com/png-to-icns>
##### Known Issues
#### Known Issues
Signing is not implemented.
#### Windows
### Building for Windows
Pngs were resized and pasted into the WixUi images using paint. [CloudConvert](https://cloudconvert.com) was used to convert the Haveno png icon to ico.

View file

@ -11,3 +11,4 @@ Terminal=false
Type=Application
MimeType=
X-AppImage-Name=Haveno
StartupWMClass=Haveno

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>exchange.haveno.Haveno</id>
<!-- <icon type="stock">exchange.haveno.Haveno</icon> -->
<launchable type="desktop-id">exchange.haveno.Haveno.desktop</launchable>
<name>Haveno</name>
<summary>Decentralized P2P exchange built on Monero and Tor</summary>
<categories>
<category>Office</category>
<category>Finance</category>
<category>P2P</category>
</categories>
<keywords>
<keyword>cryptocurrency</keyword>
<keyword>monero</keyword>
</keywords>
<metadata_license>CC-BY-4.0</metadata_license>
<project_license>AGPL-3.0-only</project_license>
<branding>
<color type="primary" scheme_preference="light">#e5a29f</color>
<color type="primary" scheme_preference="dark">#562c63</color>
</branding>
<supports>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
</supports>
<description>
<p>Haveno (pronounced ha‧ve‧no) is a platform for people who want to exchange Monero for fiat currencies like EUR, GBP, and USD or other cryptocurrencies like BTC, ETH, and BCH.</p>
<ul>
<li>All communications are routed through Tor, to preserve your privacy
</li>
<li>Trades are peer-to-peer: trades on Haveno will happen between people only, there is no central authority.
</li>
<li>Trades are non-custodial: Haveno provides arbitration in case something goes wrong during the trade, but we will never have access to your funds.
</li>
<li>There is No token, because we don&#39;t need it. Transactions between traders are secured by non-custodial multisignature transactions on the Monero network.
</li>
</ul>
</description>
<screenshots>
<screenshot type="default">
<image>https://files.catbox.moe/8pahgg.png</image>
<caption>Recent Trades page</caption>
</screenshot>
</screenshots>
<developer id="exchange.haveno">
<name>woodser</name>
</developer>
<url type="homepage">https://haveno.exchange</url>
<url type="bugtracker">https://github.com/haveno-dex/haveno/issues</url>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">moderate</content_attribute>
<content_attribute id="social-info">moderate</content_attribute>
<content_attribute id="social-contacts">intense</content_attribute>
<content_attribute id="money-purchasing">intense</content_attribute>
</content_rating>
<launchable type="desktop-id">Haveno.desktop</launchable>
</component>

View file

@ -0,0 +1,52 @@
id: exchange.haveno.Haveno
runtime: org.freedesktop.Platform
runtime-version: "23.08"
sdk: org.freedesktop.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.openjdk21
command: /app/bin/Haveno
modules:
- name: openjdk
buildsystem: simple
build-commands:
- /usr/lib/sdk/openjdk21/install.sh
- name: Haveno
buildsystem: simple
sources:
# - type: git
# url: https://github.com/haveno-dex/haveno
- type: dir
path: build
- type: file
path: package/linux/Haveno.desktop
- type: file
path: package/linux/exchange.haveno.Haveno.metainfo.xml
- type: file
path: package/linux/icon.png
build-commands:
- ls
- pwd
# TODO: consider switching from reading from a deb to reading from jpackage's image
- mv temp-*/binaries/haveno_*.deb haveno.deb
- ar x haveno.deb
- tar xf data.tar.*
- cp -r opt/haveno/lib /app/lib
- install -D opt/haveno/bin/Haveno /app/bin/Haveno
- mkdir -p /app/share/icons/hicolor/128x128/apps/
- mkdir -p /app/share/applications/
- mkdir -p /app/share/metainfo/
- mv icon.png /app/share/icons/hicolor/128x128/apps/haveno.png
- mv Haveno.desktop /app/share/applications/exchange.haveno.Haveno.desktop
- mv exchange.haveno.Haveno.metainfo.xml /app/share/metainfo/
# TODO: xdg-open fails
finish-args:
- --env=PATH=/app/jre/bin:/usr/bin:$PATH
# - --env=JAVA_HOME=/app/jre
- --env=JAVA_HOME=/usr/lib/sdk/openjdk21/
- --device=dri
- --talk-name=org.freedesktop.Notifications
- --talk-name=org.freedesktop.secrets
- --share=network
- --share=ipc
- --socket=x11

View file

@ -1,6 +1,7 @@
import org.apache.tools.ant.taskdefs.condition.Os
import java.time.LocalDateTime
import java.util.regex.Pattern
task jpackageSanityChecks {
description 'Interactive sanity checks on the version of the code that will be packaged'
@ -394,6 +395,54 @@ task packageInstallers {
executeCmd(jPackageFilePath + commonOpts + linuxOpts +
" --linux-rpm-license-type AGPLv3" + // https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
" --type rpm")
// Define Flatpak-related properties
String flatpakManifestFile = 'package/linux/exchange.haveno.Haveno.yml'
String linuxDir = 'package/linux'
String flatpakOutputDir = 'package/linux/build'
String flatpakExportDir = "${binariesFolderPath}/fpexport"
String flatpakBundleFile = "${binariesFolderPath}/haveno.flatpak"
// Read the default app name from the HavenoExecutable.java file
def filer = file('../core/src/main/java/haveno/core/app/HavenoExecutable.java')
def content = filer.text
def matcher = Pattern.compile(/public static final String DEFAULT_APP_NAME = "(.*?)";/).matcher(content)
def defaultAppName = "Haveno"
if (matcher.find()) {
defaultAppName = matcher.group(1)
} else {
throw new GradleException("DEFAULT_APP_NAME not found in HavenoExecutable.java")
}
// copy the manifest to a new tmp one in the same place
// and add a --filesystem=.local/share/${name} to the flatpak manifest
def manifest = file(flatpakManifestFile)
def newManifest = file('exchange.haveno.Haveno.yaml')
newManifest.write(manifest.text.replace("- --share=network", "- --share=network\n - --filesystem=~/.local/share/${defaultAppName}:create"))
flatpakManifestFile = 'exchange.haveno.Haveno.yaml'
// Command to build the Flatpak
exec {
commandLine 'flatpak-builder', '--force-clean', flatpakOutputDir, flatpakManifestFile, '--user', '--install-deps-from=flathub'
}
// Command to export the Flatpak
exec {
commandLine 'flatpak', 'build-export', flatpakExportDir, flatpakOutputDir
}
// Command to create the Flatpak bundle
exec {
commandLine 'flatpak', 'build-bundle', flatpakExportDir, flatpakBundleFile, 'exchange.haveno.Haveno', '--runtime-repo=https://flathub.org/repo/flathub.flatpakrepo'
}
// delete the flatpak build directory
delete(flatpakOutputDir)
delete(flatpakExportDir)
delete(flatpakManifestFile)
println "Flatpak package created at ${flatpakBundleFile}"
}
// Env variable can be set by calling "export HAVENO_SHARED_FOLDER='Some value'"