# 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 仓库自动更新工作流



## 📝 项目简介
这个项目是一个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--]* |