Test Incus Images #391
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Image Validation Pipeline | |
on: | |
schedule: | |
- cron: '0 0 * * *' | |
workflow_dispatch: | |
jobs: | |
generate_matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
matrix: ${{ steps.generate.outputs.matrix }} | |
steps: | |
- name: Fetch Image Lists | |
run: | | |
# 下载并合并不同架构的镜像列表 | |
declare -A unique_images | |
for arch in x86_64 arm64; do | |
url="https://raw.githubusercontent.com/oneclickvirt/incus_images/main/${arch}_all_images.txt" | |
echo "正在下载 $arch 架构镜像列表..." | |
if ! curl -sL "$url" -o "${arch}.txt"; then | |
echo "::error::无法下载 $arch 镜像列表" | |
exit 1 | |
fi | |
# 读取并过滤有效镜像 | |
while IFS= read -r image; do | |
[[ -n "$image" ]] && unique_images["$image"]=1 | |
done < "${arch}.txt" | |
done | |
# 生成 JSON 数组文件 | |
echo "生成矩阵配置文件..." | |
jq -nc '$ARGS.positional' --args "${!unique_images[@]}" > matrix_raw.json | |
# 转换为标准矩阵格式 | |
jq -c 'map({image: .})' matrix_raw.json > matrix.json | |
- name: Validate and Set Matrix | |
id: generate | |
run: | | |
# 验证 JSON 格式 | |
if ! jq -e '. | length > 0' matrix.json; then | |
echo "::error::生成的矩阵内容为空" | |
exit 1 | |
fi | |
# 设置 GitHub Actions 输出 | |
matrix_content=$(< matrix.json) | |
if [[ ${#matrix_content} -gt 65536 ]]; then | |
echo "::error::矩阵内容超过 64KB 限制" | |
exit 1 | |
fi | |
echo "matrix=$matrix_content" >> $GITHUB_OUTPUT | |
validate_images: | |
needs: generate_matrix | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.generate_matrix.outputs.matrix) }} | |
runs-on: ${{ contains(matrix.image, 'x86_64') && 'ubuntu-latest' || 'arm64' }} | |
timeout-minutes: 120 | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
- name: Initialize Incus Environment | |
run: | | |
# 安装必要组件 | |
sudo apt-get update | |
sudo apt-get install -y zfsutils-linux snapd | |
sudo snap install --channel=latest/stable incus | |
# 初始化 Incus | |
sudo incus admin init --auto --storage-backend=dir | |
sudo incus network set incusbr0 ipv6.address=none | |
# 验证环境 | |
echo "当前 Incus 版本:" | |
incus --version | |
- name: Execute Validation Test | |
run: | | |
# 生成安全文件名 | |
safe_name=$(echo "${{ matrix.image }}" | sed 's/[^a-zA-Z0-9]/_/g') | |
result_file="${safe_name}_validation.txt" | |
# 执行测试脚本 | |
if sudo ./test.sh "${{ matrix.image }}"; then | |
echo "${{ matrix.image }}" > "$result_file" | |
echo "✅ 验证成功:${{ matrix.image }}" | |
else | |
echo "❌ 验证失败:${{ matrix.image }}" | tee "$result_file" | |
exit 1 | |
fi | |
# 超时后自动清理 | |
timeout-minutes: 30 | |
- name: Preserve Test Artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: validation-${{ matrix.image }} | |
path: ${{ matrix.image }}_validation.txt | |
retention-days: 3 | |
aggregate_results: | |
needs: validate_images | |
runs-on: ubuntu-latest | |
steps: | |
- name: Collect Artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: artifacts | |
- name: Generate Consolidated Report | |
run: | | |
# 合并有效镜像列表 | |
find artifacts -name '*validation.txt' -exec cat {} \; | grep -v '❌' | sort -u > valid_images.txt | |
# 按架构分类 | |
mkdir -p results | |
grep 'x86_64' valid_images.txt > results/x86_64_valid.txt || echo "无 x86_64 有效镜像" > results/x86_64_valid.txt | |
grep 'arm64' valid_images.txt > results/arm64_valid.txt || echo "无 arm64 有效镜像" > results/arm64_valid.txt | |
# 生成 Markdown 报告 | |
echo "# 每日镜像验证报告" > REPORT.md | |
echo "生成时间: $(date +'%Y-%m-%d %H:%M:%S %Z')" >> REPORT.md | |
echo "## 有效镜像统计" >> REPORT.md | |
echo "- x86_64 镜像数量: $(wc -l < results/x86_64_valid.txt)" >> REPORT.md | |
echo "- arm64 镜像数量: $(wc -l < results/arm64_valid.txt)" >> REPORT.md | |
echo "## 详细列表" >> REPORT.md | |
echo "### x86_64 有效镜像" >> REPORT.md | |
echo '```' >> REPORT.md | |
cat results/x86_64_valid.txt >> REPORT.md | |
echo '```' >> REPORT.md | |
echo "### arm64 有效镜像" >> REPORT.md | |
echo '```' >> REPORT.md | |
cat results/arm64_valid.txt >> REPORT.md | |
echo '```' >> REPORT.md | |
- name: Upload Validation Results | |
uses: actions/upload-artifact@v4 | |
with: | |
name: validation-results | |
path: | | |
results/* | |
REPORT.md | |
- name: Commit to Repository | |
uses: stefanzweifel/git-auto-commit-action@v4 | |
with: | |
commit_message: "自动更新验证结果 [skip ci]" | |
file_pattern: | | |
results/*_valid.txt | |
REPORT.md | |
branch: main |