Skip to content

Run Tests

Run Tests #424

Workflow file for this run

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 页面获取详细测试结果"