cortexapps-cli 1.34.0__tar.gz → 1.36.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/PKG-INFO +1 -1
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/cli.py +2 -0
- cortexapps_cli-1.36.0/cortexapps_cli/commands/scaffolders.py +156 -0
- cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/README.md +129 -0
- cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/_templates/Jenkinsfile +82 -0
- cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/_templates/trigger-jenkins-deploy.yaml +126 -0
- cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/catalog/jenkins-demo.yaml +13 -0
- cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/scorecards/deploy-health.yaml +51 -0
- cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/setup.py +791 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/pyproject.toml +1 -1
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/LICENSE +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/README.rst +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/__init__.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/command_options.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/ai_skills.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/api_keys.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/audit_logs.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/backup.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/backup_commands/cortex_export.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/catalog.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/custom_data.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/custom_events.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/custom_metrics.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/dependencies.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/deploys.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/discovery_audit.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/docs.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/entity_relationship_types.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/entity_relationships.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/entity_types.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/gitops_logs.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/groups.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/initiatives.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/apiiro.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/argocd.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/aws.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/azure_active_directory.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/azure_devops.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/azure_resources.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/bamboohr.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/bitbucket.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/bugsnag.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/buildkite.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/checkmarx_sast.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/circleci.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/clickup.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/codecov.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/coralogix.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/datadog.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/dynatrace.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/firehydrant.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/github.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/gitlab.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/harness.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/incidentio.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/instana.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/jenkins.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/jira.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/launchdarkly.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/mend_sast.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/mend_sca.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/newrelic.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/okta.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/opsgenie.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/pagerduty.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/prometheus.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/rollbar.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/rootly.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/semgrep.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/sentry.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/servicenow.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/servicenow_cloud_observability.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/snyk.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/sonarqube.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/splunk_observability_cloud.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/splunk_on_call.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/sumologic.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/veracode.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/wiz.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/workday.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/integrations_commands/xmatters.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/ip_allowlist.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/on_call.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/packages.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/packages_commands/go.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/packages_commands/java.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/packages_commands/node.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/packages_commands/nuget.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/packages_commands/python.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/plugins.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/queries.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/rest.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/scim.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/scorecards.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/scorecards_commands/exemptions.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/secrets.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/solutions.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/teams.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/users.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/users_commands/roles.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/commands/workflows.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/cortex_client.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/models/team.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/__init__.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/_lib/__init__.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/_lib/setup_base.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/address-reviews.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/audit-flags.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/code-review.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/fix-issue.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/incident-trends.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/jira-to-kb.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/release-to-sha.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/search-troubleshooting-kb.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/catalog/simplify-test.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/entity-types/ai-agent.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-agents/scorecards/ai-agent-governance.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/catalog/api-doc-sync.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/catalog/changelog-writer.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/catalog/docs-generator.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/catalog/docs-portal.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-service.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-skills.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-skill-service.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/entity-types/ai-plugin.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/entity-types/ai-skill.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-skills/scorecards/ai-skills-quality.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/.github/workflows/sync-claude-spend.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-alice-chen.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-bob-martinez.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-carol-kim.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-david-osei.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-emma-johnson.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/team-data.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/team-engineering.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/team-frontend.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/catalog/team-platform.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/custom-metrics/ai-spend.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/entity-relationship-types/team-member.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/entity-types/employee.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/plugins/team-ai-spend.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/scorecards/ai-spend-scorecard.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/ai-spend/scripts/sync-claude-spend.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/.github/workflows/cortex-service-version.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.0.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/api-gateway.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/auth-2.2.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/auth.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/aws-dev-us-west-2.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/billing-1.1.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/billing-1.2.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/billing.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/cart-1.0.2.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/cart.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.2.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.3.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.4.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/checkout.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-east-1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-west-1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/gcp-staging-us-east-1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.1.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/notifications.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.0.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.1.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/order-service.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/payments-1.6.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.1.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/payments.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/release-2026-06-20.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-01.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-09.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-10.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/search-4.0.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/search-4.1.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/search.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.2.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.3.0.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/catalog/user-service.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/entity-relationship-types/environments.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/entity-relationship-types/versions.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/entity-types/environment.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/entity-types/release.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/entity-types/service-version.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/workflows/create-environment.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/workflows/create-release.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/environments/workflows/trigger-github-release.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-async-callback.yml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-deploy.yml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-register-deploy.yml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/github-actions-deploy.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/catalog/github-actions-demo.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/scorecards/deploy-health.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/github-actions-deploy/setup.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-async-callback-template.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-deploy-pipeline.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-record-deploy-template.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/_templates/trigger-harness-deploy.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/catalog/harness-demo.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/scorecards/deploy-health.yaml +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/harness-deploy/setup.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/workday/README.md +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/workday/data/configuration.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/workday/data/pied-piper-supervisory-org.json +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/solutions/workday/setup.py +0 -0
- {cortexapps_cli-1.34.0 → cortexapps_cli-1.36.0}/cortexapps_cli/utils.py +0 -0
|
@@ -39,6 +39,7 @@ import cortexapps_cli.commands.packages as packages
|
|
|
39
39
|
import cortexapps_cli.commands.plugins as plugins
|
|
40
40
|
import cortexapps_cli.commands.queries as queries
|
|
41
41
|
import cortexapps_cli.commands.rest as rest
|
|
42
|
+
import cortexapps_cli.commands.scaffolders as scaffolders
|
|
42
43
|
import cortexapps_cli.commands.scim as scim
|
|
43
44
|
import cortexapps_cli.commands.scorecards as scorecards
|
|
44
45
|
import cortexapps_cli.commands.secrets as secrets
|
|
@@ -277,6 +278,7 @@ app.add_typer(packages.app, name="packages")
|
|
|
277
278
|
app.add_typer(plugins.app, name="plugins")
|
|
278
279
|
app.add_typer(queries.app, name="queries")
|
|
279
280
|
app.add_typer(rest.app, name="rest")
|
|
281
|
+
app.add_typer(scaffolders.app, name="scaffolders")
|
|
280
282
|
app.add_typer(scim.app, name="scim")
|
|
281
283
|
app.add_typer(scorecards.app, name="scorecards")
|
|
282
284
|
app.add_typer(secrets.app, name="secrets")
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from cortexapps_cli.command_options import CommandOptions
|
|
2
|
+
from cortexapps_cli.command_options import ListCommandOptions
|
|
3
|
+
from cortexapps_cli.utils import print_output_with_context, print_output
|
|
4
|
+
from typing_extensions import Annotated
|
|
5
|
+
import json
|
|
6
|
+
import typer
|
|
7
|
+
import yaml
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(
|
|
10
|
+
help="Scaffolder template commands",
|
|
11
|
+
no_args_is_help=True
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
def _is_valid_yaml(filepath):
|
|
15
|
+
try:
|
|
16
|
+
yaml.safe_load(filepath)
|
|
17
|
+
filepath.seek(0)
|
|
18
|
+
return True
|
|
19
|
+
except yaml.YAMLError:
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
def _is_valid_json(filepath):
|
|
23
|
+
try:
|
|
24
|
+
json.load(filepath)
|
|
25
|
+
filepath.seek(0)
|
|
26
|
+
return True
|
|
27
|
+
except json.JSONDecodeError:
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
def _read_definition(file_input):
|
|
31
|
+
if _is_valid_json(file_input):
|
|
32
|
+
content_type = "application/json"
|
|
33
|
+
data = json.loads("".join([line for line in file_input]))
|
|
34
|
+
elif _is_valid_yaml(file_input):
|
|
35
|
+
data = file_input.read()
|
|
36
|
+
content_type = "application/yaml"
|
|
37
|
+
else:
|
|
38
|
+
raise typer.BadParameter("Input file is neither valid JSON nor YAML.")
|
|
39
|
+
return data, content_type
|
|
40
|
+
|
|
41
|
+
@app.command()
|
|
42
|
+
def list(
|
|
43
|
+
ctx: typer.Context,
|
|
44
|
+
_print: CommandOptions._print = True,
|
|
45
|
+
page: ListCommandOptions.page = None,
|
|
46
|
+
page_size: ListCommandOptions.page_size = 250,
|
|
47
|
+
table_output: ListCommandOptions.table_output = False,
|
|
48
|
+
csv_output: ListCommandOptions.csv_output = False,
|
|
49
|
+
columns: ListCommandOptions.columns = [],
|
|
50
|
+
no_headers: ListCommandOptions.no_headers = False,
|
|
51
|
+
filters: ListCommandOptions.filters = [],
|
|
52
|
+
sort: ListCommandOptions.sort = [],
|
|
53
|
+
):
|
|
54
|
+
"""
|
|
55
|
+
List Scaffolder templates.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
client = ctx.obj["client"]
|
|
59
|
+
|
|
60
|
+
params = {
|
|
61
|
+
"page": page,
|
|
62
|
+
"pageSize": page_size
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (table_output or csv_output) and not ctx.params.get('columns'):
|
|
66
|
+
ctx.params['columns'] = [
|
|
67
|
+
"Tag=tag",
|
|
68
|
+
"Name=name",
|
|
69
|
+
"Description=description",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
# remove any params that are None
|
|
73
|
+
params = {k: v for k, v in params.items() if v is not None}
|
|
74
|
+
|
|
75
|
+
if page is None:
|
|
76
|
+
# if page is not specified, we want to fetch all pages
|
|
77
|
+
r = client.fetch("api/v1/scaffolders", params=params)
|
|
78
|
+
else:
|
|
79
|
+
# if page is specified, we want to fetch only that page
|
|
80
|
+
r = client.get("api/v1/scaffolders", params=params)
|
|
81
|
+
|
|
82
|
+
if _print:
|
|
83
|
+
print_output_with_context(ctx, r)
|
|
84
|
+
else:
|
|
85
|
+
return(r)
|
|
86
|
+
|
|
87
|
+
@app.command()
|
|
88
|
+
def get(
|
|
89
|
+
ctx: typer.Context,
|
|
90
|
+
tag: str = typer.Option(..., "--tag", "-t", help="The tag or unique, auto-generated Cortex ID of the Scaffolder template"),
|
|
91
|
+
yaml: bool = typer.Option(False, "--yaml", "-y", help="When true, returns the YAML representation of the template."),
|
|
92
|
+
_print: CommandOptions._print = True,
|
|
93
|
+
):
|
|
94
|
+
"""
|
|
95
|
+
Retrieve Scaffolder template by tag or Cortex ID.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
client = ctx.obj["client"]
|
|
99
|
+
|
|
100
|
+
if yaml:
|
|
101
|
+
headers={'Accept': 'application/yaml'}
|
|
102
|
+
else:
|
|
103
|
+
headers={'Accept': 'application/json'}
|
|
104
|
+
r = client.get("api/v1/scaffolders/" + tag, headers=headers)
|
|
105
|
+
|
|
106
|
+
if _print:
|
|
107
|
+
if yaml:
|
|
108
|
+
print(r)
|
|
109
|
+
else:
|
|
110
|
+
print_output_with_context(ctx, r)
|
|
111
|
+
else:
|
|
112
|
+
return(r)
|
|
113
|
+
|
|
114
|
+
@app.command()
|
|
115
|
+
def create(
|
|
116
|
+
ctx: typer.Context,
|
|
117
|
+
file_input: Annotated[typer.FileText, typer.Option(..., "--file", "-f", help="File containing the Scaffolder template definition; can be passed as stdin with -, example: -f-")],
|
|
118
|
+
):
|
|
119
|
+
"""
|
|
120
|
+
Create or update a Scaffolder template. API key must have the Configure Scaffolder permission. Note: If a Scaffolder template with the same tag already exists, it will be updated.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
client = ctx.obj["client"]
|
|
124
|
+
|
|
125
|
+
data, content_type = _read_definition(file_input)
|
|
126
|
+
r = client.post("api/v1/scaffolders", data=data, content_type=content_type)
|
|
127
|
+
print_output(r)
|
|
128
|
+
|
|
129
|
+
@app.command()
|
|
130
|
+
def update(
|
|
131
|
+
ctx: typer.Context,
|
|
132
|
+
tag: Annotated[str, typer.Option(..., "--tag", "-t", help="The tag or unique, auto-generated Cortex ID of the Scaffolder template")],
|
|
133
|
+
file_input: Annotated[typer.FileText, typer.Option(..., "--file", "-f", help="File containing the Scaffolder template definition; can be passed as stdin with -, example: -f-")],
|
|
134
|
+
):
|
|
135
|
+
"""
|
|
136
|
+
Update a Scaffolder template by tag or Cortex ID. API key must have the Configure Scaffolder permission.
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
client = ctx.obj["client"]
|
|
140
|
+
|
|
141
|
+
data, content_type = _read_definition(file_input)
|
|
142
|
+
r = client.put("api/v1/scaffolders/" + tag, data=data, content_type=content_type)
|
|
143
|
+
print_output(r)
|
|
144
|
+
|
|
145
|
+
@app.command()
|
|
146
|
+
def delete(
|
|
147
|
+
ctx: typer.Context,
|
|
148
|
+
tag: str = typer.Option(..., "--tag", "-t", help="The tag or unique, auto-generated Cortex ID of the Scaffolder template"),
|
|
149
|
+
):
|
|
150
|
+
"""
|
|
151
|
+
Delete Scaffolder template by tag or Cortex ID. API key must have the Configure Scaffolder permission.
|
|
152
|
+
"""
|
|
153
|
+
|
|
154
|
+
client = ctx.obj["client"]
|
|
155
|
+
|
|
156
|
+
r = client.delete("api/v1/scaffolders/" + tag)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Jenkins Deploy Tracking
|
|
3
|
+
description: Track deployments from Jenkins pipelines in Cortex, with a deploy health scorecard measuring delivery cadence.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Jenkins Deploy Tracking
|
|
7
|
+
|
|
8
|
+
Trigger deploys from Cortex, track them as they run in Jenkins, and surface deploy health back in your service catalog.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
┌─────────────────────────────────┐
|
|
12
|
+
│ Cortex Catalog │
|
|
13
|
+
│ │
|
|
14
|
+
│ jenkins-demo (service) │
|
|
15
|
+
│ ├── x-cortex-custom-metadata │
|
|
16
|
+
│ │ jenkins: │
|
|
17
|
+
│ │ url / job │
|
|
18
|
+
│ └── Scorecard: Deploy Health │
|
|
19
|
+
│ Bronze / Silver / Gold │
|
|
20
|
+
└──────────────┬──────────────────┘
|
|
21
|
+
│
|
|
22
|
+
│ Run workflow from entity page
|
|
23
|
+
│ (or: cortex workflows run -t
|
|
24
|
+
│ jenkins-trigger-deploy
|
|
25
|
+
│ --scope ENTITY --entity <tag>)
|
|
26
|
+
▼
|
|
27
|
+
┌─────────────────────────────────┐
|
|
28
|
+
│ Cortex Workflow │
|
|
29
|
+
│ Trigger Jenkins Deploy │
|
|
30
|
+
│ │
|
|
31
|
+
│ 1. Read Jenkins config from │
|
|
32
|
+
│ entity custom metadata │
|
|
33
|
+
│ 2. POST /buildWithParameters │
|
|
34
|
+
│ to Jenkins via HTTP │
|
|
35
|
+
│ 3. Pass callback URL as │
|
|
36
|
+
│ pipeline parameter │
|
|
37
|
+
│ 4. Wait for callback │
|
|
38
|
+
└──────────────┬──────────────────┘
|
|
39
|
+
│ POST /buildWithParameters (HTTP + Basic auth)
|
|
40
|
+
▼
|
|
41
|
+
┌─────────────────────────────────────────────────────────┐
|
|
42
|
+
│ GitHub Codespaces (optional — provisioned by setup) │
|
|
43
|
+
│ port 8080 exposed publicly for demo │
|
|
44
|
+
│ │
|
|
45
|
+
│ ┌─────────────────────────────────┐ │
|
|
46
|
+
│ │ Jenkins Pipeline │ │
|
|
47
|
+
│ │ cortex-deploy │ │
|
|
48
|
+
│ │ │ │
|
|
49
|
+
│ │ stage: Build │ │
|
|
50
|
+
│ │ └── run your deploy steps │ │
|
|
51
|
+
│ │ │ │
|
|
52
|
+
│ │ stage: Record Deploy in Cortex │ │
|
|
53
|
+
│ │ └── POST /deploys ◄────┼── registers deploy │
|
|
54
|
+
│ │ (entity: jenkins-demo) │ event on entity │
|
|
55
|
+
│ │ │ │
|
|
56
|
+
│ │ post { always } │ │
|
|
57
|
+
│ │ └── POST callbackUrl ───────►│ Cortex marks │
|
|
58
|
+
│ │ status: SUCCESS/FAILURE │ workflow done │
|
|
59
|
+
│ └─────────────────────────────────┘ │
|
|
60
|
+
└─────────────────────────────────────────────────────────┘
|
|
61
|
+
(or point to your own Jenkins instance — Codespaces not required)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## What's Included
|
|
65
|
+
|
|
66
|
+
- **Entity:** `jenkins-demo` service — a sample entity to receive deploy events
|
|
67
|
+
- **Scorecard:** Deploy Health — Bronze/Silver/Gold based on deploy frequency
|
|
68
|
+
- **Jenkinsfile:** `cortex-deploy` — a two-stage pipeline (Build → Record Deploy) with an async callback to Cortex; drop it into any existing Jenkins job
|
|
69
|
+
- **Cortex workflow:** `jenkins-trigger-deploy` — reads Jenkins coordinates from entity custom metadata, triggers the pipeline via HTTP, and waits for the result
|
|
70
|
+
- **Setup script:** Interactive wizard that wires everything together end-to-end; optionally provisions Jenkins in GitHub Codespaces for a zero-install demo
|
|
71
|
+
|
|
72
|
+
## Quick Start
|
|
73
|
+
|
|
74
|
+
1. Install the solution:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
cortex solutions install -s jenkins-deploy
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
2. Follow the post-install setup prompts, or run later:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
cortex solutions post-install -s jenkins-deploy
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## How It Works
|
|
87
|
+
|
|
88
|
+
The Cortex workflow reads Jenkins coordinates from `x-cortex-custom-metadata.jenkins` on the entity, then triggers `cortex-deploy` via `buildWithParameters`, passing a `callback_url` as a pipeline parameter. Cortex waits asynchronously for the pipeline to report back.
|
|
89
|
+
|
|
90
|
+
Jenkins runs the build, then notifies Cortex twice on completion:
|
|
91
|
+
- **Deploy registration** (`POST /api/v1/catalog/{tag}/deploys`) — records the deploy event on the entity, feeding the Deploy Health scorecard
|
|
92
|
+
- **Workflow callback** — signals the Cortex workflow run as SUCCESS or FAILURE
|
|
93
|
+
|
|
94
|
+
## After Installing
|
|
95
|
+
|
|
96
|
+
If you ran the post-install setup, you're already done — it created the Jenkins job, added credentials, wrote Jenkins coordinates to the entity's custom metadata, imported the Cortex workflow, and triggered a test deploy.
|
|
97
|
+
|
|
98
|
+
To roll the pattern out to your own services:
|
|
99
|
+
|
|
100
|
+
1. Add the `cortex-deploy` **Jenkinsfile** stages to any existing Jenkins pipeline (needs only `CORTEX_API_KEY` and `CORTEX_BASE_URL` secret-text credentials)
|
|
101
|
+
|
|
102
|
+
2. Add a `x-cortex-custom-metadata` block to your entity's catalog YAML with your Jenkins coordinates:
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
x-cortex-custom-metadata:
|
|
106
|
+
jenkins:
|
|
107
|
+
url: "https://jenkins.example.com"
|
|
108
|
+
job: "your-pipeline-name"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
3. Create a **Cortex secret** with your Jenkins credentials:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
cortex secrets create -f - <<EOF
|
|
115
|
+
{
|
|
116
|
+
"name": "Jenkins Auth",
|
|
117
|
+
"tag": "jenkins_auth",
|
|
118
|
+
"secret": "$(echo -n 'your-username:your-api-token' | base64)"
|
|
119
|
+
}
|
|
120
|
+
EOF
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
4. Run the **Solution: Trigger Jenkins Deploy** workflow from the entity page — it reads the Jenkins coordinates from the entity's custom metadata automatically, with no manual inputs required
|
|
124
|
+
|
|
125
|
+
## Customizing for Production
|
|
126
|
+
|
|
127
|
+
- Point the workflow at your real entity by replacing `jenkins-demo` with your service tag
|
|
128
|
+
- Add `CORTEX_API_KEY` and `CORTEX_BASE_URL` secret-text credentials to your real Jenkins instances
|
|
129
|
+
- The Deploy Health scorecard is scoped to `demo-jenkins-deploys` to avoid affecting your existing services. To roll it out broadly, remove the group filter from the scorecard. To opt in individual services, add the `demo-jenkins-deploys` group to them.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
pipeline {
|
|
2
|
+
agent any
|
|
3
|
+
parameters {
|
|
4
|
+
string(name: 'callback_url', defaultValue: '', description: 'Cortex async callback URL')
|
|
5
|
+
string(name: 'cortex_entity_tag', defaultValue: '', description: 'Cortex entity tag')
|
|
6
|
+
}
|
|
7
|
+
environment {
|
|
8
|
+
CORTEX_API_KEY = credentials('CORTEX_API_KEY')
|
|
9
|
+
CORTEX_BASE_URL = credentials('CORTEX_BASE_URL')
|
|
10
|
+
}
|
|
11
|
+
stages {
|
|
12
|
+
stage('Build') {
|
|
13
|
+
steps {
|
|
14
|
+
echo 'Starting build...'
|
|
15
|
+
// Replace this echo with your actual build commands
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
stage('Deploy') {
|
|
19
|
+
steps {
|
|
20
|
+
script {
|
|
21
|
+
// Sends intermediate UPDATE callbacks to the Cortex workflow,
|
|
22
|
+
// demonstrating that the callback URL can be called multiple times
|
|
23
|
+
// before the terminal SUCCESS/FAILURE.
|
|
24
|
+
def callbackUrl = params.callback_url
|
|
25
|
+
def updates = [
|
|
26
|
+
[progress: 33, message: 'Build complete — starting deploy'],
|
|
27
|
+
[progress: 66, message: 'Deploy in progress'],
|
|
28
|
+
[progress: 100, message: 'Deploy complete — recording in Cortex'],
|
|
29
|
+
]
|
|
30
|
+
updates.each { u ->
|
|
31
|
+
sleep 5
|
|
32
|
+
echo "Deploy progress: ${u.progress}%"
|
|
33
|
+
if (callbackUrl) {
|
|
34
|
+
def payload = """{"status":"UPDATE","message":"${u.message}","response":{"progress":"${u.progress}%"}}"""
|
|
35
|
+
sh """
|
|
36
|
+
curl -s -X POST '${callbackUrl}' \\
|
|
37
|
+
-H 'Content-Type: application/json' \\
|
|
38
|
+
-H "Authorization: Bearer \${CORTEX_API_KEY}" \\
|
|
39
|
+
-d '${payload}' || true
|
|
40
|
+
"""
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Replace the placeholder loop above with your actual deploy commands
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
stage('Record Deploy in Cortex') {
|
|
48
|
+
steps {
|
|
49
|
+
script {
|
|
50
|
+
def timestamp = sh(script: 'date -u +%Y-%m-%dT%H:%M:%SZ', returnStdout: true).trim()
|
|
51
|
+
def buildUrl = env.BUILD_URL ?: "${env.JENKINS_URL}job/${env.JOB_NAME}/${env.BUILD_NUMBER}/"
|
|
52
|
+
def payload = """{"sha":"${env.BUILD_NUMBER}","timestamp":"${timestamp}","environment":"production","type":"DEPLOY","title":"Triggered by Jenkins","url":"${buildUrl}","deployer":{"name":"Jenkins"},"customData":{"buildNumber":"${env.BUILD_NUMBER}","jobName":"${env.JOB_NAME}"}}"""
|
|
53
|
+
sh """
|
|
54
|
+
curl -s -f -X POST \\
|
|
55
|
+
"\${CORTEX_BASE_URL}/api/v1/catalog/${params.cortex_entity_tag}/deploys" \\
|
|
56
|
+
-H "Authorization: Bearer \${CORTEX_API_KEY}" \\
|
|
57
|
+
-H "Content-Type: application/json" \\
|
|
58
|
+
-d '${payload}' || true
|
|
59
|
+
"""
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
post {
|
|
65
|
+
always {
|
|
66
|
+
script {
|
|
67
|
+
if (params.callback_url) {
|
|
68
|
+
def status = currentBuild.currentResult == 'SUCCESS' ? 'SUCCESS' : 'FAILURE'
|
|
69
|
+
def buildUrl = env.BUILD_URL ?: "${env.JENKINS_URL}job/${env.JOB_NAME}/${env.BUILD_NUMBER}/"
|
|
70
|
+
def payload = """{"status":"${status}","message":"Jenkins pipeline ${status.toLowerCase()}","response":{"buildUrl":"${buildUrl}","buildNumber":"${env.BUILD_NUMBER}","jobName":"${env.JOB_NAME}"}}"""
|
|
71
|
+
def callbackUrl = params.callback_url
|
|
72
|
+
sh """
|
|
73
|
+
curl -s -f -X POST '${callbackUrl}' \\
|
|
74
|
+
-H 'Content-Type: application/json' \\
|
|
75
|
+
-H "Authorization: Bearer \${CORTEX_API_KEY}" \\
|
|
76
|
+
-d '${payload}'
|
|
77
|
+
"""
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
cortexapps_cli-1.36.0/cortexapps_cli/solutions/jenkins-deploy/_templates/trigger-jenkins-deploy.yaml
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
name: "Solution: Trigger Jenkins Deploy"
|
|
2
|
+
tag: jenkins-trigger-deploy
|
|
3
|
+
description: |
|
|
4
|
+
Triggers a Jenkins pipeline and waits for it to report completion back to Cortex,
|
|
5
|
+
registering a deploy event on the target entity. No inputs required — Jenkins
|
|
6
|
+
coordinates (url, job) are read from the entity's custom metadata.
|
|
7
|
+
isDraft: false
|
|
8
|
+
isRunnableViaApi: true
|
|
9
|
+
filter:
|
|
10
|
+
type: ENTITY
|
|
11
|
+
variables:
|
|
12
|
+
- slug: jenkins-job
|
|
13
|
+
type: STRING
|
|
14
|
+
defaultValue: ""
|
|
15
|
+
runResponseTemplate: |
|
|
16
|
+
# Jenkins Deploy — Complete
|
|
17
|
+
|
|
18
|
+
**Job:** [{{variables.jenkins-job}}](JENKINS_BASE_URL/job/{{variables.jenkins-job}})
|
|
19
|
+
|
|
20
|
+
**Cortex Deploys:** [see deploys for {{context.entity.tag}}](https://app.getcortexapp.com/admin/resources?tag={{context.entity.tag}})
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## How this workflow works
|
|
25
|
+
|
|
26
|
+
**1. Cortex read the entity's Jenkins configuration**
|
|
27
|
+
|
|
28
|
+
The workflow fetched `x-cortex-custom-metadata.jenkins` from this entity to find
|
|
29
|
+
the Jenkins URL and job name — no manual input required.
|
|
30
|
+
|
|
31
|
+
**2. Cortex triggered the Jenkins build**
|
|
32
|
+
|
|
33
|
+
It POSTed to the Jenkins `buildWithParameters` API with the callback URL and entity
|
|
34
|
+
tag in the POST body so Jenkins receives them as build parameters.
|
|
35
|
+
|
|
36
|
+
**3. Jenkins ran the pipeline**
|
|
37
|
+
|
|
38
|
+
The `cortex-deploy` pipeline runs three stages:
|
|
39
|
+
|
|
40
|
+
- **Build** — your build steps (replace `echo "Starting build..."` with your real commands)
|
|
41
|
+
|
|
42
|
+
- **Deploy** — your deploy steps, with intermediate `UPDATE` callbacks sent to Cortex
|
|
43
|
+
so you can track progress in real time; replace the placeholder loop with your real deploy
|
|
44
|
+
|
|
45
|
+
- **Record Deploy in Cortex** — POSTs a deploy event to `/api/v1/catalog/{tag}/deploys`,
|
|
46
|
+
recording build number, URL, and job name. This feeds the Deploy Health scorecard.
|
|
47
|
+
|
|
48
|
+
The `post { always { ... } }` block POSTs the final `SUCCESS` or `FAILURE` status to the
|
|
49
|
+
callback URL — which is how Cortex knows the workflow run is done.
|
|
50
|
+
|
|
51
|
+
**4. Cortex received the callback**
|
|
52
|
+
|
|
53
|
+
When Jenkins posted to the callback URL, Cortex marked this workflow run complete.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Adapting this to your own pipelines
|
|
58
|
+
|
|
59
|
+
1. Replace the placeholder `echo` in the **Build** stage and the progress loop in the
|
|
60
|
+
**Deploy** stage with your actual build and deploy commands
|
|
61
|
+
|
|
62
|
+
2. Add the Deploy, Record Deploy, and callback steps to any existing Jenkinsfile — they
|
|
63
|
+
only need the `CORTEX_API_KEY` and `CORTEX_BASE_URL` credentials plus the two build
|
|
64
|
+
parameters
|
|
65
|
+
|
|
66
|
+
3. Add `x-cortex-custom-metadata.jenkins` to your entity's catalog YAML with
|
|
67
|
+
`url` and `job` fields — no credentials here. If your Jenkins requires auth,
|
|
68
|
+
create a Cortex secret `jenkins_auth = base64(user:token)` and add
|
|
69
|
+
`Authorization: "Basic {{context.secrets.jenkins_auth}}"` to the workflow's
|
|
70
|
+
Trigger Jenkins Build action.
|
|
71
|
+
actions:
|
|
72
|
+
- name: Get Jenkins config
|
|
73
|
+
slug: get-jenkins-config
|
|
74
|
+
schema:
|
|
75
|
+
type: HTTP_REQUEST
|
|
76
|
+
httpMethod: GET
|
|
77
|
+
url: "https://api.getcortexapp.com/api/v1/catalog/{{context.entity.tag}}/custom-data/jenkins"
|
|
78
|
+
headers:
|
|
79
|
+
Authorization: "Bearer {{context.secrets.cortex_api_key}}"
|
|
80
|
+
Content-Type: application/json
|
|
81
|
+
integration: null
|
|
82
|
+
integrationAlias: null
|
|
83
|
+
outgoingActions:
|
|
84
|
+
- parse-jenkins-config
|
|
85
|
+
isRootAction: true
|
|
86
|
+
- name: Parse Jenkins config
|
|
87
|
+
slug: parse-jenkins-config
|
|
88
|
+
schema:
|
|
89
|
+
type: JQ
|
|
90
|
+
expression: |
|
|
91
|
+
.actions."get-jenkins-config".outputs.body.value as $j |
|
|
92
|
+
if ($j == null or $j.job == null) then
|
|
93
|
+
error("No Jenkins configuration found. Add x-cortex-custom-metadata.jenkins with url and job to this entity.")
|
|
94
|
+
else
|
|
95
|
+
{ job: $j.job }
|
|
96
|
+
end
|
|
97
|
+
outgoingActions:
|
|
98
|
+
- set-variables
|
|
99
|
+
isRootAction: false
|
|
100
|
+
- name: Set variables
|
|
101
|
+
slug: set-variables
|
|
102
|
+
schema:
|
|
103
|
+
type: SET_VARIABLES
|
|
104
|
+
variables:
|
|
105
|
+
- slug: jenkins-job
|
|
106
|
+
source:
|
|
107
|
+
path: actions.parse-jenkins-config.outputs.result.job
|
|
108
|
+
type: REFERENCE
|
|
109
|
+
outgoingActions:
|
|
110
|
+
- trigger-deploy
|
|
111
|
+
isRootAction: false
|
|
112
|
+
- name: Trigger Jenkins Build
|
|
113
|
+
slug: trigger-deploy
|
|
114
|
+
schema:
|
|
115
|
+
type: HTTP_REQUEST_ASYNC
|
|
116
|
+
httpMethod: POST
|
|
117
|
+
url: "JENKINS_BASE_URL/job/{{variables.jenkins-job}}/buildWithParameters"
|
|
118
|
+
integration: null
|
|
119
|
+
integrationAlias: null
|
|
120
|
+
headers:
|
|
121
|
+
Content-Type: application/x-www-form-urlencoded
|
|
122
|
+
Authorization: "Basic {{{context.secrets.jenkins_auth}}}"
|
|
123
|
+
payload: "callback_url={{{callbackUrl}}}&cortex_entity_tag={{context.entity.tag}}"
|
|
124
|
+
timeoutInSeconds: 60
|
|
125
|
+
outgoingActions: []
|
|
126
|
+
isRootAction: false
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
openapi: "3.0.0"
|
|
2
|
+
info:
|
|
3
|
+
title: Jenkins Demo
|
|
4
|
+
x-cortex-tag: jenkins-demo
|
|
5
|
+
x-cortex-type: service
|
|
6
|
+
x-cortex-description: Sample service for demonstrating deploy tracking via Jenkins pipelines.
|
|
7
|
+
x-cortex-definition: {}
|
|
8
|
+
x-cortex-groups:
|
|
9
|
+
- demo-jenkins-deploys
|
|
10
|
+
x-cortex-custom-metadata:
|
|
11
|
+
jenkins:
|
|
12
|
+
url: PLACEHOLDER_JENKINS_URL
|
|
13
|
+
job: cortex-deploy
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
tag: jenkins-deploy-health
|
|
2
|
+
name: Jenkins Deploy Health
|
|
3
|
+
description: Measures deployment cadence for services using Jenkins deploy tracking. Scoped to demo-jenkins-deploys group by default — remove the filter to apply to all services.
|
|
4
|
+
draft: false
|
|
5
|
+
notifications:
|
|
6
|
+
enabled: true
|
|
7
|
+
scoreDropNotificationsEnabled: true
|
|
8
|
+
exemptions:
|
|
9
|
+
enabled: true
|
|
10
|
+
autoApprove: false
|
|
11
|
+
evaluation:
|
|
12
|
+
window: 24
|
|
13
|
+
filter:
|
|
14
|
+
kind: GENERIC
|
|
15
|
+
types:
|
|
16
|
+
include:
|
|
17
|
+
- service
|
|
18
|
+
query: hasGroup("demo-jenkins-deploys")
|
|
19
|
+
ladder:
|
|
20
|
+
name: Default Ladder
|
|
21
|
+
levels:
|
|
22
|
+
- name: Bronze
|
|
23
|
+
rank: 1
|
|
24
|
+
description: Service has at least one recorded deployment in the last year.
|
|
25
|
+
color: "#CD7F32"
|
|
26
|
+
- name: Silver
|
|
27
|
+
rank: 2
|
|
28
|
+
description: Service has deployed within the last 30 days.
|
|
29
|
+
color: "#C0C0C0"
|
|
30
|
+
- name: Gold
|
|
31
|
+
rank: 3
|
|
32
|
+
description: Service has deployed within the last 7 days.
|
|
33
|
+
color: "#D7AC58"
|
|
34
|
+
rules:
|
|
35
|
+
- title: Has at least one deploy
|
|
36
|
+
description: At least one deployment has been recorded in the last year.
|
|
37
|
+
expression: deploys(lookback=duration("P1Y")).length > 0
|
|
38
|
+
weight: 1
|
|
39
|
+
level: Bronze
|
|
40
|
+
|
|
41
|
+
- title: Deployed in the last 30 days
|
|
42
|
+
description: A deployment was recorded within the past 30 days.
|
|
43
|
+
expression: deploys(lookback=duration("P30D")).length > 0
|
|
44
|
+
weight: 1
|
|
45
|
+
level: Silver
|
|
46
|
+
|
|
47
|
+
- title: Deployed in the last 7 days
|
|
48
|
+
description: A deployment was recorded within the past 7 days, indicating an active delivery cadence.
|
|
49
|
+
expression: deploys(lookback=duration("P7D")).length > 0
|
|
50
|
+
weight: 1
|
|
51
|
+
level: Gold
|