# ScriptHookVSync **Repository Path**: j-o-k-e-r/script-hook-vsync ## Basic Information - **Project Name**: ScriptHookVSync - **Description**: 该项目是一个基于GitLab CI/CD的工作流,旨在自动监控并将Script Hook V的最新版本更新至Gitee仓库。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-27 - **Last Updated**: 2025-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Script Hook V Gitee 仓库自动更新工作流 ![Last Updated](https://img.shields.io/badge/最后更新-2025--05--30-blue) ![GTA V](https://img.shields.io/badge/游戏-GTA%20V-green) ![Script Hook V](https://img.shields.io/badge/工具-Script%20Hook%20V-orange) ## 📝 项目简介 这个项目是一个GitLab CI/CD工作流,用于自动监控并更新Script Hook V的最新版本到Gitee仓库。Script Hook V是一个允许开发者在GTA V中使用脚本本地函数的库。 此工作流会定期检查官方网站的更新,当发现新版本时,自动下载并推送到Gitee仓库,保持仓库内容始终为最新版本。 ## ✨ 特性 - 🔄 自动监控Script Hook V官方网站的更新 - 📦 自动下载最新版本文件 - 📊 版本比较与管理 - 🚀 自动提交到Gitee仓库 - 🛡️ 错误重试与异常处理机制 - 📈 详细的执行日志 ## 🔧 工作原理 1. 使用Alpine Linux容器作为运行环境 2. 抓取Script Hook V官方网站的HTML内容 3. 解析HTML提取最新版本信息和下载链接 4. 克隆Gitee仓库检查当前版本 5. 比较版本,如有更新则下载新版本 6. 更新版本文件并提交到Gitee仓库 ## 📋 前置要求 - GitLab账号和Runner - Gitee仓库和访问令牌 - 配置GitLab CI/CD环境变量: `GITEE_ACCESS_TOKEN` ## 🚀 使用方法 ### 1. 配置Gitee访问令牌 1. 登录Gitee账号 2. 访问设置 -> 私人令牌 3. 生成新的私人令牌(需要仓库权限) 4. 复制生成的令牌 ### 2. 设置GitLab CI/CD变量 1. 进入GitLab项目 -> 设置 -> CI/CD 2. 展开变量部分 3. 添加变量: - 名称: `GITEE_ACCESS_TOKEN` - 值: 你的Gitee访问令牌 - 选项: 勾选"受保护"和"已屏蔽" ### 3. 配置GitLab CI配置文件 在项目根目录创建`.gitlab-ci.yml`文件,使用以下配置: ```yaml stages: - update_gitee_repo update_gitee_repo_job: stage: update_gitee_repo image: alpine:latest variables: GIT_DEPTH: "1" # 添加超时设置 TIMEOUT: "15m" script: - | #!/bin/sh set -e # 使用 set -e 保留错误检测 echo "--- 安装依赖 ---" apk add --quiet --no-cache git curl grep sed wget echo "--- 1. 抓取目标网站 HTML ---" TARGET_URL="http://www.dev-c.com/GTAV/scripthookv" # 添加重试逻辑和超时设置 MAX_RETRIES=3 RETRY_COUNT=0 while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do if HTML_CONTENT=$(curl -s --max-time 30 "$TARGET_URL"); then break fi RETRY_COUNT=$((RETRY_COUNT+1)) echo "重试抓取网页内容 ($RETRY_COUNT/$MAX_RETRIES)..." sleep 2 done if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then echo "错误:无法抓取网页内容,已达到最大重试次数。" exit 1 fi echo "HTML 内容已抓取。" echo "--- 2. 解析 HTML 提取最新信息 ---" # 使用临时文件来避免过长的管道操作 echo "$HTML_CONTENT" > temp_html.txt DOWNLOAD_URL=$(grep -oE 'https://[^"]+ScriptHookV_[^"]+\.zip' temp_html.txt | head -n1) RELEASE_DATE=$(grep -A1 'Released' temp_html.txt | grep -oE '[^<]+' | sed 's/\(.*\)<\/td>/\1/') LATEST_VERSION=$(grep -A1 'Version' temp_html.txt | grep -oE '[^<]+' | sed 's/\(.*\)<\/td>/\1/') rm temp_html.txt if [ -z "$RELEASE_DATE" ] || [ -z "$LATEST_VERSION" ] || [ -z "$DOWNLOAD_URL" ]; then echo "错误:未能从 HTML 中解析出所有必要信息。" echo " 解析到的 RELEASE_DATE: '${RELEASE_DATE}'" echo " 解析到的 LATEST_VERSION: '${LATEST_VERSION}'" echo " 解析到的 DOWNLOAD_URL: '${DOWNLOAD_URL}'" exit 1 fi echo "解析结果:" echo " 最新发布日期: $RELEASE_DATE" echo " 最新版本: $LATEST_VERSION" echo " 下载链接: $DOWNLOAD_URL" echo "--- 3. 克隆 Gitee 仓库以检查现有版本 ---" git config --global user.name "你的用户名" git config --global user.email "你的邮箱" GITEE_REPO_URL="https://oauth2:${GITEE_ACCESS_TOKEN}@gitee.com/你的用户名/你的仓库名.git" git clone --quiet "$GITEE_REPO_URL" gitee_repo cd gitee_repo CURRENT_VERSION="" FILENAME="ScriptHookV_latest.zip" VERSION_FILE="version.txt" if [ -f "$VERSION_FILE" ]; then CURRENT_VERSION=$(cat "$VERSION_FILE" | tr -d '[:space:]') echo "从 ${VERSION_FILE} 中读取到的当前版本: '${CURRENT_VERSION}'" else echo "未找到 ${VERSION_FILE} 文件,将创建新文件。" fi LATEST_VERSION_CLEAN=$(echo "$LATEST_VERSION" | tr -d '[:space:]') CURRENT_VERSION_CLEAN=$(echo "$CURRENT_VERSION" | tr -d '[:space:]') if [ "$LATEST_VERSION_CLEAN" = "$CURRENT_VERSION_CLEAN" ]; then echo "✅ 当前版本 ($LATEST_VERSION_CLEAN) 已经是最新版本,无需更新。" exit 0 else echo "检测到新版本或文件不存在,准备下载和更新。" fi echo "--- 4. 下载文件 ---" wget --tries=3 --timeout=30 --show-progress "$DOWNLOAD_URL" -O "../$FILENAME" if [ ! -f "../$FILENAME" ]; then echo "错误:文件下载失败!" exit 1 fi if [ -f "$FILENAME" ]; then rm -f "$FILENAME" fi mv "../$FILENAME" . echo "--- 5. 更新版本文件 ---" echo "$LATEST_VERSION_CLEAN" > "$VERSION_FILE" echo "--- 6. 提交更改并推送到 Gitee ---" git add "$FILENAME" "$VERSION_FILE" git commit -m "Automated update: ${FILENAME} - Version ${LATEST_VERSION_CLEAN} (Released: ${RELEASE_DATE})" || true MAX_PUSH_RETRIES=3 PUSH_RETRY_COUNT=0 while [ $PUSH_RETRY_COUNT -lt $MAX_PUSH_RETRIES ]; do if git push origin HEAD; then echo "✅ 文件及 ${VERSION_FILE} 已成功推送到 Gitee 仓库!" break fi PUSH_RETRY_COUNT=$((PUSH_RETRY_COUNT+1)) echo "重试推送 ($PUSH_RETRY_COUNT/$MAX_PUSH_RETRIES)..." sleep 2 done timeout: 15m retry: max: 2 when: - runner_system_failure - unknown_failure rules: - when: always ``` ### 4. 自定义配置 根据你的需求修改以下部分: - `git config --global user.name "你的用户名"` - `git config --global user.email "你的邮箱"` - `GITEE_REPO_URL="https://oauth2:${GITEE_ACCESS_TOKEN}@gitee.com/你的用户名/你的仓库名.git"` ## 📅 定时执行 如果你想定期检查更新,可以配置GitLab CI调度: 1. 进入GitLab项目 -> CI/CD -> 调度 2. 点击"新建调度" 3. 设置描述和间隔 (例如: `0 0 * * *` 表示每天午夜执行) 4. 保存调度 ## 📊 版本记录 版本信息将存储在仓库的`version.txt`文件中,每次更新后自动更新此文件。 ## 📝 日志 工作流执行日志可以在GitLab CI/CD界面中查看。成功执行的日志会显示抓取、解析、下载和提交的详细信息。 ## 🔧 问题排查 常见问题及解决方法: 1. **SIGPIPE错误 (错误代码141)** - 原因: 管道链过长或被中断 - 解决: 已通过使用临时文件代替长管道链优化解决 2. **下载失败** - 原因: 网络问题或目标服务器限制 - 解决: 添加了重试逻辑和超时设置 3. **Gitee推送失败** - 原因: 凭证问题或网络连接 - 解决: 检查GITEE_ACCESS_TOKEN是否正确,添加了推送重试逻辑 ## 👨‍💻 贡献 欢迎通过Issue或Pull Request贡献代码和改进建议! ## 📄 许可证 该项目使用MIT许可证 - 详情请查看[LICENSE](LICENSE)文件 ## 🙏 致谢 - [Alexander Blade](http://www.dev-c.com/) - Script Hook V的开发者 - GitLab - 提供CI/CD平台 - Gitee - 提供代码托管服务 --- *最后更新于: 2025-05-30 by [--sora--]*