# 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