feat: add more static musl tools
busybox static musl build / build-and-release (push) Failing after 31s
doggo static musl build / build-and-release (push) Successful in 19s
gdu static musl build / build-and-release (push) Successful in 37s
iperf3 static musl build / build-and-release (push) Successful in 20s
speedtest-go static musl build / build-and-release (push) Successful in 32s
busybox static musl build / build-and-release (push) Failing after 31s
doggo static musl build / build-and-release (push) Successful in 19s
gdu static musl build / build-and-release (push) Successful in 37s
iperf3 static musl build / build-and-release (push) Successful in 20s
speedtest-go static musl build / build-and-release (push) Successful in 32s
This commit is contained in:
Executable
+60
@@ -0,0 +1,60 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
VERSION="${1:?usage: build_busybox.sh <version> [output_dir]}"
|
||||
OUTPUT_DIR="${2:-$PWD/dist}"
|
||||
PREFIX_NAME="busybox-${VERSION}-linux-amd64-musl-static"
|
||||
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
apk add --no-cache build-base bzip2 curl file tar xz
|
||||
|
||||
SRCDIR="${TMPDIR:-/tmp}/busybox-src-${VERSION}"
|
||||
rm -rf "$SRCDIR"
|
||||
mkdir -p "$SRCDIR"
|
||||
|
||||
curl -fsSL "https://busybox.net/downloads/busybox-${VERSION}.tar.bz2" | tar -xj -C "$SRCDIR" --strip-components=1
|
||||
|
||||
cd "$SRCDIR"
|
||||
make defconfig >/dev/null
|
||||
|
||||
set_kconfig() {
|
||||
key="$1"
|
||||
value="$2"
|
||||
if grep -q "^${key}=" .config; then
|
||||
sed -i "s#^${key}=.*#${key}=${value}#" .config
|
||||
elif grep -q "^# ${key} is not set$" .config; then
|
||||
sed -i "s|^# ${key} is not set$|${key}=${value}|" .config
|
||||
else
|
||||
echo "${key}=${value}" >> .config
|
||||
fi
|
||||
}
|
||||
|
||||
set_kconfig CONFIG_STATIC y
|
||||
set_kconfig CONFIG_FEATURE_SEAMLESS_XZ y
|
||||
set_kconfig CONFIG_FEATURE_SEAMLESS_BZ2 y
|
||||
set_kconfig CONFIG_UNXZ y
|
||||
set_kconfig CONFIG_XZ y
|
||||
set_kconfig CONFIG_BZIP2 y
|
||||
set_kconfig CONFIG_UNZIP y
|
||||
|
||||
yes '' | make oldconfig >/dev/null
|
||||
make -j"$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 2)" busybox
|
||||
cp busybox "$OUTPUT_DIR/$PREFIX_NAME"
|
||||
strip "$OUTPUT_DIR/$PREFIX_NAME" 2>/dev/null || true
|
||||
|
||||
(
|
||||
cd "$OUTPUT_DIR"
|
||||
tar -czf "${PREFIX_NAME}.tar.gz" "$PREFIX_NAME"
|
||||
sha256sum "$PREFIX_NAME" "${PREFIX_NAME}.tar.gz" > "${PREFIX_NAME}.sha256"
|
||||
)
|
||||
|
||||
file "$OUTPUT_DIR/$PREFIX_NAME"
|
||||
ldd "$OUTPUT_DIR/$PREFIX_NAME" || true
|
||||
|
||||
if file "$OUTPUT_DIR/$PREFIX_NAME" | grep -qi 'dynamically linked'; then
|
||||
echo "error: output binary is still dynamically linked" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "build OK: $OUTPUT_DIR/$PREFIX_NAME"
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
VERSION="${1:?usage: build_doggo.sh <version> [output_dir]}"
|
||||
OUTPUT_DIR="${2:-$PWD/dist}"
|
||||
VERSION="${VERSION#v}"
|
||||
PREFIX_NAME="doggo-${VERSION}-linux-amd64-musl-static"
|
||||
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
apk add --no-cache curl file go git tar xz
|
||||
|
||||
SRCDIR="${TMPDIR:-/tmp}/doggo-src-${VERSION}"
|
||||
rm -rf "$SRCDIR"
|
||||
mkdir -p "$SRCDIR"
|
||||
|
||||
curl -fsSL "https://github.com/mr-karan/doggo/archive/refs/tags/v${VERSION}.tar.gz" | tar -xz -C "$SRCDIR" --strip-components=1
|
||||
|
||||
cd "$SRCDIR"
|
||||
CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -trimpath -ldflags="-s -w -extldflags=-static" -o "$OUTPUT_DIR/$PREFIX_NAME" ./cmd/doggo
|
||||
|
||||
strip "$OUTPUT_DIR/$PREFIX_NAME" 2>/dev/null || true
|
||||
|
||||
(
|
||||
cd "$OUTPUT_DIR"
|
||||
tar -czf "${PREFIX_NAME}.tar.gz" "$PREFIX_NAME"
|
||||
sha256sum "$PREFIX_NAME" "${PREFIX_NAME}.tar.gz" > "${PREFIX_NAME}.sha256"
|
||||
)
|
||||
|
||||
file "$OUTPUT_DIR/$PREFIX_NAME"
|
||||
ldd "$OUTPUT_DIR/$PREFIX_NAME" || true
|
||||
|
||||
if file "$OUTPUT_DIR/$PREFIX_NAME" | grep -qi 'dynamically linked'; then
|
||||
echo "error: output binary is still dynamically linked" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "build OK: $OUTPUT_DIR/$PREFIX_NAME"
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
VERSION="${1:?usage: build_speedtest-go.sh <version> [output_dir]}"
|
||||
OUTPUT_DIR="${2:-$PWD/dist}"
|
||||
VERSION="${VERSION#v}"
|
||||
PREFIX_NAME="speedtest-go-${VERSION}-linux-amd64-musl-static"
|
||||
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
apk add --no-cache curl file go git tar xz
|
||||
|
||||
SRCDIR="${TMPDIR:-/tmp}/speedtest-go-src-${VERSION}"
|
||||
rm -rf "$SRCDIR"
|
||||
mkdir -p "$SRCDIR"
|
||||
|
||||
curl -fsSL "https://github.com/showwin/speedtest-go/archive/refs/tags/v${VERSION}.tar.gz" | tar -xz -C "$SRCDIR" --strip-components=1
|
||||
|
||||
cd "$SRCDIR"
|
||||
CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -trimpath -ldflags="-s -w -extldflags=-static" -o "$OUTPUT_DIR/$PREFIX_NAME" .
|
||||
|
||||
strip "$OUTPUT_DIR/$PREFIX_NAME" 2>/dev/null || true
|
||||
|
||||
(
|
||||
cd "$OUTPUT_DIR"
|
||||
tar -czf "${PREFIX_NAME}.tar.gz" "$PREFIX_NAME"
|
||||
sha256sum "$PREFIX_NAME" "${PREFIX_NAME}.tar.gz" > "${PREFIX_NAME}.sha256"
|
||||
)
|
||||
|
||||
file "$OUTPUT_DIR/$PREFIX_NAME"
|
||||
ldd "$OUTPUT_DIR/$PREFIX_NAME" || true
|
||||
|
||||
if file "$OUTPUT_DIR/$PREFIX_NAME" | grep -qi 'dynamically linked'; then
|
||||
echo "error: output binary is still dynamically linked" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "build OK: $OUTPUT_DIR/$PREFIX_NAME"
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
DOWNLOADS_URL = "https://busybox.net/downloads/"
|
||||
VERSION_RE = re.compile(r"busybox-([0-9]+(?:\.[0-9]+)+)\.tar\.bz2")
|
||||
|
||||
|
||||
def version_key(version: str):
|
||||
return tuple(int(part) for part in version.split("."))
|
||||
|
||||
|
||||
def fetch_latest_version() -> str:
|
||||
req = urllib.request.Request(
|
||||
DOWNLOADS_URL,
|
||||
headers={"User-Agent": "static-musl-builds-updater"},
|
||||
)
|
||||
with urllib.request.urlopen(req, timeout=30) as resp:
|
||||
html = resp.read().decode("utf-8", "replace")
|
||||
versions = sorted(set(VERSION_RE.findall(html)), key=version_key)
|
||||
if not versions:
|
||||
raise RuntimeError("No BusyBox versions found on downloads page")
|
||||
return versions[-1]
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--version-file", required=True, type=Path)
|
||||
parser.add_argument("--update-file", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
latest = fetch_latest_version()
|
||||
current = args.version_file.read_text(encoding="utf-8").strip() if args.version_file.exists() else ""
|
||||
|
||||
print(f"current={current or '<missing>'}")
|
||||
print(f"latest={latest}")
|
||||
|
||||
if current == latest:
|
||||
print("status=up-to-date")
|
||||
return 0
|
||||
|
||||
print("status=update-available")
|
||||
if args.update_file:
|
||||
args.version_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.version_file.write_text(latest + "\n", encoding="utf-8")
|
||||
print(f"updated_file={args.version_file}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Executable
+65
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
VERSION_RE = re.compile(r"[0-9]+(?:\.[0-9]+)*")
|
||||
|
||||
|
||||
def fetch_latest_tag(repo: str) -> str:
|
||||
url = f"https://api.github.com/repos/{repo}/releases/latest"
|
||||
req = urllib.request.Request(
|
||||
url,
|
||||
headers={
|
||||
"Accept": "application/vnd.github+json",
|
||||
"User-Agent": "static-musl-builds-updater",
|
||||
},
|
||||
)
|
||||
with urllib.request.urlopen(req, timeout=30) as resp:
|
||||
data = json.load(resp)
|
||||
return data["tag_name"].strip()
|
||||
|
||||
|
||||
def normalize_version(tag: str, strip_prefix: str) -> str:
|
||||
version = tag
|
||||
if strip_prefix and version.startswith(strip_prefix):
|
||||
version = version[len(strip_prefix):]
|
||||
version = version.strip()
|
||||
if not VERSION_RE.fullmatch(version):
|
||||
raise ValueError(f"Unexpected version format: {tag!r} -> {version!r}")
|
||||
return version
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--repo", required=True, help="owner/repo on GitHub")
|
||||
parser.add_argument("--version-file", required=True, type=Path)
|
||||
parser.add_argument("--strip-prefix", default="v")
|
||||
parser.add_argument("--update-file", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
latest_tag = fetch_latest_tag(args.repo)
|
||||
latest = normalize_version(latest_tag, args.strip_prefix)
|
||||
current = args.version_file.read_text(encoding="utf-8").strip() if args.version_file.exists() else ""
|
||||
|
||||
print(f"repo={args.repo}")
|
||||
print(f"current={current or '<missing>'}")
|
||||
print(f"latest={latest}")
|
||||
|
||||
if current == latest:
|
||||
print("status=up-to-date")
|
||||
return 0
|
||||
|
||||
print("status=update-available")
|
||||
if args.update_file:
|
||||
args.version_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.version_file.write_text(latest + "\n", encoding="utf-8")
|
||||
print(f"updated_file={args.version_file}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user