chore: modify workflow scripts
calc hash for dist.
This commit is contained in:
parent
593c5f8f7f
commit
e512bd9e2a
2 changed files with 144 additions and 100 deletions
200
scripts/build.sh
Normal file → Executable file
200
scripts/build.sh
Normal file → Executable file
|
|
@ -1,101 +1,101 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e # 遇到错误立即停止
|
set -e # 遇到错误立即停止
|
||||||
|
|
||||||
# --- 配置部分 ---
|
# --- 配置部分 ---
|
||||||
APP_NAME="gosh"
|
APP_NAME="gosh"
|
||||||
OUTPUT_DIR="dist"
|
OUTPUT_DIR="dist"
|
||||||
# 新增:获取 dist 目录的绝对物理路径
|
# 新增:获取 dist 目录的绝对物理路径
|
||||||
mkdir -p "$OUTPUT_DIR"
|
mkdir -p "$OUTPUT_DIR"
|
||||||
ABS_OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
|
ABS_OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
|
||||||
|
|
||||||
# 你想要支持的 Target 列表
|
# 你想要支持的 Target 列表
|
||||||
# cross 支持的列表可见: https://github.com/cross-rs/cross#supported-targets
|
# cross 支持的列表可见: https://github.com/cross-rs/cross#supported-targets
|
||||||
TARGETS=(
|
TARGETS=(
|
||||||
"x86_64-unknown-linux-gnu" # 标准 Linux x64
|
"x86_64-unknown-linux-gnu" # 标准 Linux x64
|
||||||
"x86_64-unknown-linux-musl" # 静态链接 Linux x64 (推荐: 无依赖,兼容性最好)
|
"x86_64-unknown-linux-musl" # 静态链接 Linux x64 (推荐: 无依赖,兼容性最好)
|
||||||
# "i686-unknown-linux-gnu" # Linux x86
|
# "i686-unknown-linux-gnu" # Linux x86
|
||||||
# "i586-unknown-linux-musl" # Linux x86 (静态链接)
|
# "i586-unknown-linux-musl" # Linux x86 (静态链接)
|
||||||
"aarch64-unknown-linux-gnu" # Linux ARM64 (如树莓派 4, docker ARM 容器)
|
"aarch64-unknown-linux-gnu" # Linux ARM64 (如树莓派 4, docker ARM 容器)
|
||||||
# "x86_64-unknown-freebsd" # FreeBSD x64
|
# "x86_64-unknown-freebsd" # FreeBSD x64
|
||||||
# "x86_64-pc-windows-gnu" # Windows x64 (使用 MinGW)
|
# "x86_64-pc-windows-gnu" # Windows x64 (使用 MinGW)
|
||||||
# "aarch64-apple-darwin" # macOS ARM64 (注意: cross 对 macOS 支持有限,通常建议在 Mac 上原生编译)
|
# "aarch64-apple-darwin" # macOS ARM64 (注意: cross 对 macOS 支持有限,通常建议在 Mac 上原生编译)
|
||||||
)
|
)
|
||||||
|
|
||||||
# --- 检查依赖 ---
|
# --- 检查依赖 ---
|
||||||
if ! command -v cross &> /dev/null; then
|
if ! command -v cross &> /dev/null; then
|
||||||
echo "❌ Error: 'cross' is not installed."
|
echo "❌ Error: 'cross' is not installed."
|
||||||
echo "👉 Please install it: cargo install cross"
|
echo "👉 Please install it: cargo install cross"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v podman &> /dev/null; then
|
if ! command -v podman &> /dev/null; then
|
||||||
echo "❌ Error: 'podman' is not installed or not in PATH."
|
echo "❌ Error: 'podman' is not installed or not in PATH."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --- 获取版本号 ---
|
# --- 获取版本号 ---
|
||||||
# 简单地从 Cargo.toml 提取版本号
|
# 简单地从 Cargo.toml 提取版本号
|
||||||
VERSION=$(grep "^version" Cargo.toml | head -n 1 | cut -d '"' -f 2)
|
VERSION=$(grep "^version" Cargo.toml | head -n 1 | cut -d '"' -f 2)
|
||||||
echo "🚀 Preparing to build $APP_NAME v$VERSION..."
|
echo "🚀 Preparing to build $APP_NAME v$VERSION..."
|
||||||
|
|
||||||
# 清理并创建输出目录
|
# 清理并创建输出目录
|
||||||
rm -rf "$OUTPUT_DIR"
|
rm -rf "$OUTPUT_DIR"
|
||||||
mkdir -p "$OUTPUT_DIR"
|
mkdir -p "$OUTPUT_DIR"
|
||||||
|
|
||||||
# --- 循环编译 ---
|
# --- 循环编译 ---
|
||||||
for target in "${TARGETS[@]}"; do
|
for target in "${TARGETS[@]}"; do
|
||||||
echo "------------------------------------------------"
|
echo "------------------------------------------------"
|
||||||
echo "🔨 Building target: $target"
|
echo "🔨 Building target: $target"
|
||||||
echo "------------------------------------------------"
|
echo "------------------------------------------------"
|
||||||
|
|
||||||
# 1. 使用 cross 编译 release 版本
|
# 1. 使用 cross 编译 release 版本
|
||||||
cross build --target "$target" --release
|
cross build --target "$target" --release
|
||||||
|
|
||||||
# 2. 准备打包
|
# 2. 准备打包
|
||||||
BINARY_NAME="$APP_NAME"
|
BINARY_NAME="$APP_NAME"
|
||||||
if [[ $target == *"windows"* ]]; then
|
if [[ $target == *"windows"* ]]; then
|
||||||
BINARY_NAME="${APP_NAME}.exe"
|
BINARY_NAME="${APP_NAME}.exe"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 查找编译生成的二进制文件位置
|
# 查找编译生成的二进制文件位置
|
||||||
BUILD_BIN_PATH="target/$target/release/$BINARY_NAME"
|
BUILD_BIN_PATH="target/$target/release/$BINARY_NAME"
|
||||||
|
|
||||||
if [ ! -f "$BUILD_BIN_PATH" ]; then
|
if [ ! -f "$BUILD_BIN_PATH" ]; then
|
||||||
echo "❌ Error: Binary not found at $BUILD_BIN_PATH"
|
echo "❌ Error: Binary not found at $BUILD_BIN_PATH"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. 打包文件名格式: gosh-v0.1.0-x86_64-unknown-linux-musl.tar.gz
|
# 3. 打包文件名格式: gosh-v0.1.0-x86_64-unknown-linux-musl.tar.gz
|
||||||
ARCHIVE_NAME="${APP_NAME}-v${VERSION}-${target}"
|
ARCHIVE_NAME="${APP_NAME}-v${VERSION}-${target}"
|
||||||
|
|
||||||
# 进入输出目录进行打包操作
|
# 进入输出目录进行打包操作
|
||||||
# 创建一个临时目录来存放二进制文件和文档(如果有 README/LICENSE)
|
# 创建一个临时目录来存放二进制文件和文档(如果有 README/LICENSE)
|
||||||
TMP_DIR=$(mktemp -d)
|
TMP_DIR=$(mktemp -d)
|
||||||
cp "$BUILD_BIN_PATH" "$TMP_DIR/"
|
cp "$BUILD_BIN_PATH" "$TMP_DIR/"
|
||||||
# 如果有 README 或 LICENSE,也可以 cp 到 TMP_DIR
|
# 如果有 README 或 LICENSE,也可以 cp 到 TMP_DIR
|
||||||
# cp README.md LICENSE "$TMP_DIR/"
|
# cp README.md LICENSE "$TMP_DIR/"
|
||||||
|
|
||||||
echo "📦 Packaging $ARCHIVE_NAME..."
|
echo "📦 Packaging $ARCHIVE_NAME..."
|
||||||
|
|
||||||
# if [[ $target == *"windows"* ]]; then
|
# if [[ $target == *"windows"* ]]; then
|
||||||
# # Windows 使用 zip
|
# # Windows 使用 zip
|
||||||
# ARCHIVE_FILE="${ARCHIVE_NAME}.zip"
|
# ARCHIVE_FILE="${ARCHIVE_NAME}.zip"
|
||||||
# (cd "$TMP_DIR" && zip -r "../../$OUTPUT_DIR/$ARCHIVE_FILE" .)
|
# (cd "$TMP_DIR" && zip -r "../../$OUTPUT_DIR/$ARCHIVE_FILE" .)
|
||||||
# else
|
# else
|
||||||
# Linux/Unix 使用 tar.gz
|
# Linux/Unix 使用 tar.gz
|
||||||
ARCHIVE_FILE="${ARCHIVE_NAME}.tar.gz"
|
ARCHIVE_FILE="${ARCHIVE_NAME}.tar.gz"
|
||||||
(cd "$TMP_DIR" && tar -czf "$ABS_OUTPUT_DIR/$ARCHIVE_FILE" .)
|
(cd "$TMP_DIR" && tar -czf "$ABS_OUTPUT_DIR/$ARCHIVE_FILE" .)
|
||||||
# fi
|
# fi
|
||||||
|
|
||||||
# 清理临时目录
|
# 清理临时目录
|
||||||
rm -rf "$TMP_DIR"
|
rm -rf "$TMP_DIR"
|
||||||
|
|
||||||
# 4. 生成校验和 (SHA256)
|
# 4. 生成校验和 (SHA256)
|
||||||
(cd "$ABS_OUTPUT_DIR" && shasum -a 256 "$ARCHIVE_FILE" > "${ARCHIVE_FILE}.sha256")
|
(cd "$ABS_OUTPUT_DIR" && shasum -a 256 "$ARCHIVE_FILE" > "${ARCHIVE_FILE}.sha256")
|
||||||
|
|
||||||
echo "✅ Success: $OUTPUT_DIR/$ARCHIVE_FILE"
|
echo "✅ Success: $OUTPUT_DIR/$ARCHIVE_FILE"
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "------------------------------------------------"
|
echo "------------------------------------------------"
|
||||||
echo "🎉 Build finished! All artifacts are in '$OUTPUT_DIR/'"
|
echo "🎉 Build finished! All artifacts are in '$OUTPUT_DIR/'"
|
||||||
ls -lh "$OUTPUT_DIR"
|
ls -lh "$OUTPUT_DIR"
|
||||||
44
scripts/hash.sh
Executable file
44
scripts/hash.sh
Executable file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 定义目标目录
|
||||||
|
TARGET_DIR="$PWD/dist"
|
||||||
|
|
||||||
|
# 检查目录是否存在
|
||||||
|
if [ ! -d "$TARGET_DIR" ]; then
|
||||||
|
echo "Error: Directory $TARGET_DIR does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 输出表格表头
|
||||||
|
echo "| Filename | SHA256 | Status |"
|
||||||
|
echo "| :--- | :--- | :--- |"
|
||||||
|
|
||||||
|
# 遍历所有的 .tar.gz 文件
|
||||||
|
for file in "$TARGET_DIR"/*.tar.gz; do
|
||||||
|
# 检查是否有匹配的文件,防止 glob 失败
|
||||||
|
[ -e "$file" ] || continue
|
||||||
|
|
||||||
|
filename=$(basename "$file")
|
||||||
|
sha_file="${file}.sha256"
|
||||||
|
|
||||||
|
# 计算当前的 SHA256
|
||||||
|
# 使用 awk 只取第一列(哈希值)
|
||||||
|
actual_sha=$(sha256sum "$file" | awk '{print $1}')
|
||||||
|
|
||||||
|
# 校验逻辑
|
||||||
|
if [ -f "$sha_file" ]; then
|
||||||
|
# 从文件中读取预期的 SHA256
|
||||||
|
expected_sha=$(cat "$sha_file" | awk '{print $1}')
|
||||||
|
|
||||||
|
if [ "$actual_sha" == "$expected_sha" ]; then
|
||||||
|
status="✅ OK"
|
||||||
|
else
|
||||||
|
status="❌ Mismatch"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
status="⚠️ No .sha256 file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 输出表格行
|
||||||
|
echo "| $filename | \`$actual_sha\` | $status |"
|
||||||
|
done
|
||||||
Loading…
Add table
Reference in a new issue