aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.changes/config.toml12
-rw-r--r--.github/workflows/semifold-ci.yaml1
-rw-r--r--.gitignore3
-rw-r--r--scripts/release-aur.ts152
4 files changed, 164 insertions, 4 deletions
diff --git a/.changes/config.toml b/.changes/config.toml
index 8a7034d..bd02fe4 100644
--- a/.changes/config.toml
+++ b/.changes/config.toml
@@ -35,6 +35,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"]
@@ -45,8 +49,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 <i@jyunko.cn>
+# Contributor: 苏向夜 <fu050409@163.com>
+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",
+});