Files
clash-rules/.gitea/workflows/update-rules.yml
adminroot 31c07a8e42
Some checks are pending
Auto Update Clash Rules / update-rules (push) Has started running
更新 .gitea/workflows/update-rules.yml
2025-09-11 07:18:22 -07:00

384 lines
14 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Auto Update Clash Rules
on:
workflow_dispatch: # 手动触发
schedule:
- cron: "0 2 * * *" # 每天凌晨2点执行
push:
branches:
- main
paths:
- '.gitea/workflows/**'
jobs:
update-rules:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
# 对于 Gitea可能需要使用不同的 token 配置
token: ${{ secrets.GITEA_TOKEN || github.token }}
fetch-depth: 0 # 获取完整历史,有助于避免一些同步问题
- name: Set environment variables
run: |
echo "RELEASE_NAME=Clash Rules $(date +%Y%m%d-%H%M)" >> $GITHUB_ENV
echo "TAG_NAME=$(date +%Y%m%d%H%M)" >> $GITHUB_ENV
echo "UPDATE_TIME=$(date '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_ENV
# 设置 Gitea 相关环境变量
echo "GITEA_SERVER_URL=${GITHUB_SERVER_URL:-$GITEA_SERVER_URL}" >> $GITHUB_ENV
echo "GITEA_REPOSITORY=${GITHUB_REPOSITORY:-$GITEA_REPOSITORY}" >> $GITHUB_ENV
- name: Create rules directory
run: |
mkdir -p rules
cd rules
- name: Download reject rules
run: |
echo "正在下载广告拦截规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt" -o rules/reject.txt
echo "✅ reject.txt 下载完成"
- name: Download iCloud rules
run: |
echo "正在下载 iCloud 规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt" -o rules/icloud.txt
echo "✅ icloud.txt 下载完成"
- name: Download Apple rules
run: |
echo "正在下载 Apple 规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt" -o rules/apple.txt
echo "✅ apple.txt 下载完成"
- name: Download Google rules
run: |
echo "正在下载 Google 规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt" -o rules/google.txt
echo "✅ google.txt 下载完成"
- name: Download proxy rules
run: |
echo "正在下载代理规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt" -o rules/proxy.txt
echo "✅ proxy.txt 下载完成"
- name: Download direct rules
run: |
echo "正在下载直连规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt" -o rules/direct.txt
echo "✅ direct.txt 下载完成"
- name: Download private rules
run: |
echo "正在下载私有地址规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt" -o rules/private.txt
echo "✅ private.txt 下载完成"
- name: Download GFW rules
run: |
echo "正在下载 GFW 规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt" -o rules/gfw.txt
echo "✅ gfw.txt 下载完成"
- name: Download TLD-not-CN rules
run: |
echo "正在下载非中国顶级域名规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt" -o rules/tld-not-cn.txt
echo "✅ tld-not-cn.txt 下载完成"
- name: Download Telegram CIDR
run: |
echo "正在下载 Telegram IP 段..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt" -o rules/telegramcidr.txt
echo "✅ telegramcidr.txt 下载完成"
- name: Download CN CIDR
run: |
echo "正在下载中国 IP 段..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt" -o rules/cncidr.txt
echo "✅ cncidr.txt 下载完成"
- name: Download LAN CIDR
run: |
echo "正在下载局域网 IP 段..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt" -o rules/lancidr.txt
echo "✅ lancidr.txt 下载完成"
- name: Download applications rules
run: |
echo "正在下载应用程序规则..."
curl -fsSL "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt" -o rules/applications.txt
echo "✅ applications.txt 下载完成"
- name: Generate README
run: |
cat > rules/README.md << 'EOF'
# Clash Rules Mirror
本仓库镜像了 [Loyalsoldier/clash-rules](https://github.com/Loyalsoldier/clash-rules) 的规则文件。
## 📋 规则列表
| 文件名 | 描述 | 类型 |
|--------|------|------|
| reject.txt | 广告拦截规则 | domain |
| icloud.txt | iCloud 服务规则 | domain |
| apple.txt | Apple 服务规则 | domain |
| google.txt | Google 服务规则 | domain |
| proxy.txt | 代理规则 | domain |
| direct.txt | 直连规则 | domain |
| private.txt | 私有地址规则 | domain |
| gfw.txt | GFW 规则 | domain |
| tld-not-cn.txt | 非中国顶级域名 | domain |
| telegramcidr.txt | Telegram IP段 | ipcidr |
| cncidr.txt | 中国大陆 IP段 | ipcidr |
| lancidr.txt | 局域网 IP段 | ipcidr |
| applications.txt | 应用程序规则 | classical |
## 🔗 使用方法
将以下配置添加到你的 Clash 配置文件中:
```yaml
rule-providers:
reject:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
# 其他规则类似配置...
```
## ⏰ 更新时间
最后更新时间: ${{ env.UPDATE_TIME }}
## 📊 统计信息
EOF
# 添加文件统计
echo "| 文件 | 大小 | 行数 |" >> rules/README.md
echo "|------|------|------|" >> rules/README.md
for file in rules/*.txt; do
filename=$(basename "$file")
filesize=$(du -h "$file" | cut -f1)
linecount=$(wc -l < "$file")
echo "| $filename | $filesize | $linecount |" >> rules/README.md
done
- name: Generate usage example
run: |
cat > rules/clash-config-example.yaml << 'EOF'
# Clash 配置示例
# 使用本仓库的规则文件
rule-providers:
reject:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
icloud:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/icloud.txt"
path: ./ruleset/icloud.yaml
interval: 86400
apple:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/apple.txt"
path: ./ruleset/apple.yaml
interval: 86400
google:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/google.txt"
path: ./ruleset/google.yaml
interval: 86400
proxy:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400
direct:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
private:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/private.txt"
path: ./ruleset/private.yaml
interval: 86400
gfw:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400
tld-not-cn:
type: http
behavior: domain
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/tld-not-cn.txt"
path: ./ruleset/tld-not-cn.yaml
interval: 86400
telegramcidr:
type: http
behavior: ipcidr
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/telegramcidr.txt"
path: ./ruleset/telegramcidr.yaml
interval: 86400
cncidr:
type: http
behavior: ipcidr
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
lancidr:
type: http
behavior: ipcidr
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/lancidr.txt"
path: ./ruleset/lancidr.yaml
interval: 86400
applications:
type: http
behavior: classical
url: "https://your-gitea-domain/username/clash-rules/raw/branch/release/applications.txt"
path: ./ruleset/applications.yaml
interval: 86400
rules:
- RULE-SET,applications,DIRECT
- RULE-SET,private,DIRECT
- RULE-SET,reject,REJECT
- RULE-SET,icloud,DIRECT
- RULE-SET,apple,DIRECT
- RULE-SET,google,🚀 代理
- RULE-SET,proxy,🚀 代理
- RULE-SET,gfw,🚀 代理
- RULE-SET,tld-not-cn,🚀 代理
- RULE-SET,telegramcidr,📲 Telegram
- RULE-SET,direct,DIRECT
- RULE-SET,lancidr,DIRECT
- RULE-SET,cncidr,DIRECT
- GEOIP,LAN,DIRECT
- GEOIP,CN,DIRECT
- MATCH,🚀 代理
EOF
- name: Check for changes
id: check_changes
run: |
git add rules/
if git diff --staged --quiet; then
echo "changes=false" >> $GITHUB_OUTPUT
echo "📄 没有检测到规则文件变化"
else
echo "changes=true" >> $GITHUB_OUTPUT
echo "🔄 检测到规则文件有更新"
fi
- name: Commit and push changes
if: steps.check_changes.outputs.changes == 'true'
run: |
git config --local user.email "action@gitea.local"
git config --local user.name "Gitea Actions Bot"
git commit -m "🤖 自动更新 Clash 规则文件 - ${{ env.UPDATE_TIME }}"
git push origin main
- name: Create release branch
if: steps.check_changes.outputs.changes == 'true'
run: |
# 创建或更新 release 分支
git checkout -B release
git push -f origin release
- name: Create release (Gitea API)
if: steps.check_changes.outputs.changes == 'true'
run: |
# 生成更新日志
cat > release_notes.md << 'EOF'
## 📋 本次更新内容
🤖 自动同步最新的 Clash 规则文件
### 📊 文件统计
EOF
echo "| 文件名 | 大小 | 行数 |" >> release_notes.md
echo "|--------|------|------|" >> release_notes.md
for file in rules/*.txt; do
filename=$(basename "$file")
filesize=$(du -h "$file" | cut -f1)
linecount=$(wc -l < "$file")
echo "| $filename | $filesize | $linecount |" >> release_notes.md
done
echo "" >> release_notes.md
echo "### 🔗 使用方法" >> release_notes.md
echo "参考仓库中的 \`clash-config-example.yaml\` 文件配置你的 Clash 客户端。" >> release_notes.md
echo "" >> release_notes.md
echo "### ⏰ 更新时间" >> release_notes.md
echo "${{ env.UPDATE_TIME }}" >> release_notes.md
# 准备 API 请求数据
RELEASE_BODY=$(cat release_notes.md | jq -sR .)
# 使用 Gitea API 创建 Release
RESPONSE=$(curl -s -w "%{http_code}" -X POST \
-H "Authorization: token ${{ secrets.GITEA_TOKEN || secrets.WORKFLOW_TOKEN }}" \
-H "Content-Type: application/json" \
-d "{
\"tag_name\": \"${{ env.TAG_NAME }}\",
\"target_commitish\": \"release\",
\"name\": \"${{ env.RELEASE_NAME }}\",
\"body\": $RELEASE_BODY,
\"draft\": false,
\"prerelease\": false
}" \
"${{ env.GITEA_SERVER_URL }}/api/v1/repos/${{ env.GITEA_REPOSITORY }}/releases")
HTTP_CODE="${RESPONSE: -3}"
if [[ "$HTTP_CODE" -ge 200 && "$HTTP_CODE" -lt 300 ]]; then
echo "✅ Release 创建成功"
else
echo "⚠️ Release 创建可能失败 (HTTP $HTTP_CODE),但文件已成功更新"
echo "响应: ${RESPONSE%???}"
fi
- name: Summary
if: steps.check_changes.outputs.changes == 'true'
run: |
echo "✅ Clash 规则文件更新完成!"
echo "🔗 访问地址: ${{ env.GITEA_SERVER_URL }}/${{ env.GITEA_REPOSITORY }}"
echo "📁 文件位置: rules/ 目录"
echo "🏷️ 发布标签: ${{ env.TAG_NAME }}"
- name: No changes
if: steps.check_changes.outputs.changes == 'false'
run: |
echo "📄 规则文件没有变化,跳过发布步骤"