From 8ff3af6cb908fd824b512379dd21ed4f595ab6bb Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Wed, 25 Feb 2026 02:04:39 +0800 Subject: chore(ci): release to aur --- .changes/config.toml | 12 ++- .github/workflows/semifold-ci.yaml | 1 + .gitignore | 3 + scripts/release-aur.ts | 152 +++++++++++++++++++++++++++++++++++++ 4 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 scripts/release-aur.ts diff --git a/.changes/config.toml b/.changes/config.toml index dbce913..fa6ca47 100644 --- a/.changes/config.toml +++ b/.changes/config.toml @@ -30,6 +30,10 @@ User-Agent = "Semifold 0.2.10" command = "cargo" args = ["publish"] +[[resolver.rust.publish]] +command = "pnpm" +args = ["tsx", "scripts/release-aur.ts"] + [[resolver.rust.post-version]] command = "pnpm" args = ["bump-tauri"] @@ -40,8 +44,8 @@ url = "https://registry.npmjs.org/{{ package.name }}/{{ package.version }}" [[resolver.nodejs.publish]] command = "npm" args = [ - "publish", - "--provenance", - "--access", - "public", + "publish", + "--provenance", + "--access", + "public", ] diff --git a/.github/workflows/semifold-ci.yaml b/.github/workflows/semifold-ci.yaml index 27de130..aad64ab 100644 --- a/.github/workflows/semifold-ci.yaml +++ b/.github/workflows/semifold-ci.yaml @@ -7,6 +7,7 @@ env: CARGO_TERM_COLOR: always CLICOLOR_FORCE: 1 CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} + AUR_SSH_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }} permissions: id-token: write diff --git a/.gitignore b/.gitignore index b3a0dbf..5d6d0f3 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ __pycache__/ # Tauri artifacts artifacts/ + +# AUR Release +release/ diff --git a/scripts/release-aur.ts b/scripts/release-aur.ts new file mode 100644 index 0000000..d1fed87 --- /dev/null +++ b/scripts/release-aur.ts @@ -0,0 +1,152 @@ +import { execSync } from "node:child_process"; +import { + existsSync, + mkdirSync, + readFileSync, + unlinkSync, + writeFileSync, +} from "node:fs"; +import path from "node:path"; +import { version as pkgver } from "../src-tauri/tauri.conf.json"; + +function getSHA256Sum(url: string) { + const response = execSync(`curl -L ${url} | sha256sum`); + return response.toString().split(" ")[0]; +} + +execSync("mkdir -p release", { stdio: "inherit" }); +process.chdir("release"); + +const basePath = process.cwd(); +const homePath = process.env.HOME ?? basePath; +const sshPath = path.resolve(homePath, ".ssh"); +if (!existsSync(sshPath)) { + mkdirSync(sshPath, { recursive: true }); +} + +const url = "https://github.com/HydroRoll-Team/DropOut"; +const x86_64Url = `${url}/releases/download/dropout-v${pkgver}/dropout_${pkgver}_amd64.deb`; +const aarch64Url = `${url}/releases/download/dropout-v${pkgver}/dropout_${pkgver}_arm64.deb`; +const PKGBUILD = `\ +# Maintainer: HsiangNianian +# Contributor: 苏向夜 +pkgname=dropout-bin +pkgver=${pkgver} +pkgrel=1 +pkgdesc="A modern, reproducible, and developer-grade Minecraft launcher" +arch=('x86_64' 'aarch64') +url="${url}" +license=('MIT') +depends=('cairo' 'desktop-file-utils' 'gdk-pixbuf2' 'glib2' 'gtk3' 'hicolor-icon-theme' 'libsoup' 'pango' 'webkit2gtk-4.1') +options=('!strip' '!debug') +install=dropout-bin.install +source_x86_64=("${x86_64Url}") +source_aarch64=("${aarch64Url}") +sha256sums_x86_64=('${getSHA256Sum(x86_64Url)}') +sha256sums_aarch64=('${getSHA256Sum(aarch64Url)}') +package() { + # Extract package data + tar -xvf data.tar.gz -C "\${pkgdir}" +} +`; +const INSTALL = `\ +post_install() { + gtk-update-icon-cache -q -t -f usr/share/icons/hicolor + update-desktop-database -q +} + +post_upgrade() { + post_install +} + +post_remove() { + gtk-update-icon-cache -q -t -f usr/share/icons/hicolor + update-desktop-database -q +}`; + +// Check if AUR_SSH_KEY environment variable is set +const AUR_SSH_KEY = process.env.AUR_SSH_KEY; +if (!AUR_SSH_KEY) { + console.error("AUR_SSH_KEY environment variable is not set."); + process.exit(1); +} + +// Remove old SSH key file if it exists +const aurSSHKeyPath = path.resolve(sshPath, "aur"); +if (existsSync(aurSSHKeyPath)) { + unlinkSync(aurSSHKeyPath); +} + +// Write new SSH key file +writeFileSync(aurSSHKeyPath, `${AUR_SSH_KEY}\n`); +execSync(`chmod 400 ${aurSSHKeyPath}`); + +// Add aur to known hosts +const knownHostsPath = path.resolve(sshPath, "known_hosts"); +if (existsSync(knownHostsPath)) { + const knownHosts = readFileSync(knownHostsPath, { + encoding: "utf-8", + }); + if (!knownHosts.includes("aur.archlinux.org")) { + execSync( + `ssh-keyscan -v -t "rsa,ecdsa,ed25519" aur.archlinux.org >> ~/.ssh/known_hosts`, + { stdio: "inherit" }, + ); + } +} else { + execSync( + `ssh-keyscan -v -t "rsa,ecdsa,ed25519" aur.archlinux.org > ~/.ssh/known_hosts`, + { stdio: "inherit" }, + ); +} + +// Clone AUR repository if not exists +if (!existsSync("aur")) { + execSync( + `git -c init.defaultBranch=master -c core.sshCommand="ssh -i ${aurSSHKeyPath}" clone ssh://aur@aur.archlinux.org/clip-bridge-bin.git aur`, + { stdio: "inherit" }, + ); +} +execSync(`git -C aur config core.sshCommand "ssh -i ${aurSSHKeyPath}"`, { + stdio: "inherit", +}); + +// Write PKGBUILD and .install files +const pkgbuildPath = path.resolve("aur", "PKGBUILD"); +const installPath = path.resolve("aur", "dropout-bin.install"); +writeFileSync(pkgbuildPath, PKGBUILD); +writeFileSync(installPath, INSTALL); + +// Generate .SRCINFO file +execSync("makepkg --printsrcinfo > .SRCINFO", { + cwd: "aur", + stdio: "inherit", +}); + +// Setup Git repository +execSync("git add PKGBUILD .SRCINFO", { + stdio: "inherit", + cwd: "aur", +}); +execSync(`git -C aur config user.name "HsiangNianian"`, { stdio: "inherit" }); +execSync(`git -C aur config user.email "i@jyunko.cn"`, { + stdio: "inherit", +}); + +// Test AUR package (skip in CI) +if (!process.env.CI) { + execSync("makepkg -f", { + stdio: "inherit", + cwd: "aur", + }); +} + +// Publish to AUR +execSync(`git commit -m "release: release v${pkgver}"`, { + stdio: "inherit", + cwd: "aur", +}); +execSync(`git push origin master`, { + stdio: "inherit", + cwd: "aur", +}); -- cgit v1.2.3-70-g09d2