Skip to content

AcuOps Usage Guide

Developer Workflow

Daily Development

  1. Create a feature branch:

    git checkout -b feature/add-custom-field
    

  2. Edit your customization in Customization/_project/project.xml

  3. Validate locally:

    python scripts/validate-project.py Customization/_project/project.xml
    

  4. Push and create a PR:

    git push origin feature/add-custom-field
    gh pr create --title "Add custom field to SOOrder"
    

  5. The PR check runs validation against staging (import + compilation, no publish).

  6. After review, merge to main — automatic production deploy.

Manual Deploy

Trigger from GitHub Actions UI: 1. Go to Actions → "AcuOps Deploy" 2. Click "Run workflow" 3. Select environment (staging/production) 4. Optionally enable "Validate only"

Or use the script directly:

# Deploy to production
scripts/deploy.sh \
  --project MyCustomization \
  --package dist/MyCustomization.zip

# Validate only (no publish)
scripts/deploy.sh \
  --project MyCustomization \
  --package dist/MyCustomization.zip \
  --validate-only

# Deploy with backup
scripts/deploy.sh \
  --project MyCustomization \
  --package dist/MyCustomization.zip \
  --backup

Python Deployer

The Python script supports additional features:

# With YAML config
python scripts/deploy.py --config acuops.yaml --package dist/MyProject.zip

# Download existing package (backup)
python scripts/deploy.py --download --project MyProject --output backups/

# Co-publish for conflict detection
python scripts/deploy.py \
  --project MyProject \
  --package dist/MyProject.zip \
  --also-publish VARPackage ShopifyConnector

Rollback

From GitHub Artifacts

  1. Go to Actions → find the deployment run
  2. Download the backup-package artifact
  3. Run restore:
    scripts/restore.sh \
      --project MyCustomization \
      --package backups/MyCustomization_backup_20260307-120000.zip
    

Manual Backup

scripts/backup.sh --project MyCustomization --output backups/

Co-Publish (Conflict Detection)

When multiple customization projects are active, publish them together to catch conflicts:

# acuops.yaml
publish:
  co_publish: ["VARPackage", "ShopifyConnector"]

Or via CLI:

scripts/deploy.sh \
  --project MyCustomization \
  --package dist/MyCustomization.zip \
  --also-publish "VARPackage,ShopifyConnector"

Acumatica compiles all listed projects together and reports any type conflicts, duplicate field names, or compilation errors.

Validation

Local Validation

# Basic validation
python scripts/validate-project.py Customization/_project/project.xml

# Strict mode (additional warnings)
python scripts/validate-project.py --strict Customization/_project/project.xml

# ISV prefix enforcement
python scripts/validate-project.py --isv-prefix AO Customization/_project/project.xml

What the Validator Checks

  1. XML well-formedness
  2. <Customization> root element
  3. level and product-version attributes
  4. <Sql> elements — ALTER TABLE guards
  5. <Table> elements — NullReferenceException warning
  6. <Graph> elements — C# code validation
  7. <SqlScript> rejection warning
  8. ISV prefix enforcement
  9. Duplicate Usr* field detection
  10. Security scan (hardcoded credentials in CDATA)

Solution Objects (ISV Certification)

Generate the certification artifact:

python scripts/generate-solution-objects.py Customization/_project/project.xml
# Outputs: solution-objects.csv

Environment-Specific Deploys

Trigger Environment Behavior
Push to main Production Full deploy (backup + import + publish)
Push to staging Staging Full deploy
Pull request Staging Validate only (import + compile, no publish)
Manual dispatch Your choice Full deploy or validate-only