CI/CD Workflows
Overview
GAT uses GitHub Actions for continuous integration, testing, packaging, and release automation. The workflows follow a simplified manual release process with comprehensive diagnostics.
Workflow Structure
1. Release Verification (Quick Smoke Test)
File: .github/workflows/release-verification.yml
- Triggers: Automatic on push to
mainorstaging - Scope: Ubuntu + macOS, headless variant only
- Duration: ~5 minutes
- Purpose: Fast smoke test that packaging works
- Artifacts: Test packages with 5-day retention
2. Staging Diagnostics (Comprehensive Testing)
File: .github/workflows/staging-diagnostics.yml
- Trigger: Manual only (workflow_dispatch)
- Scope: All platforms, all variants, all feature combinations
- Purpose: Comprehensive "what's broken where" testing before release
- Components:
- Feature matrix tests (minimal, full-io, viz, all-backends)
- Subcrate tests (gat-core, gat-io, gat-algo, gat-ts, gat-viz)
- Full build matrix (ubuntu/macos × headless/analyst/full)
- Artifacts: Build diagnostics JSON files with 14-day retention
- Output: Comprehensive diagnostic report with actionable next steps
3. Manual Release Build
File: .github/workflows/manual-release.yml
- Trigger: Manual only (workflow_dispatch)
- Scope: All platforms, all requested variants
- Purpose: Build release packages for distribution
- Duration: ~15-20 minutes for all variants
- Artifacts: Release tarballs with 30-day retention
- Output: Build summary with next steps
4. Build Matrix (Reusable)
File: .github/workflows/build-matrix.yml
- Type: Reusable workflow called by staging-diagnostics
- Platforms: Linux (ubuntu-latest) + macOS (macos-latest)
- Variants: headless, full, analyst
- Features: Tiered diagnostics, verbose compiler output on-demand
5. Feature Testing
Files: .github/workflows/cli-feature-matrix.yml, .github/workflows/feature-subcrate-tests.yml
- Triggers: On PR/push to main (cli-feature-matrix), manual (feature-subcrate-tests)
- Purpose: Test different feature combinations and subcrates
- Included in: staging-diagnostics workflow
6. Native Solver Testing
File: .github/workflows/native-solvers.yml
- Trigger: Manual only (workflow_dispatch)
- Purpose: Build and test native COIN-OR solvers from vendored sources
- Components:
- system-ipopt job: Tests with system-installed IPOPT (Ubuntu/macOS)
- vendored-ipopt job: Builds complete COIN-OR stack from vendored sources
- Build sequence:
build-clp.sh— CoinUtils, Osi, Clpbuild-cbc.sh— Cgl, Cbcbuild-ipopt.sh— Metis, MUMPS (with OpenMP), IPOPT
- Caching:
vendor/local/is cached keyed on vendored archives and build scripts - Artifacts: Build logs with 7-day retention
This workflow verifies that the fully offline, vendored build chain works correctly for reproducible native solver builds.
Bundle Variants
Headless (~30-50 MB)
- CLI only, minimal dependencies
- Features:
--no-default-features --features minimal-io - Use case: Scripting, CI/CD, resource-constrained environments
Analyst (~100-150 MB)
- CLI + ADMS/DERMS/DIST/analytics/featurization
- Features:
--no-default-features --features minimal-io,adms,derms,dist,analytics,featurize - Use case: Power systems analysts, domain-focused workflows
Full (~200-300 MB)
- Everything: GUI, TUI, all solvers, visualization
- Features:
--all-features - Use case: Interactive desktop use, exploratory analysis
Release Process
The release process follows a manual staging-to-main workflow:
Step 1: Develop on Staging
# Make your changes
Step 2: Run Staging Diagnostics
- Go to Actions → Staging Diagnostics in GitHub
- Click Run workflow on the
stagingbranch - Enable all test suites (default)
- Review the comprehensive diagnostic report
If diagnostics fail:
- Fix issues on staging
- Re-run diagnostics
- Repeat until all pass
Step 3: Build Release Packages
- Go to Actions → Manual Release Build in GitHub
- Click Run workflow on the
stagingbranch - Keep default variants (
headless analyst full) or specify subset - Download and test the packages locally
Step 4: Test Packages Locally
# Download artifact from workflow run
# Extract a package
# Test installation
# Verify it works
Step 5: Merge to Main
Step 6: Tag the Release
Step 7: Create GitHub Release (Optional)
Manually create a GitHub release and upload packages if desired. Otherwise, users can install from artifacts or build from source.
How to Install
From GitHub Artifacts (Latest Builds)
# Download artifact from a Manual Release Build workflow run
# Extract and install
From GitHub Release (If Published)
# Download specific release
VERSION="v0.2.0"
# Install
&&
From Source
# Clone the repository
# Install with your preferred variant
The installer automatically detects your platform and architecture, downloads binaries if available, or falls back to building from source.
Packaging Individual Bundles
To package a specific bundle variant (e.g., for local testing):
# Package headless variant
# Package analyst variant
# Package full variant
The packaged tarball will be in dist/.
Customizing Installations
Using Environment Variables
# Install to custom prefix
GAT_PREFIX=/opt/gat
# Use specific version
GAT_VERSION=v0.2.0
Installation Methods (Priority)
- Binary download (if available for your platform/version)
- Source build (automatic fallback if binary not available)
Development Workflow
For Regular Development
# Work on staging
# Make changes, commit, push
# Release Verification runs automatically on push
# Check Actions tab for quick smoke test results
For Pre-Release Testing
# Run comprehensive diagnostics before release
# Go to Actions → Staging Diagnostics → Run workflow (on staging)
# Review diagnostic report
# Fix any failures
# Re-run until all pass
For Release Preparation
# Build release packages
# Go to Actions → Manual Release Build → Run workflow (on staging)
# Download and test packages locally
# If satisfied, merge to main and tag
Diagnostics
Tier 1 (Always)
- System info, toolchain versions, build flags
- Output:
build-diagnostics-*.json - Available in all workflows
Tier 2 (On-Demand)
- Verbose compiler output
- Enable via
verbose_diagnostics: truein workflow_dispatch - Available in staging-diagnostics and build-matrix
Tier 3 (Comprehensive)
- Feature matrix tests
- Subcrate tests
- Full build matrix
- Available in staging-diagnostics workflow
Troubleshooting
Diagnostics Failed
- Review failed job logs
- Download diagnostic artifacts
- Reproduce locally:
- Fix issues on staging
- Re-run diagnostics
Package Build Failed
- Check workflow logs for missing dependencies
- Test locally:
./scripts/package.sh headless - Update workflow if needed
- Re-run manual release build
Installation Failed
- Verify tarball structure:
- Expected structure:
gat-VERSION-OS-ARCH-VARIANT/ ├── bin/ │ ├── gat-cli │ └── gat ├── README.md ├── LICENSE.txt └── install.sh - Fix package.sh if structure is wrong
- Re-run manual release build
Key Differences from Auto-Release
This simplified workflow removes all auto-tagging and auto-release features:
- ❌ No automatic tagging on version bumps
- ❌ No automatic GitHub release creation
- ❌ No automatic package uploads to releases
All release-critical steps are manual and explicit:
- ✅ Manual staging diagnostics
- ✅ Manual release package builds
- ✅ Manual merge to main
- ✅ Manual git tag creation
- ✅ Manual GitHub release (if desired)
This prevents surprises and gives developers full control over when releases happen.
References
- Release Process:
RELEASE_PROCESS.md(comprehensive guide) - Workflow Files:
.github/workflows/ - Packaging Scripts:
scripts/{package,install}.sh