这个项目能做什么
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为最新版本。
评论
0 人表达喜爱 · 满10人后显示 Deer Point
登录后参与讨论。