Skip to content

Test Incus Images

Test Incus Images #391

Workflow file for this run

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