Skip to main content

Conditions

Conditions limit pipeline step execution at runtime. Harness Open Source sets variables that can be used in conditions.

tip

Harness Open Source supports multiple pipelines per repository. Creating a pipeline per trigger (push, pull request, tag) can reduce the need for conditions.

The following operators are supported:

TypeOperator
Comparison==, !=
Logicalnot, and, or
Regexmatches
Stringcontains, startsWith, endsWith

The following functions are supported:

TypeSyntax
Alwaysalways()
Failurefailure()

This pipeline runs the test step only for pull request events where the target branch is main.

kind: pipeline
spec:
stages:
- type: ci
spec:
steps:
- name: test
type: run
when: |
build.event == "pull_request"
and
build.target == "main"
spec:
container: ruby
script: |-
bundle install --jobs=3 --retry=3
rake

This condition runs the step for pull request events where the target branch is not main.

        when: |
build.event == "pull_request"
and
build.target != "main"

This condition runs the step only when a pull request is created based on the action.

        when: build.action == "pullreq_created"

Branch

Limit execution based on the target branch.

This pipeline runs the build step when the target branch is main, or starts with feature/.

kind: pipeline
spec:
stages:
- type: ci
spec:
steps:
- name: build
type: run
when: |
build.target == "main"
or
build.target startsWith "feature/"
spec:
container: golang
script: |-
go build
go test

This condition uses a regular expression to achieve the same behavior.

        when: build.target matches "main|feature/.*"

Event

Limit execution based on the event.

This pipeline runs the clean cache step only for manually triggered pipelines.

kind: pipeline
spec:
stages:
- type: ci
spec:
steps:
- name: clean cache
type: run
when: build.event == "manual"
spec:
container: node:18
script: |-
npm cache clean --force

Reference

Limit execution based on the git reference.

This pipeline runs the build step for branch names that start with feature-, or for tags.

kind: pipeline
spec:
stages:
- type: ci
spec:
steps:
- name: build
type: run
when: |
build.ref startsWith "refs/heads/feature-"
or
build.ref startsWith "refs/tags/"
spec:
container: golang
script: |-
go build
go test

Status

Limit execution based on the pipeline status.

This pipeline runs the notify step only when the test step fails.

kind: pipeline
spec:
stages:
- type: ci
spec:
steps:
- name: test
type: run
spec:
container: gradle:jdk10
script: |-
gradle assemble
gradle check

- name: notify
type: plugin
when: failure()
spec:
name: slack
inputs:
webhook: ${{ secrets.get("slack_webhook") }}

This condition will always run the step.

        when: always()