Merge pull request #7 from andydixon/packaging-nexusterminal

Publish nexusterminal to repo.dixon.cx and Homebrew; install instructions
This commit was merged in pull request #7.
This commit is contained in:
Andy Dixon
2026-10-13 15:57:36 +01:00
committed by GitHub
2 changed files with 59 additions and 14 deletions
+38
View File
@@ -17,6 +17,44 @@ Nexus Terminal helps you manage many connections at once, keep terminal work org
- Session recording (asciicast v2) and playback - Session recording (asciicast v2) and playback
- Secure credential storage with the OS keychain first and an encrypted vault fallback - Secure credential storage with the OS keychain first and an encrypted vault fallback
## Install
**macOS** (Homebrew):
```sh
brew install --cask andydixon/tap/nexusterminal
```
**Debian, Ubuntu** (22.04 and later):
```sh
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://repo.dixon.cx/dixon.gpg | sudo tee /etc/apt/keyrings/dixon.gpg >/dev/null
echo "deb [signed-by=/etc/apt/keyrings/dixon.gpg] https://repo.dixon.cx/apt stable main" |
sudo tee /etc/apt/sources.list.d/dixon.list
sudo apt update && sudo apt install nexusterminal
```
**Fedora, RHEL, openSUSE:**
```sh
sudo curl -fsSL -o /etc/yum.repos.d/dixon.repo https://repo.dixon.cx/rpm/dixon.repo
sudo dnf install nexusterminal # or: sudo zypper install nexusterminal
```
**Arch Linux:**
```sh
curl -fsSL https://repo.dixon.cx/dixon.asc | sudo pacman-key --add -
sudo pacman-key --lsign-key C22FF7330668417C62C7A304CBC7951D7F2234D1
printf '\n[dixon]\nServer = https://repo.dixon.cx/arch/$arch\n' | sudo tee -a /etc/pacman.conf
sudo pacman -Sy nexusterminal
```
**Windows**, or any platform by hand: download a zip from
[GitHub Releases](https://github.com/andydixon/nexus/releases) and check it against `SHA256SUMS`.
Builds aren't code-signed yet, so macOS and Windows ask you to confirm the first launch.
## Quick start ## Quick start
1. Launch Nexus Terminal. 1. Launch Nexus Terminal.
+21 -14
View File
@@ -16,7 +16,7 @@
# The publish half is the same as in ../../../mapsize/packaging/repo.sh and friends: every index # The publish half is the same as in ../../../mapsize/packaging/repo.sh and friends: every index
# is rebuilt over all packages in the repository, so other projects' packages are kept. # is rebuilt over all packages in the repository, so other projects' packages are kept.
# #
# Needs: gh (or curl), unzip, curl (for the pinned nfpm), docker, gpg, apt-ftparchive, flock. # Needs: curl, unzip, curl (for the pinned nfpm), docker, gpg, apt-ftparchive, flock.
# REPO_DIR where the repository lives (default below) # REPO_DIR where the repository lives (default below)
# REPO_GNUPGHOME GnuPG home holding the signing key (default below) # REPO_GNUPGHOME GnuPG home holding the signing key (default below)
# ARCHS package architectures (default: amd64 arm64) # ARCHS package architectures (default: amd64 arm64)
@@ -31,12 +31,17 @@ LICENSE=AGPL-3.0-only
ARCHS=${ARCHS:-"amd64 arm64"} ARCHS=${ARCHS:-"amd64 arm64"}
# The binaries come from ubuntu-22.04 runners: glibc 2.35. Windowing, GL and audio libraries are # The binaries come from ubuntu-22.04 runners: glibc 2.35. Windowing, GL and audio libraries are
# loaded at run time, so they're recommended rather than hard dependencies (any desktop has them). # loaded at run time, so they're recommended rather than hard dependencies (any desktop has them).
DEB_DEPENDS='"libc6 (>= 2.35)", "libgcc-s1", "zlib1g"' # ALSA is linked directly (RDP audio), so it's a hard dependency. libasound2t64 comes first: on
DEB_RECOMMENDS='"libxkbcommon0", "libwayland-client0", "libx11-6", "libxcursor1", "libxrandr2", "libxi6", "libgl1", "libegl1", "libasound2", "xdg-desktop-portal"' # Ubuntu 24.04 and later plain libasound2 is only a virtual name, which apt may satisfy with the
RPM_DEPENDS='"glibc >= 2.35", "libgcc", "zlib"' # OSS shim liboss4-salsa-asound2 (missing real ALSA symbols); older Debian falls through to it.
RPM_RECOMMENDS='"libxkbcommon", "libwayland-client", "libX11", "libXcursor", "libXrandr", "libXi", "mesa-libGL", "mesa-libEGL", "alsa-lib", "xdg-desktop-portal"' DEB_DEPENDS='"libc6 (>= 2.35)", "libgcc-s1", "zlib1g", "libasound2t64 | libasound2"'
ARCH_DEPENDS='"glibc", "gcc-libs", "zlib", "libxkbcommon", "libglvnd"' DEB_RECOMMENDS='"libxkbcommon0", "libwayland-client0", "libx11-6", "libxcursor1", "libxrandr2", "libxi6", "libgl1", "libegl1", "xdg-desktop-portal"'
ARCH_OPTDEPENDS='"wayland: Wayland sessions", "libx11: X11 sessions", "libxcursor: X11 sessions", "libxrandr: X11 sessions", "libxi: X11 sessions", "alsa-lib: RDP audio", "xdg-desktop-portal: file dialogs"' RPM_DEPENDS='"glibc >= 2.35", "libgcc", "zlib", "alsa-lib"'
RPM_RECOMMENDS='"libxkbcommon", "libwayland-client", "libX11", "libXcursor", "libXrandr", "libXi", "mesa-libGL", "mesa-libEGL", "xdg-desktop-portal"'
ARCH_DEPENDS='"glibc", "gcc-libs", "zlib", "alsa-lib", "libxkbcommon", "libglvnd"'
ARCH_SUGGESTS='"wayland", "libx11", "libxcursor", "libxrandr", "libxi", "xdg-desktop-portal"'
# Package revision: bump to republish the same Nexus version with packaging fixes.
PKGREL=${PKGREL:-1}
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
REPO_DIR=${REPO_DIR:-/home/andy/domains/repo.dixon.cx/public_html} REPO_DIR=${REPO_DIR:-/home/andy/domains/repo.dixon.cx/public_html}
@@ -49,7 +54,7 @@ HERE=$(cd "$(dirname "$0")" && pwd)
say() { echo "repo: $*" >&2; } say() { echo "repo: $*" >&2; }
die() { say "$*"; exit 1; } die() { say "$*"; exit 1; }
for tool in gh unzip curl docker gpg apt-ftparchive flock sha256sum; do for tool in unzip curl docker gpg apt-ftparchive flock sha256sum; do
command -v $tool >/dev/null || die "needs $tool" command -v $tool >/dev/null || die "needs $tool"
done done
[[ -d $REPO_DIR ]] || die "$REPO_DIR does not exist" [[ -d $REPO_DIR ]] || die "$REPO_DIR does not exist"
@@ -85,9 +90,10 @@ NFPM=$NFPM_DIR/nfpm
# ---- fetch and verify the release binaries --------------------------------- # ---- fetch and verify the release binaries ---------------------------------
say "fetching $TAG from github.com/$GITHUB" say "fetching $TAG from github.com/$GITHUB"
mkdir -p "$WORK/dl" mkdir -p "$WORK/dl"
patterns=(--pattern SHA256SUMS) base=https://github.com/$GITHUB/releases/download/$TAG
for arch in $ARCHS; do patterns+=(--pattern "NexusTerminal-linux-$arch.zip"); done for f in SHA256SUMS $(for arch in $ARCHS; do echo "NexusTerminal-linux-$arch.zip"; done); do
gh release download "$TAG" -R "$GITHUB" -D "$WORK/dl" "${patterns[@]}" || die "release $TAG has no Linux assets yet" curl -fsSL -o "$WORK/dl/$f" "$base/$f" || die "release $TAG has no $f yet"
done
(cd "$WORK/dl" && grep -E "NexusTerminal-linux-($(tr ' ' '|' <<<"$ARCHS"))\.zip" SHA256SUMS | sha256sum -c --quiet) || die "checksum mismatch" (cd "$WORK/dl" && grep -E "NexusTerminal-linux-($(tr ' ' '|' <<<"$ARCHS"))\.zip" SHA256SUMS | sha256sum -c --quiet) || die "checksum mismatch"
# ---- package ----------------------------------------------------------------- # ---- package -----------------------------------------------------------------
@@ -104,7 +110,7 @@ for arch in $ARCHS; do
arch: $arch arch: $arch
platform: linux platform: linux
version: $VERSION version: $VERSION
release: 1 release: $PKGREL
section: net section: net
maintainer: Andy Dixon <andy@dixon.cx> maintainer: Andy Dixon <andy@dixon.cx>
description: | description: |
@@ -144,15 +150,16 @@ for arch in $ARCHS; do
recommends: [$RPM_RECOMMENDS] recommends: [$RPM_RECOMMENDS]
archlinux: archlinux:
depends: [$ARCH_DEPENDS] depends: [$ARCH_DEPENDS]
suggests: [$ARCH_SUGGESTS]
archlinux: archlinux:
packager: Andy Dixon <andy@dixon.cx> packager: Andy Dixon <andy@dixon.cx>
optdepends: [$ARCH_OPTDEPENDS]
rpm: rpm:
signature: signature:
key_file: $WORK/signing.asc key_file: $WORK/signing.asc
EOF EOF
for fmt in deb rpm archlinux; do for fmt in deb rpm archlinux; do
"$NFPM" pkg -f "$WORK/nfpm-$arch.yaml" -p $fmt -t "$WORK/out/" >/dev/null "$NFPM" pkg -f "$WORK/nfpm-$arch.yaml" -p $fmt -t "$WORK/out/" >"$WORK/nfpm.log" 2>&1 ||
{ cat "$WORK/nfpm.log" >&2; die "nfpm $fmt for $arch failed"; }
done done
done done