Об этом проекте

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.