Run Tests #424
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: Test Incus Images | |
on: | |
schedule: | |
- cron: '0 4 2-30/2 * *' | |
workflow_dispatch: | |
jobs: | |
prepare-matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
test-matrix: ${{ steps.set-matrix.outputs.matrix }} | |
steps: | |
- uses: actions/checkout@v4 | |
- id: set-matrix | |
run: | | |
# 下载两个平台的镜像列表 | |
curl -o x86_64_all_images.txt https://raw.githubusercontent.com/oneclickvirt/incus_images/main/x86_64_all_images.txt | |
curl -o arm64_all_images.txt https://raw.githubusercontent.com/oneclickvirt/incus_images/main/arm64_all_images.txt | |
echo "构建测试矩阵..." | |
matrix_json="{\"include\":[" | |
while IFS= read -r image; do | |
if [[ -n "$image" ]]; then | |
matrix_json+="{\"image\":\"$image\",\"arch\":\"amd64\",\"runner\":\"ubuntu-latest\"}," | |
fi | |
done < x86_64_all_images.txt | |
while IFS= read -r image; do | |
if [[ -n "$image" ]]; then | |
matrix_json+="{\"image\":\"$image\",\"arch\":\"arm64\",\"runner\":\"ubuntu-24.04-arm\"}," | |
fi | |
done < arm64_all_images.txt | |
# 去掉最后一个逗号 | |
matrix_json=${matrix_json%,} | |
matrix_json+="]}" | |
echo "matrix=$matrix_json" >> $GITHUB_OUTPUT | |
# 同时用 set-output 兼容部分旧版本 runner | |
echo "::set-output name=matrix::$matrix_json" | |
test-single-image: | |
needs: prepare-matrix | |
strategy: | |
fail-fast: false | |
max-parallel: 12 | |
matrix: ${{ fromJson(needs.prepare-matrix.outputs.test-matrix) }} | |
runs-on: ${{ matrix.runner }} | |
timeout-minutes: 8 | |
# 定义 job 输出,供下游通过 API 拉取时读取 | |
outputs: | |
success: ${{ steps.test.outputs.success }} | |
image: ${{ steps.test.outputs.image }} | |
arch: ${{ steps.test.outputs.arch }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup Fresh Environment | |
run: | | |
echo "设置新环境..." | |
sudo apt update -y | |
sudo sh -c 'export noninteractive=true && curl -L https://raw.githubusercontent.com/oneclickvirt/incus/main/scripts/incus_install.sh -o incus_install.sh && chmod +x incus_install.sh && bash incus_install.sh' | |
- name: Configure Git | |
run: | | |
git config --global user.name "daily-test" | |
git config --global user.email "test@spiritlhl.top" | |
- name: Test Image | |
id: test | |
# 使用 continue-on-error 保证即使当前镜像测试失败,也不会影响整个矩阵执行 | |
continue-on-error: true | |
run: | | |
echo "测试镜像: ${{ matrix.image }}" | |
# 备份 DNS 配置 | |
sudo cp /etc/resolv.conf /etc/resolv.conf.backup | |
if sudo bash test.sh "${{ matrix.image }}"; then | |
echo "测试通过: ${{ matrix.image }}" | |
echo "success=true" >> $GITHUB_OUTPUT | |
echo "image=${{ matrix.image }}" >> $GITHUB_OUTPUT | |
echo "arch=${{ matrix.arch }}" >> $GITHUB_OUTPUT | |
else | |
echo "测试失败: ${{ matrix.image }}" | |
echo "success=false" >> $GITHUB_OUTPUT | |
echo "image=${{ matrix.image }}" >> $GITHUB_OUTPUT | |
echo "arch=${{ matrix.arch }}" >> $GITHUB_OUTPUT | |
exit 1 | |
fi | |
# 还原 DNS 配置 | |
sudo mv /etc/resolv.conf.backup /etc/resolv.conf || true | |
results-updater: | |
needs: test-single-image | |
if: always() | |
runs-on: ubuntu-latest | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
GITHUB_REPOSITORY: ${{ github.repository }} | |
GITHUB_RUN_ID: ${{ github.run_id }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Collect Test Results via GitHub API | |
run: | | |
echo "开始通过 GitHub API 拉取所有作业输出..." | |
# 使用 GitHub API 拉取当前 run 下所有作业信息 | |
curl -s -H "Authorization: Bearer ${GITHUB_TOKEN}" \ | |
"https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/jobs" > jobs.json | |
echo "拉取到的 jobs.json 内容:" | |
cat jobs.json | |
# 初始化结果文件 | |
> x86_64_fixed_images.txt | |
> arm64_fixed_images.txt | |
echo "解析并聚合矩阵作业的输出..." | |
# 过滤出所有作业名称为 "test-single-image" 的记录,并读取每个作业的输出字段 | |
cat jobs.json | jq -c '.jobs[] | select(.name=="test-single-image")' | while read -r job; do | |
# 读取输出字段 success、image、arch | |
SUCCESS=$(echo "$job" | jq -r '.outputs.success') | |
IMAGE=$(echo "$job" | jq -r '.outputs.image') | |
ARCH=$(echo "$job" | jq -r '.outputs.arch') | |
echo "处理作业输出:" | |
echo " 镜像: $IMAGE" | |
echo " 架构: $ARCH" | |
echo " 执行状态: $SUCCESS" | |
if [ "$SUCCESS" = "true" ]; then | |
if [ "$ARCH" = "amd64" ]; then | |
echo "添加成功的 amd64 镜像: $IMAGE" | |
echo "$IMAGE" >> x86_64_fixed_images.txt | |
elif [ "$ARCH" = "arm64" ]; then | |
echo "添加成功的 arm64 镜像: $IMAGE" | |
echo "$IMAGE" >> arm64_fixed_images.txt | |
else | |
echo "警告: 未知架构 $ARCH, 镜像 $IMAGE" | |
fi | |
else | |
echo "跳过失败的作业: $IMAGE (架构: $ARCH)" | |
fi | |
done | |
echo "结果统计完成,进行排序去重..." | |
sort -u x86_64_fixed_images.txt -o x86_64_fixed_images.txt | |
sort -u arm64_fixed_images.txt -o arm64_fixed_images.txt | |
echo "最终结果:" | |
echo "成功的 x86_64 镜像:" | |
cat x86_64_fixed_images.txt | |
echo "成功的 arm64 镜像:" | |
cat arm64_fixed_images.txt | |
cleanup: | |
needs: results-updater | |
if: always() | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check Test Results | |
run: | | |
echo "所有测试完成" | |
echo "查看 Actions 页面获取详细测试结果" |