From aac87f09a64a272c6f3d59df47cf4f514649b575 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 09:12:42 -0400 Subject: [PATCH 1/7] Add temporary extension mechanism to `check-nightly-success` If a project goes for an extended period of time without a successful nightly run, they sometimes temporarily increase their maximum days without success. Rather than doing that, provide a temporary extension mechanism that expires on a specific day, so that the max days without success never needs to be updated, and the temporary measure stays temporary, even if the extension date is never removed. This mechanism supersedes all other checks if it passes, meaning if the current date is less than the temporary expiration, GitHub is never checked for successful workflows. --- .../check-nightly-success/check.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/check_nightly_success/check-nightly-success/check.py b/check_nightly_success/check-nightly-success/check.py index 41fd570d..e58c4350 100644 --- a/check_nightly_success/check-nightly-success/check.py +++ b/check_nightly_success/check-nightly-success/check.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2026, NVIDIA CORPORATION. +# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. """Check whether a GHA workflow has run successfully in the last N days.""" @@ -6,7 +6,7 @@ import os import sys from dataclasses import dataclass -from datetime import datetime, timedelta, timezone +from datetime import date, datetime, timedelta, timezone import requests from requests.adapters import HTTPAdapter @@ -155,6 +155,7 @@ def main( request_page_size: int, request_timeout_seconds: float, retry_backoff_seconds: float, + temp_extension_expires: date | None, ) -> int: """Check whether a GHA workflow has run successfully in the last N days. @@ -171,7 +172,12 @@ def main( # Dealing with day-precision date-times makes filtering in the GitHub API simpler, see # https://docs.github.com/en/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates # - oldest_date_to_pull = datetime.now(timezone.utc) - timedelta(days=max_days_without_success) + now = datetime.now(timezone.utc) + if temp_extension_expires is not None and now.date() <= temp_extension_expires: + print(f"There is a temporary extension until the end of {temp_extension_expires}.") + return ExitCode.SUCCESS + + oldest_date_to_pull = now - timedelta(days=max_days_without_success) # get all the matching runs client = GitHubClient( @@ -303,6 +309,13 @@ def main( required=False, help="Number of responses per page of data. Decrease this to reduce memory usage.", ) + parser.add_argument( + "--temp-extension-expires", + type=date.fromisoformat, + default=None, + required=False, + help="Last day after which a temporary extension expires.", + ) args = parser.parse_args() sys.exit( @@ -315,5 +328,6 @@ def main( request_page_size=args.request_page_size, request_timeout_seconds=10, retry_backoff_seconds=0.5, + temp_extension_expires=args.temp_extension_expires, ), ) From 848ebdaffb4c642ea1b83e37bee1fd2f606c76e8 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 09:25:51 -0400 Subject: [PATCH 2/7] Update action --- .../check-nightly-success/action.yaml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/check_nightly_success/check-nightly-success/action.yaml b/check_nightly_success/check-nightly-success/action.yaml index 4c149b7a..784da237 100644 --- a/check_nightly_success/check-nightly-success/action.yaml +++ b/check_nightly_success/check-nightly-success/action.yaml @@ -22,6 +22,11 @@ inputs: description: "The number of consecutive days that may go by without a successful CI run" required: true type: integer + temp-extension-expires: + description: "Last day after which a temporary extension expires." + required: false + default: "" + type: string runs: using: composite @@ -33,7 +38,12 @@ runs: TARGET_BRANCH: ${{ inputs.target-branch }} WORKFLOW_ID: ${{ inputs.workflow-id }} MAX_DAYS_WITHOUT_SUCCESS: ${{ inputs.max-days-without-success }} + TEMP_EXTENSION_EXPIRES: ${{ inputs.temp-extension-expires }} run: | + temp_extension_args=() + if [[ -n "${TEMP_EXTENSION_EXPIRES}" ]]; then + temp_extension_args=(--temp-extension-expires "${TEMP_EXTENSION_EXPIRES}") + fi python -m pip install \ --prefer-binary \ 'requests>=2.32.4' @@ -41,4 +51,5 @@ runs: --repo ${REPO} \ --branch ${TARGET_BRANCH} \ --workflow-id ${WORKFLOW_ID} \ - --max-days-without-success ${MAX_DAYS_WITHOUT_SUCCESS} + --max-days-without-success ${MAX_DAYS_WITHOUT_SUCCESS} \ + "${temp_extension_args[@]}" From 7adaa7738de4ef17d5289fa8b4489a77ab48a528 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 09:31:12 -0400 Subject: [PATCH 3/7] Update dispatch actin --- check_nightly_success/dispatch/action.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/check_nightly_success/dispatch/action.yml b/check_nightly_success/dispatch/action.yml index 852c0c5d..d2f6c48c 100644 --- a/check_nightly_success/dispatch/action.yml +++ b/check_nightly_success/dispatch/action.yml @@ -21,6 +21,11 @@ inputs: required: false default: 7 type: integer + temp-extension-expires: + description: "Last day after which a temporary extension expires." + required: false + default: "" + type: string runs: using: 'composite' @@ -39,3 +44,4 @@ runs: target-branch: ${{ inputs.target-branch }} workflow-id: ${{ inputs.workflow-id }} max-days-without-success: ${{ inputs.max-days-without-success }} + temp-extension-expires: ${{ inputs.temp-extension-expires }} From b5ca56c84c4fcbe63096e8d60a534d2c444abd4f Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 09:34:45 -0400 Subject: [PATCH 4/7] Temp fix --- check_nightly_success/check-nightly-success/action.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/check_nightly_success/check-nightly-success/action.yaml b/check_nightly_success/check-nightly-success/action.yaml index 784da237..8ecd40bf 100644 --- a/check_nightly_success/check-nightly-success/action.yaml +++ b/check_nightly_success/check-nightly-success/action.yaml @@ -39,6 +39,7 @@ runs: WORKFLOW_ID: ${{ inputs.workflow-id }} MAX_DAYS_WITHOUT_SUCCESS: ${{ inputs.max-days-without-success }} TEMP_EXTENSION_EXPIRES: ${{ inputs.temp-extension-expires }} + SHARED_ACTIONS_REF: temp-extension run: | temp_extension_args=() if [[ -n "${TEMP_EXTENSION_EXPIRES}" ]]; then From 4dd9dce76f14002eff4abc3fc0f79fcde6fc2cb4 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 09:35:15 -0400 Subject: [PATCH 5/7] Revert "Temp fix" This reverts commit b5ca56c84c4fcbe63096e8d60a534d2c444abd4f. --- check_nightly_success/check-nightly-success/action.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/check_nightly_success/check-nightly-success/action.yaml b/check_nightly_success/check-nightly-success/action.yaml index 8ecd40bf..784da237 100644 --- a/check_nightly_success/check-nightly-success/action.yaml +++ b/check_nightly_success/check-nightly-success/action.yaml @@ -39,7 +39,6 @@ runs: WORKFLOW_ID: ${{ inputs.workflow-id }} MAX_DAYS_WITHOUT_SUCCESS: ${{ inputs.max-days-without-success }} TEMP_EXTENSION_EXPIRES: ${{ inputs.temp-extension-expires }} - SHARED_ACTIONS_REF: temp-extension run: | temp_extension_args=() if [[ -n "${TEMP_EXTENSION_EXPIRES}" ]]; then From 3f696b4c5198e327257b7b3bd20ab974731f2c6d Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 09:43:43 -0400 Subject: [PATCH 6/7] More diagnostics --- check_nightly_success/check-nightly-success/check.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/check_nightly_success/check-nightly-success/check.py b/check_nightly_success/check-nightly-success/check.py index e58c4350..531152f9 100644 --- a/check_nightly_success/check-nightly-success/check.py +++ b/check_nightly_success/check-nightly-success/check.py @@ -173,9 +173,11 @@ def main( # https://docs.github.com/en/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates # now = datetime.now(timezone.utc) - if temp_extension_expires is not None and now.date() <= temp_extension_expires: - print(f"There is a temporary extension until the end of {temp_extension_expires}.") - return ExitCode.SUCCESS + if temp_extension_expires is not None: + if now.date() <= temp_extension_expires: + print(f"There is a temporary extension until the end of {temp_extension_expires}.") + return ExitCode.SUCCESS + print(f"A temporary extension expired on {temp_extension_expires}.") oldest_date_to_pull = now - timedelta(days=max_days_without_success) From d904543af3c49723bb8efd99204f0e079327a369 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Fri, 23 Oct 2026 10:13:06 -0400 Subject: [PATCH 7/7] Update docs --- check_nightly_success/check-nightly-success/action.yaml | 2 +- check_nightly_success/check-nightly-success/check.py | 2 +- check_nightly_success/dispatch/action.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/check_nightly_success/check-nightly-success/action.yaml b/check_nightly_success/check-nightly-success/action.yaml index 784da237..a0315aff 100644 --- a/check_nightly_success/check-nightly-success/action.yaml +++ b/check_nightly_success/check-nightly-success/action.yaml @@ -23,7 +23,7 @@ inputs: required: true type: integer temp-extension-expires: - description: "Last day after which a temporary extension expires." + description: "Last day after which a temporary extension expires (YYYY-MM-DD)." required: false default: "" type: string diff --git a/check_nightly_success/check-nightly-success/check.py b/check_nightly_success/check-nightly-success/check.py index 531152f9..819e21c5 100644 --- a/check_nightly_success/check-nightly-success/check.py +++ b/check_nightly_success/check-nightly-success/check.py @@ -316,7 +316,7 @@ def main( type=date.fromisoformat, default=None, required=False, - help="Last day after which a temporary extension expires.", + help="Last day after which a temporary extension expires (YYYY-MM-DD).", ) args = parser.parse_args() diff --git a/check_nightly_success/dispatch/action.yml b/check_nightly_success/dispatch/action.yml index d2f6c48c..61d24d05 100644 --- a/check_nightly_success/dispatch/action.yml +++ b/check_nightly_success/dispatch/action.yml @@ -22,7 +22,7 @@ inputs: default: 7 type: integer temp-extension-expires: - description: "Last day after which a temporary extension expires." + description: "Last day after which a temporary extension expires (YYYY-MM-DD)." required: false default: "" type: string