update registry test results #16
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 Registry | |
on: | |
push: | |
schedule: | |
- cron: '0 0 */1 * *' | |
workflow_dispatch: | |
jobs: | |
ci: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Test Registries and Update README | |
run: | | |
# 读取 README.md 中的 registry 列表 | |
registries=$(awk '/\| Registry \| Description \| Status \| Speed \| Time \|/,/^$/' README.md | tail -n +3 | sed '/^$/d' | awk -F'|' '{print $2 "|" $3}' | sed 's/^ *//;s/ *$//') | |
# 更新 README.md 的函数 | |
update_readme() { | |
local registry="$1" | |
local description="$2" | |
local status="$3" | |
local speed="$4" | |
local time="$5" | |
sed -i "s#| $registry | $description |.*#| $registry | $description | $status | $speed | $time |#" README.md | |
} | |
# 测试 registry 的函数,包含重试逻辑 | |
test_registry() { | |
local registry="$1" | |
local description="$2" | |
local image="$3" | |
local max_attempts=3 | |
local attempt=1 | |
local output=$(mktemp) | |
while [ $attempt -le $max_attempts ]; do | |
echo "Attempt $attempt of $max_attempts for $registry" | |
if timeout 60s bash -c "time docker pull $registry/$image" > "$output" 2>&1; then | |
status="✅ Good" | |
pull_time=$(grep real "$output" | awk '{print $2}' | sed 's/0m//;s/s//') | |
image_size=$(docker image inspect "$registry/$image" --format='{{.Size}}' | awk '{print $1/1024/1024}') | |
speed=$(echo "scale=2; $image_size / $pull_time" | bc) | |
echo "$registry is good, Speed: ${speed} MB/s, Time: ${pull_time}s" | |
update_readme "$registry" "$description" "$status" "${speed} MB/s" "${pull_time}s" | |
rm "$output" | |
return 0 | |
else | |
echo "$registry failed on attempt $attempt" | |
attempt=$((attempt + 1)) | |
sleep 5 # 等待5秒后重试 | |
fi | |
done | |
status="❌ Failed" | |
update_readme "$registry" "$description" "$status" "-" "-" | |
rm "$output" | |
return 1 | |
} | |
# 测试每个 registry | |
image="library/nginx:alpine" | |
while IFS='|' read -r registry description; do | |
registry=$(echo "$registry" | xargs) # 去除前后空格 | |
description=$(echo "$description" | xargs) # 去除前后空格 | |
echo "Testing $registry" | |
# 清理可能存在的镜像 | |
docker rmi "$registry/$image" > /dev/null 2>&1 || true | |
# 使用子shell隔离每个registry的执行 | |
( | |
test_registry "$registry" "$description" "$image" | |
docker rmi "$registry/$image" > /dev/null 2>&1 || true | |
) || true # 即使子shell失败,也继续执行下一个registry | |
done <<< "$registries" | |
- name: Commit and push if changed | |
run: | | |
git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
git config --global user.name "github-actions[bot]" | |
git add README.md | |
git diff --quiet && git diff --staged --quiet || (git commit -m "update registry test results"; git push) |