# CKB GitLab CI Template # Include this in your .gitlab-ci.yml for CKB analysis # # Usage: # 1. Copy to .gitlab/ci/ckb.yml # 2. Include in .gitlab-ci.yml: # include: # - local: '.gitlab/ci/ckb.yml' # Base template with common settings .ckb-base: image: node:20 variables: CKB_LOG_LEVEL: info before_script: - npm install -g @tastehub/ckb - ckb init cache: key: ckb-${CI_COMMIT_REF_SLUG} paths: - .ckb/ policy: pull-push # Index job - runs first to populate cache ckb-index: extends: .ckb-base stage: .pre script: - ckb index rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Impact analysis for merge requests ckb-impact-analysis: extends: .ckb-base stage: test needs: [ckb-index] script: - | # Run impact analysis ckb impact diff --base=origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-$CI_DEFAULT_BRANCH} --format=json > impact.json RISK=$(jq -r '.summary.estimatedRisk' impact.json) SYMBOLS=$(jq '.summary.symbolsChanged' impact.json) AFFECTED=$(jq '.summary.transitivelyAffected' impact.json) echo "Risk Level: $RISK" echo "Symbols Changed: $SYMBOLS" echo "Transitively Affected: $AFFECTED" # Export for downstream jobs echo "CKB_RISK=$RISK" >> impact.env echo "CKB_SYMBOLS=$SYMBOLS" >> impact.env echo "CKB_AFFECTED=$AFFECTED" >> impact.env # Fail on critical risk if [ "$RISK" = "critical" ]; then echo "CRITICAL RISK: Manual review required" exit 1 fi artifacts: reports: dotenv: impact.env paths: - impact.json expire_in: 1 week rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" # PR summary with MR note ckb-pr-summary: extends: .ckb-base stage: test needs: [ckb-index] script: - | # Generate summary ckb pr-summary --base=origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-$CI_DEFAULT_BRANCH} --format=json > summary.json # Generate markdown for MR note ckb impact diff --base=origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-$CI_DEFAULT_BRANCH} --format=markdown > mr-note.md # Post to MR (requires GITLAB_TOKEN with api scope) if [ -n "$GITLAB_TOKEN" ]; then curl --request POST \ --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ --form "body=$(cat mr-note.md)" \ "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes" else echo "GITLAB_TOKEN not set, skipping MR comment" cat mr-note.md fi artifacts: paths: - summary.json - mr-note.md expire_in: 1 week rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Scheduled architecture refresh ckb-scheduled-refresh: extends: .ckb-base stage: build script: - ckb index --force - ckb arch --format=json > architecture.json - ckb hotspots --limit=50 --format=json > hotspots.json - ckb modules --format=json > modules.json artifacts: paths: - architecture.json - hotspots.json - modules.json expire_in: 30 days rules: - if: $CI_PIPELINE_SOURCE == "schedule" # Affected tests (for selective testing) ckb-affected-tests: extends: .ckb-base stage: test needs: [ckb-index] script: - | # Get affected tests ckb affected-tests \ --base=origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-$CI_DEFAULT_BRANCH} \ --strategy=safe \ --format=json > affected-tests.json CONFIDENCE=$(jq '.confidence' affected-tests.json) TEST_COUNT=$(jq '.tests | length' affected-tests.json) echo "Confidence: $CONFIDENCE" echo "Affected Tests: $TEST_COUNT" # Generate runnable command ckb affected-tests \ --base=origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-$CI_DEFAULT_BRANCH} \ --strategy=safe \ --output=command > run-tests.sh echo "Run command:" cat run-tests.sh artifacts: paths: - affected-tests.json - run-tests.sh expire_in: 1 week rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event"