Skip to content

Development Validation and CI

Jim Daley edited this page Jul 2, 2026 · 1 revision

Development, Validation, and CI

This page documents how to build, test, and validate the Forsetti app and how GitHub Actions is configured for the private repository.

Local Repository Layout

The app project depends on the public Forsetti framework products through a local sibling package path.

/Users/jim/GitHub/
  Forsetti-Jamf-Pro/
    Forsetti.xcodeproj
    ForsettiApp/
    ForsettiTests/
  Forsetti-Framework-Mac-iOS-main/
    Package.swift
    Sources/

The Xcode project references:

../Forsetti-Framework-Mac-iOS-main

and links:

  • ForsettiCore
  • ForsettiPlatform

Local Build Commands

xcodebuild -list -project Forsetti.xcodeproj
xcodebuild -project Forsetti.xcodeproj -scheme Forsetti -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO clean build
xcodebuild -project Forsetti.xcodeproj -scheme Forsetti -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO test
xcodebuild -project Forsetti.xcodeproj -scheme Forsetti -destination 'generic/platform=iOS' CODE_SIGNING_ALLOWED=NO build

Static Guard Commands

bash scripts/verify-no-customer-references.sh .
bash scripts/verify-no-customer-residue.sh .
bash .github/scripts/check-provenance-markers.sh .

If SwiftLint is installed:

swiftlint lint --strict --config .swiftlint.yml

If SwiftLint is unavailable, document the missing executable and run the remaining validation commands.

Validation Matrix

Group Command or evidence
Project/package resolution xcodebuild -list -project Forsetti.xcodeproj
macOS build xcodebuild ... clean build
macOS tests xcodebuild ... test
iOS generic build xcodebuild ... -destination 'generic/platform=iOS' build
Static customer-reference guard scripts/verify-no-customer-references.sh
Static residue guard scripts/verify-no-customer-residue.sh
Provenance guard .github/scripts/check-provenance-markers.sh
CI validation GitHub Actions macOS validation and Provenance Guard

GitHub Actions Layout

The macOS validation workflow checks out the app repo and the framework repo side by side so Xcode can resolve the local package path.

flowchart TD
    Runner["GitHub runner workspace"] --> AppCheckout["forsetti-Jamf-Pro/"]
    Runner --> FrameworkCheckout["Forsetti-Framework-Mac-iOS-main/"]
    AppCheckout --> Project["Forsetti.xcodeproj"]
    Project --> LocalPackage["../Forsetti-Framework-Mac-iOS-main"]
    FrameworkCheckout --> Products["ForsettiCore + ForsettiPlatform"]
    Project --> Resolve["xcodebuild -list"]
    Resolve --> Test["xcodebuild test"]
Loading

Workflow checkout shape:

- name: Checkout
  uses: actions/checkout@v4
  with:
    path: forsetti-Jamf-Pro

- name: Checkout Forsetti framework
  uses: actions/checkout@v4
  with:
    repository: flynn33/Forsetti-Framework
    ref: main
    path: Forsetti-Framework-Mac-iOS-main

The job default working directory is forsetti-Jamf-Pro, which makes the project package path resolve to the sibling framework checkout.

CI Flow

sequenceDiagram
    participant Push as Push or PR update
    participant Guard as Provenance Guard
    participant Mac as macOS validation
    participant App as App checkout
    participant Framework as Framework checkout
    participant Xcode as xcodebuild

    Push->>Guard: trigger
    Guard->>App: checkout repository
    Guard->>Guard: self-test guard
    Guard->>Guard: scan repository and PR text
    Guard-->>Push: pass/fail

    Push->>Mac: trigger
    Mac->>App: checkout app to forsetti-Jamf-Pro
    Mac->>Framework: checkout framework sibling
    Mac->>Mac: sanitation scan
    Mac->>Xcode: resolve project
    Xcode->>Xcode: resolve local framework package
    Mac->>Xcode: run macOS tests
    Xcode-->>Push: pass/fail
Loading

Test Coverage Themes

Forsetti tests cover:

  • Runtime manifest and registry alignment.
  • Computer and mobile search filters, records, hardware display, profile behavior, and pagination.
  • Support Technician search, command history parsing, remote support readiness, target resolution, action availability, secret extraction, temporary admin model/service/view-model behavior, and layout.
  • Reports aggregation, export/rendering behavior, pagination, field catalog, and generated view models.
  • Deployment Tracker demo safety, workflow transitions, guide topics, preload rendering, upload/pagination helpers, and records/export behavior.
  • Permissions Helper matrix decoding, command filtering, privilege matching, runtime graph, and diagram layout.
  • Diagnostics export, pruning, and persistence behavior.
  • UI foundation and responsive layout behavior.

Release Readiness Checklist

  1. Confirm the framework sibling package is present locally.
  2. Run project resolution.
  3. Run macOS build.
  4. Run macOS tests.
  5. Run iOS generic build.
  6. Run customer-reference and residue guard scripts.
  7. Run provenance guard script.
  8. Run SwiftLint when available.
  9. Verify GitHub Actions checks are green on the target PR or branch.
  10. Confirm license/distribution terms before public distribution.

Known Operational Notes

  • The repository is private.
  • The wiki is a separate Git repository at https://github.com/flynn33/forsetti-Jamf-Pro.wiki.git.
  • The app repository uses a local Swift package reference for framework integration.
  • GitHub Actions compensates for that local reference by checking out flynn33/Forsetti-Framework into the expected sibling path.
  • Final signing identities and distribution terms require owner approval before public distribution.

Clone this wiki locally