Skip to content

CI: set timeout-minutes on every job - #29

Open
ahsanalidotme wants to merge 1 commit into
mainfrom
ci/job-timeouts
Open

ahsanalidotme wants to merge 1 commit into
mainfrom
ci/job-timeouts

Conversation

@ahsanalidotme

@ahsanalidotme ahsanalidotme commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

What

Every job now has a timeout-minutes, so a stuck job is killed and frees its runner instead of running to GitHub's 360-minute default. (A 5-second changes job recently sat in progress on a self-hosted Mac runner for 4 hours.)

How

Added timeout-minutes to each job that had none, picked from the last 30 successful runs per workflow (durations in minutes, started_at to completed_at per job). Rule: about 2-3x the p90, rounded up, with floors of 5 min for tiny jobs, 15 for lint/unit and 30 for builds; release/publish jobs get 60-90. No job names, triggers or runners changed. actionlint is clean on every changed file (apart from existing shellcheck style notes on untouched run: scripts).

Workflow Job Runs measured p50 p90 max New timeout Why
ci.yml changes 8 0.1 0.1 0.1 5 tiny-job floor
ci.yml library 30 0.5 1.4 1.4 15 lint floor
ci.yml example-android 30 5.2 7.9 8.0 30 build floor (~4x p90)
ios.yml changes 8 0.1 0.1 0.1 5 tiny-job floor
ios.yml ios 30 18.1 24.0 28.8 60 ~2.5x p90
release.yml publish 3 0.4 0.5 0.5 60 publish job

Production impact

Breaking public API change No
Behaviour change for integrators No
Min OS / SDK / platform version change No
Permissions or privacy manifest change No
Version and CHANGELOG updated No
Risk Low

Production impact: CI only. Only .github/workflows/*.yml changes; no app, API, SDK or database code is touched. A job that runs longer than its new limit is cancelled, so the numbers leave room over the slowest measured run.

Tests

Tests added or updated for all new and changed code No (CI config only)
Unit tests pass locally No (CI config only; actionlint run locally)
CI green Yes
Example app / e2e run No (CI config only)

Only workflow files change, so there is no code to test. CI on this PR runs the edited workflows.

Preview

None (CI only).

Details (optional)

A job timeout is enforced by the runner process. If the self-hosted runner itself hangs, the job can still look "in progress" until the runner is restarted.

Links

Same change in every linktrail-io repo, one PR each (branch ci/job-timeouts).

A stuck job now fails at its timeout instead of holding a runner for the 360-minute default. Timeouts come from recent successful run durations (about 2-3x the p90, with floors for tiny jobs, lint and builds).
@ahsanalidotme
ahsanalidotme marked this pull request as ready for review October 28, 2026 12:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant