harness-ci

SKILL.md

Harness CI Skill

Container-native CI builds with test intelligence, caching, parallelization, and infrastructure management.

Build Infrastructure

  • Cloud (Recommended): Zero-config hosted, auto-scaling, pre-installed tools

    infrastructure:
      type: Cloud
      spec:
        os: Linux  # Linux, MacOS, Windows
    
  • Kubernetes: Self-hosted via k8s clusters

    infrastructure:
      type: KubernetesDirect
      spec:
        connectorRef: k8s_connector
        namespace: harness-builds
        os: Linux
    
  • VMs: AWS, Azure, GCP pool-based scaling

Basic Pipeline Structure

pipeline:
  name: Build Pipeline
  identifier: build_pipeline
  properties:
    ci:
      codebase:
        connectorRef: harness_code
        repoName: my-service
        build: <+input>
  stages:
    - stage:
        name: Build and Test
        type: CI
        spec:
          cloneCodebase: true
          infrastructure:
            type: Cloud
            spec:
              os: Linux
          execution:
            steps:
              - step:
                  name: Install
                  type: Run
                  spec:
                    shell: Sh
                    command: npm ci
              - step:
                  name: Test
                  type: Run
                  spec:
                    command: npm test -- --coverage
              - step:
                  name: Build
                  type: Run
                  spec:
                    command: npm run build

Step Types

Run: Execute shell commands

- step:
    name: Build
    type: Run
    spec:
      shell: Sh
      command: npm run build
      envVariables:
        NODE_ENV: production
      resources:
        limits:
          memory: 2Gi
          cpu: "1"

RunTests (Test Intelligence): Language/framework-aware test execution

- step:
    type: RunTests
    spec:
      language: Java  # Java, Kotlin, Scala, C#, Python, Ruby
      buildTool: Maven  # Maven, Gradle, Bazel, etc.
      runOnlySelectedTests: true  # Enable TI
      enableTestSplitting: true   # Parallel execution
      testAnnotations: org.junit.Test
      packages: com.myapp

Docker Registry Build/Push

- step:
    name: Build and Push
    type: BuildAndPushDockerRegistry
    spec:
      connectorRef: docker_connector
      repo: myorg/myapp
      tags: [<+pipeline.sequenceId>, <+codebase.shortCommitSha>, latest]
      dockerfile: Dockerfile
      caching: true
      buildArgs:
        VERSION: <+pipeline.sequenceId>

ECR/GCR/ACR: Replace BuildAndPushDockerRegistry with BuildAndPushECR, BuildAndPushGCR, or BuildAndPushACR with appropriate connector refs.

Caching

S3 Cache:

- step:
    name: Save Cache
    type: SaveCacheS3
    spec:
      connectorRef: aws_connector
      bucket: harness-cache
      key: npm-{{ checksum "package-lock.json" }}
      sourcePaths: [node_modules]
- step:
    name: Restore Cache
    type: RestoreCacheS3
    spec:
      connectorRef: aws_connector
      bucket: harness-cache
      key: npm-{{ checksum "package-lock.json" }}
      failIfKeyNotFound: false

GCS Cache: Replace S3 steps with SaveCacheGCS/RestoreCacheGCS.

Parallelism

Matrix Strategy: Run steps with multiple configurations

- step:
    name: Test Matrix
    type: Run
    spec:
      command: npm test
      envVariables:
        NODE_VERSION: <+matrix.nodeVersion>
        DB_TYPE: <+matrix.database>
    strategy:
      matrix:
        nodeVersion: ["16", "18", "20"]
        database: [postgres, mysql]
      maxConcurrency: 4

Parallelism: Run same step multiple times

- step:
    name: Parallel Tests
    type: Run
    spec:
      command: npm test -- --shard=$HARNESS_STAGE_INDEX/$HARNESS_STAGE_TOTAL
    strategy:
      parallelism: 4

Parallel Step Groups:

- stepGroup:
    name: Parallel Build
    steps:
      - parallel:
          - step:
              name: Build Frontend
              type: Run
              spec:
                command: npm run build:frontend
          - step:
              name: Build Backend
              type: Run
              spec:
                command: npm run build:backend

Background Services

Start services (databases, caches) for integration tests:

- step:
    name: PostgreSQL
    type: Background
    spec:
      image: postgres:14
      envVariables:
        POSTGRES_USER: test
        POSTGRES_PASSWORD: test
        POSTGRES_DB: testdb
      portBindings:
        "5432": "5432"
      resources:
        limits:
          memory: 1Gi

- step:
    name: Wait for DB
    type: Run
    spec:
      command: until pg_isready -h localhost -p 5432; do sleep 1; done

Plugins & Actions

Slack Notification:

- step:
    name: Notify Slack
    type: Plugin
    spec:
      image: plugins/slack
      settings:
        webhook: <+secrets.getValue("slack_webhook")>
        channel: builds
        template: "Build {{#success build.status}}succeeded{{else}}failed{{/success}}"

S3 Upload:

- step:
    name: Upload Artifacts
    type: Plugin
    spec:
      image: plugins/s3
      settings:
        bucket: build-artifacts
        source: dist/**/*
        target: builds/<+pipeline.sequenceId>

GitHub Actions:

- step:
    name: Setup Node
    type: Action
    spec:
      uses: actions/setup-node@v3
      with:
        node-version: "18"
        cache: npm

Artifact Management

Upload build outputs to cloud storage:

  • S3: Type S3Upload, spec: bucket, sourcePath, target
  • GCS: Type GCSUpload, spec: bucket, sourcePath, target

CI Expressions

Expression Description
<+codebase.branch> Git branch name
<+codebase.commitSha> Full commit SHA
<+codebase.shortCommitSha> Short SHA (7 chars)
<+codebase.commitMessage> Commit message
<+pipeline.sequenceId> Build number
<+pipeline.executionId> Execution UUID
<+secrets.getValue("key")> Secret value

Triggers

Push Trigger:

trigger:
  name: Build on Push
  pipelineIdentifier: build_pipeline
  source:
    type: Webhook
    spec:
      type: Push
      connectorRef: harness_code
      repoName: my-service
      payloadConditions:
        - key: targetBranch
          operator: In
          value: [main, develop]

Pull Request & Tag: Use type: PullRequest or type: Tag with actions or tagCondition.

Troubleshooting

Issue Solution
Build timeout Increase timeout, optimize steps
Cache miss Verify checksum file path
Image pull failed Check connector credentials
TI not working Verify language/buildTool config
Out of memory Increase step memory limits

Debug:

- step:
    name: Debug
    type: Run
    spec:
      command: |
        echo "Branch: <+codebase.branch>"
        echo "Build: <+pipeline.sequenceId>"
        env | sort
        df -h

Related Documentation

Weekly Installs
3
GitHub Stars
9
First Seen
Feb 27, 2026
Installed on
opencode3
gemini-cli3
codebuddy3
github-copilot3
codex3
kimi-cli3