Check for Updates #360
This file contains hidden or 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: 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 }} |