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 -->
124 lines
4.0 KiB
JSON
124 lines
4.0 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft/2020-12/schema",
|
|
"type": "object",
|
|
"title": "Homebrew-based Fleet-maintained apps input schema",
|
|
"description": "Specify metadata to source a Fleet-maintained app from Homebrew.",
|
|
"required": [
|
|
"name",
|
|
"unique_identifier",
|
|
"token",
|
|
"installer_format",
|
|
"slug",
|
|
"default_categories"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The user-facing name of the application.",
|
|
"minLength": 1
|
|
},
|
|
"unique_identifier": {
|
|
"type": "string",
|
|
"description": "The platform-specific unique identifier for the app. On macOS, this is the app's bundle identifier.",
|
|
"minLength": 1
|
|
},
|
|
"token": {
|
|
"type": "string",
|
|
"description": "The identifier used by homebrew for the app; it is the token field on the homebrew API response.",
|
|
"minLength": 1
|
|
},
|
|
"installer_format": {
|
|
"type": "string",
|
|
"description": "The file format for the app's installer.",
|
|
"enum": ["zip", "dmg", "pkg"]
|
|
},
|
|
"slug": {
|
|
"type": "string",
|
|
"description": "The slug identifies a specific app and platform combination. It is used to name the manifest files that contain the metadata that Fleet needs to add, install, and uninstall this app. Format: app-name/platform (e.g., adobe-acrobat-reader/darwin)",
|
|
"pattern": "^[a-z0-9-+@]+/darwin$",
|
|
"minLength": 1
|
|
},
|
|
"pre_uninstall_scripts": {
|
|
"type": "array",
|
|
"description": "Command lines that will be run before the generated uninstall script is executed.",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
}
|
|
},
|
|
"post_uninstall_scripts": {
|
|
"type": "array",
|
|
"description": "Command lines that will be run after the generated uninstall script is executed.",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
}
|
|
},
|
|
"default_categories": {
|
|
"type": "array",
|
|
"description": "The default categories assigned to the installer in self-service if no categories are specified when it is added to a team's library.",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["Browsers", "Communication", "Developer tools", "Productivity", "Security", "Utilities"]
|
|
},
|
|
"minItems": 1,
|
|
"uniqueItems": true
|
|
},
|
|
"install_script_path": {
|
|
"type": "string",
|
|
"description": "A filepath to an install script. If provided, this script will override the generated install script.",
|
|
"minLength": 1,
|
|
"pattern": "\\.sh$"
|
|
},
|
|
"uninstall_script_path": {
|
|
"type": "string",
|
|
"description": "A filepath to an uninstall script. If provided, this script will override the generated uninstall script.",
|
|
"minLength": 1,
|
|
"pattern": "\\.sh$"
|
|
},
|
|
"frozen": {
|
|
"type": "boolean",
|
|
"description": "If true, the app will not be processed during ingestion and no new output will be created."
|
|
},
|
|
"cask_path": {
|
|
"type": "string",
|
|
"description": "Path (relative to the repo root) to a local file containing the cask JSON in the same schema as https://formulae.brew.sh/api/cask/<token>.json. Used to commit cask metadata for third-party taps directly into this repo under inputs/homebrew/custom-tap/.",
|
|
"minLength": 1,
|
|
"pattern": "\\.json$"
|
|
}
|
|
},
|
|
"not": {
|
|
"allOf": [
|
|
{
|
|
"properties": {
|
|
"uninstall_script_path": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["uninstall_script_path"]
|
|
},
|
|
{
|
|
"anyOf": [
|
|
{
|
|
"properties": {
|
|
"pre_uninstall_scripts": {
|
|
"type": "array"
|
|
}
|
|
},
|
|
"required": ["pre_uninstall_scripts"]
|
|
},
|
|
{
|
|
"properties": {
|
|
"post_uninstall_scripts": {
|
|
"type": "array"
|
|
}
|
|
},
|
|
"required": ["post_uninstall_scripts"]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"additionalProperties": false
|
|
}
|