Fleet Deployment Guide
This guide explains how to deploy packages to Fleet DM for self-service installation.
Prerequisites
- Fleet Premium subscription (required for custom packages)
- Fleet admin access
- Signed and notarized
.pkgfile fleetctlCLI installed (optional, for automation)
Manual Upload via Fleet UI
Step 1: Build the Package
bash
# Build with full signing and notarization
export APPLE_SIGNING_IDENTITY="Developer ID Application: ..."
export APPLE_ID="..."
export APPLE_APP_SPECIFIC_PASSWORD="..."
export APPLE_TEAM_ID="..."
./packages/CursorCarlyle/build.sh
# Output: dist/CursorCarlyle/CursorCarlyle-1.0.0.pkgStep 2: Upload to Fleet
- Log in to your Fleet dashboard
- Navigate to Software > Add software
- Click Upload and select your
.pkgfile - Fill in the details:
- Name: Cursor (Carlyle)
- Version: 1.0.0
- Platform: macOS
Step 3: Configure Installation
Set the installation options:
- Install script: Leave empty (pkg handles it)
- Uninstall script:bashOr provide the full uninstall script content.
/Applications/Cursor\ Carlyle.app/Contents/Resources/uninstall.sh
Step 4: Enable Self-Service
- Go to the software item settings
- Enable Self-service
- Choose which teams can see it
Step 5: Test Installation
- On a test Mac enrolled in Fleet
- Open Fleet Desktop or self-service portal
- Find "Cursor (Carlyle)"
- Click Install
- Verify installation completes successfully
Automated Deployment with fleetctl
Install fleetctl
bash
# macOS
brew install fleetdm/tap/fleetctl
# Or download from releases
# https://github.com/fleetdm/fleet/releasesConfigure fleetctl
bash
fleetctl config set --address https://your-fleet-server.com
fleetctl loginUpload Package
bash
fleetctl software add \
--software-package dist/CursorCarlyle/CursorCarlyle-1.0.0.pkg \
--self-service \
--team "Engineering"Update Existing Package
bash
fleetctl software update \
--software-id <software-id> \
--software-package dist/CursorCarlyle/CursorCarlyle-1.1.0.pkgCI/CD Integration
Add a deployment step to your GitHub Actions workflow:
yaml
- name: Deploy to Fleet
if: github.ref == 'refs/heads/main'
env:
# NOTE: FLEET_API_TOKEN and FLEET_URL now come from AWS Secrets Manager
# (tractorbeam/github-actions/fleet in Shared Services account), not GitHub secrets.
FLEET_API_TOKEN: ${{ secrets.FLEET_API_TOKEN }}
FLEET_URL: ${{ secrets.FLEET_URL }}
run: |
# Install fleetctl
brew install fleetdm/tap/fleetctl
# Configure
fleetctl config set --address "$FLEET_URL" --token "$FLEET_API_TOKEN"
# Upload
fleetctl software add \
--software-package dist/${{ inputs.package }}/*.pkg \
--self-serviceVersion Management
Versioning Strategy
Use semantic versioning:
- MAJOR: Breaking changes (new authentication, incompatible config)
- MINOR: New features (new branding, additional tools)
- PATCH: Bug fixes, updates to upstream app
Tracking Upstream Versions
For repackaged apps like Cursor Carlyle:
- The weekly CI build checks for new Cursor versions
- If Cursor updates, a new package is built
- Version format:
{upstream_version}-{our_patch}- Example:
2.4.35-1(Cursor 2.4.35, our patch 1)
- Example:
Updating in Fleet
When deploying a new version:
- Upload the new package to Fleet
- Users will see "Update available" in self-service
- Or push updates automatically via policy
Monitoring
Installation Success
Check Fleet's software inventory:
- Which hosts have the package installed
- Installation success/failure rates
- Version distribution across fleet
User Feedback
Monitor for:
- Support tickets related to the package
- Slack channel for package-specific issues
- Fleet activity logs for installation failures
Troubleshooting
Package Won't Upload
- Check file size (Fleet may have limits)
- Verify pkg is properly signed
- Check Fleet server disk space
Installation Fails on Hosts
Common issues:
- Gatekeeper blocks: Package not properly notarized
- Permission errors: postinstall needs sudo
- Disk space: Host doesn't have enough space
Check Fleet logs:
bash
fleetctl get host <hostname> --json | jq '.software_install_logs'Users Don't See Package
- Check self-service is enabled
- Verify team assignment
- Check host is in the right team
Package Shows Wrong Version
Fleet caches software information. Force refresh:
bash
fleetctl trigger --host <hostname> --name software_inventoryBest Practices
- Test on staging first: Use a staging Fleet instance or test team
- Gradual rollout: Start with a small group before company-wide
- Communication: Announce new packages in Slack/email
- Documentation: Link to package README in Fleet description
- Rollback plan: Keep previous versions available for quick rollback