From a3e0414f748215594e8605810f1c7d82cf781683 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Wed, 8 Apr 2026 10:57:36 -0700 Subject: [PATCH 1/2] Add re-run limit to actions limits doc (#60666) --- .../manage-workflow-runs/re-run-workflows-and-jobs.md | 9 +++------ content/actions/reference/limits.md | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/content/actions/how-tos/manage-workflow-runs/re-run-workflows-and-jobs.md b/content/actions/how-tos/manage-workflow-runs/re-run-workflows-and-jobs.md index 5eb927d7acff..c3ac08f3936b 100644 --- a/content/actions/how-tos/manage-workflow-runs/re-run-workflows-and-jobs.md +++ b/content/actions/how-tos/manage-workflow-runs/re-run-workflows-and-jobs.md @@ -17,12 +17,9 @@ category: contentType: how-tos --- -> [!NOTE] -> Re-run workflows use the privileges of the actor who initially triggered the workflow, not the privileges of the actor who initiated the re-run. The workflow will also use the same `GITHUB_SHA` (commit SHA) and `GITHUB_REF` (git ref) of the original event that triggered the workflow run. -{% ifversion fpt or ghec %} -> -> A workflow run can be re-run a maximum of 50 times. Re-running only a single job or failed jobs counts towards this limit. -{% endif %} +Re-runs use the privileges of the actor who initially triggered the workflow, not the privileges of the actor who initiated the re-run. The workflow will also use the same `GITHUB_SHA` (commit SHA) and `GITHUB_REF` (git ref) of the original event that triggered the workflow run. + +A workflow run can be re-run a maximum of 50 times. This limit includes both full re-runs and re-runs of a subset of jobs. ## Re-running all the jobs in a workflow diff --git a/content/actions/reference/limits.md b/content/actions/reference/limits.md index 284a39f46a5b..5094f653b179 100644 --- a/content/actions/reference/limits.md +++ b/content/actions/reference/limits.md @@ -28,9 +28,10 @@ These limits are subject to change. | :---- | :---- | :---- | :---- | :---- | | Workflow execution limit | Workflow run time | 35 days / workflow run | If a workflow run reaches this limit, the workflow run is cancelled. This period includes execution duration, and time spent on waiting and approval. | {% octicon "x" aria-label="No" %} | | Workflow execution limit | Gate approval time | 30 days | A workflow may wait for up to [30 days on environment approvals](/actions/managing-workflow-runs-and-deployments/managing-deployments/managing-environments-for-deployment#wait-timer). | {% octicon "x" aria-label="No" %} | +| Workflow execution limit | Job Matrix | 256 jobs / workflow run | A job matrix can generate a maximum of 256 jobs per workflow run. This limit applies to both {% data variables.product.github %}-hosted and self-hosted runners. | {% octicon "x" aria-label="No" %} | +| Workflow execution limit | Re-run | 50 re-runs | A workflow run can be re-run a maximum of 50 times. This limit includes both full re-runs and re-runs of a subset of jobs. | {% octicon "check" aria-label="Yes" %} Support ticket | | Workflows queuing | Workflow trigger event rate limit | 1500 events / 10 seconds / repository | Each repository is limited to events triggering a workflow run. | {% octicon "check" aria-label="Yes" %} Support ticket | | Workflows queuing | Workflow run queued | 500 workflow runs / 10 seconds | When the limit is reached, the workflow runs that were supposed to be triggered by the webhook events will be blocked and will not be queued. Reusable workflows are viewed as a single entity. For example, a run with 30 reusable workflows counts as 1 in this instance. | {% octicon "x" aria-label="No" %} | -| Workflow execution | Job Matrix | 256 jobs / workflow run | A job matrix can generate a maximum of jobs per workflow run. This limit applies to both {% data variables.product.github %}-hosted and self-hosted runners. | {% octicon "x" aria-label="No" %} | | Self-hosted | Runner registrations | 1500 runners / 5 minutes / repository/org/enterprise | Runners can be registered per repository/organization/enterprise. | {% octicon "check" aria-label="Yes" %} Support ticket | | Self-hosted | Runners per runner group | 10,000 runners | Runners registered at the same time per runner group. | {% octicon "x" aria-label="No" %} | | Self-hosted | Job execution time | 5 days | Each job in a workflow can run for up to 5 days of execution time. If a job reaches this limit, the job is terminated and fails. | {% octicon "x" aria-label="No" %} | From adba95d0bb60359c8de891921b4ba963423a1290 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Wed, 8 Apr 2026 12:44:51 -0700 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=9A=A2=20Add=20per-step=20info=20logg?= =?UTF-8?q?ing=20to=20warm-server=20for=20deployment=20debugging=20(#60678?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/frame/lib/warm-server.ts | 44 ++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/frame/lib/warm-server.ts b/src/frame/lib/warm-server.ts index dccaf093576a..bfe654d0bad8 100644 --- a/src/frame/lib/warm-server.ts +++ b/src/frame/lib/warm-server.ts @@ -31,19 +31,55 @@ let promisedWarmServer: Promise | undefined async function warmServer(languagesOnly: string[] = []): Promise { const startTime = Date.now() - logger.debug( - `Priming context information...${languagesOnly && languagesOnly.length ? ` ${languagesOnly.join(',')} only` : ''}`, - ) + const langSuffix = + languagesOnly && languagesOnly.length ? ` (${languagesOnly.join(',')})` : ' (all languages)' + logger.info(`warm-server: starting${langSuffix}`) + + let stepStart = Date.now() const unversionedTree = await dog.loadUnversionedTree(languagesOnly) + logger.info('warm-server: loadUnversionedTree complete', { + durationMs: Date.now() - stepStart, + heapUsedMb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), + }) + + stepStart = Date.now() const siteTree = await dog.loadSiteTree(unversionedTree, languagesOnly) + logger.info('warm-server: loadSiteTree complete', { + durationMs: Date.now() - stepStart, + heapUsedMb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), + }) + + stepStart = Date.now() const pageList = await dog.loadPages(unversionedTree, languagesOnly) + logger.info('warm-server: loadPages complete', { + durationMs: Date.now() - stepStart, + pageCount: pageList.length, + heapUsedMb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), + }) + + stepStart = Date.now() const pageMap = await dog.loadPageMap(pageList) + logger.info('warm-server: loadPageMap complete', { + durationMs: Date.now() - stepStart, + permalinkCount: Object.keys(pageMap).length, + heapUsedMb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), + }) + + stepStart = Date.now() const redirects = await dog.loadRedirects(pageList) + logger.info('warm-server: loadRedirects complete', { + durationMs: Date.now() - stepStart, + redirectCount: Object.keys(redirects).length, + heapUsedMb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), + }) statsd.gauge('memory_heap_used', process.memoryUsage().heapUsed, ['event:warm-server']) - logger.debug(`Context primed in ${Date.now() - startTime} ms`) + logger.info('warm-server: complete', { + totalDurationMs: Date.now() - startTime, + heapUsedMb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), + }) return { pages: pageMap,