Update runner label matching to strip ":scheme" suffixes (e.g., ":host", ":docker") before comparison. This allows runners with "germany-linux:host" to match jobs with "runs-on: germany-linux" and vice versa.
Previously, exact label match was required, causing runners with scheme-qualified labels to fail matching jobs without schemes.
Adds v2 API endpoints for optimized workflow status queries. Implements /workflows/status to fetch latest run per workflow in single query using MAX(id) grouping. Adds /runs/{id}/failure-log endpoint returning structured failure data with job details, failed steps, log tails (last 200 lines), and workflow YAML content. Reduces client-side API calls and processing overhead.
Refine unhealthy runner behavior to only skip jobs when a healthy AND idle alternative exists. Previously, unhealthy runners would skip jobs if any healthy runner existed, even if busy. Now unhealthy runners take jobs when all alternatives are either unhealthy or busy.
Rename isOnlyMatchingRunner to hasHealthyIdleAlternative to better reflect the actual check being performed.
Also add cleanup for leftover vault clones in Windows build step and ensure HOME directory exists in release job.
System administrators can now view, edit, and delete any runner regardless of context (repo/org/user). Previously, admins were restricted by the same ownership rules as regular users. Also removes redundant deleted_unix filter in GetUnhealthyRunners query.
Adds a new page to view all waiting/blocked jobs for a specific runner label. This helps administrators identify which jobs are queued for particular runner labels and diagnose runner capacity issues.
Adds bandwidth monitoring to runner health checks with critical threshold of 8 Mbps (1 MB/s). Runners below this threshold are blocked from job assignment and trigger automatic bandwidth rechecks. Also refines health check logic: disk/CPU now only block at 95%+ (critical), and latency is informational only. Includes new RunnerBandwidthCheckRequest model to track recheck requests.
When an unhealthy runner is the only one that can handle a job (e.g., the
only macos runner), assign the job anyway instead of leaving it stuck in
waiting state indefinitely.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Go's semantic import versioning requires v2+ modules to include the
major version in the module path. This enables using proper version
tags (v3.x.x) instead of pseudo-versions.
Updated module path: code.gitcaddy.com/server/v3
- Add workflow filter to clear-cancelled, clear-failed, clear-running, clear-old-success
- Add any option to AI Learning runner type filter
- Fix ServerStats int64 types for FileSize template function
- Add CPULoad field with platform-specific implementations
- Fix actions list template with conditional button visibility
- Use Gitea styled modal dialogs for all clear buttons
🤖 Generated with Claude Code
- Prefer faster runners when multiple can handle a job
- Score runners by bandwidth (log scale) minus latency penalty
- Configurable threshold (default 20 points) prevents slow runner starvation
- Slower runners still get jobs when faster ones are busy or unavailable
- New settings: BANDWIDTH_AWARE_ROUTING, BANDWIDTH_SCORE_THRESHOLD
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add CleanupRequestedAt field to runner model
- Add RunnerRequestCleanup handler to set cleanup timestamp
- Add force-cleanup route for POST requests
- Add orange Force Cleanup button next to Check Bandwidth
- Runner will check this timestamp and perform cleanup when set
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add GetCurrentTaskByRunnerID and GetCurrentTasksForRunners functions
- Update RunnersStatusJSON to include current task info for each runner
- Add Current Task column to runner list showing running job duration
- Add wait time display to queue depth (shows oldest waiting job age)
- Queue labels now show: label: N (Xh Ym) for jobs waiting time
- Auto-refreshing every 30 seconds via AJAX polling
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add GetQueueDepthByLabels function to query waiting jobs by labels
- Add QueueDepthJSON endpoint to return queue depth data
- Update runner_list.tmpl to show queue depth with visual indicators
- Show warnings for jobs waiting > 30 minutes (stuck jobs)
- Labels colored by severity: blue (normal), yellow (>5 waiting), red (stuck)
- Add queue_depth locale string
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Clear Running button to delete stuck running workflow runs
- Disk usage now filters by selected workflow
- Clear buttons only appear when corresponding status has runs
- Rename ActionsDiskUsage to DiskUsage (lint fix)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Adds a button to clear successful workflow runs older than a configurable
number of days (1, 3, 5, 7, 14, or 30 days), defaulting to 5 days.
- Add ClearOldSuccess handler in view.go
- Add DeleteSuccessRunsOlderThan service function
- Add GetSuccessRunIDsOlderThan model function
- Add route /clear-old-success
- Add translations for clear_old_success and clear_old_success_confirm
- Update list.tmpl with dropdown selector and button
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add disk usage statistics endpoint (GET /actions/disk-usage)
- Add Clear Cancelled button to delete all cancelled workflow runs
- Add Clear Failed button to delete all failed workflow runs
- Show disk usage breakdown by status on Actions page sidebar
- Repo admins only feature
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Format Go files with gofmt
- Fix perfsprint lint issues in mail_runner_health.go
- Fix editorconfig issues in templates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add unhealthy status display on runners list page (yellow color when online but unhealthy)
- Add is_healthy field to RunnersStatusJSON API response
- Add CPUInfo struct to RunnerCapability for CPU load monitoring
- Add CPU tile to runner edit page showing load percentage and CPU count
- Add real-time JavaScript polling for CPU tile updates
- Add locale string for unhealthy status
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add RunnerHealthCheckSettings with CPU load threshold (MaxCPULoadPercent)
- Add CPUInfo struct to runner capabilities
- Add RunnerCleanupRequest model for tracking cleanup requests
- Add GetPendingCleanupRequest for FetchTask cleanup signaling
- Server FetchTask now sets RequestCleanup flag when cleanup is needed
- Add health monitoring background service with email alerts
- Skip unhealthy runners (low disk, high CPU, high latency) during job assignment
🤖 Generated with Claude Code
- New files: Copyright 2026 MarketAlly
- Modified files: Copyright YYYY The Gitea Authors and MarketAlly
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add BandwidthTestRequestedAt field to ActionRunner model
- Update to actions-proto-go v0.5.7 with RequestBandwidthTest field
- Add RunnerRequestBandwidthTest handler and route
- Update FetchTask to check and return bandwidth test request flag
- Add Check Now button to runner capabilities panel
- Add locale strings for bandwidth test feature
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add runner capability discovery API (v2) for AI tools to query before writing workflows
- Add release archive feature with filter toggle UI
- Add GitHub Actions compatibility layer with action aliasing
- Store runner capabilities JSON from act_runner Declare calls
- Add migrations for release archive and runner capabilities fields
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
#35783 fixes an actions rerun bug. Due to this bug, some runs may be
incorrectly marked as `StatusWaiting` even though all the jobs are in
done status. These runs cannot be run or cancelled. This PR adds a new
doctor command to fix the inconsistent run status.
```
gitea doctor check --run fix-actions-unfinished-run-status --fix
```
Thanks to @ChristopherHX for the test.
Fix#35781, #27472
The PR will not correct the wrong numbers automatically.
There is a cron task `check_repo_stats` which will be run when Gitea
start or midnight. It will correct the numbers.
This PR moves "no online runner" warning to the runs list.
A job's `runs-on` may contain expressions like `runs-on: [self-hosted,
"${{ inputs.chosen-os }}"]` so the value of `runs-on` may be different
in each run. We cannot check it through the workflow file.
<details>
<summary>Screenshots</summary>
Before:
<img width="960" alt="3d2a91746271d8b1f12c8f7d20eba550"
src="https://github.com/user-attachments/assets/7a972c50-db97-49d2-b12b-c1a439732a11"
/>
After:
<img width="960" alt="image"
src="https://github.com/user-attachments/assets/fc076e0e-bd08-4afe-99b9-c0eb0fd2c7e7"
/>
</details>
This PR also splits `prepareWorkflowDispatchTemplate` function into 2
functions:
- `prepareWorkflowTemplate` get and check all of the workflows
- `prepareWorkflowDispatchTemplate` only prepare workflow dispatch
config for `workflow_dispatch` workflows.
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Use a helper method around the jobparser for parsing a single job
structure from an ActionRunJob
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
* repository deletion, delete ephemeral runners with active tasks as
well skips regular cleanup
* user deletion, delete ephemeral runners with active tasks as well
skips regular cleanup
* delete ephemeral runners once status changes to done
* You no longer see used ephemeral runners after the task is done
* if you see one the cron job takes care of it
* fixes a fixture status to upload confirmed
* add another fixture as noise to break tests as soon they are exposed
to api
* v4 delete test added check that artifact is no longer visible in
internal api with status pending delete
* removal of http 404 on empty list: actions/upload-artifact@v4 now
backoff on http 404 of ListArtifacts endpoint
* fixes artifacts with pending delete etc. are able to be found and
downloaded if the storage is not freed
Implements runner apis based on
https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#list-self-hosted-runners-for-an-organization
- Add Post endpoints for registration-token, google/go-github revealed
this as problem
- We should deprecate Get Endpoints, leaving them for compatibility
- Get endpoint of admin has api path /admin/runners/registration-token
that feels wrong, /admin/actions/runners/registration-token seems more
consistent with user/org/repo api
- Get Runner Api
- List Runner Api
- Delete Runner Api
- Tests admin / user / org / repo level endpoints
Related to #33750 (implements point 1 and 2)
Via needs discovered in #32461, this runner api is needed to allow
cleanup of runners that are deallocated without user interaction.
---------
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>