这个项目能做什么

Last Run Action是一款GitHub Action,它通过将时间戳存储在可复用的仓库级Actions构件中,追踪工作流的上次运行时间,提供了简单的读取、写入或原子性读后写三种操作模式。 ## 使用方式 两步模式(先获取再设置): ```yaml permissions: actions: write jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: benbalter/last-run-action@v1 id: last-run with: mode: get - run: echo "上次运行时间为 ${{ steps.last-run.outputs.last-run }}" - run: echo "(执行相关任务)" - uses: benbalter/last-run-action@v1 with: mode: set ``` 原子性获取并设置: ```yaml permissions: actions: write steps: - uses: actions/checkout@v5 - uses: benbalter/last-run-action@v1 id: last-run with: mode: get-and-set - run: echo "上次运行时间为 ${{ steps.last-run.outputs.last-run }}" ``` ## 输入参数 - `mode`(可选,默认值为`get`):可选值为`get`、`set`、`get-and-set`(别名`getset`、`get_and_set`)。传入未知值时会输出警告,行为等同于只读的`get`模式。 - `fail-if-missing`(可选,默认值为`false`):如果设为`true`且未找到有效历史时间戳,该Action会执行失败。在组合模式下,构件上传流程仍会正常执行。 - `key`(可选,默认值为`last-run`):存储时间戳的构件名称。建议为不同工作流或分支设置唯一键名,无效字符会被替换为`-`。 - `retention-days`(可选,默认值为`90`):构件的保留时长,上限为仓库设置的最大值。如果构件过期,下一次运行会被视为首次运行。 - `token`(可选,默认值为`${{ github.token }}`):用于列出/下载构件的令牌,未设置时会回退使用`GITHUB_TOKEN`。 ## 输出参数 - `last-run`:上次运行的ISO 8601格式时间戳,首次运行时无该输出。 - `first-run`:不存在历史时间戳时为`'true'`,否则为`'false'`。 - `current-run`:当前步骤存储的时间戳,适用于set、get-and-set模式或首次运行初始化场景。 ## 首次运行行为 - `mode: get`且`fail-if-missing: false`:输出警告,不返回`last-run`值,将`first-run`设为`'true'`,并自动上传当前时间戳(需要`actions: write`权限)。 - `mode: get-and-set`:无`last-run`输出,`first-run`为`'true'`,上传新的时间戳。 - `fail-if-missing: true`:执行失败,不会初始化时间戳。 后续的set或get-and-set步骤会覆盖初始化生成的时间戳。 ## 工作原理 时间戳存储在名为`last-run`的单文件构件中,对应文件为`last-run.txt`。获取时间戳时会按名称列出所有构件,选择最新的未过期构件,下载到`RUNNER_TEMP`目录。该状态为仓库全局状态,并行运行的工作流可能产生竞态,建议添加并发组避免冲突。 权限要求:读取操作需要`actions: read`权限,写入操作需要`actions: write`权限。 ## 行为汇总 | 模式 | 读取历史值 | 输出`last-run` | 上传新时间戳 | |------|------------|----------------|--------------| | get | 是 | 是(找到有效时间戳时) | 仅首次运行时 | | set | 否 | 否 | 是 | | get-and-set | 是 | 是(返回历史值) | 是(上传新值) | ## 适用场景 - 下载自上次运行以来产生的活动数据。 - 处理自上次运行以来发生的变更。 - 执行周期性任务。 ## 实现说明 - 时间戳校验:必须匹配`YYYY-MM-DDTHH:mm:ss(.fraction)?Z`格式,且可被`Date.parse`正常解析。 - 单调更新:存储的时间戳至少比上一次读取到的时间戳晚1毫秒。 - 组合模式优势:可在单步内完成原子性的读取和更新操作。 ## 为何不直接使用REST API? 直接存储时间戳可以避免过滤运行记录带来的歧义,也不依赖工作流的执行结果或外部过滤逻辑。 ## 自动化依赖更新 使用Renovate保持npm依赖和GitHub Actions为最新版本。