Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4db488415f | ||
|
|
be695d78a9 |
@@ -121,11 +121,13 @@ jobs:
|
||||
uv run main.py
|
||||
|
||||
publish-arch:
|
||||
name: Build and publish gitty-desktop to AUR
|
||||
name: Build and publish AUR packages
|
||||
needs: publish-ubuntu
|
||||
runs-on: archlinux
|
||||
environment: production
|
||||
env:
|
||||
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
||||
ARTIFACT_BASE_URL: ${{ vars.ARTIFACT_BASE_URL }}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -236,6 +238,43 @@ jobs:
|
||||
|
||||
echo "AUR_SOURCE_DIR=$AUR_SOURCE_DIR" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Generate and build binary AUR package
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
LATEST_JSON="$(curl --fail --location --silent --show-error \
|
||||
"$ARTIFACT_BASE_URL/gitty/latest.json")"
|
||||
export LATEST_JSON
|
||||
APPIMAGE_URL="$(node -e "const p=JSON.parse(process.env.LATEST_JSON); const a=p.platforms?.['linux-x86_64']?.url; if (!a) process.exit(1); process.stdout.write(a)")"
|
||||
APPIMAGE_NAME="${APPIMAGE_URL##*/}"
|
||||
|
||||
AUR_BIN_DIR="$(mktemp -d)"
|
||||
cp PKGBUILD-bin "$AUR_BIN_DIR/PKGBUILD"
|
||||
APPIMAGE_PATH="$AUR_BIN_DIR/$APPIMAGE_NAME"
|
||||
curl --fail --location --silent --show-error \
|
||||
--output "$APPIMAGE_PATH" "$APPIMAGE_URL"
|
||||
APPIMAGE_CHECKSUM="$(sha256sum "$APPIMAGE_PATH" | cut -d ' ' -f 1)"
|
||||
ICON_PATH="$AUR_BIN_DIR/gitty-desktop.png"
|
||||
curl --fail --location --silent --show-error \
|
||||
--output "$ICON_PATH" \
|
||||
"https://git.cbsk-tech.de/Christoph/GitLite/raw/tag/$RELEASE_TAG/src-tauri/icons/icon.png"
|
||||
ICON_CHECKSUM="$(sha256sum "$ICON_PATH" | cut -d ' ' -f 1)"
|
||||
|
||||
sed -i \
|
||||
-e "s/^pkgver=.*/pkgver=$PACKAGE_VERSION/" \
|
||||
-e "s/^pkgrel=.*/pkgrel=1/" \
|
||||
-e "s|^_appimage=.*|_appimage=\"$APPIMAGE_NAME\"|" \
|
||||
-e "s|^_artifact_url=.*|_artifact_url=\"$APPIMAGE_URL\"|" \
|
||||
-e "s/^_tag=.*/_tag=$RELEASE_TAG/" \
|
||||
-e "/^sha256sums=/,/^[[:space:]]*'SKIP')$/c\\sha256sums=('$APPIMAGE_CHECKSUM'\\n '$ICON_CHECKSUM')" \
|
||||
"$AUR_BIN_DIR/PKGBUILD"
|
||||
|
||||
chown -R builder:builder "$AUR_BIN_DIR"
|
||||
runuser -u builder -- \
|
||||
bash -lc "cd '$AUR_BIN_DIR' && makepkg --cleanbuild --noconfirm && makepkg --printsrcinfo > .SRCINFO"
|
||||
|
||||
echo "AUR_BIN_DIR=$AUR_BIN_DIR" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Publish PKGBUILD to AUR
|
||||
env:
|
||||
AUR_GIT_NAME: ${{ vars.USERNAME_GIT }}
|
||||
@@ -273,14 +312,19 @@ jobs:
|
||||
install -m 0600 "$AUR_KNOWN_HOSTS_TEMP" "$HOME/.ssh/known_hosts"
|
||||
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/aur -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=30 -o ServerAliveInterval=15 -o ServerAliveCountMax=2"
|
||||
|
||||
AUR_CHECKOUT_ROOT="$(mktemp -d)"
|
||||
AUR_CHECKOUT=""
|
||||
publish_aur_package() {
|
||||
local package_name="$1"
|
||||
local package_source_dir="$2"
|
||||
local checkout_root checkout clone_candidate pushed
|
||||
|
||||
checkout_root="$(mktemp -d)"
|
||||
checkout=""
|
||||
for AUR_ATTEMPT in 1 2 3 4 5; do
|
||||
AUR_CLONE_CANDIDATE="$AUR_CHECKOUT_ROOT/attempt-$AUR_ATTEMPT"
|
||||
echo "AUR clone attempt $AUR_ATTEMPT of 5"
|
||||
clone_candidate="$checkout_root/attempt-$AUR_ATTEMPT"
|
||||
echo "$package_name clone attempt $AUR_ATTEMPT of 5"
|
||||
if timeout 3m git -c init.defaultBranch=master clone \
|
||||
ssh://aur@aur.archlinux.org/gitty-desktop.git "$AUR_CLONE_CANDIDATE"; then
|
||||
AUR_CHECKOUT="$AUR_CLONE_CANDIDATE"
|
||||
"ssh://aur@aur.archlinux.org/$package_name.git" "$clone_candidate"; then
|
||||
checkout="$clone_candidate"
|
||||
break
|
||||
fi
|
||||
if [ "$AUR_ATTEMPT" -lt 5 ]; then
|
||||
@@ -288,29 +332,27 @@ jobs:
|
||||
sleep "${AUR_RETRY_DELAYS[$((AUR_ATTEMPT - 1))]}"
|
||||
fi
|
||||
done
|
||||
if [ -z "$AUR_CHECKOUT" ]; then
|
||||
echo "Could not clone the AUR repository after 5 attempts" >&2
|
||||
exit 1
|
||||
if [ -z "$checkout" ]; then
|
||||
echo "Could not clone $package_name after 5 attempts" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
cp "$AUR_SOURCE_DIR/PKGBUILD" "$AUR_SOURCE_DIR/.SRCINFO" "$AUR_CHECKOUT/"
|
||||
cp "$package_source_dir/PKGBUILD" "$package_source_dir/.SRCINFO" "$checkout/"
|
||||
git -C "$checkout" config user.name "${AUR_GIT_NAME:-Gitty Release Bot}"
|
||||
git -C "$checkout" config user.email "${AUR_GIT_EMAIL:-aur@localhost}"
|
||||
git -C "$checkout" add PKGBUILD .SRCINFO
|
||||
|
||||
cd "$AUR_CHECKOUT"
|
||||
git config user.name "${AUR_GIT_NAME:-Gitty Release Bot}"
|
||||
git config user.email "${AUR_GIT_EMAIL:-aur@localhost}"
|
||||
git add PKGBUILD .SRCINFO
|
||||
|
||||
if git diff --cached --quiet; then
|
||||
echo "AUR metadata already matches release $PACKAGE_VERSION"
|
||||
exit 0
|
||||
if git -C "$checkout" diff --cached --quiet; then
|
||||
echo "$package_name already matches release $PACKAGE_VERSION"
|
||||
return 0
|
||||
fi
|
||||
|
||||
git commit -m "Update to $PACKAGE_VERSION"
|
||||
AUR_PUSHED=0
|
||||
git -C "$checkout" commit -m "Update to $PACKAGE_VERSION"
|
||||
pushed=0
|
||||
for AUR_ATTEMPT in 1 2 3 4 5; do
|
||||
echo "AUR push attempt $AUR_ATTEMPT of 5"
|
||||
if timeout 3m git push origin HEAD:master; then
|
||||
AUR_PUSHED=1
|
||||
echo "$package_name push attempt $AUR_ATTEMPT of 5"
|
||||
if timeout 3m git -C "$checkout" push origin HEAD:master; then
|
||||
pushed=1
|
||||
break
|
||||
fi
|
||||
if [ "$AUR_ATTEMPT" -lt 5 ]; then
|
||||
@@ -318,10 +360,14 @@ jobs:
|
||||
sleep "${AUR_RETRY_DELAYS[$((AUR_ATTEMPT - 1))]}"
|
||||
fi
|
||||
done
|
||||
if [ "$AUR_PUSHED" -ne 1 ]; then
|
||||
echo "Could not publish to AUR after 5 attempts" >&2
|
||||
exit 1
|
||||
if [ "$pushed" -ne 1 ]; then
|
||||
echo "Could not publish $package_name after 5 attempts" >&2
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
publish_aur_package gitty-desktop "$AUR_SOURCE_DIR"
|
||||
publish_aur_package gitty-desktop-bin "$AUR_BIN_DIR"
|
||||
|
||||
publish-ubuntu:
|
||||
name: Build and publish Ubuntu AppImage
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# Maintainer: Christoph Brandau <c.brandau91@googlemail.com>
|
||||
|
||||
pkgname=gitty-desktop-bin
|
||||
pkgver=2026.8.3
|
||||
pkgrel=1
|
||||
pkgdesc="A lightweight, modern Git client built with Tauri (prebuilt AppImage)"
|
||||
arch=('x86_64')
|
||||
url="https://git.cbsk-tech.de/Christoph/GitLite"
|
||||
license=('MIT')
|
||||
depends=('fuse2' 'git' 'webkit2gtk-4.1' 'gtk3' 'hicolor-icon-theme' 'libappindicator-gtk3' 'librsvg' 'xdotool')
|
||||
provides=('gitty-desktop')
|
||||
conflicts=('gitty-desktop')
|
||||
options=('!strip')
|
||||
|
||||
_appimage="Gitty_${pkgver}_amd64.AppImage"
|
||||
_artifact_url="https://cdn.cbsk-tech.de/gitty/${pkgver}/${_appimage}"
|
||||
_tag=2026.8.3
|
||||
source=("${_appimage}::${_artifact_url}"
|
||||
"gitty-desktop.png::${url}/raw/tag/${_tag}/src-tauri/icons/icon.png")
|
||||
sha256sums=('SKIP'
|
||||
'SKIP')
|
||||
|
||||
package() {
|
||||
install -Dm755 "$srcdir/$_appimage" \
|
||||
"$pkgdir/opt/$pkgname/gitty-desktop.AppImage"
|
||||
install -d "$pkgdir/usr/bin"
|
||||
ln -s "/opt/$pkgname/gitty-desktop.AppImage" \
|
||||
"$pkgdir/usr/bin/gitty-desktop"
|
||||
|
||||
install -Dm644 "$srcdir/gitty-desktop.png" \
|
||||
"$pkgdir/usr/share/icons/hicolor/512x512/apps/gitty-desktop.png"
|
||||
|
||||
install -d "$pkgdir/usr/share/applications"
|
||||
cat > "$pkgdir/usr/share/applications/gitty-desktop.desktop" <<-EOF
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Gitty
|
||||
Comment=$pkgdesc
|
||||
Exec=gitty-desktop
|
||||
Icon=gitty-desktop
|
||||
Terminal=false
|
||||
Categories=Development;RevisionControl;
|
||||
StartupWMClass=gitty
|
||||
EOF
|
||||
}
|
||||
@@ -60,6 +60,12 @@ Install Gitty from the AUR with an AUR helper:
|
||||
yay -S gitty-desktop
|
||||
```
|
||||
|
||||
To install the prebuilt AppImage instead of compiling from source:
|
||||
|
||||
```bash
|
||||
yay -S gitty-desktop-bin
|
||||
```
|
||||
|
||||
Or build the AUR package manually:
|
||||
|
||||
```bash
|
||||
@@ -68,8 +74,9 @@ cd gitty-desktop
|
||||
makepkg -si
|
||||
```
|
||||
|
||||
The AUR recipe downloads the public Gitea release archive and builds Gitty from
|
||||
source. The release pipeline updates its version, checksum, and `.SRCINFO`.
|
||||
The source recipe downloads the public Gitea release archive and builds Gitty.
|
||||
The `-bin` recipe installs the prebuilt AppImage. The release pipeline updates
|
||||
both packages' versions, checksums, and `.SRCINFO` files.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user