This repository has been archived on 2026-11-08. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2026-10-21 19:40:48 -05:00

230 lines
8.5 KiB
Makefile

# QQQ Orb Development Makefile
# Provides convenient commands for orb development, validation, and publishing
.PHONY: help pack validate clean test test-scripts test-all publish-snapshot publish-release dev check-clean check-branch
# Default target
help:
@echo "QQQ Orb Development Commands:"
@echo ""
@echo " make pack - Pack the orb using 'orb pack' (recommended for orb development)"
@echo " make validate - Validate the packed orb"
@echo " make test - Pack and validate the orb"
@echo " make test-scripts - Run comprehensive tests for calculate_version.sh"
@echo " make test-all - Run all tests (orb + scripts)"
@echo " make clean - Remove packed orb files"
@echo " make dev - Development workflow: pack, validate, and show status"
@echo " make lint - Run all CircleCI-style linting checks"
@echo " make publish-snapshot - Interactive snapshot release (dev:snapshot)"
@echo " make publish-release - Interactive production release (tagged version)"
@echo ""
@echo "Key Files:"
@echo " src/@orb.yml - Main orb definition"
@echo " target/qqq-orb-packed.yml - Packed orb (generated)"
# Pack the orb using the correct command for orb development
pack:
@python3 scripts/pack_pipeline.py
@echo "Packing orb using 'circleci orb pack'..."
@mkdir -p ./target/
@circleci orb pack src > target/qqq-orb-packed.yml
@echo "✅ Orb packed successfully: target/qqq-orb-packed.yml"
# Validate the packed orb
validate: pack
@echo "Validating packed orb..."
@circleci orb validate target/qqq-orb-packed.yml
@echo "✅ Orb validation successful"
# Test workflow: pack and validate
test: validate
@echo "✅ All tests passed!"
# Test scripts: run comprehensive tests for calculate_version.sh
test-scripts:
@echo "🧪 Running calculate_version.sh test suite..."
@./tests/run_tests.sh --ci
@echo "✅ Script tests passed!"
# Test all: run both orb tests and script tests
test-all: test test-scripts test-pipelines
@echo "🎉 All tests completed successfully!"
.PHONY: test-pipelines
# PyYAML 6.0.3 is the same strict parser used by the setup job.
test-pipelines: pack
python3 tests/test_generate_pipeline.py --packed target/qqq-orb-packed.yml
python3 tests/test_maven_ci_contract.py
bash tests/test_cli_ci_behavior.sh
python3 tests/test_cli_ci_contract.py
python3 tests/test_standardize_qbit.py
python3 tests/test_qbit_hotfix_profile.py
python3 tests/test_ci_maintenance.py
python3 tests/test_rollout_version.py
python3 tests/test_enforce_orb_checks.py
python3 tests/test_enroll_consumers.py
python3 tests/test_reconcile_enrollment.py
python3 tests/test_discover_enrollment.py
python3 tests/test_finish_enrollment.py
python3 tests/test_static_analysis_exit.py
python3 tests/test_validate_standard.py
python3 tests/test_voyage_profile.py
python3 tests/test_next_native.py
python3 tests/test_auxiliary_workflows.py
python3 tests/test_qbit_codeql.py
python3 tests/test_repository_policy.py
python3 tests/test_intellij_plugin.py
python3 tests/test_workflow_lint.py
python3 tests/test_business_e2e.py
python3 tests/test_qctl_native.py
python3 -m unittest discover -s tests -p test_generate_qctl_workflow.py
python3 tests/test_rc_finalize_sweep.py
python3 tests/test_rc_guard.py
python3 -m unittest discover -s tests -p test_generate_rc_workflow.py
python3 -m unittest discover -s tests -p test_audit_estate.py
python3 tests/test_all_profiles.py
python3 tests/test_generate_all_release.py
python3 -m unittest discover -s tests -p 'test_qqq_all_release*.py'
python3 tests/test_verify_all_circle_smoke.py
python3 tests/test_mobile_policy_profiles.py
bash tests/test_all_artifact.sh
python3 tests/test_maven_ci_rc_completion.py
bash tests/test_maven_ci_push.sh
bash tests/test_create_github_release.sh
bash tests/test_maven_ci_cache.sh
bash tests/test_maven_test_results.sh
bash tests/test_maven_ci_install.sh
bash tests/test_snapshot_refresh.sh
bash tests/test_maven_settings_output.sh
# Clean up generated files
clean:
@echo "Cleaning up packed orb files..."
@rm -rf target
@echo "Cleaning up test data..."
@rm -rf tests/test_data
@echo "✅ Cleanup complete"
# Lint source files (same checks as CircleCI)
lint:
@echo "🔍 Running CircleCI-style linting checks..."
@echo ""
@echo "1. YAML Linting..."
@yamllint src/commands/ src/jobs/ src/examples/ src/@orb.yml
@echo "✅ YAML linting passed"
@echo ""
@echo "2. Shell Script Linting (ShellCheck)..."
@shellcheck src/scripts/*.sh
@echo "✅ Source script ShellCheck passed"
@echo ""
@echo "3. Test Script Linting (ShellCheck)..."
@shellcheck tests/*.sh
@echo "✅ Test script ShellCheck passed"
@echo ""
@echo "4. CircleCI Orb Linting..."
@circleci orb validate src/@orb.yml
@echo "✅ CircleCI orb validation passed"
@echo ""
@echo "5. Orb Packing Test..."
@circleci orb pack src > /tmp/test-packed.yml
@circleci orb validate /tmp/test-packed.yml
@rm -f /tmp/test-packed.yml
@echo "✅ Orb packing test passed"
@echo ""
@echo "🎉 All linting checks passed! Ready for commit."
@echo ""
@echo "Note: For orb best practices review (orb-tools/review),"
@echo " this runs automatically in CircleCI when you push."
# Development workflow: pack, validate, and show status
dev: validate
@echo ""
@echo "🎉 Development Status:"
@echo " ✅ Orb packed successfully"
@echo " ✅ Orb validation passed"
@echo " 📁 Packed orb: target/qqq-orb-packed.yml"
@echo ""
@echo "Next steps:"
@echo " 1. Review the packed orb: cat target/qqq-orb-packed.yml"
@echo " 2. Test with a project configuration"
@echo " 3. Publish when ready:"
@echo " - make publish-snapshot (for dev testing)"
@echo " - make publish-release (for production)"
# Check if working directory is clean
check-clean:
@if [ -n "$$(git status --porcelain)" ]; then \
echo "❌ Working directory is not clean. Commit changes first."; \
exit 1; \
fi
# Check if we're on the right branch for releases
check-branch:
@current=$$(git branch --show-current); \
if [ "$$current" != "main" ] && [ "$$current" != "master" ]; then \
echo "⚠️ Warning: You're on branch '$$current', not main/master"; \
echo " This is recommended for production releases."; \
read -p "Continue anyway? [y/N]: " confirm; \
if [ "$$confirm" != "y" ] && [ "$$confirm" != "Y" ]; then \
exit 1; \
fi; \
fi
# Interactive snapshot release (dev:snapshot)
publish-snapshot: check-clean lint clean dev test-all
@echo "🚀 Publishing Snapshot Release"
@echo ""
@echo "This will publish to: kingsrook/qqq-orb@dev:snapshot"
@echo ""
@read -p "Continue with snapshot release? [y/N]: " confirm; \
if [ "$$confirm" != "y" ] && [ "$$confirm" != "Y" ]; then \
echo "❌ Release cancelled"; \
exit 1; \
fi; \
echo ""; \
echo "📦 Publishing snapshot..."; \
circleci orb publish target/qqq-orb-packed.yml kingsrook/qqq-orb@dev:snapshot; \
echo "✅ Snapshot published successfully!"
# Interactive production release (tagged version)
publish-release: check-clean check-branch lint clean dev test-all
@echo "🚀 Publishing Production Release"
@echo ""
@echo "This will create a git tag and publish a production version."
@echo ""
@latest=$$(git tag -l 'v*' | sort -V | tail -1); \
if [ -n "$$latest" ]; then \
echo "Latest version: $$latest"; \
next=$$(echo "$$latest" | sed 's/^v//' | awk -F. '{$$NF++; print $$1"."$$2"."$$NF}'); \
echo "Suggested next version: v$$next"; \
else \
echo "No previous versions found. Starting with v0.1.0"; \
next="0.1.0"; \
fi; \
echo ""; \
read -p "Enter version [v$$next]: " version; \
version=$${version:-v$$next}; \
if [ "$$version" != "v$$(echo $$version | sed 's/^v//')" ]; then \
echo "❌ Version must start with 'v' (e.g., v1.0.0)"; \
exit 1; \
fi; \
if git tag -l | grep -q "^$$version$$"; then \
echo "❌ Tag $$version already exists"; \
exit 1; \
fi; \
echo ""; \
echo "Creating tag $$version..."; \
git tag -a "$$version" -m "Release $$version"; \
echo "Publishing kingsrook/qqq-orb@$$(echo $$version | sed 's/^v//')..."; \
circleci orb publish target/qqq-orb-packed.yml kingsrook/qqq-orb@$$(echo $$version | sed 's/^v//'); \
echo "Pushing tag to remote..."; \
git push origin "$$version"; \
echo "✅ Production release $$version published successfully!"
.PHONY: test-publication-poms
# Explicit integration gate: requires Java/Maven and public plugin downloads into
# an isolated temporary repository. Never publishes or uses signing credentials.
test-publication-poms:
python3 tests/test_maven_publication_poms.py
python3 tests/test_effective_publication_version.py