diff --git a/.gitea/workflows/sync.yml b/.gitea/workflows/sync.yml deleted file mode 100755 index d430a57..0000000 --- a/.gitea/workflows/sync.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Sync public Google Sheet - -on: - schedule: - # 03:00 Asia/Shanghai is 19:00 UTC on the previous day. - - cron: "0 19 * * *" - workflow_dispatch: - -permissions: - contents: write - -jobs: - sync: - runs-on: ubuntu-latest - env: - SOURCE_WORKBOOK_ID: 1DPbdVsX3SG_kgDXs2j34mDAgplRSfcAWKKG9yqalFmw - TARGET_REPOSITORY: ttshop - TARGET_BRANCH: main - PUBLISH_PATH: data/merged.html - GITEA_BASE_URL: ${{ vars.GITEA_BASE_URL }} - GITEA_OWNER: ${{ vars.GITEA_OWNER }} - GIT_CREDENTIAL_SECRET: ${{ secrets.GIT_CREDENTIAL_SECRET }} - SYNC_FAILURE_WEBHOOK_URL: ${{ secrets.SYNC_FAILURE_WEBHOOK_URL }} - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - ref: main - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - - name: Install requests - run: python -m pip install --disable-pip-version-check -r requirements.txt - - - name: Synchronize workbook - run: python sync.py diff --git a/.gitignore b/.gitignore index 493d510..8227250 100755 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,20 @@ .env .env.* !.env.example +*.key +*.pem +*.secret +*.token +.git-credentials +credentials/ +secrets/ + +# Temporary files and local metadata +*.swp +*.swo +*.tmp +*.temp +.DS_Store # Python caches __pycache__/ diff --git a/REAMME.md b/REAMME.md index 25fe22b..6448f0d 100755 --- a/REAMME.md +++ b/REAMME.md @@ -1,14 +1,22 @@ # TTSHOP 同步脚本 -`sync.py` 使用 Python 标准库和 `requests` 读取公开 Google Sheets 工作簿,并把所有工作表合并成一个 UTF-8 HTML 表格,固定写入 `data/merged.html`。工作表名称和顺序来自 XLSX 导出,单元格使用公开 gviz 接口返回的显示值。 +TTSHOP 的代码仓库地址为 `git.ops.roasbloom.site`,报告目录地址为 `ops.roasbloom.site/<仓库名>/`;本仓库对应的报告目录为 `ops.roasbloom.site/ttshop/`。 + +`sync.py` 使用 Python 标准库和 `requests` 读取公开 Google Sheets 工作簿,并把所有工作表合并成一个 UTF-8 HTML 表格,固定写入 `data/merged.html`。生成的 `data/merged.html` 供 Google Sheets 的 `IMPORTHTML` 使用,不改成 `index.html` 或 `data.json`。工作表名称和顺序来自 XLSX 导出,单元格使用公开 gviz 接口返回的显示值。 合并规则:每张表第一行是标题;列按首次出现顺序取并集;源表已有的 `LinkName` 会改名为 `LinkName_Source`、`LinkName_Source_2` 等并保留;脚本最后追加生成的 `LinkName` 列。HTML 文本会进行转义。内容没有变化时不产生 Git 提交,变化时只提交 `data/merged.html` 并推送到 `main`。 +## AgentStage 自动更新 + +AgentStage 服务器会自动执行仓库根目录的 `update.sh`,不使用 Gitea Actions workflow。`update.sh` 会进入脚本所在目录并使用 `python3` 执行 `sync.py`;脚本失败时会以非零状态退出。 + +`schedule.conf` 是一个表示间隔小时数的数字:默认值为 `1`(每小时一次),本仓库设置为 `24`,表示每天刷新一次。服务器执行更新后,报告可从 `ops.roasbloom.site/<仓库名>/` 访问。 + ## 本地运行 ```sh -python -m pip install -r requirements.txt -python sync.py +python3 -m pip install -r requirements.txt +./update.sh ``` 脚本默认使用固定工作簿 ID `1DPbdVsX3SG_kgDXs2j34mDAgplRSfcAWKKG9yqalFmw`、仓库 `ttshop`、分支 `main` 和输出路径 `data/merged.html`。本地运行需要当前目录是该仓库,并且 Git 已配置可推送的 `origin`;不要把凭据写入 remote URL。 @@ -16,10 +24,7 @@ python sync.py ## 环境变量 - `GIT_CREDENTIAL_SECRET`:可选的 Git 密码/token。脚本通过临时 `GIT_ASKPASS` 使用,不写入 URL、日志或提交文件。 -- `GITEA_OWNER`:Git askpass 的用户名提示值;workflow 从仓库变量注入。 -- `GITEA_BASE_URL`:Gitea 地址,作为 workflow 配置保留;实际推送使用 checkout 提供的 `origin`。 +- `GITEA_OWNER`:Git askpass 的用户名提示值。 - `SYNC_FAILURE_WEBHOOK_URL`:可选的失败通知 URL。失败时最多发送一次简短通知,通知失败不会覆盖原始异常。 -## Gitea Actions - -`.gitea/workflows/sync.yml` 每天执行一次 `0 19 * * *`(按 UTC 解释时为 Asia/Shanghai 次日 03:00),也支持手动触发。workflow 只安装 `requirements.txt` 中的 `requests` 并运行 `python sync.py`,不依赖包 CLI、测试 extras、runner、scheduler 或报告系统。 +AgentStage 运行不需要 Gitea Actions、Google OAuth 或 Google 服务账号。请勿把 token、密码或其他密钥写入脚本、仓库 URL、提交文件或日志;本地密钥和临时文件应被 `.gitignore` 规则忽略,避免进入提交。 diff --git a/schedule.conf b/schedule.conf new file mode 100755 index 0000000..a45fd52 --- /dev/null +++ b/schedule.conf @@ -0,0 +1 @@ +24 diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..049cd9e --- /dev/null +++ b/update.sh @@ -0,0 +1,6 @@ +#!/bin/sh +set -eu + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +cd "$SCRIPT_DIR" +exec python3 sync.py