概念澄清与适用范围
实现思路
示例脚本与用法
#!/usr/bin/env bash
set -euo pipefail
EXE="build/myapp"
ARCHIVE="dist/myapp-1.2.3.tar.gz"
fail() { echo "FAIL: $*"; exit 1; }
# 1) 可执行文件必须存在
[[ -x "$EXE" ]] || fail "Missing executable: $EXE"
# 2) 版本号断言
version=$(strings "$EXE" | grep -E '^myapp version [0-9]+\.[0-9]+\.[0-9]+$' | head -n1)
[[ -n "$version" ]] || fail "Version string not found in $EXE"
[[ "$version" == "myapp version 1.2.3" ]] || fail "Version mismatch: got '$version'"
# 3) 许可证断言
grep -q "SPDX-License-Identifier: MIT" "$EXE" || fail "MIT license string not found in $EXE"
# 4) 压缩包内文件与字符串断言
[[ -f "$ARCHIVE" ]] || fail "Missing archive: $ARCHIVE"
tar -tzf "$ARCHIVE" | grep -q "myapp" || fail "myapp not found in $ARCHIVE"
strings "$ARCHIVE" | grep -q "Built-by: ci-runner" || fail "Build metadata missing in $ARCHIVE"
echo "All string checks passed."
在 CI 中集成
name: Strings Check
on: [push, pull_request]
jobs:
strings:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install build deps
run: sudo apt-get update && sudo apt-get install -y build-essential
- name: Build
run: |
make # 或你的构建命令,确保生成 build/myapp 与 dist/*.tar.gz
- name: Install strings
run: sudo apt-get install -y binutils # strings 属于 binutils
- name: Run strings checks
run: bash check_strings.sh
进阶用法与注意事项