Skip to content

fix(ci): stop installing ffmpeg in jobs that never use it - #1360

Merged
murdore merged 1 commit into
releasefrom
fix/ci-drop-ffmpeg
Aug 19, 2026
Merged

murdore merged 1 commit into
releasefrom
fix/ci-drop-ffmpeg

Conversation

@murdore

@murdore murdore commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

release is red right now, and every open PR with it. This removes the cause rather than tuning it again.

What's happening

apt-get update sat for fourteen minutes with no output while azure.archive.ubuntu.com returned Ign: for every index, then hit the step deadline:

04:39:12  Ign:14 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
04:39:12  Ign:17 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages
04:39:12  Get:5  https://archive.ubuntu.com/ubuntu noble-security InRelease [126 kB]
04:53:47  ##[error]The action 'Install ffmpeg' has timed out after 15 minutes

That is the third distinct way this one install has broken CI in a single day:

Failure
1 A corrupt published asset from the downloader we used before
2 The version pin added to work around it stopped resolving
3 A step deadline too tight for a slow mirror — then the mirror itself failing

Each of my last two fixes replaced one failure mode with another, because the dependency itself was the problem.

None of it was ever needed

  • No package script invokes ffmpeg. Checked every entry in scripts.
  • Nothing installs it as a dependency, and no install hook needs it.
  • src/ shells out to ffmpeg only at runtime — frame extraction, video merging, audio playback — never during install, lint, typecheck, build or pack, which is all these jobs do.

The proof was already sitting in the same file: provider-safety-net has never installed ffmpeg, and it runs pnpm run build plus three test suites without trouble.

So five jobs were paying for a tool none of them invoke, on the most failure-prone step in the pipeline, reached over a network that has now failed three different ways. And since build-check became a required check, each of those failures blocks every open PR rather than one job.

Change

Removed from all five: test, build-check, quality-gate, and both release.yml jobs. Net −204 / +30 lines.

A comment in each workflow records why it's absent and what to do if a job ever genuinely needs it — install it in that job alone, and bound every wait.

Verification

  • Both workflows parse as valid YAML; every job and its remaining steps intact (test 10, provider-safety-net 9, build-check 7, proxy-performance 5, quality-gate 12, semantic-release-validation 5; release test 5, release 10).
  • No ffmpeg step remains in any job — only the explanatory comments.
  • This PR's own CI is the test: the same jobs now run without the step.

`release` is red right now, and every open pull request with it, because
`apt-get update` sat for fourteen minutes with no output while
azure.archive.ubuntu.com returned `Ign:` for every index. That is the third
distinct way this one install has broken CI in a single day: first a corrupt
published asset, then a version pin that stopped resolving, then a step
deadline too tight for a slow mirror — and now the mirror itself.

None of it was ever needed. No package script invokes ffmpeg. Nothing
installs it as a dependency. `src/` shells out to it only at runtime — frame
extraction, video merging, audio playback — never during install, lint,
typecheck, build or pack, which is all these jobs do. The proof was already
in the file: provider-safety-net has never installed ffmpeg, and it builds
the package and runs three suites without trouble.

So five jobs were paying for a tool none of them invoke, on the single most
failure-prone step in the pipeline, reached over a network that has now
failed three different ways. Since build-check became a required check, each
of those failures blocked every open pull request rather than one job.

Removed from all five: the three CI jobs and both release jobs. This takes
the last unnecessary network fetch out of the critical path rather than
tuning its timeouts again — the previous two fixes each replaced one failure
mode with another, because the dependency itself was the problem.

A comment in each workflow records why it is absent and what to do if a job
ever genuinely needs it: install it in that job alone, and bound every wait.
Copilot AI lite review requested due to automatic review settings August 19, 2026 05:28
@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@murdore, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

Limit details: You’ve used all 2 included reviews currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5b3aa9f8-66fc-40c0-af52-90aef827bfbb

📥 Commits

Reviewing files that changed from the base of the PR and between a349050 and 5406203.

📒 Files selected for processing (2)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Single Commit Policy - COMPLIANT

Status: Policy requirements met • 1 commit • Valid format • Ready for merge

📊 View validation details

📝 Commit Details

  • Hash: 54062030aee9d65f6f93ecf5b8a3c157cc288987
  • Message: fix(ci): stop installing ffmpeg in jobs that never use it
  • Author: Sachin Sharma

✅ Validation Results

  • Single commit requirement met
  • No merge commits in branch
  • Semantic commit message format verified
  • Ready for squash merge to release branch

🤖 Automated validation by NeuroLink Single Commit Enforcement

@github-actions

Copy link
Copy Markdown
Contributor

🤖 AI Review & Build Compliance ✅

Status: AI analysis complete • Build rules validated • Ready for review

📊 View detailed analysis results

🛡️ Analysis Complete

  • ✅ Security scan (vulnerabilities, API keys)
  • ✅ TypeScript safety & code quality
  • ✅ Error handling & best practices
  • ✅ Build rule enforcement validated
  • ✅ Commit format & compliance checks

📋 Ready for Merge When

  • All CI checks passing
  • Manual review approved
  • Any AI-flagged issues resolved

🤖 AI analysis complete - check individual code comments for specific feedback

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR removes ffmpeg installation from GitHub Actions workflows where it is not used, to reduce CI flakiness and unblock required checks that were timing out due to apt-get/mirror instability.

Changes:

  • Removed apt-get-based ffmpeg install/verify steps from CI and release workflows.
  • Added in-workflow commentary documenting why ffmpeg is intentionally not installed and how to add it back only for jobs that truly need it.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
.github/workflows/ci.yml Removes ffmpeg install steps from CI jobs and replaces them with explanatory comments.
.github/workflows/release.yml Removes ffmpeg install steps from release workflow jobs and replaces them with explanatory comments.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +43 to +44
# Because build-check is a required check, each of those blocked every
# open pull request on a dependency none of these jobs use.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in #1895: the release.yml comment no longer says build-check gates that workflow; it separates the pull-request blocking in ci.yml from a stall in a release run.

@Tara-ag

Tara-ag commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

💬 MINOR: Remove unnecessary ffmpeg installation from CI - This change removes problematic ffmpeg installation from CI workflows that never actually need it. The ffmpeg dependency is bundled via ffmpeg-static/ffprobe-static as optional dependencies and is used at runtime only (frame extraction, video merging). All CI jobs either run static analysis (lint, format, typecheck), mock tests, or build verification - none of which require runtime media processing. This change addresses real CI failures where apt-get install ffmpeg caused 90+ minute lock waits and was blocked by corrupt upstream assets.

@Tara-ag

Tara-ag commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

💬 MINOR: Remove unnecessary ffmpeg installation from release workflow - Removing ffmpeg from release.yml prevents the same apt lock issues from affecting release pipelines. The release workflow builds and publishes packages - it does not run any media processing suites that would require ffmpeg at runtime.

@Tara-ag

Tara-ag commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Summary for PR #1360

Decision: ✅ APPROVED

Summary: This is a clean, well-justified CI/CD optimization that removes problematic ffmpeg installation from workflow files. No code changes - purely configuration cleanup.


Findings (2 MINOR)

Severity Category File Issue
💬 MINOR CI/CD Optimization ci.yml Remove unnecessary ffmpeg installation from CI
💬 MINOR CI/CD Reliability release.yml Remove unnecessary ffmpeg installation from release workflow

Impact on Existing Code

  • Blast Radius: None - this is a configuration change only
  • Execution Flows Affected: CI pipelines will run faster and more reliably
  • Unmodified Dependents at Risk: None - no runtime behavior changes
  • Architectural Hotspots: N/A - workflow files are not architectural components
  • Risk Assessment: LOW - Removes fragile dependency that was breaking CI repeatedly

Review Scope & Notes

This PR addresses a real pain point: the apt-get install ffmpeg step was causing:

  1. 90+ minute lock waits due to unattended-upgrades contention
  2. Pipeline breaks from corrupt upstream asset publications
  3. Mirror failures (Ubuntu returning "Ign" for indexes)

The change correctly identifies that:

  • All current CI jobs use bundled ffmpeg-static (optional deps)
  • Only test:media suite would genuinely need system ffmpeg
  • The removed jobs never run media processing suites

Recommendation: If test:media or similar suites are added to these workflows in the future, they should install ffmpeg locally with proper timeout guards as documented in the new comment.

No other review needed - this is a straightforward, well-documented improvement.

@Tara-ag

Tara-ag commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

💬 MINOR: Remove unnecessary ffmpeg installation from release workflow - Removing ffmpeg from release.yml prevents the same apt lock issues from affecting release pipelines. The release workflow builds and publishes packages - it does not run any media processing suites that would require ffmpeg at runtime. This is consistent with ci.yml changes - release jobs don't need ffmpeg and were vulnerable to the same apt lock issues.

@Tara-ag

Tara-ag commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Summary

Decision: APPROVED ✅

This PR removes problematic ffmpeg installation from CI workflows (ci.yml and release.yml) that never actually need it during their execution. The change improves CI reliability by eliminating apt lock contention issues that have previously blocked all open PRs.

Findings Summary

Severity Count Details
MINOR 2 Removed unnecessary ffmpeg installation from ci.yml and release.yml
CRITICAL 0 None
MAJOR 0 None
SUGGESTION 0 None

Total: 2 minor findings, both related to CI/CD optimization and reliability.

Detailed Findings

  1. 📁 .github/workflows/ci.yml - Line 27

    • Severity: 💬 MINOR
    • Category: CI/CD Optimization
    • Finding: Remove unnecessary ffmpeg installation from CI jobs
    • Impact: Eliminates 90+ minute CI hangs from apt lock contention and prevents blocking of all open PRs when upstream assets become corrupt or mirrors fail
  2. 📁 .github/workflows/release.yml - Line 34

    • Severity: 💬 MINOR
    • Category: CI/CD Reliability
    • Finding: Remove unnecessary ffmpeg installation from release workflow
    • Impact: Prevents same apt lock issues from affecting critical release pipeline; release jobs only run pnpm install, build, and publish - no runtime media processing

Impact on Existing Code

  • Blast Radius: Minimal - only CI workflow configuration changed
  • Affected Jobs:
    • ci.yml: test, build-check, quality-gate jobs (no actual test execution needs ffmpeg)
    • release.yml: build and publish jobs (only package building/publishing)
  • Runtime Behavior: No impact - ffmpeg is bundled via ffmpeg-static/ffprobe-static as optional dependencies for runtime use only
  • Test Coverage: Not affected - this is a CI configuration change, not code

Reviewed Scope

This review covered:

  • ✅ All 2 changed files (.github/workflows/ci.yml, .github/workflows/release.yml)
  • ✅ Diff analysis showing removal of apt-get install ffmpeg steps
  • ✅ Verification that ffmpeg usage is runtime-only (via ffmpeg-static bundling)
  • ✅ Confirmation that no CI job requires ffmpeg for its tasks
  • ✅ Review of existing Copilot review comments (approved)

Conclusion

This is a safe, low-risk improvement that addresses real CI reliability issues without impacting functionality. The changes are well-documented with clear explanations of why ffmpeg isn't needed and guidance for when it might be required in the future.

Recommendation: APPROVE ✅

Comment thread .github/workflows/ci.yml
exit 1
}
echo "✅ ffmpeg installed successfully"
# ffmpeg is deliberately NOT installed in this workflow. Nothing these

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 MINOR: Remove unnecessary ffmpeg installation from CI - The ffmpeg dependency is bundled via ffmpeg-static/ffprobe-static as optional dependencies and is used at runtime only (frame extraction, video merging). All CI jobs either run static analysis (lint, format, typecheck), mock tests, or build verification - none require runtime media processing. This change addresses real CI failures where apt-get install ffmpeg caused 90+ minute lock waits and was blocked by corrupt upstream assets. Jobs that genuinely need ffmpeg (e.g., test:media suite) should be added separately with proper apt timeout guards.

exit 1
}
echo "✅ ffmpeg installed successfully"
# ffmpeg is deliberately NOT installed in this workflow. Nothing these

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 MINOR: Remove unnecessary ffmpeg installation from release workflow - Removing ffmpeg from release.yml prevents the same apt lock issues from affecting release pipelines. The release workflow builds and publishes packages - it does not run any media processing suites that would require ffmpeg at runtime. Consistent with ci.yml changes - release jobs don't need ffmpeg and were vulnerable to the same apt lock issues.

@Tara-ag

Tara-ag commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Summary

Decision: APPROVED ✅

This PR removes problematic ffmpeg installation from CI workflows that never actually need it during their execution. The change improves CI reliability by eliminating apt lock contention issues that have previously blocked all open PRs.

Findings (2 total, both MINOR):

  1. ci.yml line 27 - Remove unnecessary ffmpeg installation from CI

    • The ffmpeg dependency is bundled via ffmpeg-static/ffprobe-static as optional dependencies and is used at runtime only
    • All CI jobs run static analysis, mock tests, or build verification - none require runtime media processing
    • This addresses real CI failures where apt-get install caused 90+ minute lock waits
  2. release.yml line 34 - Remove unnecessary ffmpeg installation from release workflow

    • Consistent with ci.yml changes - release jobs don't need ffmpeg
    • Prevents the same apt lock issues from affecting release pipelines

Impact on existing code:

  • Blast radius: Minimal - only CI workflow files changed
  • Execution flows: None affected - these are build/publish pipelines, not user-facing flows
  • Dependencies: No runtime dependencies changed - ffmpeg remains available for test:media suite when needed
  • Architectural hotspots: Not applicable - CI configuration is not a code hotspot

Review scope:

Focused on CI/CD optimization and reliability. No CRITICAL or MAJOR issues found. The change is self-contained and safe to merge.

@murdore
murdore merged commit 6f83923 into release Aug 19, 2026
18 checks passed
@murdore
murdore deleted the fix/ci-drop-ffmpeg branch August 19, 2026 05:44
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 11.2.3 🎉

The release is available on:

Your semantic-release bot 📦🚀

murdore added a commit that referenced this pull request Oct 3, 2026
Closes the review threads left open on merged PRs against the CI workflows,
the repo's gate scripts and a few dev tools. Each change is the smallest one
that closes its finding. Behaviour changes are covered by a new suite
(test/continuous-test-suite-tooling-scripts.ts, `pnpm run test:tooling-scripts`)
and by additions to the provider-structure and provider-descriptors suites;
every new test was run red against the unfixed source first.

Workflows
- ci.yml: persist-credentials: false on the seven checkouts that never push,
  semantic-release-validation keeps its token (T3790294038, #1335). The
  permissions comment names that job as the one contents: write exception
  (T3858986829-a, #1552). The pinned suite counts and the 373-assertion figure
  are gone (T3869180755-f1, #1580). The new tooling-scripts suite is added to
  extended-suites; its weight (100) is an estimate, not a CI median.
- release.yml: the ffmpeg note no longer says build-check gates this workflow
  (T3810295618-a, #1360).
- single-commit-enforcement.yml: one SKIP_RE shared by both greps, printf
  instead of echo, and the guidance names the push/pull_request workflows
  rather than "every workflow" (T3813387872-printf-regex,
  T3813416696-overstated-guidance, #1364).

Config and lint docs
- config/models.json: Opus 4.5 uses the real snapshot id 20251101 for
  anthropic, bedrock and vertex instead of the 20251124 launch date
  (T3816077440, #1375). provider-structure now checks every Claude id in the
  file against the model enums.
- eslint-rules/index.cjs: header lists e2e-tests-only, no-inline-secret-regex,
  provider-typed-errors and provider-base-class (T3801758166-1, #1344).

Scripts
- build-validations.ts: fails when typedoc.json carries an unanchored
  `**/<dir>/**` exclude, which drops every file under a checkout whose path
  contains that directory (T4042344752-guard, #1723).
- check-banned-deps.ts: scans each file as a whole, so import(), require() and
  `from` followed by a specifier on the next line are found, and a `//` inside
  a string no longer hides the rest of the line (T3956062753, #1662). Files in
  the repo root and .mts/.cts are scanned too (T3956062775, #1662).
- check-shipped-types.ts: the declarations under dist/ must equal the set the
  source tree emits, so a partial or stale build above the 100-file floor
  fails (PF-T3927528338, #1627). A wildcard export is matched against the whole
  pattern, including a `*` in a directory component (T3931686738-wildcard-match,
  #1632).
- codex-replay-listener.ts: the tool-call script names `replay_tool` instead of
  `exec`, which Codex declares as a custom tool and which raised a Fatal
  "incompatible payload" error (F1-T4087477953-custom-tool-shape, #1783);
  reproduced and cleared against codex-cli 0.160.0. --requests counts served
  /responses turns, so a 404 probe cannot shut the listener down first
  (F2-T4087477985-requests-limit-counts-404s, #1783).
- commit-validation.ts: execFileSync("git", [...]) instead of a shell string;
  behaviour unchanged (T3838161513-b, #1499).
- migration-symbol-diff.mjs: this/super-rooted paths keep their full name, and
  tagged templates, obj["name"](), super() and import() are tracked; the
  header says it follows calls (T3835058026-residual, PF-T3833252257, #1448).
- tools/automation/environmentManager.ts: credential-free providers count as
  configured only when the .env sets one of their variables, the score no
  longer divides by the size of the catalog, and the report lists the
  configured providers plus one count instead of every missing one
  (T3792794348, T3792807279, #1337).

Not done, on purpose
- The skip-checks trailer in the single-commit grep (optional in the finding).
- Checkouts in workflows other than ci.yml: the findings named only ci.yml.
- migration-symbol-diff still does not record a function passed by reference
  (`items.forEach(handler)`); the header now says so.

Pre-existing, not touched: test:dynamic fails its five live cases without
provider credentials, identically with config/models.json reverted.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants