Vor einiger Zeit habe ich ein (für mich) ziemlich interessantes Software Projekt von m0ngr31 (@Github) entdeckt: Jellyamp, eine freie Software vergleichbar mit Plexamp, jedoch für den Medienserver Jellyfin. Da es noch kein AUR Paket gab, las ich mich ein, wie man diese erstellt. Schließlich galt es das ganze zu automatisieren, so dass ich die Schritte nicht bei jedem Release manuell durchführen muss.
AUR PKGBUILD
Zuerst habe ich mir angeschaut, wie eine PKGBUILD Datei für Arch aufgebaut ist, und wie diese funktionieren. Da das für ein Appimage relativ einfach ist, kam ich, dank dem Blog Beitrag von Dave Parrish recht schnell zu einem fertigen PKGBUILD. Dieses besteht aus Variablen, die den Paketnamen, die Version, in Konflikt stehende Pakete, die Architektur, die Lizenz, Abhängigkeiten, usw. enthalten:
# Maintainer: Peter Gerhards <mail@peterge.de>
_pkgname=Jellyamp
pkgname=jellyamp-appimage
pkgver=0.9.8
pkgrel=1
pkgdesc="A stylish, cross-platform desktop client for listening to music from a Jellyfin server. Inspired by Plexamp."
provides=('jellyamp')
conflicts=('jellyamp')
arch=('x86_64')
url="https://github.com/m0ngr31/jellyamp"
license=("MIT")
depends=('zlib' 'hicolor-icon-theme')
options=(!strip)
_appimage="${pkgname}-${pkgver}.AppImage"
source=("${_appimage}::https://github.com/m0ngr31/jellyamp/releases/download/v${pkgver}/${_pkgname}-${pkgver}-${arch}.AppImage"
"https://raw.githubusercontent.com/m0ngr31/jellyamp/v${pkgver}/LICENSE"
)
noextract=("${_appimage}")
Danach folgen drei Funktionen, die zunächst die Appimage Datei ausführbar machen und extrahieren, danach eine .dekstop
Datei erstellen, sowie die Berechtigungen anpassen und schließlich die Datei und die Lizenz verschieben, die .desktop
Datei und Icons kopieren, und die korrekten Symlinks anlegen:
prepare() {
chmod +x "${_appimage}"
./"${_appimage}" --appimage-extract
}
build() {
# Adjust .desktop so it will work outside of AppImage container
sed -i -E "s|Exec=AppRun|Exec=env DESKTOPINTEGRATION=false /usr/bin/${_pkgname}|"\
"squashfs-root/${_pkgname}.desktop"
# Fix permissions; .AppImage permissions are 700 for all directories
chmod -R a-x+rX squashfs-root/usr
}
package() {
# AppImage
install -Dm755 "${srcdir}/${_appimage}" "${pkgdir}/opt/${pkgname}/${pkgname}.AppImage"
install -Dm644 "${srcdir}/LICENSE" "${pkgdir}/opt/${pkgname}/LICENSE"
# Desktop file
install -Dm644 "${srcdir}/squashfs-root/${_pkgname}.desktop"\
"${pkgdir}/usr/share/applications/${_pkgname}.desktop"
# Icon images
install -dm755 "${pkgdir}/usr/share/"
cp -a "${srcdir}/squashfs-root/usr/share/icons" "${pkgdir}/usr/share/"
# Symlink executable
install -dm755 "${pkgdir}/usr/bin"
ln -s "/opt/${pkgname}/${pkgname}.AppImage" "${pkgdir}/usr/bin/${_pkgname}"
# Symlink license
install -dm755 "${pkgdir}/usr/share/licenses/${pkgname}/"
ln -s "/opt/$pkgname/LICENSE" "$pkgdir/usr/share/licenses/$pkgname"
}
Zum Schluss ist noch eine Liste mit den Hashsummen der einzelnen Dateien angegeben (makepkg -g >> PKGBUILD
):
md5sums=('6413a08ea61f23b03fb6d44e0e9e137a'
'f320c21f36aa4854c516c2393ba9de69')
Mit dieser Datei lässt sich dann mit makepkg -si
das korrekte Paket herunterladen, extrahieren, und installieren.
Automatische Aktualisierung mithilfe von Github Actions
Um nun den manuellen Aufwand zu ersparen, verwende ich Github Actions, die bei einem neuen Release innerhalb der nächsten 3 Stunden die korrekte PKGBUILD Datei ins AUR hochladen. Dazu habe ich 2 Workflows angelegt.
Der erste prüft alle 3 Stunden auf einen neuen Release im Repo der Software, und updatet in diesem Fall die Datei release-versions/jellyamp-latest.txt
, und commited & pusht die Änderungen dann wieder ins Repo.
Im zweiten Workflow ist die Startbedingung ein push, der eine Datei in release-versions
verändert. Daraufhin startet die Action einen Docker Container mit dem Dockerfile
aus dem jellyamp-appimge
Verzeichnis. Dieses gibt als Basisimage die aktuellste Version des archlinux Containers an, installiert notwendige Pakete wie base-devel und git, fügt einen User hinzu, mit dem wir später die Arbeit durchführen, und kopiert und führt das Script entrypoint.sh
aus.
Dieses klont zunächst das Github Repo mit dem PKGBUILD Template und das AUR Repo der Software. Nun überschreibe ich die Software Version mit dem aktuellsten Stand den ich von der Github API geliefert bekomme, lade alle Dateien runter und erstelle die Hashsumme aller Dateien und erzeuge schließlich die .SRCINFO Datei für AUR. Diese schiebe ich dann nach /github/workspace
, ein Verzeichnis dass auch außerhalb des Docker Containers verfügbar ist.
Nun folgt als letzter Schritt das hochladen von PKGBUILD und .SRCINFO aus /github/workspace
ins AUR. Dies erledige ich mithilfe der Action KSXGitHub/github-actions-deploy-aur, hierzu habe ich im Repo Secrets angelegt und einen zusätzlichen User als Maintainer auf das AUR Projekt berechtigt. Über diesen erfolgt dann das commiten & pushen der beiden Dateien. Die aktuellsten Änderung im AUR Repo können hier eingesehen werden.
Update 04/2021: Die Action funktioniert! (Ich hab natürlich nie daran gezweifelt xD) Aber es kann sein das Github den Workflow auf inaktiv stellt. Dann muss man dies in der Webgui nach 60 Tagen bestätigen. Alternativ kann man auch mit
on:
workflow_dispatch:
in der Action diese von der Webgui aus starten.