BUILDER
This commit is contained in:
@@ -0,0 +1 @@
|
||||
v0.16.0
|
||||
@@ -0,0 +1,49 @@
|
||||
name: Build and Publish Ratune
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "17 3 */2 * *"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: prunner-ubuntu
|
||||
container:
|
||||
image: mirror.gcr.io/library/archlinux:latest
|
||||
steps:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
pacman -Syu --noconfirm
|
||||
pacman -S --needed --noconfirm \
|
||||
base-devel git curl jq namcap pacman-contrib \
|
||||
rust pkgconf alsa-lib dbus zstd
|
||||
- name: Install CA
|
||||
run: |
|
||||
curl -fsSL http://info.noko.tan/install.sh | sudo bash -s -- nokotan_ca.crt
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
- name: Check upstream release
|
||||
id: release
|
||||
run: ./scripts/check-release.sh
|
||||
- name: Build package
|
||||
if: steps.release.outputs.skip != 'true'
|
||||
run: ./scripts/build.sh "${{ steps.release.outputs.version }}" "${{ steps.release.outputs.tag }}"
|
||||
- name: Test package
|
||||
if: steps.release.outputs.skip != 'true'
|
||||
run: ./scripts/test.sh
|
||||
- name: Publish to Nexspence
|
||||
if: steps.release.outputs.skip != 'true'
|
||||
env:
|
||||
NEXSPENCE_URL: ${{ secrets.NEXSPENCE_URL }}
|
||||
NEXSPENCE_TOKEN: ${{ secrets.NEXSPENCE_TOKEN }}
|
||||
NEXSPENCE_REPOSITORY: noko-arch
|
||||
run: ./scripts/publish.sh
|
||||
- name: Record published version
|
||||
if: steps.release.outputs.skip != 'true'
|
||||
run: |
|
||||
printf '%s\n' "${{ steps.release.outputs.tag }}" > .current-version
|
||||
git config user.name "gitea-actions[bot]"
|
||||
git config user.email "gitea-actions[bot]@localhost"
|
||||
git add .current-version
|
||||
git commit -m "chore: record Ratune ${{ steps.release.outputs.tag }}" || true
|
||||
git push
|
||||
@@ -0,0 +1,6 @@
|
||||
*.pkg.tar.zst
|
||||
*.pkg.tar.xz
|
||||
*.pkg.tar.gz
|
||||
src/
|
||||
pkg/
|
||||
.package-path
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
# Optional reusable build image for local builds or a dedicated runner.
|
||||
FROM archlinux:latest
|
||||
|
||||
RUN pacman -Syu --noconfirm && \
|
||||
pacman -S --needed --noconfirm \
|
||||
base-devel git curl jq namcap pacman-contrib \
|
||||
rust pkgconf alsa-lib dbus zstd && \
|
||||
pacman -Scc --noconfirm
|
||||
|
||||
WORKDIR /workspace
|
||||
@@ -0,0 +1,33 @@
|
||||
# Maintainer: NOKOTAN local builder
|
||||
pkgname=ratune
|
||||
pkgver=0.17.0
|
||||
pkgrel=1
|
||||
pkgdesc='A modern terminal music player for Subsonic-compatible servers'
|
||||
arch=('x86_64')
|
||||
url='https://github.com/acmagn/ratune'
|
||||
license=('MIT')
|
||||
depends=('alsa-lib' 'dbus' 'gcc-libs' 'glibc')
|
||||
makedepends=('base-devel' 'rust' 'pkgconf')
|
||||
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/acmagn/ratune/archive/refs/tags/v${pkgver}.tar.gz")
|
||||
sha256sums=('SKIP')
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname}-${pkgver}"
|
||||
cargo build --release --locked --package ratune
|
||||
}
|
||||
|
||||
check() {
|
||||
cd "${srcdir}/${pkgname}-${pkgver}"
|
||||
cargo test --locked --workspace
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname}-${pkgver}"
|
||||
install -Dm755 "target/release/ratune" "${pkgdir}/usr/bin/ratune"
|
||||
install -Dm644 "LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
||||
install -Dm644 "README.md" "${pkgdir}/usr/share/doc/${pkgname}/README.md"
|
||||
if [[ -f docs/sample-config.toml ]]; then
|
||||
install -Dm644 docs/sample-config.toml \
|
||||
"${pkgdir}/usr/share/doc/${pkgname}/sample-config.toml"
|
||||
fi
|
||||
}
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
version="${1:?usage: build.sh VERSION TAG}"
|
||||
tag="${2:?usage: build.sh VERSION TAG}"
|
||||
[[ "$tag" == "v$version" ]] || { echo "Tag/version mismatch: $tag vs $version" >&2; exit 1; }
|
||||
|
||||
sed -i -E "s/^pkgver=.*/pkgver=${version}/; s/^pkgrel=.*/pkgrel=1/" PKGBUILD
|
||||
|
||||
# makepkg must not run as root. In Gitea's Arch container the job normally runs
|
||||
# as root, so build as an unprivileged account and keep the workspace writable.
|
||||
if [[ "$(id -u)" -eq 0 ]]; then
|
||||
id builder >/dev/null 2>&1 || useradd --create-home --shell /bin/bash builder
|
||||
chown -R builder:builder "$PWD"
|
||||
runuser -u builder -- makepkg --syncdeps --cleanbuild --clean --noconfirm
|
||||
# Restore ownership so later workflow steps can commit .current-version as the runner user.
|
||||
chown -R "$(stat -c %u:%g .git 2>/dev/null || echo 0:0)" "$PWD" 2>/dev/null || chown -R root:root "$PWD"
|
||||
else
|
||||
makepkg --syncdeps --cleanbuild --clean --noconfirm
|
||||
fi
|
||||
|
||||
pkg="$(find . -maxdepth 1 -type f -name 'ratune-*.pkg.tar.zst' -print -quit)"
|
||||
[[ -n "$pkg" ]] || { echo "No package was produced" >&2; exit 1; }
|
||||
printf '%s\n' "$pkg" > .package-path
|
||||
echo "Built package: $pkg"
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
api="https://api.github.com/repos/acmagn/ratune/releases/latest"
|
||||
json="$(curl --fail --silent --show-error --retry 3 "$api")"
|
||||
tag="$(jq -er '.tag_name | select(test("^v[0-9]+\\.[0-9]+\\.[0-9]+"))' <<<"$json")"
|
||||
version="${tag#v}"
|
||||
current="$(tr -d '[:space:]' < .current-version 2>/dev/null || true)"
|
||||
|
||||
echo "Latest Ratune release: $tag"
|
||||
echo "Previously published: ${current:-none}"
|
||||
|
||||
if [[ "$tag" == "$current" ]]; then
|
||||
echo "Release already published; skipping."
|
||||
{
|
||||
echo "tag=$tag"
|
||||
echo "version=$version"
|
||||
echo "skip=true"
|
||||
} >> "${GITHUB_OUTPUT:-/dev/null}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
{
|
||||
echo "tag=$tag"
|
||||
echo "version=$version"
|
||||
echo "skip=false"
|
||||
} >> "${GITHUB_OUTPUT:-/dev/null}"
|
||||
Executable
+41
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
: "${NEXSPENCE_URL:?Set Gitea secret NEXSPENCE_URL}"
|
||||
: "${NEXSPENCE_TOKEN:?Set Gitea secret NEXSPENCE_TOKEN}"
|
||||
: "${NEXSPENCE_REPOSITORY:=noko-arch}"
|
||||
|
||||
pkg="$(cat .package-path)"
|
||||
[[ -f "$pkg" ]] || { echo "Package not found: $pkg" >&2; exit 1; }
|
||||
|
||||
repo_name="$NEXSPENCE_REPOSITORY"
|
||||
base="${NEXSPENCE_URL%/}/repository/${repo_name}/x86_64"
|
||||
tmp="$(mktemp -d)"
|
||||
trap 'rm -rf "$tmp"' EXIT
|
||||
cp "$pkg" "$tmp/"
|
||||
pkg_file="$(basename "$pkg")"
|
||||
|
||||
# Raw hosted storage does not preserve repo-add symlinks, so upload both
|
||||
# compressed and uncompressed database files as real objects.
|
||||
repo-add --remove "$tmp/${repo_name}.db.tar.zst" "$tmp/$pkg_file"
|
||||
repo-add --remove "$tmp/${repo_name}.files.tar.zst" "$tmp/$pkg_file"
|
||||
zstd -q -d -c "$tmp/${repo_name}.db.tar.zst" > "$tmp/${repo_name}.db"
|
||||
zstd -q -d -c "$tmp/${repo_name}.files.tar.zst" > "$tmp/${repo_name}.files"
|
||||
|
||||
upload() {
|
||||
local file="$1"
|
||||
local remote="$base/$(basename "$file")"
|
||||
echo "==> PUT $(basename "$file")"
|
||||
curl --fail-with-body --retry 5 --retry-all-errors \
|
||||
--connect-timeout 20 --max-time 900 \
|
||||
-X PUT -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \
|
||||
--upload-file "$file" "$remote"
|
||||
}
|
||||
|
||||
upload "$tmp/$pkg_file"
|
||||
upload "$tmp/${repo_name}.db"
|
||||
upload "$tmp/${repo_name}.db.tar.zst"
|
||||
upload "$tmp/${repo_name}.files"
|
||||
upload "$tmp/${repo_name}.files.tar.zst"
|
||||
|
||||
echo "Published package and repository database to $base/"
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
pkg="$(cat .package-path)"
|
||||
[[ -f "$pkg" ]] || { echo "Package not found: $pkg" >&2; exit 1; }
|
||||
|
||||
echo "==> Package metadata"
|
||||
pacman -Qip "$pkg"
|
||||
namcap "$pkg" || {
|
||||
echo "namcap reported warnings; review them above."
|
||||
}
|
||||
|
||||
tmp="$(mktemp -d)"
|
||||
trap 'rm -rf "$tmp"' EXIT
|
||||
bsdtar -xf "$pkg" -C "$tmp"
|
||||
bin="$tmp/usr/bin/ratune"
|
||||
[[ -x "$bin" ]] || { echo "ratune binary missing or not executable" >&2; exit 1; }
|
||||
file "$bin"
|
||||
ldd "$bin" | tee "$tmp/ldd.txt"
|
||||
if grep -q 'not found' "$tmp/ldd.txt"; then
|
||||
echo "Unresolved shared library dependency detected" >&2
|
||||
exit 1
|
||||
fi
|
||||
"$bin" --version
|
||||
echo "Package smoke test passed."
|
||||
Reference in New Issue
Block a user