ic-code 1.1.8__tar.gz → 1.1.10__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.
- {ic_code-1.1.8/src/ic_code.egg-info → ic_code-1.1.10}/PKG-INFO +1 -1
- ic_code-1.1.10/docs/ci-workflow-guide.md +221 -0
- ic_code-1.1.10/docs/release-guide.md +258 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/pyproject.toml +1 -1
- ic_code-1.1.10/scripts/test-ci-detection.sh +111 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/__init__.py +1 -1
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/profile/info.py +50 -1
- ic_code-1.1.10/src/ic/platforms/oci/compartment/info.py +272 -0
- {ic_code-1.1.8 → ic_code-1.1.10/src/ic_code.egg-info}/PKG-INFO +1 -1
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic_code.egg-info/SOURCES.txt +3 -2
- ic_code-1.1.8/CHANGELOG.md +0 -181
- ic_code-1.1.8/docs/aws/AWS_IMPLEMENTATION_SUMMARY.md +0 -230
- ic_code-1.1.8/src/ic/platforms/oci/compartment/info.py +0 -232
- {ic_code-1.1.8 → ic_code-1.1.10}/LICENSE +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/MANIFEST.in +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/SECURITY.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/_templates/configuration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/_templates/installation.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/_templates/troubleshooting.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/_templates/usage.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/aws/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/aws/aws_cli_prd.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/aws/installation.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/azure/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/config_migration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/deployment.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/development/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/development/cleanup_summary.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/development/development_guide.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/development/import_patterns.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/development/migration_guide.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/gcp/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/general/configuration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/installation.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/mcp_integration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/migration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/migration_guide.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncp/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncp/configuration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncp/installation.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncp/troubleshooting.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncp/usage.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncpgov/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ncpgov/installation.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/oci/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/oci/installation.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/security.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/ssh/configuration.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/troubleshooting.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/docs/user_guide.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/requirements.txt +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/analysis_summary.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/bump-version.sh +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/cli_usage_analysis.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/dependency_mapper.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/deploy.sh +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/final_validation_and_documentation.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/fix_consolidated_imports.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/migration_execution_and_validation.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/ncp_security_scanner.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/oracle-policy/user_policy.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/performance_optimization.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/setup_venv.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/unset_env.sh +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/validate_config.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/validate_dependencies.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/scripts/validate_ncp_security.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/setup.cfg +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/setup.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/azure_utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/gather_env.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/gcp_config_validator.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/gcp_monitoring.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/gcp_utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/log.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/ncp_security_utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/ncp_utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/ncpgov_utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/progress_decorator.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/slack.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/common/utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/cli.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/cli_backup.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/commands/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/commands/config.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/commands/migration.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/commands/security.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/compat/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/compat/cli.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/compat/common.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/cleanup.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/docs_organizer.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/external.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/installer.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/manager.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/migration.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/migration_utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/path_manager.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/schema.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/secrets.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/config/security.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/dependency_validator.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/logging.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/mcp_manager.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/platform_discovery.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/session.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/core/silence_logging.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/migration/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/migration/manager.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/migration/post_validation.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/migration/rollback.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/migration/validation.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/cloudfront/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/codepipeline/build.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ec2/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ec2/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ec2/list_tags.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ecs/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ecs/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ecs/service.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/ecs/task.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/addons.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/fargate.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/nodes.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/pods.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/eks/update_config.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/fargate/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/fargate/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/lb/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/lb/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/lb/list_tags.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/lb/tag_check.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/msk/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/msk/broker.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/msk/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/nat/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/nat/list_tags.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/nat/tag_check.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/profile/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/rds/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/rds/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/rds/list_tags.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/rds/tag_check.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/s3/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/s3/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/s3/list_tags.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/s3/tag_check.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/sg/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/sg/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/vpc/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/vpc/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/vpc/list_tags.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/vpn/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/aws/vpn/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/aci/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/aci/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/aks/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/aks/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/lb/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/lb/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/nsg/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/nsg/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/storage/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/storage/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/vm/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/vm/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/vm/mock_data.json +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/vnet/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/vnet/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/azure/vnet/mock_data.json +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/cloudflare/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/cloudflare/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/billing/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/billing/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/billing/mock_data.json +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/compute/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/compute/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/compute/mock_data.json +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/firewall/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/functions/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/functions/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/gke/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/gke/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/gke/mock_data.json +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/lb/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/lb/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/run/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/run/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/sql/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/sql/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/storage/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/storage/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/vpc/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/gcp/vpc/mock_data.json +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/client.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/ec2/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/ec2/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/rds/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/rds/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/s3/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/s3/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/sg/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/sg/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/vpc/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncp/vpc/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/client.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/ec2/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/ec2/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/rds/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/rds/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/s3/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/s3/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/sg/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/sg/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/vpc/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ncpgov/vpc/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/common/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/common/utils.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/compartment/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/cost/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/cost/credit.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/cost/usage.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/info/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/info/oci_info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/lb/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/lb/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/nsg/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/nsg/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/obj/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/obj/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/policy/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/policy/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/policy/search.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/vcn/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/vcn/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/vm/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/vm/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/volume/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/oci/volume/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/auto/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/auto/scan.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/auto_ssh.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/server/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/server/info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/platforms/ssh/server_info.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/README.md +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/config.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/detector.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/guidance.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/hooks.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/patterns.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic/security/scanner.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic_code.egg-info/dependency_links.txt +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic_code.egg-info/entry_points.txt +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic_code.egg-info/requires.txt +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/ic_code.egg-info/top_level.txt +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/mcp/__init__.py +0 -0
- {ic_code-1.1.8 → ic_code-1.1.10}/src/mcp/gcp_connector.py +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# IC CLI - Smart CI Workflow Guide
|
|
2
|
+
|
|
3
|
+
## 개요
|
|
4
|
+
|
|
5
|
+
IC CLI의 CI workflow는 커밋 메시지와 변경된 파일을 기반으로 자동으로 테스트할 플랫폼을 감지합니다.
|
|
6
|
+
|
|
7
|
+
## 사용 방법
|
|
8
|
+
|
|
9
|
+
### 1. 커밋 메시지 태그 사용 (권장)
|
|
10
|
+
|
|
11
|
+
특정 플랫폼만 테스트하려면 커밋 메시지에 플랫폼 태그를 추가하세요:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# NCP만 테스트
|
|
15
|
+
git commit -m "[ncp] EC2 인스턴스 목록 조회 수정"
|
|
16
|
+
|
|
17
|
+
# OCI만 테스트
|
|
18
|
+
git commit -m "[oci] Compartment 처리 업데이트"
|
|
19
|
+
|
|
20
|
+
# 여러 플랫폼 테스트
|
|
21
|
+
git commit -m "[ncp][oci] 인증 플로우 개선"
|
|
22
|
+
|
|
23
|
+
# 모든 플랫폼 테스트
|
|
24
|
+
git commit -m "[all] 핵심 설정 시스템 리팩토링"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. 자동 감지
|
|
28
|
+
|
|
29
|
+
커밋 메시지에 태그가 없으면 변경된 파일을 기반으로 자동 감지:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# src/ic/platforms/ncp/ 파일 변경 → NCP 테스트
|
|
33
|
+
# tests/platforms/oci/ 파일 변경 → OCI 테스트
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 3. 기본 동작
|
|
37
|
+
|
|
38
|
+
플랫폼이 감지되지 않으면 기본 플랫폼 테스트:
|
|
39
|
+
- NCP (Naver Cloud Platform)
|
|
40
|
+
- NCPGov (Naver Cloud Platform Government)
|
|
41
|
+
|
|
42
|
+
## 지원 플랫폼 태그
|
|
43
|
+
|
|
44
|
+
| 태그 | 플랫폼 | 테스트 상태 |
|
|
45
|
+
|------|--------|------------|
|
|
46
|
+
| `[ncp]` | Naver Cloud Platform | ✅ 완전 지원 |
|
|
47
|
+
| `[ncpgov]` | NCP Government | ✅ 완전 지원 |
|
|
48
|
+
| `[oci]` | Oracle Cloud Infrastructure | ⚠️ 테스트 개발 중 |
|
|
49
|
+
| `[azure]` | Microsoft Azure | ⚠️ 테스트 개발 중 |
|
|
50
|
+
| `[aws]` | Amazon Web Services | ⚠️ 테스트 개발 중 |
|
|
51
|
+
| `[gcp]` | Google Cloud Platform | ⚠️ 테스트 개발 중 |
|
|
52
|
+
| `[ssh]` | SSH Server Management | ⚠️ 테스트 개발 중 |
|
|
53
|
+
| `[cf]` | CloudFlare | ⚠️ 테스트 개발 중 |
|
|
54
|
+
|
|
55
|
+
## 태그 형식
|
|
56
|
+
|
|
57
|
+
다음 형식 모두 지원:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
[platform] # 대괄호
|
|
61
|
+
(platform) # 소괄호
|
|
62
|
+
platform: # 콜론
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
대소문자 구분 없음:
|
|
66
|
+
```bash
|
|
67
|
+
[ncp] = [NCP] = [Ncp]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 실전 예제
|
|
71
|
+
|
|
72
|
+
### 예제 1: NCP EC2 기능 개발
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 1. NCP EC2 코드 수정
|
|
76
|
+
vim src/ic/platforms/ncp/ec2/info.py
|
|
77
|
+
|
|
78
|
+
# 2. 커밋 (NCP 태그 포함)
|
|
79
|
+
git commit -m "[ncp] GPU 인스턴스 지원 추가"
|
|
80
|
+
|
|
81
|
+
# 3. Push
|
|
82
|
+
git push
|
|
83
|
+
|
|
84
|
+
# 결과: NCP 테스트만 실행 (unit, integration, performance)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 예제 2: 다중 플랫폼 업데이트
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. 인증 코드 수정
|
|
91
|
+
vim src/ic/core/auth.py
|
|
92
|
+
|
|
93
|
+
# 2. 커밋 (여러 플랫폼 태그)
|
|
94
|
+
git commit -m "[ncp][oci][aws] 인증 에러 처리 표준화"
|
|
95
|
+
|
|
96
|
+
# 3. Push
|
|
97
|
+
git push
|
|
98
|
+
|
|
99
|
+
# 결과: NCP, OCI, AWS 테스트 실행
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 예제 3: 전체 시스템 변경
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# 1. 설정 시스템 수정
|
|
106
|
+
vim src/ic/config/manager.py
|
|
107
|
+
|
|
108
|
+
# 2. 커밋 (all 태그)
|
|
109
|
+
git commit -m "[all] 설정 로딩 시스템 리팩토링"
|
|
110
|
+
|
|
111
|
+
# 3. Push
|
|
112
|
+
git push
|
|
113
|
+
|
|
114
|
+
# 결과: 모든 플랫폼 테스트 실행
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 예제 4: 자동 감지
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# 1. OCI 코드 수정 (태그 없이)
|
|
121
|
+
vim src/ic/platforms/oci/vm/info.py
|
|
122
|
+
|
|
123
|
+
# 2. 커밋 (플랫폼 태그 없음)
|
|
124
|
+
git commit -m "VM 인스턴스 필터링 수정"
|
|
125
|
+
|
|
126
|
+
# 3. Push
|
|
127
|
+
git push
|
|
128
|
+
|
|
129
|
+
# 결과: OCI 테스트 자동 실행 (변경된 파일에서 감지)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## 테스트 타입
|
|
133
|
+
|
|
134
|
+
각 플랫폼에 대해 3가지 테스트 실행:
|
|
135
|
+
|
|
136
|
+
1. **Unit Tests**: 빠른 단위 테스트 (모킹된 의존성)
|
|
137
|
+
2. **Integration Tests**: 통합 테스트 (CI에서는 모킹)
|
|
138
|
+
3. **Performance Tests**: 성능 벤치마크
|
|
139
|
+
|
|
140
|
+
## Python 버전
|
|
141
|
+
|
|
142
|
+
각 플랫폼은 다음 Python 버전에서 테스트:
|
|
143
|
+
- Python 3.11
|
|
144
|
+
- Python 3.12
|
|
145
|
+
|
|
146
|
+
## CI 최적화
|
|
147
|
+
|
|
148
|
+
- ✅ 영향받은 플랫폼만 테스트
|
|
149
|
+
- ✅ 병렬 실행 (Python 버전별)
|
|
150
|
+
- ✅ 테스트 파일이 없는 플랫폼 자동 스킵
|
|
151
|
+
- ✅ 의존성 캐싱
|
|
152
|
+
|
|
153
|
+
## 수동 실행
|
|
154
|
+
|
|
155
|
+
GitHub Actions에서 수동으로 실행:
|
|
156
|
+
|
|
157
|
+
1. Actions → "IC CLI CI Tests" 선택
|
|
158
|
+
2. "Run workflow" 클릭
|
|
159
|
+
3. 플랫폼과 테스트 타입 선택
|
|
160
|
+
4. "Run workflow" 클릭
|
|
161
|
+
|
|
162
|
+
## CI 스킵
|
|
163
|
+
|
|
164
|
+
CI를 완전히 스킵하려면:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
git commit -m "[skip ci] 문서 업데이트"
|
|
168
|
+
# 또는
|
|
169
|
+
git commit -m "[ci skip] README 수정"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 로컬 테스트
|
|
173
|
+
|
|
174
|
+
CI 감지 로직을 로컬에서 테스트:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
./scripts/test-ci-detection.sh
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## 새 플랫폼 테스트 추가
|
|
181
|
+
|
|
182
|
+
새 플랫폼에 대한 테스트를 추가하려면:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# 1. 테스트 디렉토리 생성
|
|
186
|
+
mkdir -p tests/platforms/{platform}/{service}/{unit,integration,performance}
|
|
187
|
+
|
|
188
|
+
# 2. 테스트 파일 추가
|
|
189
|
+
# tests/platforms/{platform}/{service}/unit/test_{feature}.py
|
|
190
|
+
|
|
191
|
+
# 3. 자동으로 CI에서 실행됨
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## 문제 해결
|
|
195
|
+
|
|
196
|
+
### 내 플랫폼 테스트가 실행되지 않음
|
|
197
|
+
|
|
198
|
+
확인 사항:
|
|
199
|
+
1. `tests/platforms/{platform}/` 디렉토리가 있나요?
|
|
200
|
+
2. `test_*.py` 파일이 있나요?
|
|
201
|
+
3. 커밋 메시지에 플랫폼 태그를 포함했나요?
|
|
202
|
+
4. 변경된 파일이 `src/ic/platforms/{platform}/`에 있나요?
|
|
203
|
+
|
|
204
|
+
### 하나만 변경했는데 모든 플랫폼이 테스트됨
|
|
205
|
+
|
|
206
|
+
확인 사항:
|
|
207
|
+
1. `[all]` 또는 `[test-all]` 태그를 사용했나요?
|
|
208
|
+
2. 모든 플랫폼에 영향을 주는 핵심 파일을 변경했나요?
|
|
209
|
+
|
|
210
|
+
### 현재 테스트 상태 확인
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# 플랫폼별 테스트 파일 수 확인
|
|
214
|
+
./scripts/test-ci-detection.sh
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 참고
|
|
218
|
+
|
|
219
|
+
- 전체 workflow 설정: `.github/workflows/ci-tests.yml`
|
|
220
|
+
- 상세 가이드: `.github/workflows/README.md`
|
|
221
|
+
- 테스트 감지 스크립트: `scripts/test-ci-detection.sh`
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# IC CLI Release Guide
|
|
2
|
+
|
|
3
|
+
## 릴리스 프로세스
|
|
4
|
+
|
|
5
|
+
### 1. 버전 업데이트
|
|
6
|
+
|
|
7
|
+
두 파일의 버전을 동기화해야 합니다:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# src/ic/__init__.py
|
|
11
|
+
__version__ = "1.1.10"
|
|
12
|
+
|
|
13
|
+
# pyproject.toml
|
|
14
|
+
version = "1.1.10"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2. CHANGELOG 업데이트
|
|
18
|
+
|
|
19
|
+
`.local-docs/CHANGELOG.md`에 변경사항 추가:
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
## [1.1.10] - 2025-11-17
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- 새로운 기능들...
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- 변경된 사항들...
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
- 수정된 버그들...
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 3. 로컬 빌드 테스트
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 빌드 아티팩트 정리
|
|
38
|
+
rm -rf dist/ build/ src/ic_code.egg-info/
|
|
39
|
+
|
|
40
|
+
# 패키지 빌드
|
|
41
|
+
python -m build
|
|
42
|
+
|
|
43
|
+
# 빌드 결과 확인
|
|
44
|
+
ls -lh dist/
|
|
45
|
+
|
|
46
|
+
# 패키지 검증
|
|
47
|
+
twine check dist/*
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 4. 변경사항 커밋 및 푸시
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 변경사항 확인
|
|
54
|
+
git status
|
|
55
|
+
|
|
56
|
+
# 커밋
|
|
57
|
+
git add src/ic/__init__.py pyproject.toml .local-docs/CHANGELOG.md
|
|
58
|
+
git commit -m "Release v1.1.10: Smart CI platform detection and improvements"
|
|
59
|
+
|
|
60
|
+
# 푸시
|
|
61
|
+
git push origin main
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 5. GitHub Release 생성
|
|
65
|
+
|
|
66
|
+
#### 방법 1: GitHub 웹 인터페이스
|
|
67
|
+
|
|
68
|
+
1. https://github.com/dgr009/ic/releases/new 접속
|
|
69
|
+
2. "Choose a tag" → `v1.1.10` 입력 (새 태그 생성)
|
|
70
|
+
3. Release title: `v1.1.10`
|
|
71
|
+
4. Description: CHANGELOG 내용 복사
|
|
72
|
+
5. "Publish release" 클릭
|
|
73
|
+
|
|
74
|
+
#### 방법 2: Git 태그 + GitHub CLI
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# 태그 생성
|
|
78
|
+
git tag -a v1.1.10 -m "Release v1.1.10: Smart CI platform detection"
|
|
79
|
+
|
|
80
|
+
# 태그 푸시
|
|
81
|
+
git push origin v1.1.10
|
|
82
|
+
|
|
83
|
+
# GitHub CLI로 release 생성 (선택사항)
|
|
84
|
+
gh release create v1.1.10 \
|
|
85
|
+
--title "v1.1.10" \
|
|
86
|
+
--notes-file .local-docs/CHANGELOG.md
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 6. 자동 배포 확인
|
|
90
|
+
|
|
91
|
+
GitHub Release가 생성되면 자동으로:
|
|
92
|
+
|
|
93
|
+
1. `.github/workflows/publish-to-pypi.yml` workflow 실행
|
|
94
|
+
2. 패키지 빌드
|
|
95
|
+
3. PyPI에 자동 업로드 (Trusted Publishing 사용)
|
|
96
|
+
|
|
97
|
+
진행 상황 확인:
|
|
98
|
+
- https://github.com/dgr009/ic/actions
|
|
99
|
+
|
|
100
|
+
### 7. PyPI 배포 확인
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# PyPI에서 새 버전 확인
|
|
104
|
+
pip index versions ic-code
|
|
105
|
+
|
|
106
|
+
# 또는 웹에서 확인
|
|
107
|
+
# https://pypi.org/project/ic-code/
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 8. 설치 테스트
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# 새 가상환경에서 테스트
|
|
114
|
+
python -m venv test-env
|
|
115
|
+
source test-env/bin/activate
|
|
116
|
+
|
|
117
|
+
# 최신 버전 설치
|
|
118
|
+
pip install --upgrade ic-code
|
|
119
|
+
|
|
120
|
+
# 버전 확인
|
|
121
|
+
ic --version
|
|
122
|
+
# 또는
|
|
123
|
+
python -c "import ic; print(ic.__version__)"
|
|
124
|
+
|
|
125
|
+
# 정리
|
|
126
|
+
deactivate
|
|
127
|
+
rm -rf test-env
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 버전 관리 규칙
|
|
131
|
+
|
|
132
|
+
### Semantic Versioning
|
|
133
|
+
|
|
134
|
+
`MAJOR.MINOR.PATCH` (예: 1.1.10)
|
|
135
|
+
|
|
136
|
+
- **MAJOR**: 호환되지 않는 API 변경
|
|
137
|
+
- **MINOR**: 하위 호환되는 기능 추가
|
|
138
|
+
- **PATCH**: 하위 호환되는 버그 수정
|
|
139
|
+
|
|
140
|
+
### 버전 증가 가이드
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# 버그 수정만
|
|
144
|
+
1.1.9 → 1.1.10
|
|
145
|
+
|
|
146
|
+
# 새 기능 추가 (하위 호환)
|
|
147
|
+
1.1.10 → 1.2.0
|
|
148
|
+
|
|
149
|
+
# Breaking changes
|
|
150
|
+
1.2.0 → 2.0.0
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 문제 해결
|
|
154
|
+
|
|
155
|
+
### PyPI 업로드 실패: "File already exists"
|
|
156
|
+
|
|
157
|
+
**원인**: 같은 버전을 다시 업로드하려고 시도
|
|
158
|
+
|
|
159
|
+
**해결**:
|
|
160
|
+
```bash
|
|
161
|
+
# 버전 증가
|
|
162
|
+
# src/ic/__init__.py와 pyproject.toml 모두 업데이트
|
|
163
|
+
__version__ = "1.1.11"
|
|
164
|
+
version = "1.1.11"
|
|
165
|
+
|
|
166
|
+
# 커밋 및 새 release 생성
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 버전 불일치
|
|
170
|
+
|
|
171
|
+
**확인**:
|
|
172
|
+
```bash
|
|
173
|
+
# pyproject.toml 버전
|
|
174
|
+
grep "^version" pyproject.toml
|
|
175
|
+
|
|
176
|
+
# __init__.py 버전
|
|
177
|
+
grep "__version__" src/ic/__init__.py
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**두 파일의 버전이 반드시 일치해야 합니다!**
|
|
181
|
+
|
|
182
|
+
### GitHub Actions 실패
|
|
183
|
+
|
|
184
|
+
**확인 사항**:
|
|
185
|
+
1. Workflow 로그 확인: https://github.com/dgr009/ic/actions
|
|
186
|
+
2. PyPI Trusted Publishing 설정 확인
|
|
187
|
+
3. 빌드 에러 확인 (의존성, 문법 등)
|
|
188
|
+
|
|
189
|
+
### 로컬 빌드 실패
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# 빌드 도구 업데이트
|
|
193
|
+
pip install --upgrade build twine setuptools wheel
|
|
194
|
+
|
|
195
|
+
# 캐시 정리
|
|
196
|
+
rm -rf dist/ build/ *.egg-info src/*.egg-info
|
|
197
|
+
|
|
198
|
+
# 다시 빌드
|
|
199
|
+
python -m build
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## 체크리스트
|
|
203
|
+
|
|
204
|
+
릴리스 전 확인사항:
|
|
205
|
+
|
|
206
|
+
- [ ] `src/ic/__init__.py` 버전 업데이트
|
|
207
|
+
- [ ] `pyproject.toml` 버전 업데이트
|
|
208
|
+
- [ ] 두 파일의 버전이 일치하는지 확인
|
|
209
|
+
- [ ] `.local-docs/CHANGELOG.md` 업데이트
|
|
210
|
+
- [ ] 로컬 빌드 테스트 성공
|
|
211
|
+
- [ ] `twine check` 통과
|
|
212
|
+
- [ ] 변경사항 커밋 및 푸시
|
|
213
|
+
- [ ] GitHub Release 생성
|
|
214
|
+
- [ ] GitHub Actions 성공 확인
|
|
215
|
+
- [ ] PyPI에 새 버전 확인
|
|
216
|
+
- [ ] 설치 테스트 성공
|
|
217
|
+
|
|
218
|
+
## 빠른 릴리스 스크립트
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
#!/bin/bash
|
|
222
|
+
# scripts/quick-release.sh
|
|
223
|
+
|
|
224
|
+
VERSION=$1
|
|
225
|
+
|
|
226
|
+
if [ -z "$VERSION" ]; then
|
|
227
|
+
echo "Usage: ./scripts/quick-release.sh 1.1.10"
|
|
228
|
+
exit 1
|
|
229
|
+
fi
|
|
230
|
+
|
|
231
|
+
echo "🚀 Releasing version $VERSION"
|
|
232
|
+
|
|
233
|
+
# 버전 업데이트
|
|
234
|
+
sed -i '' "s/__version__ = \".*\"/__version__ = \"$VERSION\"/" src/ic/__init__.py
|
|
235
|
+
sed -i '' "s/^version = \".*\"/version = \"$VERSION\"/" pyproject.toml
|
|
236
|
+
|
|
237
|
+
# 빌드 테스트
|
|
238
|
+
rm -rf dist/ build/ *.egg-info
|
|
239
|
+
python -m build
|
|
240
|
+
twine check dist/*
|
|
241
|
+
|
|
242
|
+
echo "✅ Build successful!"
|
|
243
|
+
echo ""
|
|
244
|
+
echo "Next steps:"
|
|
245
|
+
echo "1. Update .local-docs/CHANGELOG.md"
|
|
246
|
+
echo "2. git add src/ic/__init__.py pyproject.toml .local-docs/CHANGELOG.md"
|
|
247
|
+
echo "3. git commit -m 'Release v$VERSION'"
|
|
248
|
+
echo "4. git push origin main"
|
|
249
|
+
echo "5. git tag -a v$VERSION -m 'Release v$VERSION'"
|
|
250
|
+
echo "6. git push origin v$VERSION"
|
|
251
|
+
echo "7. Create GitHub Release at https://github.com/dgr009/ic/releases/new"
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## 참고
|
|
255
|
+
|
|
256
|
+
- PyPI 프로젝트: https://pypi.org/project/ic-code/
|
|
257
|
+
- GitHub 저장소: https://github.com/dgr009/ic
|
|
258
|
+
- Trusted Publishing 가이드: https://docs.pypi.org/trusted-publishers/
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Test CI platform detection logic locally
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
echo "🔍 Testing CI Platform Detection Logic"
|
|
7
|
+
echo "========================================"
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
# All available platforms
|
|
11
|
+
ALL_PLATFORMS=("ncp" "ncpgov" "oci" "azure" "aws" "gcp" "ssh" "cf")
|
|
12
|
+
|
|
13
|
+
# Test function
|
|
14
|
+
test_detection() {
|
|
15
|
+
local commit_msg="$1"
|
|
16
|
+
local expected="$2"
|
|
17
|
+
|
|
18
|
+
echo "Test: $commit_msg"
|
|
19
|
+
echo "Expected: $expected"
|
|
20
|
+
|
|
21
|
+
DETECTED_PLATFORMS=()
|
|
22
|
+
|
|
23
|
+
# Check for platform tags in commit message
|
|
24
|
+
for platform in "${ALL_PLATFORMS[@]}"; do
|
|
25
|
+
if echo "$commit_msg" | grep -iE "\[${platform}\]|\(${platform}\)|${platform}:" > /dev/null; then
|
|
26
|
+
DETECTED_PLATFORMS+=("$platform")
|
|
27
|
+
fi
|
|
28
|
+
done
|
|
29
|
+
|
|
30
|
+
# Check for [all] tag
|
|
31
|
+
if echo "$commit_msg" | grep -iE "\[all\]|\[test-all\]" > /dev/null; then
|
|
32
|
+
DETECTED_PLATFORMS=("${ALL_PLATFORMS[@]}")
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# If no platforms detected, use defaults
|
|
36
|
+
if [ ${#DETECTED_PLATFORMS[@]} -eq 0 ]; then
|
|
37
|
+
DETECTED_PLATFORMS=("ncp" "ncpgov")
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# Remove duplicates
|
|
41
|
+
UNIQUE_PLATFORMS=($(echo "${DETECTED_PLATFORMS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
|
|
42
|
+
|
|
43
|
+
echo "Detected: ${UNIQUE_PLATFORMS[*]}"
|
|
44
|
+
|
|
45
|
+
if [ "${UNIQUE_PLATFORMS[*]}" = "$expected" ]; then
|
|
46
|
+
echo "✅ PASS"
|
|
47
|
+
else
|
|
48
|
+
echo "❌ FAIL"
|
|
49
|
+
fi
|
|
50
|
+
echo ""
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Run tests
|
|
54
|
+
echo "Test 1: Single platform tag"
|
|
55
|
+
test_detection "[ncp] Fix EC2 listing" "ncp"
|
|
56
|
+
|
|
57
|
+
echo "Test 2: Multiple platform tags"
|
|
58
|
+
test_detection "[ncp][oci] Update auth" "ncp oci"
|
|
59
|
+
|
|
60
|
+
echo "Test 3: All platforms tag"
|
|
61
|
+
test_detection "[all] Major refactor" "aws azure cf gcp ncp ncpgov oci ssh"
|
|
62
|
+
|
|
63
|
+
echo "Test 4: Platform in parentheses"
|
|
64
|
+
test_detection "(oci) Add compartment support" "oci"
|
|
65
|
+
|
|
66
|
+
echo "Test 5: Platform with colon"
|
|
67
|
+
test_detection "aws: Add S3 support" "aws"
|
|
68
|
+
|
|
69
|
+
echo "Test 6: No platform tag (should use defaults)"
|
|
70
|
+
test_detection "Fix typo in README" "ncp ncpgov"
|
|
71
|
+
|
|
72
|
+
echo "Test 7: Case insensitive"
|
|
73
|
+
test_detection "[NCP] Fix bug" "ncp"
|
|
74
|
+
|
|
75
|
+
echo "Test 8: Multiple platforms mixed format"
|
|
76
|
+
test_detection "[ncp] (oci) aws: Update all" "aws ncp oci"
|
|
77
|
+
|
|
78
|
+
echo ""
|
|
79
|
+
echo "🔍 Checking test directory structure"
|
|
80
|
+
echo "====================================="
|
|
81
|
+
echo ""
|
|
82
|
+
|
|
83
|
+
for platform in "${ALL_PLATFORMS[@]}"; do
|
|
84
|
+
if [ -d "tests/platforms/$platform" ]; then
|
|
85
|
+
test_count=$(find "tests/platforms/$platform" -name "test_*.py" -type f 2>/dev/null | wc -l)
|
|
86
|
+
if [ "$test_count" -gt 0 ]; then
|
|
87
|
+
echo "✅ $platform: $test_count test files"
|
|
88
|
+
else
|
|
89
|
+
echo "⚠️ $platform: directory exists but no test files"
|
|
90
|
+
fi
|
|
91
|
+
else
|
|
92
|
+
echo "❌ $platform: no test directory"
|
|
93
|
+
fi
|
|
94
|
+
done
|
|
95
|
+
|
|
96
|
+
echo ""
|
|
97
|
+
echo "🔍 Checking platform source directories"
|
|
98
|
+
echo "========================================"
|
|
99
|
+
echo ""
|
|
100
|
+
|
|
101
|
+
for platform in "${ALL_PLATFORMS[@]}"; do
|
|
102
|
+
if [ -d "src/ic/platforms/$platform" ]; then
|
|
103
|
+
service_count=$(find "src/ic/platforms/$platform" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
|
104
|
+
echo "✅ $platform: $service_count services"
|
|
105
|
+
else
|
|
106
|
+
echo "❌ $platform: no source directory"
|
|
107
|
+
fi
|
|
108
|
+
done
|
|
109
|
+
|
|
110
|
+
echo ""
|
|
111
|
+
echo "✅ Detection logic test complete!"
|
|
@@ -4,7 +4,7 @@ IC (Infra Resource Management CLI) - A comprehensive tool for managing cloud inf
|
|
|
4
4
|
This package provides CLI tools and libraries for managing AWS, Azure, GCP, OCI, and CloudFlare resources.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
__version__ = "1.1.
|
|
7
|
+
__version__ = "1.1.10"
|
|
8
8
|
__author__ = "SangYun"
|
|
9
9
|
__email__ = "cruiser594@gmail.com"
|
|
10
10
|
|
|
@@ -14,6 +14,21 @@ from rich.console import Console
|
|
|
14
14
|
from rich.table import Table
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
###############################################################################
|
|
18
|
+
# CLI 인자 정의
|
|
19
|
+
###############################################################################
|
|
20
|
+
def add_arguments(parser):
|
|
21
|
+
"""AWS Profile Info에 필요한 인자 추가"""
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
"--config",
|
|
24
|
+
help="AWS config 파일 경로 (기본: ~/.aws/config)"
|
|
25
|
+
)
|
|
26
|
+
parser.add_argument(
|
|
27
|
+
"--credentials",
|
|
28
|
+
help="AWS credentials 파일 경로 (기본: ~/.aws/credentials)"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
17
32
|
class AWSProfileParser:
|
|
18
33
|
"""Parses AWS configuration and credentials files."""
|
|
19
34
|
|
|
@@ -308,4 +323,38 @@ class ProfileTableRenderer:
|
|
|
308
323
|
missing_accounts = [p['profile_name'] for p in profiles if not p['account_id']]
|
|
309
324
|
if missing_accounts:
|
|
310
325
|
self.console.print(f"\n⚠️ Profiles without account ID: {', '.join(missing_accounts)}")
|
|
311
|
-
self.console.print("💡 Consider adding role_arn or account_id to these profiles")
|
|
326
|
+
self.console.print("💡 Consider adding role_arn or account_id to these profiles")
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
###############################################################################
|
|
330
|
+
# main
|
|
331
|
+
###############################################################################
|
|
332
|
+
def main(args, config=None):
|
|
333
|
+
"""
|
|
334
|
+
AWS Profile 정보를 조회하고 출력합니다.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
args: CLI 인자
|
|
338
|
+
config: 설정 정보 (선택사항)
|
|
339
|
+
"""
|
|
340
|
+
console = Console()
|
|
341
|
+
|
|
342
|
+
try:
|
|
343
|
+
# Profile 정보 수집
|
|
344
|
+
collector = ProfileInfoCollector()
|
|
345
|
+
|
|
346
|
+
# 사용자 지정 경로가 있으면 사용
|
|
347
|
+
if hasattr(args, 'config') and args.config:
|
|
348
|
+
collector.parser.aws_config_path = Path(args.config)
|
|
349
|
+
if hasattr(args, 'credentials') and args.credentials:
|
|
350
|
+
collector.parser.aws_credentials_path = Path(args.credentials)
|
|
351
|
+
|
|
352
|
+
profiles = collector.collect_profile_info()
|
|
353
|
+
|
|
354
|
+
# 테이블 렌더링
|
|
355
|
+
renderer = ProfileTableRenderer()
|
|
356
|
+
console.print() # 빈 줄 추가
|
|
357
|
+
renderer.render_profiles(profiles)
|
|
358
|
+
|
|
359
|
+
except Exception as e:
|
|
360
|
+
console.print(f"❌ AWS Profile 조회 중 오류 발생: {e}")
|