프로젝트 소개

Last Run Action은 재사용 가능한 저장소 수준 Actions 아티팩트에 타임스탬프를 저장하여 워크플로우가 마지막으로 실행된 시점을 추적하는 GitHub Action입니다. 값을 읽기, 쓰기 또는 원자적으로 읽고 쓰는 간단한 모드를 제공합니다. ## 사용법 2단계 패턴(get 후 set): ```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 ``` 원자적 get-and-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`): 타임스탬프의 아티팩트 이름입니다. 워크플로우 또는 브랜치별로 고유한 키를 사용하세요. 잘못된 문자는 `-`로 대체됩니다. - `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`로 파싱 가능해야 합니다. - 단조 증가 업데이트: 저장된 타임스탬프는 이전에 읽은 값보다 최소 1ms 이후입니다. - 결합 모드의 장점: 한 단계에서 원자적으로 캡처 및 업데이트합니다. ## REST API를 사용하지 않는 이유 타임스탬프는 필터링된 실행에 대한 모호성을 피하고 워크플로우 결론이나 외부 필터링에 의존하지 않습니다. ## 자동화된 종속성 업데이트 Renovate를 사용하여 npm 종속성과 GitHub Actions를 최신 상태로 유지합니다.