{
  "title": "Woodpecker CI configuration file",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/woodpecker-ci/woodpecker/main/pipeline/frontend/yaml/linter/schema/schema.json",
  "description": "Schema of a Woodpecker pipeline file. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax",
  "type": "object",
  "required": ["steps"],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "variables": {
      "description": "Use yaml aliases to define variables. Read more: https://woodpecker-ci.org/docs/usage/advanced-usage"
    },
    "clone": {
      "$ref": "#/definitions/clone"
    },
    "skip_clone": {
      "type": "boolean"
    },
    "when": {
      "$ref": "#/definitions/workflow_when"
    },
    "steps": {
      "$ref": "#/definitions/step_list"
    },
    "services": {
      "$ref": "#/definitions/services"
    },
    "workspace": {
      "$ref": "#/definitions/workspace"
    },
    "matrix": {
      "$ref": "#/definitions/matrix"
    },
    "labels": {
      "$ref": "#/definitions/labels"
    },
    "depends_on": {
      "type": "array",
      "minLength": 1,
      "items": {
        "type": "string"
      }
    },
    "runs_on": {
      "type": "array",
      "minLength": 1,
      "items": {
        "type": "string"
      }
    }
  },
  "definitions": {
    "string_or_string_slice": {
      "oneOf": [
        {
          "type": "array",
          "minLength": 1,
          "items": {
            "type": "string"
          }
        },
        {
          "type": "string"
        }
      ]
    },
    "clone": {
      "description": "Configures the clone step. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#clone",
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "git": {
              "type": "object",
              "properties": {
                "image": {
                  "$ref": "#/definitions/step_image"
                },
                "settings": {
                  "$ref": "#/definitions/clone_settings"
                }
              }
            }
          }
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/step"
          },
          "minLength": 1
        }
      ]
    },
    "clone_settings": {
      "description": "Change the settings of your clone plugin. Read more: https://woodpecker-ci.org/plugins/git-clone",
      "type": "object",
      "properties": {
        "depth": {
          "type": "number",
          "description": "If specified, uses git's --depth option to create a shallow clone with a limited number of commits, overwritten by partial"
        },
        "recursive": {
          "type": "boolean",
          "default": false,
          "description": "Clones submodules recursively"
        },
        "partial": {
          "type": "boolean",
          "description": "Only fetch the one commit and it's blob objects to resolve all files, overwrite depth with 1"
        },
        "lfs": {
          "type": "boolean",
          "default": true,
          "description": "Set this to false to disable retrieval of LFS files"
        },
        "tags": {
          "type": "boolean",
          "description": "Fetches tags when set to true, default is false if event is not tag else true"
        }
      },
      "additionalProperties": {
        "type": ["boolean", "string", "number", "array", "object"]
      }
    },
    "step_list": {
      "description": "The steps section defines a list of steps which will be executed serially, in the order in which they are defined. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/step"
          },
          "minProperties": 1
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/step"
          },
          "minLength": 1
        }
      ]
    },
    "workflow_when": {
      "description": "Whole workflow can be skipped based on conditions. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#when---global-workflow-conditions",
      "oneOf": [
        {
          "type": "array",
          "minLength": 1,
          "items": {
            "$ref": "#/definitions/workflow_when_condition"
          }
        },
        {
          "$ref": "#/definitions/workflow_when_condition"
        }
      ]
    },
    "workflow_when_condition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "repo": {
          "description": "Execute a step only on a specific repository. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#repo",
          "$ref": "#/definitions/constraint_list"
        },
        "branch": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#branch",
          "$ref": "#/definitions/constraint_list"
        },
        "event": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#event",
          "default": [],
          "$ref": "#/definitions/event_constraint_list"
        },
        "ref": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#ref",
          "type": "string"
        },
        "cron": {
          "description": "filter cron by title. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#cron",
          "$ref": "#/definitions/constraint_list"
        },
        "platform": {
          "description": "Execute a step only on a specific platform. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#platform",
          "$ref": "#/definitions/constraint_list"
        },
        "instance": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#instance",
          "$ref": "#/definitions/constraint_list"
        },
        "path": {
          "description": "Execute a step only on commit with certain files added/removed/modified. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#path",
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "object",
              "properties": {
                "include": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "exclude": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "ignore_message": {
                  "type": "string"
                },
                "on_empty": {
                  "type": "boolean"
                }
              },
              "additionalProperties": false
            }
          ]
        },
        "evaluate": {
          "description": "Execute a step only if the expression evaluates to true. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#evaluate",
          "type": "string"
        }
      }
    },
    "step": {
      "description": "A step of your workflow executes either arbitrary commands or uses a plugin. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
      "anyOf": [
        {
          "$ref": "#/definitions/commands_step"
        },
        {
          "$ref": "#/definitions/plugin_step"
        }
      ]
    },
    "commands_step": {
      "description": "Every step of your pipeline executes arbitrary commands inside a specified docker container. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
      "type": "object",
      "additionalProperties": false,
      "required": ["image"],
      "allOf": [
        {
          "if": {
            "properties": {
              "detach": {
                "const": true
              }
            }
          },
          "then": {},
          "else": {
            "anyOf": [
              {
                "required": ["commands"]
              },
              {
                "required": ["entrypoint"]
              }
            ]
          }
        }
      ],
      "properties": {
        "name": {
          "description": "The name of the step. Can be used if using the array style steps list.",
          "type": "string"
        },
        "image": {
          "$ref": "#/definitions/step_image"
        },
        "privileged": {
          "$ref": "#/definitions/step_privileged"
        },
        "pull": {
          "$ref": "#/definitions/step_pull"
        },
        "commands": {
          "$ref": "#/definitions/step_commands"
        },
        "environment": {
          "$ref": "#/definitions/step_environment"
        },
        "directory": {
          "$ref": "#/definitions/step_directory"
        },
        "when": {
          "$ref": "#/definitions/step_when"
        },
        "volumes": {
          "$ref": "#/definitions/step_volumes"
        },
        "depends_on": {
          "description": "Execute a step after another step has finished.",
          "$ref": "#/definitions/string_or_string_slice"
        },
        "detach": {
          "description": "Detach a step to run in background until pipeline finishes. Read more: https://woodpecker-ci.org/docs/usage/services#detachment",
          "type": "boolean"
        },
        "failure": {
          "description": "How to handle the failure of this step. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#failure",
          "type": "string",
          "enum": ["fail", "ignore"],
          "default": "fail"
        },
        "backend_options": {
          "$ref": "#/definitions/step_backend_options"
        },
        "entrypoint": {
          "description": "Defines container entrypoint.",
          "$ref": "#/definitions/string_or_string_slice"
        },
        "dns": {
          "description": "Change DNS server for step. Only allowed if 'Trusted Network' option is enabled in repo settings by an admin. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#dns",
          "$ref": "#/definitions/string_or_string_slice"
        },
        "dns_search": {
          "description": "Change DNS lookup domain for step. Only allowed if 'Trusted Network' option is enabled in repo settings by an admin. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#dns",
          "$ref": "#/definitions/string_or_string_slice"
        }
      }
    },
    "plugin_step": {
      "description": "Plugins let you execute predefined functions in a more secure context. Read more: https://woodpecker-ci.org/docs/usage/plugins/overview",
      "type": "object",
      "additionalProperties": false,
      "required": ["image"],
      "properties": {
        "name": {
          "description": "The name of the step. Can be used if using the array style steps list.",
          "type": "string"
        },
        "image": {
          "$ref": "#/definitions/step_image"
        },
        "privileged": {
          "$ref": "#/definitions/step_privileged"
        },
        "pull": {
          "$ref": "#/definitions/step_pull"
        },
        "directory": {
          "$ref": "#/definitions/step_directory"
        },
        "settings": {
          "$ref": "#/definitions/step_settings"
        },
        "when": {
          "$ref": "#/definitions/step_when"
        },
        "volumes": {
          "$ref": "#/definitions/step_volumes"
        },
        "depends_on": {
          "description": "Execute a step after another step has finished.",
          "$ref": "#/definitions/string_or_string_slice"
        },
        "detach": {
          "description": "Detach a step to run in background until pipeline finishes. Read more: https://woodpecker-ci.org/docs/usage/services#detachment",
          "type": "boolean"
        },
        "failure": {
          "description": "How to handle the failure of this step. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#failure",
          "type": "string",
          "enum": ["fail", "ignore"],
          "default": "fail"
        },
        "backend_options": {
          "$ref": "#/definitions/step_backend_options"
        }
      }
    },
    "step_when": {
      "description": "Steps can be skipped based on conditions. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#when---conditional-execution",
      "oneOf": [
        {
          "type": "array",
          "minLength": 1,
          "items": {
            "$ref": "#/definitions/step_when_condition"
          }
        },
        {
          "$ref": "#/definitions/step_when_condition"
        }
      ]
    },
    "step_when_condition": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "repo": {
          "description": "Execute a step only on a specific repository. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#repo",
          "$ref": "#/definitions/constraint_list"
        },
        "branch": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#branch",
          "$ref": "#/definitions/constraint_list"
        },
        "event": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#event",
          "$ref": "#/definitions/event_constraint_list"
        },
        "ref": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#ref",
          "type": "string"
        },
        "cron": {
          "description": "filter cron by title. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#cron",
          "$ref": "#/definitions/constraint_list"
        },
        "status": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#status",
          "oneOf": [
            {
              "type": "array",
              "minLength": 1,
              "items": {
                "type": "string",
                "enum": ["success", "failure"]
              }
            },
            {
              "type": "string",
              "enum": ["success", "failure"]
            }
          ]
        },
        "platform": {
          "description": "Execute a step only on a specific platform. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#platform",
          "$ref": "#/definitions/constraint_list"
        },
        "matrix": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/matrix-workflows",
          "type": "object",
          "additionalProperties": {
            "type": ["boolean", "string", "number"]
          }
        },
        "instance": {
          "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#instance",
          "$ref": "#/definitions/constraint_list"
        },
        "path": {
          "description": "Execute a step only on commit with certain files added/removed/modified. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#path",
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "object",
              "properties": {
                "include": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "exclude": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "ignore_message": {
                  "type": "string"
                },
                "on_empty": {
                  "type": "boolean"
                }
              },
              "additionalProperties": false
            }
          ]
        },
        "evaluate": {
          "description": "Execute a step only if the expression evaluates to true. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#evaluate",
          "type": "string"
        }
      }
    },
    "event_enum": {
      "enum": [
        "push",
        "pull_request",
        "pull_request_closed",
        "pull_request_metadata",
        "tag",
        "deployment",
        "cron",
        "manual",
        "release"
      ]
    },
    "event_constraint_list": {
      "oneOf": [
        {
          "$ref": "#/definitions/event_enum"
        },
        {
          "type": "array",
          "minLength": 1,
          "items": {
            "$ref": "#/definitions/event_enum"
          }
        }
      ]
    },
    "constraint_list": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "minLength": 1,
          "items": {
            "type": "string"
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "include": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "array",
                  "minLength": 1,
                  "items": {
                    "type": "string"
                  }
                }
              ]
            },
            "exclude": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "array",
                  "minLength": 1,
                  "items": {
                    "type": "string"
                  }
                }
              ]
            }
          }
        }
      ]
    },
    "step_image": {
      "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#image",
      "type": "string"
    },
    "step_privileged": {
      "description": "Run the step in privileged mode. Read more: https://woodpecker-ci.org/docs/next/usage/workflow-syntax#privileged-mode",
      "type": "boolean",
      "default": false
    },
    "step_pull": {
      "description": "Always pull the latest image on pipeline execution Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#image",
      "type": "boolean"
    },
    "step_commands": {
      "description": "Commands of every pipeline step are executed serially as if you would enter them into your local shell. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#commands",
      "oneOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minLength": 1
        },
        {
          "type": "string"
        }
      ]
    },
    "step_environment": {
      "description": "Pass environment variables to a pipeline step. Read more: https://woodpecker-ci.org/docs/usage/environment",
      "type": "object",
      "additionalProperties": {
        "type": ["boolean", "string", "number", "array", "object"]
      }
    },
    "step_settings": {
      "description": "Change the settings of your plugin. Read more: https://woodpecker-ci.org/docs/usage/plugins/overview",
      "type": "object",
      "additionalProperties": {
        "type": ["boolean", "string", "number", "array", "object"]
      }
    },
    "step_volumes": {
      "description": "Mount files or folders from the host machine into your step container. Read more: https://woodpecker-ci.org/docs/usage/volumes",
      "type": "array",
      "items": {
        "type": "string"
      },
      "minLength": 1
    },
    "step_directory": {
      "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#directory",
      "type": "string"
    },
    "step_backend_options": {
      "description": "Advanced options for the different agent backends",
      "type": "object",
      "properties": {
        "kubernetes": {
          "$ref": "#/definitions/step_backend_kubernetes"
        }
      }
    },
    "step_backend_kubernetes": {
      "description": "Advanced options for the kubernetes agent backends",
      "type": "object",
      "properties": {
        "labels": {
          "type": "object",
          "additionalProperties": {
            "type": ["boolean", "string", "number"]
          }
        },
        "annotations": {
          "type": "object",
          "additionalProperties": {
            "type": ["boolean", "string", "number"]
          }
        },
        "tolerations": {
          "description": "The tolerations section defines a list of references to the native Kubernetes tolerations. Read more: https://woodpecker-ci.org/docs/administration/configuration/backends/kubernetes#tolerations",
          "type": "array",
          "items": {
            "$ref": "#/definitions/step_backend_kubernetes_toleration_object"
          },
          "minLength": 1
        },
        "securityContext": {
          "$ref": "#/definitions/step_backend_kubernetes_security_context"
        },
        "runtimeClassName": {
          "description": "Read more: https://woodpecker-ci.org/docs/administration/configuration/backends/kubernetes#runtimeclassname",
          "type": "string"
        },
        "secrets": {
          "description": "The secrets section defines a list of references to the native Kubernetes secrets",
          "type": "array",
          "items": {
            "$ref": "#/definitions/step_kubernetes_secret"
          },
          "minLength": 1
        }
      }
    },
    "step_backend_kubernetes_resources": {
      "description": "Resources for the kubernetes backend. Read more: https://woodpecker-ci.org/docs/administration/configuration/backends/kubernetes#step-specific-configuration",
      "type": "object",
      "properties": {
        "requests": {
          "$ref": "#/definitions/step_kubernetes_resources_object"
        },
        "limits": {
          "$ref": "#/definitions/step_kubernetes_resources_object"
        }
      }
    },
    "step_backend_kubernetes_security_context": {
      "description": "Pods / containers security context. Read more: https://woodpecker-ci.org/docs/administration/configuration/backends/kubernetes#security-context",
      "type": "object",
      "properties": {
        "privileged": {
          "type": "boolean"
        },
        "runAsNonRoot": {
          "type": "boolean"
        },
        "runAsUser": {
          "type": "number"
        },
        "runAsGroup": {
          "type": "number"
        },
        "fsGroup": {
          "type": "number"
        },
        "seccompProfile": {
          "$ref": "#/definitions/step_backend_kubernetes_secprofile"
        },
        "apparmorProfile": {
          "$ref": "#/definitions/step_backend_kubernetes_secprofile"
        }
      }
    },
    "step_backend_kubernetes_secprofile": {
      "description": "Pods / containers security profile. Read more: https://woodpecker-ci.org/docs/administration/configuration/backends/kubernetes#step-specific-configuration",
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "localhostProfile": {
          "type": "string"
        }
      }
    },
    "step_kubernetes_resources_object": {
      "description": "A list of kubernetes resource mappings",
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "step_backend_kubernetes_service_account": {
      "description": "serviceAccountName to be use by job. Read more: https://woodpecker-ci.org/docs/administration/configuration/backends/kubernetes#service-account",
      "type": "object",
      "properties": {
        "requests": {
          "$ref": "#/definitions/step_kubernetes_service_account_object"
        },
        "limits": {
          "$ref": "#/definitions/step_kubernetes_service_account_object"
        }
      }
    },
    "step_kubernetes_service_account_object": {
      "description": "A list of kubernetes resource mappings",
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "step_kubernetes_secret": {
      "description": "A reference to a native Kubernetes secret",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "name": {
          "description": "The name of the secret. Can be used if using the array style secrets list.",
          "type": "string"
        },
        "key": {
          "description": "The key of the secret to select from.",
          "type": "string"
        },
        "target": {
          "$ref": "#/definitions/step_kubernetes_secret_target"
        }
      }
    },
    "step_kubernetes_secret_target": {
      "description": "A target which a native Kubernetes secret maps to.",
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "env": {
              "description": "The name of the environment variable which secret maps to.",
              "type": "string"
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "file": {
              "description": "The filename (path) which secret maps to.",
              "type": "string"
            }
          }
        }
      ]
    },
    "step_backend_kubernetes_toleration_object": {
      "description": "Toleration entry for the kubernetes backend.",
      "type": "object",
      "properties": {
        "key": {
          "type": "string"
        },
        "operator": {
          "type": "string"
        },
        "value": {
          "type": "string"
        },
        "effect": {
          "type": "string"
        },
        "tolerationSeconds": {
          "type": "integer"
        }
      }
    },
    "services": {
      "description": "Read more: https://woodpecker-ci.org/docs/usage/services",
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/service"
          },
          "minProperties": 1
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/service"
          },
          "minLength": 1
        }
      ]
    },
    "service": {
      "description": "Read more: https://woodpecker-ci.org/docs/usage/services",
      "type": "object",
      "additionalProperties": false,
      "minProperties": 1,
      "required": ["image"],
      "properties": {
        "name": {
          "description": "The name of the service. Can be used if using the array style services list",
          "type": "string"
        },
        "image": {
          "$ref": "#/definitions/step_image"
        },
        "privileged": {
          "$ref": "#/definitions/step_privileged"
        },
        "pull": {
          "$ref": "#/definitions/step_pull"
        },
        "commands": {
          "$ref": "#/definitions/step_commands"
        },
        "environment": {
          "$ref": "#/definitions/step_environment"
        },
        "directory": {
          "$ref": "#/definitions/step_directory"
        },
        "settings": {
          "$ref": "#/definitions/step_settings"
        },
        "when": {
          "$ref": "#/definitions/step_when"
        },
        "volumes": {
          "$ref": "#/definitions/step_volumes"
        },
        "backend_options": {
          "$ref": "#/definitions/step_backend_options"
        },
        "ports": {
          "description": "expose ports to which other steps can connect to",
          "type": "array",
          "items": {
            "oneOf": [
              {
                "type": "number"
              },
              {
                "type": "string"
              }
            ]
          },
          "minLength": 1
        }
      }
    },
    "workspace": {
      "description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#workspace",
      "type": "object",
      "additionalProperties": true
    },
    "matrix": {
      "description": "Execute pipeline for each matrix combination. Read more: https://woodpecker-ci.org/docs/usage/matrix-workflows",
      "type": "object",
      "properties": {
        "include": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "minLength": 1
        }
      },
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": ["boolean", "string", "number"]
        },
        "minLength": 1
      }
    },
    "labels": {
      "description": "Configures the labels used for the agent selection. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#labels",
      "type": "object",
      "additionalProperties": {
        "type": ["boolean", "string", "number"]
      }
    }
  }
}
