This pull request introduces support for ingesting Homebrew casks from third-party taps (not available in the official `Homebrew/homebrew-cask`) into the Fleet Maintained Apps (FMA) system. It does this by allowing cask metadata to be committed directly into the repository and referenced via a new `cask_path` field. The PR also updates CI workflows to better support Fleet Desktop validation and documents the new contributor flow. **Support for custom Homebrew casks:** * Added a new `cask_path` field to app manifests, allowing the FMA ingester to read cask metadata from a local JSON file instead of fetching from the Homebrew API. This enables ingestion of apps from third-party taps or custom casks not present in the official Homebrew repository. [[1]](diffhunk://#diff-be469dd148f0c50ad56489c48bdb514522e1a46d21336e8f747b5880d71a6d1bR49-R66) [[2]](diffhunk://#diff-abd7db4bef16a062c1bd81f54a7c846f1e91b913a9fe9f87976c8075f39b8cd2R270-R276) * Refactored the Homebrew ingester (`brewIngester`) to use a new `fetchCask` helper, which reads from the local file if `cask_path` is set, or falls back to the API otherwise. Includes robust error handling. [[1]](diffhunk://#diff-abd7db4bef16a062c1bd81f54a7c846f1e91b913a9fe9f87976c8075f39b8cd2L99-R101) [[2]](diffhunk://#diff-abd7db4bef16a062c1bd81f54a7c846f1e91b913a9fe9f87976c8075f39b8cd2R200-R251) * Added comprehensive documentation and examples for the custom tap workflow, including a new `custom-tap/` directory with cask DSL sources, generated JSON, and a regeneration script. [[1]](diffhunk://#diff-2dfa2fc79b9becad555db38289a16afe4ce651665a31868d386fed8b4e160740R1-R85) [[2]](diffhunk://#diff-be469dd148f0c50ad56489c48bdb514522e1a46d21336e8f747b5880d71a6d1bR49-R66) * Added new custom casks for `fleet-desktop`, `druva-insync`, and `zoom-rooms` under `inputs/homebrew/custom-tap/Casks/`. [[1]](diffhunk://#diff-2555a54830de2bfb0ffca8bc487aac67de84dee5d431fe5f42e90e1754f63bb6R1-R36) [[2]](diffhunk://#diff-db1fa8a43a27c5adf49a5ade04e61405ce1e9420f266e3160156cabf69ed4ea8R1-R40) [[3]](diffhunk://#diff-effd461583140683d41dc68d9a93692d039be5ad5e52b6b108ece79f17155107R1-R44) **Testing and validation:** * Added a new test (`TestIngestCaskPath`) to ensure the ingester correctly reads from `cask_path` and does not make unnecessary HTTP requests, with error handling for missing files. **CI workflow improvements:** * Updated GitHub Actions workflows to handle Fleet Desktop's installer requirements in CI by creating a managed preferences stub when validating Fleet Desktop, ensuring the installer succeeds even without MDM enrollment. [[1]](diffhunk://#diff-28b30c8601cb7662d59efbfbbcf800cae91455fd3d875627659dced8c1257a24R100) [[2]](diffhunk://#diff-28b30c8601cb7662d59efbfbbcf800cae91455fd3d875627659dced8c1257a24R116-R123) [[3]](diffhunk://#diff-28b30c8601cb7662d59efbfbbcf800cae91455fd3d875627659dced8c1257a24R148-R172) [[4]](diffhunk://#diff-c263ffc3062c3b5e4e4eb65976080c6cbddac478a5fed3392fe8b23c49bb2da8R69-R92) These changes make it possible to maintain and test apps from custom Homebrew taps within the Fleet repo, improving flexibility and reliability for Fleet-maintained apps. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added support for three new macOS apps: Fleet Desktop, Druva inSync, and Zoom Rooms * Added UI icons for Fleet Desktop and Zoom Rooms * **Enhancements** * Fleet Desktop includes an MDM enrollment caveat and improved installer validation for macOS installers * Support for overriding Homebrew cask input via a local cask JSON file * **Tests** * Added unit coverage for local cask JSON ingestion behavior * **Chores** * Added a deterministic script to regenerate Homebrew custom-tap manifests <!-- end of auto-generated comment: release notes by coderabbit.ai -->
3.1 KiB
Fleet custom-tap casks
This directory is a self-contained source of truth for Fleet-maintained apps that
don't exist in Homebrew/homebrew-cask and therefore can't be ingested from
https://formulae.brew.sh/api/.
It is laid out like a Homebrew tap:
custom-tap/
├── Casks/ # Cask DSL sources (.rb). Edit these.
│ ├── fleet-desktop.rb
│ └── druva-insync.rb
├── api/ # Generated cask metadata (.json). Do not hand-edit.
│ ├── fleet-desktop.json
│ └── druva-insync.json
├── regenerate.sh # Regenerates api/*.json from Casks/*.rb.
└── README.md # You are here.
It is not a real Homebrew tap — the Fleet repo isn't named
homebrew-<something> and Casks/ isn't at the repo root, so brew tap /
brew install against it won't work. It exists solely to feed Fleet's FMA
ingester, and keeping both the source (.rb) and the built artifact (.json)
in the same repo means the PR that changes a cask also tests the change in
CI.
How it hooks into the FMA ingester
Each app here has an input manifest one directory up
(../<token>.json) with a cask_path field pointing at the generated JSON.
Example — ../fleet-desktop.json:
{
"name": "Fleet Desktop",
"token": "fleet-desktop",
"cask_path": "ee/maintained-apps/inputs/homebrew/custom-tap/api/fleet-desktop.json",
...
}
When go run cmd/maintained-apps/main.go runs, the ingester sees cask_path,
reads the local file, and skips the brew API entirely. Apps without
cask_path continue to use https://formulae.brew.sh/api/ as before.
Adding a new cask
- Write the cask DSL in
Casks/<token>.rb. Use an existing file or https://docs.brew.sh/Cask-Cookbook as a reference. - Run
./regenerate.shin this directory to produceapi/<token>.json. - Create an input manifest at
ee/maintained-apps/inputs/homebrew/<token>.jsonthat pointscask_pathat the new JSON. Follow the template in../fleet-desktop.json. - Generate the FMA output manifest:
go run cmd/maintained-apps/main.go --slug="<token>/darwin"from the repo root. - Follow the rest of the FMA contributor flow in
../../../README.md(apps.json description, icon, PR).
Updating an existing cask
- Edit the stanza you care about in
Casks/<token>.rb. - Run
./regenerate.shto refreshapi/<token>.json. - Regenerate the FMA output manifest:
go run cmd/maintained-apps/main.go --slug="<token>/darwin". - Commit all three changes together: the
.rb, the.json, and theoutputs/<token>/darwin.json.
Why regenerate.sh strips fields
brew info --cask --json=v2 includes several fields that depend on the
developer's machine or the throwaway tap the script uses internally —
installed, installed_time, outdated, full_token, tap,
tap_git_head, generated_date. None of these are read by the FMA
ingester, so the script strips them to keep committed JSON stable across
machines.
Requirements
- macOS (the
.rbDSL is parsed by Homebrew). - Homebrew installed (
brewon PATH). jq(brew install jq).