Skip to content

Check for Updates

Check for Updates #360

Workflow file for this run

name: Check for Updates
on:
schedule:
- cron: '0 */12 * * *' # 每12小时检查一次
workflow_dispatch: # 允许手动触发
jobs:
check-and-update:
runs-on: macos-latest
steps:
- name: Checkout with token
uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }} # 使用PAT确保有推送权限
fetch-depth: 0 # 获取完整历史
- name: Install jq
run: |
brew install jq
- name: Check libmaxminddb for updates
id: check
env:
GH_TOKEN: ${{ secrets.PAT }} # 使用PAT进行API请求身份验证
run: |
# 当前使用的版本
CURRENT_VERSION="1.12.1"
# 获取最新版本 - 使用授权请求避免API限制
echo "Fetching latest version from GitHub API..."
API_RESPONSE=$(curl -s -H "Authorization: token $GH_TOKEN" https://api.github.com/repos/maxmind/libmaxminddb/releases/latest)
echo "API Response received"
# 打印完整API响应用于调试(脱敏)
echo "API Response preview (first 100 chars):"
echo "${API_RESPONSE:0:100}..."
# 检查API响应是否为空
if [ -z "$API_RESPONSE" ]; then
echo "Error: Empty API response"
exit 1
fi
# 使用jq解析JSON并检查tag_name是否存在
if echo "$API_RESPONSE" | jq -e .tag_name > /dev/null 2>&1; then
LATEST_VERSION=$(echo "$API_RESPONSE" | jq -r .tag_name)
echo "Successfully parsed API response"
# 确保不是null
if [ "$LATEST_VERSION" = "null" ]; then
echo "Error: API returned null tag_name"
exit 1
fi
else
echo "Error: Could not find tag_name in API response"
echo "Response contains these keys:"
echo "$API_RESPONSE" | jq 'keys'
exit 1
fi
# 移除版本号前的 'v' 如果存在
LATEST_VERSION=${LATEST_VERSION#v}
echo "Latest version from API: $LATEST_VERSION"
echo "Current version: $CURRENT_VERSION"
# 再次验证版本号有效性
if [[ ! "$LATEST_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Error: Invalid version format: $LATEST_VERSION"
exit 1
fi
if [ "$LATEST_VERSION" = "$CURRENT_VERSION" ]; then
echo "No updates available"
echo "update_needed=false" >> $GITHUB_OUTPUT
exit 0
fi
# 设置libmaxminddb版本号
echo "LIBMAXMINDDB_VERSION=$LATEST_VERSION" >> $GITHUB_ENV
echo "update_needed=true" >> $GITHUB_OUTPUT
- name: Calculate next version
if: steps.check.outputs.update_needed == 'true'
id: semver
run: |
# 获取最新的标签
git fetch --tags
# 默认起始版本为 1.1.0
DEFAULT_VERSION="1.1.0"
# 尝试获取最新版本标签
LATEST_TAG=$(git tag -l | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1)
if [ -z "$LATEST_TAG" ]; then
# 如果没有找到符合格式的标签,使用默认版本
NEXT_VERSION="$DEFAULT_VERSION"
echo "No previous version found. Starting with $NEXT_VERSION"
else
# 解析版本号
MAJOR=$(echo $LATEST_TAG | cut -d. -f1)
MINOR=$(echo $LATEST_TAG | cut -d. -f2)
PATCH=$(echo $LATEST_TAG | cut -d. -f3)
# 递增补丁版本号
PATCH=$((PATCH + 1))
NEXT_VERSION="$MAJOR.$MINOR.$PATCH"
echo "Previous version: $LATEST_TAG"
echo "Next version: $NEXT_VERSION"
fi
# 设置版本号环境变量
echo "VERSION=$NEXT_VERSION" >> $GITHUB_ENV
- name: Update source files
if: steps.check.outputs.update_needed == 'true'
env:
GH_TOKEN: ${{ secrets.PAT }} # 添加身份验证令牌
run: |
# 再次验证 LIBMAXMINDDB_VERSION 不为空
if [ -z "$LIBMAXMINDDB_VERSION" ] || [ "$LIBMAXMINDDB_VERSION" = "null" ]; then
echo "Error: Invalid LIBMAXMINDDB_VERSION: $LIBMAXMINDDB_VERSION"
exit 1
fi
echo "Using libmaxminddb version: $LIBMAXMINDDB_VERSION"
# 删除所有旧版本
echo "Cleaning up all previous versions..."
find "Sources/CLibMaxMindDB" -type d -name "libmaxminddb-*" -exec rm -rf {} + 2>/dev/null || true
# 克隆并更新源码 - 使用授权以避免限制
git clone https://x-access-token:${GH_TOKEN}@github.com/maxmind/libmaxminddb.git temp
cd temp
git fetch --tags
# 检查标签是否存在
if git rev-parse --verify "v$LIBMAXMINDDB_VERSION" >/dev/null 2>&1; then
echo "Checking out tag v$LIBMAXMINDDB_VERSION"
git checkout "v$LIBMAXMINDDB_VERSION"
elif git rev-parse --verify "$LIBMAXMINDDB_VERSION" >/dev/null 2>&1; then
echo "Checking out tag $LIBMAXMINDDB_VERSION"
git checkout "$LIBMAXMINDDB_VERSION"
else
echo "Tag not found for version $LIBMAXMINDDB_VERSION"
echo "Available tags:"
git tag | grep -E "v?$LIBMAXMINDDB_VERSION" || echo "No matching tags"
# 尝试使用最新的提交
echo "Trying to use latest commit instead..."
git checkout main || git checkout master
fi
# 复制所有必需文件
mkdir -p "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/include"
mkdir -p "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/src"
# 复制源文件
cp src/maxminddb.c "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/src/"
cp src/data-pool.c "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/src/"
# 复制头文件
cp include/maxminddb.h "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/include/"
# 复制内部头文件
cp src/data-pool.h "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/src/"
cp src/maxminddb-compat-util.h "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/src/"
# 更新配置文件
cat > "../Sources/CLibMaxMindDB/libmaxminddb-$LIBMAXMINDDB_VERSION/include/maxminddb_config.h" << EOF
#ifndef MAXMINDDB_CONFIG_H
#define MAXMINDDB_CONFIG_H
#define PACKAGE_VERSION "$LIBMAXMINDDB_VERSION"
#ifndef _WIN32
#define HAVE_MMAP 1
#endif
#endif
EOF
cd ..
rm -rf temp
# 更新 Package.swift
sed -i '' "s/libmaxminddb-[0-9.][0-9.]*\/src/libmaxminddb-$LIBMAXMINDDB_VERSION\/src/g" Package.swift
sed -i '' "s/libmaxminddb-[0-9.][0-9.]*\/include/libmaxminddb-$LIBMAXMINDDB_VERSION\/include/g" Package.swift
# 更新 module.modulemap
sed -i '' "s/libmaxminddb-[0-9.][0-9.]*\/include/libmaxminddb-$LIBMAXMINDDB_VERSION\/include/g" Sources/CLibMaxMindDB/module.modulemap
- name: Run build script
if: steps.check.outputs.update_needed == 'true'
env:
BUILD_SCRIPT: ${{ secrets.BUILD_SCRIPT }}
run: |
# 创建临时目录
mkdir -p build_output
cd build_output
# 创建并运行构建脚本
echo "$BUILD_SCRIPT" > ./build.sh
chmod +x ./build.sh
./build.sh
# 如果生成了嵌套的 MaxMindDBSwift 目录,将内容复制到正确位置
if [ -d "MaxMindDBSwift" ]; then
echo "Copying files from nested directory to root..."
# 复制文件到仓库根目录
cp -R MaxMindDBSwift/* ../
fi
# 返回根目录并清理
cd ..
rm -rf build_output
# 检查是否有嵌套目录
if [ -d "MaxMindDBSwift" ]; then
echo "Removing nested MaxMindDBSwift directory..."
rm -rf MaxMindDBSwift
fi
# 再次清理所有冗余版本
echo "Final cleanup of redundant versions..."
# 获取当前被使用的版本号
USED_VERSION=$(grep -o 'libmaxminddb-[0-9.]*' Package.swift | head -1 | cut -d'-' -f2)
echo "Current version in use: $USED_VERSION"
# 删除所有不是当前版本的目录
find "Sources/CLibMaxMindDB" -type d -name "libmaxminddb-*" | grep -v "libmaxminddb-$USED_VERSION" | xargs rm -rf
- name: Commit changes
if: steps.check.outputs.update_needed == 'true'
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
# 添加所有更改
git add -A
# 提交更改
git commit -m "Update libmaxminddb to version $LIBMAXMINDDB_VERSION"
# 确保能看到所有错误输出
set -x
# 推送提交
git push
echo "Changes committed and pushed."
- name: Create and push tag
if: steps.check.outputs.update_needed == 'true'
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
# 创建标签(不带v前缀)
git tag "$VERSION"
# 推送标签
git push origin "$VERSION"
echo "Tagged version $VERSION and pushed tag."
- name: Create Release
if: steps.check.outputs.update_needed == 'true'
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ env.VERSION }}
name: Release ${{ env.VERSION }}
body: |
Updated to libmaxminddb version ${{ env.LIBMAXMINDDB_VERSION }}
### Changes
- Updated libmaxminddb source code to version ${{ env.LIBMAXMINDDB_VERSION }}
### Installation
```swift
dependencies: [
.package(url: "https://github.com/SunboyGo/MaxMindDBSwift.git", from: "${{ env.VERSION }}")
]
```
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.PAT }}