Об этом проекте
Last Run Action — это GitHub Action, которая отслеживает, когда workflow выполнялся в последний раз, сохраняя метку времени в переиспользуемом артефакте 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 "Previous run was at ${{ steps.last-run.outputs.last-run }}"
- run: echo "(do stuff)"
- 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 "Previous run was at ${{ steps.last-run.outputs.last-run }}"
```
## Входные параметры
- `mode` (необязательный, по умолчанию `get`): одно из `get`, `set`, `get-and-set` (псевдонимы `getset`, `get_and_set`). Неизвестные значения выводят предупреждение и ведут себя как режим только для чтения `get`.
- `fail-if-missing` (необязательный, по умолчанию `false`): если `true` и допустимая предыдущая метка времени не найдена, действие завершается ошибкой. В комбинированных режимах загрузка всё равно выполняется.
- `key` (необязательный, по умолчанию `last-run`): имя артефакта для метки времени. Используйте уникальные ключи для каждого workflow или ветки. Недопустимые символы заменяются на `-`.
- `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`. Состояние на уровне всего репозитория; перекрывающиеся запуски могут конкурировать, поэтому добавьте группу concurrency.
Разрешения: для чтения требуется `actions: read`; для записи требуется `actions: write`.
## Сводка поведения
| Режим | Читает предыдущее | Выводит `last-run` | Загружает новую метку времени |
|------|----------------|---------------------|-----------------------|
| get | Да | Да (если найдено и допустимо) | Только при первом запуске |
| set | Нет | Нет | Да |
| get-and-set | Да | Да (предыдущее) | Да (новое) |
## Сценарии использования
- Скачивание активности с момента последнего запуска.
- Реагирование на изменения с момента последнего запуска.
- Выполнение периодических задач.
## Замечания по реализации
- Проверка метки времени: должна соответствовать `YYYY-MM-DDTHH:mm:ss(.fraction)?Z` и быть разбираемой с помощью `Date.parse`.
- Монотонные обновления: сохранённая метка времени как минимум на 1 мс позже предыдущей прочитанной.
- Преимущества комбинированного режима: атомарный захват и обновление за один шаг.
## Почему не REST API?
Метки времени позволяют избежать неоднозначности, связанной с отфильтрованными запусками, и не зависят от результатов workflow или внешней фильтрации.
## Автоматические обновления зависимостей
Использует Renovate для поддержания актуальности зависимостей npm и GitHub Actions.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.