From bf46fe348fb83893408e875408499761a3df5ea4 Mon Sep 17 00:00:00 2001 From: Peter Banik Date: Mon, 2 Oct 2023 13:20:56 +0200 Subject: [PATCH] Implemented snap package build --- .github/workflows/README.md | 7 ++ .github/workflows/build-snap.yml | 48 +++++++++ .gitignore | 1 + client/cmd/dexc-desktop/README.md | 22 +++- client/cmd/dexc-desktop/go.mod | 2 +- client/cmd/dexc-desktop/go.sum | 4 +- .../metainfo/org.decred.dcrdex.desktop | 10 ++ .../metainfo/org.decred.dcrdex.metainfo.xml | 30 ++++++ client/cmd/dexc-desktop/pkg/common.sh | 19 ++++ client/cmd/dexc-desktop/pkg/pkg-debian.sh | 70 ++++-------- client/cmd/dexc-desktop/pkg/pkg-snap.sh | 14 +++ client/cmd/dexc-desktop/pkg/publish-snap.sh | 7 ++ .../dexc-desktop/snap/local/snapcraft.yaml.in | 102 ++++++++++++++++++ client/cmd/dexc-desktop/src/dexc-symbolic.svg | 7 ++ client/cmd/dexc-desktop/src/dexc.png | Bin 2874 -> 4898 bytes client/cmd/dexc-desktop/src/dexc.svg | 23 ++++ 16 files changed, 314 insertions(+), 52 deletions(-) create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/build-snap.yml create mode 100644 client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.desktop create mode 100644 client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.metainfo.xml create mode 100644 client/cmd/dexc-desktop/pkg/common.sh create mode 100755 client/cmd/dexc-desktop/pkg/pkg-snap.sh create mode 100755 client/cmd/dexc-desktop/pkg/publish-snap.sh create mode 100644 client/cmd/dexc-desktop/snap/local/snapcraft.yaml.in create mode 100644 client/cmd/dexc-desktop/src/dexc-symbolic.svg create mode 100644 client/cmd/dexc-desktop/src/dexc.svg diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000000..7786feb15a --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,7 @@ + +## Build and Publish Snap Package workflow + +This workflow builds a `snap` package and uploads it to the [Snap Store](https://snapcraft.io/store). It has a `workflow_dispatch` trigger so it can be triggered manually only, it is not hooked up to any other GH event. + +The store upload requires the `SNAPCRAFT_STORE_CREDENTIALS` variable to be set in [Github Secrets](https://github.com/decred/dcrdex/settings/secrets/actions). +See https://github.com/snapcore/action-publish for details. \ No newline at end of file diff --git a/.github/workflows/build-snap.yml b/.github/workflows/build-snap.yml new file mode 100644 index 0000000000..58b68b72aa --- /dev/null +++ b/.github/workflows/build-snap.yml @@ -0,0 +1,48 @@ +name: Build and Publish Snap Package + +on: +# manually trigger the workflow from the Actions tab + workflow_dispatch: + +jobs: + build-snap: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + with: + fetch-depth: 0 + + - name: Compile frontend + working-directory: client/webserver/site + run: | + npm install + npm run build + + - name: Install deb deps + run: | + sudo apt-get update + sudo apt-get -y install libgtk-3-dev libwebkit2gtk-4.0-dev build-essential + + - name: Build deb package + working-directory: client/cmd/dexc-desktop + run: pkg/pkg-debian.sh + + - name: Prepare snapcraft.yml + working-directory: client/cmd/dexc-desktop + run: pkg/prepare-snap.sh + + - name: Build snap package + uses: snapcore/action-build@2ee46bc29d163c9c836f2820cc46b39664bf0de2 # v1.1.3 + id: build + with: + path: client/cmd/dexc-desktop + + - name: Publish snap to Snap Store + uses: snapcore/action-publish@0a8d537ae06f4a292e8b4ef1084cd5631b3c6871 # v1.1.1 + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }} + with: + snap: ${{ steps.build.outputs.snap }} + release: stable diff --git a/.gitignore b/.gitignore index f2d27c0f8d..31d0105d2c 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ client/asset/eth/cmd/getgas/getgas client/asset/eth/cmd/deploy/deploy client/cmd/dexc-desktop/pkg/installers server/noderelay/cmd/sourcenode/sourcenode +client/cmd/dexc-desktop/snap/snapcraft.yaml diff --git a/client/cmd/dexc-desktop/README.md b/client/cmd/dexc-desktop/README.md index 2d8e0deea9..9ef3fb605d 100644 --- a/client/cmd/dexc-desktop/README.md +++ b/client/cmd/dexc-desktop/README.md @@ -7,11 +7,29 @@ The dexc-desktop client is a cross-platform desktop application for the DEX clie ## Debian Build with `./pkg/pkg-debian.sh`. The deb archive is located in **./build**. -For development, you'll need to install the WebKit Development Libraries. -`apt install libgtk-3-dev libwebkit2gtk-4.0-dev` +For development, you'll need to install the WebKit Development Libraries and the +standard build toolchain: + +```bash +apt install libgtk-3-dev libwebkit2gtk-4.0-dev build-essential +``` For production, they are specified as DEPENDS in the control file and the package manager will install them. +## Snap +The Snap package can be built on an Ubuntu system using Snapcraft, which can +be installed with `apt-get install snapcraft`. Then run `./pkg/pkg-snap.sh`, +which will build the snap package in **./build**. Note that this is dependent on +the Debian package so be sure to run the deb build first. + +The snap can be uploaded to the Snap Store using `./pkg/upload-snap.sh`, after this +the package can be installed on any Ubuntu system using `snap install dexc`. + +Prerequsities: +```bash +apt-get install snapcraft +``` + ## MacOS (darwin) Build with `./pkg/pkg-darwin.sh` for `amd64` MacOS machines. If running on an `arm64` machine, you'll need to build with `TARGETS=darwin/arm64 ./pkg/pkg-darwin.sh` instead. diff --git a/client/cmd/dexc-desktop/go.mod b/client/cmd/dexc-desktop/go.mod index efd0bd14b1..b4312d7970 100644 --- a/client/cmd/dexc-desktop/go.mod +++ b/client/cmd/dexc-desktop/go.mod @@ -66,7 +66,7 @@ require ( github.com/decred/dcrd/dcrec/edwards/v2 v2.0.3 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/decred/dcrd/dcrjson/v4 v4.0.1 // indirect - github.com/decred/dcrd/dcrutil/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrutil/v4 v4.0.2-0.20231005000813-c102e54b4128 // indirect github.com/decred/dcrd/gcs/v4 v4.0.0 // indirect github.com/decred/dcrd/hdkeychain/v3 v3.1.1 // indirect github.com/decred/dcrd/lru v1.1.1 // indirect diff --git a/client/cmd/dexc-desktop/go.sum b/client/cmd/dexc-desktop/go.sum index 9f18e1f3ad..92f5dad199 100644 --- a/client/cmd/dexc-desktop/go.sum +++ b/client/cmd/dexc-desktop/go.sum @@ -293,8 +293,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etly github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/dcrjson/v4 v4.0.1 h1:vyQuB1miwGqbCVNm8P6br3V65WQ6wyrh0LycMkvaBBg= github.com/decred/dcrd/dcrjson/v4 v4.0.1/go.mod h1:2qVikafVF9/X3PngQVmqkbUbyAl32uik0k/kydgtqMc= -github.com/decred/dcrd/dcrutil/v4 v4.0.1 h1:E+d2TNbpOj0f1L9RqkZkEm1QolFjajvkzxWC5WOPf1s= -github.com/decred/dcrd/dcrutil/v4 v4.0.1/go.mod h1:7EXyHYj8FEqY+WzMuRkF0nh32ueLqhutZDoW4eQ+KRc= +github.com/decred/dcrd/dcrutil/v4 v4.0.2-0.20231005000813-c102e54b4128 h1:hDyaGr+CuE9M/fCC7raFGH89wPd49tnjuc4wftISwa4= +github.com/decred/dcrd/dcrutil/v4 v4.0.2-0.20231005000813-c102e54b4128/go.mod h1:7EXyHYj8FEqY+WzMuRkF0nh32ueLqhutZDoW4eQ+KRc= github.com/decred/dcrd/gcs/v4 v4.0.0 h1:bet+Ax1ZFUqn2M0g1uotm0b8F6BZ9MmblViyJ088E8k= github.com/decred/dcrd/gcs/v4 v4.0.0/go.mod h1:9z+EBagzpEdAumwS09vf/hiGaR8XhNmsBgaVq6u7/NI= github.com/decred/dcrd/hdkeychain/v3 v3.1.1 h1:4WhyHNBy7ec6qBUC7Fq7JFVGSd7bpuR5H+AJRID8Lyk= diff --git a/client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.desktop b/client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.desktop new file mode 100644 index 0000000000..ab45725f8b --- /dev/null +++ b/client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Decred DEX Client +Comment=Multi-wallet backed by Decred DEX +Categories=Office;Finance; +Icon=org.decred.dcrdex +Exec=dexc +Terminal=false +StartupWMClass=DCRDEX diff --git a/client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.metainfo.xml b/client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.metainfo.xml new file mode 100644 index 0000000000..a4b48073d5 --- /dev/null +++ b/client/cmd/dexc-desktop/metainfo/org.decred.dcrdex.metainfo.xml @@ -0,0 +1,30 @@ + + + org.decred.dcrdex + org.decred.dcrdex.desktop + DCRDEX + Decentralized cryptocurrency exchange + MIT + BlueOak-1.0.0 + https://dex.decred.org + https://chat.decred.org/#/room/#dex:decred.org + The Decred Developers + +

+ Non-custodial peer-to-peer exchange where your funds never leave your wallet. + Trade Bitcoin, USDC, Ethereum, Decred, Dogecoin, Zcash and more without KYC + and fees, using atomic swaps technology. +

+
+ + + https://raw.githubusercontent.com/decred/umbrel-app-store/master/decred-dcrdex/images/screenshot_1.png + + + https://raw.githubusercontent.com/decred/umbrel-app-store/master/decred-dcrdex/images/screenshot_2.png + + + https://raw.githubusercontent.com/decred/umbrel-app-store/master/decred-dcrdex/images/screenshot_3.png + + +
diff --git a/client/cmd/dexc-desktop/pkg/common.sh b/client/cmd/dexc-desktop/pkg/common.sh new file mode 100644 index 0000000000..1a3150c2b3 --- /dev/null +++ b/client/cmd/dexc-desktop/pkg/common.sh @@ -0,0 +1,19 @@ + +# This file defines common variables to be source'd by the various build scripts +# in this directory. + +# pick up the release tag from git +VER=$(git describe --tags --abbrev=0 --always | sed -e 's/^v//') +META= # "release" +REV="0" + +APP="dexc" +ARCH="amd64" + +# The build directory will be deleted at the beginning of every build. The +# directory is .gitignore'd. +BUILD_DIR="./build" + +# DEB_NAME follows the prescribed format for debian packaging. +DEB_NAME="${APP}_${VER}-${REV}_${ARCH}" + diff --git a/client/cmd/dexc-desktop/pkg/pkg-debian.sh b/client/cmd/dexc-desktop/pkg/pkg-debian.sh index a82eb8bcd5..bdb8b05f0d 100755 --- a/client/cmd/dexc-desktop/pkg/pkg-debian.sh +++ b/client/cmd/dexc-desktop/pkg/pkg-debian.sh @@ -3,22 +3,12 @@ # A good getting-started guide for Debian packaging can be found at # https://www.internalpointers.com/post/build-binary-deb-package-practical-guide -set -ex +# turn this on for debugging, keep noise low for prod builds +# set -ex -APP="dexc" -VER="0.7.0-pre" -META= # "release" -REV="0" -ARCH="amd64" +source $(dirname "$0")/common.sh -# DEB_NAME follows the prescribed format for debian packaging. -DEB_NAME="${APP}_${VER}-${REV}_${ARCH}" - -# The build directory will be deleted at the beginning of every build. The -# directory is .gitignore'd. -BUILD_DIR="./build" - -# A directory for binary source files e.g. image files. +# A directory containing metadata files SRC_DIR="./src" # The DEB_DIR represents the root directory in our target system. The directory @@ -36,16 +26,11 @@ POSTINST_PATH="${CONTROL_DIR}/postinst" POSTRM_PATH="${CONTROL_DIR}/postrm" # The dexc binary. -BIN_TARGETDIR="/usr/lib/dexc" +BIN_TARGETDIR="/usr/bin" BIN_BUILDDIR="${DEB_DIR}${BIN_TARGETDIR}" BIN_FILENAME="${APP}" BIN_BUILDPATH="${BIN_BUILDDIR}/${BIN_FILENAME}" -ICON_FILENAME="dexc.png" -SRC_TARGETDIR="${BIN_TARGETDIR}/src" -SRC_BUILDDIR="${DEB_DIR}${SRC_TARGETDIR}" -LIBICON_BUILDPATH="${SRC_BUILDDIR}/${ICON_FILENAME}" - # The Desktop Entry is a format for "installing" programs on Linux, creating # an entry in the main menu. # https://specifications.freedesktop.org/desktop-entry-spec/latest/ @@ -54,18 +39,10 @@ DOT_DESKTOP_BUILDDIR="${DEB_DIR}${DOT_DESKTOP_TARGETDIR}" DOT_DESKTOP_FILENAME="dexc.desktop" DOT_DESKTOP_BUILDPATH="${DOT_DESKTOP_BUILDDIR}/${DOT_DESKTOP_FILENAME}" -# This will be the icon shown for the program in the taskbar. I know that both -# PNG and SVG will work. If it's a bitmap, should probably be >= 128 x 128 px. -ICON_TARGETDIR="/usr/share/pixmaps" -ICON_BUILDDIR="${DEB_DIR}${ICON_TARGETDIR}" -DESKTOPICON_BUILDPATH="${ICON_BUILDDIR}/${ICON_FILENAME}" - # Prepare the directory structure. rm -fr "${BUILD_DIR}" mkdir -p -m 0755 "${CONTROL_DIR}" -mkdir -p "${SRC_BUILDDIR}" # subdir of BIN_BUILDDIR mkdir -p "${DOT_DESKTOP_BUILDDIR}" -mkdir -p "${ICON_BUILDDIR}" # Build dexc LDFLAGS="-s -w -X main.Version=${VER}${META:++${META}}" @@ -83,40 +60,39 @@ Depends: libgtk-3-0, libwebkit2gtk-4.0-37 Description: A multi-wallet backed by Decred DEX EOF -# Symlink the binary and update the desktop icons, refresh the "start" menu. +# Copy icons +# This will be the icon shown for the program in the taskbar. I know that both +# PNG and SVG will work. If it's a bitmap, should probably be >= 128 x 128 px. +ICON_TARGETDIR="/usr/share/icons/hicolor" +ICON_BUILDDIR="${DEB_DIR}${ICON_TARGETDIR}" +install -Dm644 -t "${ICON_BUILDDIR}/scalable/apps" "${SRC_DIR}/dexc.svg" +install -Dm644 -t "${ICON_BUILDDIR}/128x128/apps" "${SRC_DIR}/dexc.png" +install -Dm644 -t "${ICON_BUILDDIR}/symbolic/apps" "${SRC_DIR}/dexc-symbolic.svg" + +# AppStream metadata +# https://wiki.debian.org/AppStream +install -Dm644 -t "${DEB_DIR}/usr/share/metainfo" "${SRC_DIR}/org.decred.dcrdex.metainfo.xml" + +# Update the desktop icons, refresh the "start" menu. cat > "${POSTINST_PATH}" < "${POSTRM_PATH}" < "${DOT_DESKTOP_BUILDPATH}" < "$SNAPCRAFT_YML" + +snapcraft --verbose --output $BUILD_DIR/ diff --git a/client/cmd/dexc-desktop/pkg/publish-snap.sh b/client/cmd/dexc-desktop/pkg/publish-snap.sh new file mode 100755 index 0000000000..fec2f2bb10 --- /dev/null +++ b/client/cmd/dexc-desktop/pkg/publish-snap.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +source $(dirname "$0")/common.sh + +snapcraft login + +snapcraft upload --release=stable $BUILD_DIR/${APP}_${VER}_${ARCH}.snap diff --git a/client/cmd/dexc-desktop/snap/local/snapcraft.yaml.in b/client/cmd/dexc-desktop/snap/local/snapcraft.yaml.in new file mode 100644 index 0000000000..d86eae3125 --- /dev/null +++ b/client/cmd/dexc-desktop/snap/local/snapcraft.yaml.in @@ -0,0 +1,102 @@ +name: dexc +adopt-info: metainfo +version: '$VERSION' +license: BlueOak-1.0.0 + +base: core22 +grade: stable +confinement: strict + +architectures: + - build-on: amd64 +compression: lzo + +plugs: + dbus-svc: + bus: system + interface: dbus + name: org.freedesktop.portal + dbus-statusnotifier: + bus: session + interface: dbus + name: org.kde.StatusNotifierWatcher + dbus-dbusmenu: + bus: session + interface: dbus + name: com.canonical.dbusmenu + +apps: + dexc: + common-id: org.decred.dcrdex + command: usr/bin/dexc + desktop: usr/share/applications/dexc.desktop + extensions: [gnome] + environment: + GTK_USE_PORTAL: "1" + #TMPDIR: $XDG_RUNTIME_DIR + #XDG_CURRENT_DESKTOP: Unity + #DISABLE_WAYLAND: 1 + plugs: + - home + - opengl + - x11 + - desktop + - desktop-legacy + - network + - network-status + - browser-support + - screen-inhibit-control + - dbus-svc + - dbus-dbusmenu + - dbus-statusnotifier + +parts: + metainfo: + plugin: nil + source: . + parse-info: [./metainfo/org.decred.dcrdex.metainfo.xml] + + dexc-desktop: + plugin: dump + source: ./build/$DEB_NAME.deb + source-type: deb + override-build: | + craftctl default + # Point icon to the correct location + sed -i -e 's|Icon=.*$|Icon=usr/share/icons/hicolor/scalable/apps/dexc.svg|' $SNAPCRAFT_PART_INSTALL/usr/share/applications/dexc.desktop + + prime: + - -usr/lib/x86_64-linux-gnu/libEGL_mesa* + - -usr/lib/x86_64-linux-gnu/libGLX_mesa* + - -usr/lib/x86_64-linux-gnu/libGLESv2* + - -usr/lib/x86_64-linux-gnu/libcaca++* + - -usr/lib/x86_64-linux-gnu/libcolordprivate* + - -usr/lib/x86_64-linux-gnu/libdconf* + - -usr/lib/x86_64-linux-gnu/libexslt* + - -usr/lib/x86_64-linux-gnu/libgstcheck-1.0* + - -usr/lib/x86_64-linux-gnu/libgstcontroller-1.0* + - -usr/lib/x86_64-linux-gnu/libicuio* + - -usr/lib/x86_64-linux-gnu/libicutest* + - -usr/lib/x86_64-linux-gnu/libjacknet* + - -usr/lib/x86_64-linux-gnu/libjackserver* + - -usr/lib/x86_64-linux-gnu/liborc-test-0.4* + - -usr/lib/x86_64-linux-gnu/libpulse-simple* + - -usr/lib/x86_64-linux-gnu/libunwind-coredump* + - -usr/lib/x86_64-linux-gnu/libunwind-ptrace* + - -usr/lib/x86_64-linux-gnu/libunwind-x86_64* + - -usr/lib/x86_64-linux-gnu/libwoff2enc* + - -usr/lib/x86_64-linux-gnu/libicutu* + - -usr/lib/x86_64-linux-gnu/libsamplerate* + - -usr/lib/x86_64-linux-gnu/libxcb-dri2* + - -usr/lib/x86_64-linux-gnu/libxcb-glx* + - -usr/lib/x86_64-linux-gnu/libxcb-present* + - -usr/lib/x86_64-linux-gnu/libxcb-randr* + - -usr/lib/x86_64-linux-gnu/libxcb-sync* + - -usr/lib/x86_64-linux-gnu/libxcb-xfixes* + - -usr/lib/x86_64-linux-gnu/libxshmfence* + + stage-packages: + - desktop-file-utils + - libwebkit2gtk-4.0-37 + - libgtk-3-0 + diff --git a/client/cmd/dexc-desktop/src/dexc-symbolic.svg b/client/cmd/dexc-desktop/src/dexc-symbolic.svg new file mode 100644 index 0000000000..ed7c5b7afc --- /dev/null +++ b/client/cmd/dexc-desktop/src/dexc-symbolic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/cmd/dexc-desktop/src/dexc.png b/client/cmd/dexc-desktop/src/dexc.png index 3c7d7e01db898abbf4486225eb99dc3bc1ee68b8..467c4f260b1fcd158c25222a8ab9f12e489358f0 100644 GIT binary patch literal 4898 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 diff --git a/client/cmd/dexc-desktop/src/dexc.svg b/client/cmd/dexc-desktop/src/dexc.svg new file mode 100644 index 0000000000..f6bb97f7c9 --- /dev/null +++ b/client/cmd/dexc-desktop/src/dexc.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + +