Files
Allen Houchins 6ff485fcdd Support custom tap folder for apps without casks; add three apps (#43784)
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 -->
2026-04-29 20:30:51 -05:00

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

  1. Write the cask DSL in Casks/<token>.rb. Use an existing file or https://docs.brew.sh/Cask-Cookbook as a reference.
  2. Run ./regenerate.sh in this directory to produce api/<token>.json.
  3. Create an input manifest at ee/maintained-apps/inputs/homebrew/<token>.json that points cask_path at the new JSON. Follow the template in ../fleet-desktop.json.
  4. Generate the FMA output manifest: go run cmd/maintained-apps/main.go --slug="<token>/darwin" from the repo root.
  5. Follow the rest of the FMA contributor flow in ../../../README.md (apps.json description, icon, PR).

Updating an existing cask

  1. Edit the stanza you care about in Casks/<token>.rb.
  2. Run ./regenerate.sh to refresh api/<token>.json.
  3. Regenerate the FMA output manifest: go run cmd/maintained-apps/main.go --slug="<token>/darwin".
  4. Commit all three changes together: the .rb, the .json, and the outputs/<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 .rb DSL is parsed by Homebrew).
  • Homebrew installed (brew on PATH).
  • jq (brew install jq).