Skip to content

Instantly share code, notes, and snippets.

@Thomas-Smyth
Created January 3, 2023 09:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Thomas-Smyth/c5f70c51a50c7ab3f76769ef1213b276 to your computer and use it in GitHub Desktop.
Save Thomas-Smyth/c5f70c51a50c7ab3f76769ef1213b276 to your computer and use it in GitHub Desktop.
{
"type": "object",
"properties": {
"apiVersion": {
"type": "string",
"const": "v1"
},
"arguments": {
"type": "object",
"description": "A set of arguments that can be referenced in a template using '${args.argumentName}'.",
"properties": {},
"additionalProperties": true
},
"spec": {
"$ref": "#/$defs/V1TemplateNodeSchema"
}
},
"required": [
"apiVersion",
"spec"
],
"additionalProperties": false,
"$defs": {
"V1TemplateWorkflowSchema": {
"type": "object",
"description": "The specification for the workflow node.",
"properties": {
"type": {
"type": "string",
"examples": [
"sequential"
],
"description": "The type of workflow. If set to `sequential`, nodes in the workflow will run in order. If set to `parallel`, nodes will run simultaneously.",
"enum": [
"sequential",
"parallel"
]
},
"steps": {
"type": "array",
"description": "An array of nodes belonging to the workflow.",
"items": {
"$ref": "#/$defs/V1TemplateNodeSchema"
}
}
},
"required": [
"type",
"steps"
],
"additionalProperties": false
},
"V1TemplateNodeSchema": {
"description": "A node representing an action to be performed as part of the template.",
"oneOf": [
{
"type": "object",
"description": "Workflow node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Workflow"
],
"description": "The kind of node.",
"const": "Workflow"
},
"spec": {
"description": "The specification for the Workflow node.",
"$ref": "#/$defs/V1TemplateWorkflowSchema"
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "BuildService node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"BuildService"
],
"description": "The kind of node.",
"const": "BuildService"
},
"spec": {
"type": "object",
"description": "The specification for the BuildService node.",
"properties": {
"name": {
"description": "The name of the service.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Service"
],
"description": "The name of the service.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the service.",
"oneOf": [
{
"type": "string",
"examples": [
"A service description"
],
"description": "A description of the service.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"deploymentPlan"
],
"additionalProperties": false
},
"vcsData": {
"type": "object",
"properties": {
"projectUrl": {
"description": "URL of the Git repo to build.",
"oneOf": [
{
"type": "string",
"examples": [
"https://github.com/northflank/gatsby-with-northflank"
],
"description": "URL of the Git repo to build.",
"pattern": "^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectType": {
"description": "The VCS provider to use.",
"oneOf": [
{
"type": "string",
"examples": [
"github"
],
"description": "The VCS provider to use.",
"enum": [
"bitbucket",
"gitlab",
"github",
"self-hosted"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"selfHostedVcsId": {
"oneOf": [
{
"oneOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9-]+\\/[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
]
},
"accountLogin": {
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.",
"oneOf": [
{
"type": "string",
"examples": [
"github-user"
],
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"projectUrl",
"projectType"
],
"additionalProperties": false
},
"buildSettings": {
"type": "object",
"properties": {
"dockerfile": {
"type": "object",
"properties": {
"buildEngine": {
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"oneOf": [
{
"type": "string",
"examples": [
"kaniko"
],
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"default": "kaniko",
"enum": [
"kaniko",
"buildkit"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerFilePath": {
"description": "The file path of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/Dockerfile"
],
"description": "The file path of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerWorkDir": {
"description": "The working directory of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should intermediate image layers be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should intermediate image layers be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"dockerFilePath",
"dockerWorkDir"
],
"additionalProperties": false
},
"buildpack": {
"type": "object",
"properties": {
"builder": {
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"oneOf": [
{
"type": "string",
"examples": [
"HEROKU_22_CLASSIC"
],
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"default": "HEROKU_22_CLASSIC",
"enum": [
"HEROKU_22",
"HEROKU_22_CLASSIC",
"HEROKU_20",
"HEROKU_18",
"GOOGLE_V1",
"CNB_ALPINE",
"CNB_BIONIC",
"PAKETO_TINY",
"PAKETO_BASE",
"PAKETO_FULL"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildpackLocators": {
"type": "array",
"description": "Array of custom Buildpacks to use.",
"default": [],
"items": {
"description": "Url or registry identifier of custom Buildpack.",
"oneOf": [
{
"type": "string",
"examples": [
"https://buildpack-registry.heroku.com/cnb/mars/create-react-app"
],
"description": "Url or registry identifier of custom Buildpack."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"buildContext": {
"description": "The working directory to build in.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory to build in.",
"default": "/",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should build dependencies be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should build dependencies be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"buildConfiguration": {
"type": "object",
"properties": {
"prRestrictions": {
"type": "array",
"description": "An array of pull request build rules. Only supported for build services. Each commit belonging to a pull request on a branch that matches one of the provided build rules will be built automatically.",
"items": {
"type": "string",
"examples": [
"feature/*"
],
"description": "A pull request build rule. Can contain `*` as a wildcard to match multiple branch names. For example, `feature/*` will build all commits from pull requests from branches that start with `feature/`.",
"pattern": "^[^?:@$~ [\\]{}]*$"
}
},
"branchRestrictions": {
"type": "array",
"description": "An array of branch build rules. Only supported for build services. Each commit belonging to a branch that matches one of the provided build rules will be built automatically.",
"items": {
"type": "string",
"examples": [
"feature/*"
],
"description": "A branch build rule. Can contain `*` as a wildcard to match multiple branch names. For example, `feature/*` will build all commits from branches that start with `feature/`.",
"pattern": "^[^?:@$~ [\\]{}]*$"
}
},
"pathIgnoreRules": {
"type": "array",
"description": "An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"README.md"
],
"description": "A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.",
"maxLength": 260
}
},
"isAllowList": {
"type": "boolean",
"examples": [
false
],
"description": "If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."
},
"ciIgnoreFlagsEnabled": {
"type": "boolean",
"description": "If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."
},
"ciIgnoreFlags": {
"type": "array",
"examples": [
[
"[skip ci]",
"[ci skip]",
"[no ci]",
"[skip nf]",
"[nf skip]",
"[northflank skip]",
"[skip northflank]"
]
],
"description": "An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"[skip ci]"
],
"description": "A commit ignore flag.",
"maxLength": 72
}
},
"dockerfileTarget": {
"type": "string",
"description": "If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."
},
"includeGitFolder": {
"type": "boolean",
"description": "Include .git folder inside the build context"
},
"fullGitClone": {
"type": "boolean",
"description": "Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."
}
},
"additionalProperties": false
},
"buildArguments": {
"type": "object",
"examples": [
{
"ARGUMENT_1": "abcdef",
"ARGUMENT_2": "12345"
}
],
"description": "An object containing the build arguments to set for the service",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"buildFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
}
},
"required": [
"name",
"billing",
"vcsData",
"buildSettings"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "CombinedService node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"CombinedService"
],
"description": "The kind of node.",
"const": "CombinedService"
},
"spec": {
"type": "object",
"description": "The specification for the CombinedService node.",
"properties": {
"name": {
"description": "The name of the service.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Service"
],
"description": "The name of the service.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the service.",
"oneOf": [
{
"type": "string",
"examples": [
"A service description"
],
"description": "A description of the service.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"deploymentPlan"
],
"additionalProperties": false
},
"deployment": {
"type": "object",
"properties": {
"instances": {
"description": "The number of instances to run the service on.",
"oneOf": [
{
"type": "integer",
"examples": [
1
],
"description": "The number of instances to run the service on.",
"minimum": 0
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildpack": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"examples": [
"default"
],
"enum": [
"default",
"customProcess",
"customCommand",
"customEntrypointCustomCommand",
"originalEntrypointCustomCommand"
]
},
"customProcess": {
"type": [
"string",
"null"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"docker": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"enum": [
"default",
"customEntrypoint",
"customCommand",
"customEntrypointCustomCommand"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"storage": {
"type": "object",
"properties": {
"ephemeralStorage": {
"type": "object",
"properties": {
"storageSize": {
"type": "integer",
"examples": [
1024
],
"description": "Ephemeral storage per container in MB",
"enum": [
1024,
2048,
5120,
10240,
20480
],
"minimum": 1024,
"maximum": 20480
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"strategy": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Configures the instance roll out strategy of your service. Currently only available via feature flag.",
"enum": [
"recreate",
"rollout-steady",
"rollout-balanced",
"rollout-fast"
]
}
},
"additionalProperties": false
}
},
"required": [
"instances"
],
"additionalProperties": false
},
"ports": {
"type": "array",
"default": [],
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"examples": [
"port-1"
],
"description": "The name used to identify the port.",
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$",
"minLength": 3,
"maxLength": 8
},
"internalPort": {
"type": "integer",
"examples": [
8080
],
"description": "The port number.",
"minimum": 1,
"maximum": 65535
},
"public": {
"type": "boolean",
"examples": [
true
],
"description": "If true, the port will be exposed publicly.",
"default": false
},
"security": {
"type": "object",
"default": {
"credentials": [],
"policies": []
},
"properties": {
"credentials": {
"type": "array",
"description": "An array of credentials to access the service.",
"default": [],
"items": {
"type": "object",
"properties": {
"username": {
"type": "string",
"examples": [
"admin"
],
"description": "The username to access the service",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
},
"password": {
"type": "string",
"examples": [
"password123"
],
"description": "The password to access the service with this username."
},
"type": {
"type": "string",
"examples": [
"basic-auth"
],
"description": "The type of authentication used",
"const": "basic-auth"
}
},
"required": [
"username",
"password",
"type"
],
"additionalProperties": false
}
},
"policies": {
"type": "array",
"description": "An array of IP address policies.",
"default": [],
"items": {
"type": "object",
"properties": {
"addresses": {
"type": "array",
"description": "An array of IP addresses used for this rule",
"items": {
"type": "string",
"examples": [
"127.0.0.1"
],
"description": "An IP address used by this rule",
"format": "ipv4"
}
},
"action": {
"type": "string",
"examples": [
"DENY"
],
"description": "The action for this rule.",
"enum": [
"ALLOW",
"DENY"
]
}
},
"required": [
"addresses",
"action"
],
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"domains": {
"type": "array",
"description": "An array of domains to redirect to this port. Each domain must first be verified and registered to your account.",
"default": [],
"items": {
"type": "string",
"examples": [
"app.example.com"
],
"description": "A domain to redirect to this port."
}
},
"disableNfDomain": {
"type": "boolean",
"description": "Disable routing on the default code.run domain for public HTTP ports with custom domains.",
"default": false
},
"protocol": {
"type": "string",
"examples": [
"HTTP"
],
"description": "The protocol to use for the port."
}
},
"required": [
"name",
"internalPort",
"protocol"
],
"additionalProperties": false
}
},
"vcsData": {
"type": "object",
"properties": {
"projectUrl": {
"description": "URL of the Git repo to build.",
"oneOf": [
{
"type": "string",
"examples": [
"https://github.com/northflank/gatsby-with-northflank"
],
"description": "URL of the Git repo to build.",
"pattern": "^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectType": {
"description": "The VCS provider to use.",
"oneOf": [
{
"type": "string",
"examples": [
"github"
],
"description": "The VCS provider to use.",
"enum": [
"bitbucket",
"gitlab",
"github",
"self-hosted"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"selfHostedVcsId": {
"oneOf": [
{
"oneOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9-]+\\/[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
]
},
"accountLogin": {
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.",
"oneOf": [
{
"type": "string",
"examples": [
"github-user"
],
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectBranch": {
"description": "The name of the branch to use.",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "The name of the branch to use."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"projectUrl",
"projectType",
"projectBranch"
],
"additionalProperties": false
},
"buildSettings": {
"type": "object",
"properties": {
"dockerfile": {
"type": "object",
"properties": {
"buildEngine": {
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"oneOf": [
{
"type": "string",
"examples": [
"kaniko"
],
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"default": "kaniko",
"enum": [
"kaniko",
"buildkit"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerFilePath": {
"description": "The file path of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/Dockerfile"
],
"description": "The file path of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerWorkDir": {
"description": "The working directory of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should intermediate image layers be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should intermediate image layers be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"dockerFilePath",
"dockerWorkDir"
],
"additionalProperties": false
},
"buildpack": {
"type": "object",
"properties": {
"builder": {
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"oneOf": [
{
"type": "string",
"examples": [
"HEROKU_22_CLASSIC"
],
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"default": "HEROKU_22_CLASSIC",
"enum": [
"HEROKU_22",
"HEROKU_22_CLASSIC",
"HEROKU_20",
"HEROKU_18",
"GOOGLE_V1",
"CNB_ALPINE",
"CNB_BIONIC",
"PAKETO_TINY",
"PAKETO_BASE",
"PAKETO_FULL"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildpackLocators": {
"type": "array",
"description": "Array of custom Buildpacks to use.",
"default": [],
"items": {
"description": "Url or registry identifier of custom Buildpack.",
"oneOf": [
{
"type": "string",
"examples": [
"https://buildpack-registry.heroku.com/cnb/mars/create-react-app"
],
"description": "Url or registry identifier of custom Buildpack."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"buildContext": {
"description": "The working directory to build in.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory to build in.",
"default": "/",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should build dependencies be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should build dependencies be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"buildConfiguration": {
"type": "object",
"default": {
"pathIgnoreRules": [],
"isAllowList": false,
"ciIgnoreFlagsEnabled": false
},
"properties": {
"pathIgnoreRules": {
"type": "array",
"description": "An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"README.md"
],
"description": "A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.",
"maxLength": 260
}
},
"isAllowList": {
"type": "boolean",
"examples": [
false
],
"description": "If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."
},
"ciIgnoreFlagsEnabled": {
"type": "boolean",
"description": "If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."
},
"ciIgnoreFlags": {
"type": "array",
"examples": [
[
"[skip ci]",
"[ci skip]",
"[no ci]",
"[skip nf]",
"[nf skip]",
"[northflank skip]",
"[skip northflank]"
]
],
"description": "An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"[skip ci]"
],
"description": "A commit ignore flag.",
"maxLength": 72
}
},
"dockerfileTarget": {
"type": "string",
"description": "If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."
},
"includeGitFolder": {
"type": "boolean",
"description": "Include .git folder inside the build context"
},
"fullGitClone": {
"type": "boolean",
"description": "Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."
}
},
"additionalProperties": false
},
"runtimeEnvironment": {
"type": "object",
"examples": [
{
"VARIABLE_1": "abcdef",
"VARIABLE_2": "12345"
}
],
"description": "An object containing the runtime environment to set for the service. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"runtimeFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"buildArguments": {
"type": "object",
"examples": [
{
"ARGUMENT_1": "abcdef",
"ARGUMENT_2": "12345"
}
],
"description": "An object containing the build arguments to set for the service. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"buildFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"healthChecks": {
"type": "array",
"description": "An array of health checks.",
"items": {
"type": "object",
"description": "A health check object.",
"properties": {
"protocol": {
"type": "string",
"examples": [
"HTTP"
],
"description": "The protocol to access the health check with.",
"enum": [
"HTTP",
"CMD",
"TCP"
]
},
"type": {
"type": "string",
"examples": [
"readinessProbe"
],
"description": "The type of health check.",
"enum": [
"livenessProbe",
"readinessProbe",
"startupProbe"
]
},
"path": {
"not": {}
},
"cmd": {
"not": {}
},
"port": {
"not": {}
},
"initialDelaySeconds": {
"type": "integer",
"examples": [
10
],
"description": "Initial delay, in seconds, before the health check is first run.",
"minimum": 1,
"maximum": 180
},
"periodSeconds": {
"type": "integer",
"examples": [
60
],
"description": "The time between each check, in seconds.",
"minimum": 10,
"maximum": 600
},
"timeoutSeconds": {
"type": "integer",
"examples": [
1
],
"description": "The time to wait for a response before marking the health check as a failure.",
"minimum": 1,
"maximum": 60
},
"failureThreshold": {
"type": "integer",
"examples": [
3
],
"description": "The maximum number of allowed failures.",
"minimum": 1,
"maximum": 255
},
"successThreshold": {
"not": {}
}
},
"required": [
"protocol",
"type",
"initialDelaySeconds",
"periodSeconds",
"timeoutSeconds",
"failureThreshold"
],
"additionalProperties": false
}
}
},
"required": [
"name",
"billing",
"deployment",
"vcsData",
"buildSettings"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "DeploymentService node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"DeploymentService"
],
"description": "The kind of node.",
"const": "DeploymentService"
},
"spec": {
"type": "object",
"description": "The specification for the DeploymentService node.",
"properties": {
"name": {
"description": "The name of the service.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Service"
],
"description": "The name of the service.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the service.",
"oneOf": [
{
"type": "string",
"examples": [
"A service description"
],
"description": "A description of the service.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"deploymentPlan"
],
"additionalProperties": false
},
"deployment": {
"type": "object",
"properties": {
"instances": {
"description": "The number of instances to run the service on.",
"oneOf": [
{
"type": "integer",
"examples": [
1
],
"description": "The number of instances to run the service on.",
"minimum": 0
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildpack": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"examples": [
"default"
],
"enum": [
"default",
"customProcess",
"customCommand",
"customEntrypointCustomCommand",
"originalEntrypointCustomCommand"
]
},
"customProcess": {
"type": [
"string",
"null"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"docker": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"enum": [
"default",
"customEntrypoint",
"customCommand",
"customEntrypointCustomCommand"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"storage": {
"type": "object",
"properties": {
"ephemeralStorage": {
"type": "object",
"properties": {
"storageSize": {
"type": "integer",
"examples": [
1024
],
"description": "Ephemeral storage per container in MB",
"enum": [
1024,
2048,
5120,
10240,
20480
],
"minimum": 1024,
"maximum": 20480
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"strategy": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Configures the instance roll out strategy of your service. Currently only available via feature flag.",
"enum": [
"recreate",
"rollout-steady",
"rollout-balanced",
"rollout-fast"
]
}
},
"additionalProperties": false
},
"internal": {
"type": "object",
"properties": {
"id": {
"description": "ID of the build service to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"example-build-service"
],
"description": "ID of the build service to deploy",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"branch": {
"description": "Branch to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "Branch to deploy"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildSHA": {
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"examples": [
"latest"
],
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"type": "string"
},
{
"type": "string",
"const": "latest"
}
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildId": {
"description": "ID of the build that should be deployed",
"oneOf": [
{
"type": "string",
"examples": [
"premium-guide-6393"
],
"description": "ID of the build that should be deployed"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
},
"external": {
"type": "object",
"properties": {
"imagePath": {
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"oneOf": [
{
"type": "string",
"examples": [
"nginx:latest"
],
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"pattern": "^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"credentials": {
"description": "ID of the saved credentials to use to access this external image.",
"oneOf": [
{
"type": "string",
"examples": [
"example-credentials"
],
"description": "ID of the saved credentials to use to access this external image.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"imagePath"
],
"additionalProperties": false
},
"releaseFlowControlled": {
"type": "boolean",
"description": "When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."
}
},
"required": [
"instances"
],
"additionalProperties": false
},
"ports": {
"type": "array",
"default": [],
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"examples": [
"port-1"
],
"description": "The name used to identify the port.",
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$",
"minLength": 3,
"maxLength": 8
},
"internalPort": {
"type": "integer",
"examples": [
8080
],
"description": "The port number.",
"minimum": 1,
"maximum": 65535
},
"public": {
"type": "boolean",
"examples": [
true
],
"description": "If true, the port will be exposed publicly.",
"default": false
},
"security": {
"type": "object",
"default": {
"credentials": [],
"policies": []
},
"properties": {
"credentials": {
"type": "array",
"description": "An array of credentials to access the service.",
"default": [],
"items": {
"type": "object",
"properties": {
"username": {
"type": "string",
"examples": [
"admin"
],
"description": "The username to access the service",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
},
"password": {
"type": "string",
"examples": [
"password123"
],
"description": "The password to access the service with this username."
},
"type": {
"type": "string",
"examples": [
"basic-auth"
],
"description": "The type of authentication used",
"const": "basic-auth"
}
},
"required": [
"username",
"password",
"type"
],
"additionalProperties": false
}
},
"policies": {
"type": "array",
"description": "An array of IP address policies.",
"default": [],
"items": {
"type": "object",
"properties": {
"addresses": {
"type": "array",
"description": "An array of IP addresses used for this rule",
"items": {
"type": "string",
"examples": [
"127.0.0.1"
],
"description": "An IP address used by this rule",
"format": "ipv4"
}
},
"action": {
"type": "string",
"examples": [
"DENY"
],
"description": "The action for this rule.",
"enum": [
"ALLOW",
"DENY"
]
}
},
"required": [
"addresses",
"action"
],
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"domains": {
"type": "array",
"description": "An array of domains to redirect to this port. Each domain must first be verified and registered to your account.",
"default": [],
"items": {
"type": "string",
"examples": [
"app.example.com"
],
"description": "A domain to redirect to this port."
}
},
"disableNfDomain": {
"type": "boolean",
"description": "Disable routing on the default code.run domain for public HTTP ports with custom domains.",
"default": false
},
"protocol": {
"type": "string",
"examples": [
"HTTP"
],
"description": "The protocol to use for the port."
}
},
"required": [
"name",
"internalPort",
"protocol"
],
"additionalProperties": false
}
},
"runtimeEnvironment": {
"type": "object",
"examples": [
{
"VARIABLE_1": "abcdef",
"VARIABLE_2": "12345"
}
],
"description": "An object containing the runtime environment to set for the service",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"runtimeFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"healthChecks": {
"type": "array",
"description": "An array of health checks.",
"items": {
"type": "object",
"description": "A health check object.",
"properties": {
"protocol": {
"type": "string",
"examples": [
"HTTP"
],
"description": "The protocol to access the health check with.",
"enum": [
"HTTP",
"CMD",
"TCP"
]
},
"type": {
"type": "string",
"examples": [
"readinessProbe"
],
"description": "The type of health check.",
"enum": [
"livenessProbe",
"readinessProbe",
"startupProbe"
]
},
"path": {
"not": {}
},
"cmd": {
"not": {}
},
"port": {
"not": {}
},
"initialDelaySeconds": {
"type": "integer",
"examples": [
10
],
"description": "Initial delay, in seconds, before the health check is first run.",
"minimum": 1,
"maximum": 180
},
"periodSeconds": {
"type": "integer",
"examples": [
60
],
"description": "The time between each check, in seconds.",
"minimum": 10,
"maximum": 600
},
"timeoutSeconds": {
"type": "integer",
"examples": [
1
],
"description": "The time to wait for a response before marking the health check as a failure.",
"minimum": 1,
"maximum": 60
},
"failureThreshold": {
"type": "integer",
"examples": [
3
],
"description": "The maximum number of allowed failures.",
"minimum": 1,
"maximum": 255
},
"successThreshold": {
"not": {}
}
},
"required": [
"protocol",
"type",
"initialDelaySeconds",
"periodSeconds",
"timeoutSeconds",
"failureThreshold"
],
"additionalProperties": false
}
}
},
"required": [
"name",
"billing",
"deployment"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "CronJob node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"CronJob"
],
"description": "The kind of node.",
"const": "CronJob"
},
"spec": {
"type": "object",
"description": "The specification for the CronJob node.",
"properties": {
"name": {
"description": "The name of the job.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Job"
],
"description": "The name of the job.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the job.",
"oneOf": [
{
"type": "string",
"examples": [
"A job description"
],
"description": "A description of the job.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"deploymentPlan"
],
"additionalProperties": false
},
"backoffLimit": {
"type": "integer",
"examples": [
0
],
"description": "The number of attempts to rerun a job before it is marked as failed.",
"minimum": 0
},
"runOnSourceChange": {
"type": "string",
"examples": [
"never"
],
"description": "Configure when the job should be run if the source image changes.",
"default": "never",
"enum": [
"never",
"cd-promote",
"always"
]
},
"activeDeadlineSeconds": {
"type": "integer",
"examples": [
600
],
"description": "The maximum amount of time, in seconds, for a job to run before it is marked as failed."
},
"deployment": {
"type": "object",
"default": {},
"properties": {
"buildpack": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"examples": [
"default"
],
"enum": [
"default",
"customProcess",
"customCommand",
"customEntrypointCustomCommand",
"originalEntrypointCustomCommand"
]
},
"customProcess": {
"type": [
"string",
"null"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"docker": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"enum": [
"default",
"customEntrypoint",
"customCommand",
"customEntrypointCustomCommand"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"storage": {
"type": "object",
"properties": {
"ephemeralStorage": {
"type": "object",
"properties": {
"storageSize": {
"type": "integer",
"examples": [
1024
],
"description": "Ephemeral storage per container in MB",
"enum": [
1024,
2048,
5120,
10240,
20480
],
"minimum": 1024,
"maximum": 20480
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"vcs": {
"type": "object",
"properties": {
"projectUrl": {
"description": "URL of the Git repo to build.",
"oneOf": [
{
"type": "string",
"examples": [
"https://github.com/northflank/gatsby-with-northflank"
],
"description": "URL of the Git repo to build.",
"pattern": "^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectType": {
"description": "The VCS provider to use.",
"oneOf": [
{
"type": "string",
"examples": [
"github"
],
"description": "The VCS provider to use.",
"enum": [
"bitbucket",
"gitlab",
"github",
"self-hosted"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"selfHostedVcsId": {
"oneOf": [
{
"oneOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9-]+\\/[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
]
},
"accountLogin": {
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.",
"oneOf": [
{
"type": "string",
"examples": [
"github-user"
],
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectBranch": {
"description": "The name of the branch to use.",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "The name of the branch to use."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"projectUrl",
"projectType",
"projectBranch"
],
"additionalProperties": false
},
"external": {
"type": "object",
"properties": {
"imagePath": {
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"oneOf": [
{
"type": "string",
"examples": [
"nginx:latest"
],
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"pattern": "^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"credentials": {
"description": "ID of the saved credentials to use to access this external image.",
"oneOf": [
{
"type": "string",
"examples": [
"example-credentials"
],
"description": "ID of the saved credentials to use to access this external image.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"imagePath"
],
"additionalProperties": false
},
"internal": {
"type": "object",
"properties": {
"id": {
"description": "ID of the build service to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"example-build-service"
],
"description": "ID of the build service to deploy",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"branch": {
"description": "Branch to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "Branch to deploy"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildSHA": {
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"examples": [
"latest"
],
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"type": "string"
},
{
"type": "string",
"const": "latest"
}
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildId": {
"description": "ID of the build that should be deployed",
"oneOf": [
{
"type": "string",
"examples": [
"premium-guide-6393"
],
"description": "ID of the build that should be deployed"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
},
"releaseFlowControlled": {
"type": "boolean",
"description": "When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."
}
},
"additionalProperties": false
},
"buildConfiguration": {
"type": "object",
"default": {
"pathIgnoreRules": [],
"isAllowList": false,
"ciIgnoreFlagsEnabled": false
},
"properties": {
"pathIgnoreRules": {
"type": "array",
"description": "An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"README.md"
],
"description": "A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.",
"maxLength": 260
}
},
"isAllowList": {
"type": "boolean",
"examples": [
false
],
"description": "If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."
},
"ciIgnoreFlagsEnabled": {
"type": "boolean",
"description": "If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."
},
"ciIgnoreFlags": {
"type": "array",
"examples": [
[
"[skip ci]",
"[ci skip]",
"[no ci]",
"[skip nf]",
"[nf skip]",
"[northflank skip]",
"[skip northflank]"
]
],
"description": "An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"[skip ci]"
],
"description": "A commit ignore flag.",
"maxLength": 72
}
},
"dockerfileTarget": {
"type": "string",
"description": "If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."
},
"includeGitFolder": {
"type": "boolean",
"description": "Include .git folder inside the build context"
},
"fullGitClone": {
"type": "boolean",
"description": "Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."
}
},
"additionalProperties": false
},
"buildSettings": {
"type": "object",
"properties": {
"dockerfile": {
"type": "object",
"properties": {
"buildEngine": {
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"oneOf": [
{
"type": "string",
"examples": [
"kaniko"
],
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"default": "kaniko",
"enum": [
"kaniko",
"buildkit"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerFilePath": {
"description": "The file path of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/Dockerfile"
],
"description": "The file path of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerWorkDir": {
"description": "The working directory of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should intermediate image layers be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should intermediate image layers be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"dockerFilePath",
"dockerWorkDir"
],
"additionalProperties": false
},
"buildpack": {
"type": "object",
"properties": {
"builder": {
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"oneOf": [
{
"type": "string",
"examples": [
"HEROKU_22_CLASSIC"
],
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"default": "HEROKU_22_CLASSIC",
"enum": [
"HEROKU_22",
"HEROKU_22_CLASSIC",
"HEROKU_20",
"HEROKU_18",
"GOOGLE_V1",
"CNB_ALPINE",
"CNB_BIONIC",
"PAKETO_TINY",
"PAKETO_BASE",
"PAKETO_FULL"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildpackLocators": {
"type": "array",
"description": "Array of custom Buildpacks to use.",
"default": [],
"items": {
"description": "Url or registry identifier of custom Buildpack.",
"oneOf": [
{
"type": "string",
"examples": [
"https://buildpack-registry.heroku.com/cnb/mars/create-react-app"
],
"description": "Url or registry identifier of custom Buildpack."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"buildContext": {
"description": "The working directory to build in.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory to build in.",
"default": "/",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should build dependencies be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should build dependencies be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"runtimeEnvironment": {
"type": "object",
"examples": [
{
"variable1": "abcdef",
"variable2": "12345"
}
],
"description": "An object containing the runtime environment to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"runtimeFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"buildArguments": {
"type": "object",
"examples": [
{
"variable1": "abcdef",
"variable2": "12345"
}
],
"description": "An object containing the build arguments to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"buildFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"healthChecks": {
"type": "array",
"description": "An array of health checks.",
"items": {
"type": "object",
"description": "A health check object.",
"properties": {
"protocol": {
"type": "string",
"examples": [
"HTTP"
],
"description": "The protocol to access the health check with.",
"enum": [
"HTTP",
"CMD",
"TCP"
]
},
"type": {
"type": "string",
"examples": [
"readinessProbe"
],
"description": "The type of health check.",
"enum": [
"livenessProbe",
"readinessProbe",
"startupProbe"
]
},
"path": {
"not": {}
},
"cmd": {
"not": {}
},
"port": {
"not": {}
},
"initialDelaySeconds": {
"type": "integer",
"examples": [
10
],
"description": "Initial delay, in seconds, before the health check is first run.",
"minimum": 1,
"maximum": 180
},
"periodSeconds": {
"type": "integer",
"examples": [
60
],
"description": "The time between each check, in seconds.",
"minimum": 10,
"maximum": 600
},
"timeoutSeconds": {
"type": "integer",
"examples": [
1
],
"description": "The time to wait for a response before marking the health check as a failure.",
"minimum": 1,
"maximum": 60
},
"failureThreshold": {
"type": "integer",
"examples": [
3
],
"description": "The maximum number of allowed failures.",
"minimum": 1,
"maximum": 255
},
"successThreshold": {
"not": {}
}
},
"required": [
"protocol",
"type",
"initialDelaySeconds",
"periodSeconds",
"timeoutSeconds",
"failureThreshold"
],
"additionalProperties": false
}
},
"schedule": {
"type": "string",
"examples": [
"30 8 * * *"
],
"description": "The cron timer scheduling when to run the job."
},
"concurrencyPolicy": {
"type": "string",
"examples": [
"forbid"
],
"description": "Whether this job should run when another instance of the job is already running. `allow` will enable multiple instances of this job to run. `forbid` will keep the current instance of the job running and stop a new instance from being run. `replace` will terminate any currently running instance of the job and start a new one.",
"enum": [
"allow",
"forbid",
"replace"
]
}
},
"required": [
"name",
"billing",
"backoffLimit",
"schedule",
"concurrencyPolicy"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "ManualJob node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"ManualJob"
],
"description": "The kind of node.",
"const": "ManualJob"
},
"spec": {
"type": "object",
"description": "The specification for the ManualJob node.",
"properties": {
"name": {
"description": "The name of the job.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Job"
],
"description": "The name of the job.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the job.",
"oneOf": [
{
"type": "string",
"examples": [
"A job description"
],
"description": "A description of the job.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"deploymentPlan"
],
"additionalProperties": false
},
"backoffLimit": {
"type": "integer",
"examples": [
0
],
"description": "The number of attempts to rerun a job before it is marked as failed.",
"minimum": 0
},
"runOnSourceChange": {
"type": "string",
"examples": [
"never"
],
"description": "Configure when the job should be run if the source image changes.",
"default": "never",
"enum": [
"never",
"cd-promote",
"always"
]
},
"activeDeadlineSeconds": {
"type": "integer",
"examples": [
600
],
"description": "The maximum amount of time, in seconds, for a job to run before it is marked as failed."
},
"deployment": {
"type": "object",
"default": {},
"properties": {
"buildpack": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"examples": [
"default"
],
"enum": [
"default",
"customProcess",
"customCommand",
"customEntrypointCustomCommand",
"originalEntrypointCustomCommand"
]
},
"customProcess": {
"type": [
"string",
"null"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"docker": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"enum": [
"default",
"customEntrypoint",
"customCommand",
"customEntrypointCustomCommand"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"storage": {
"type": "object",
"properties": {
"ephemeralStorage": {
"type": "object",
"properties": {
"storageSize": {
"type": "integer",
"examples": [
1024
],
"description": "Ephemeral storage per container in MB",
"enum": [
1024,
2048,
5120,
10240,
20480
],
"minimum": 1024,
"maximum": 20480
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"vcs": {
"type": "object",
"properties": {
"projectUrl": {
"description": "URL of the Git repo to build.",
"oneOf": [
{
"type": "string",
"examples": [
"https://github.com/northflank/gatsby-with-northflank"
],
"description": "URL of the Git repo to build.",
"pattern": "^(https:\\/\\/)?((www(\\.[a-zA-Z0-9\\-]{2,})+\\.)?[a-zA-Z0-9\\-]{2,})(\\.([a-zA-Z0-9\\-]{2,}))+(\\/([a-zA-Z0-9\\-._]{2,}))+?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectType": {
"description": "The VCS provider to use.",
"oneOf": [
{
"type": "string",
"examples": [
"github"
],
"description": "The VCS provider to use.",
"enum": [
"bitbucket",
"gitlab",
"github",
"self-hosted"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"selfHostedVcsId": {
"oneOf": [
{
"oneOf": [
{
"type": "string",
"pattern": "^[A-Za-z0-9-]+\\/[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
]
},
"accountLogin": {
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name.",
"oneOf": [
{
"type": "string",
"examples": [
"github-user"
],
"description": "By default, if you have multiple version control accounts of the same provider linked, Northflank will pick a linked account that has access to the repository. If `accountLogin` is provided, Northflank will instead use your linked account with that login name."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"projectBranch": {
"description": "The name of the branch to use.",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "The name of the branch to use."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"projectUrl",
"projectType",
"projectBranch"
],
"additionalProperties": false
},
"external": {
"type": "object",
"properties": {
"imagePath": {
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"oneOf": [
{
"type": "string",
"examples": [
"nginx:latest"
],
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"pattern": "^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"credentials": {
"description": "ID of the saved credentials to use to access this external image.",
"oneOf": [
{
"type": "string",
"examples": [
"example-credentials"
],
"description": "ID of the saved credentials to use to access this external image.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"imagePath"
],
"additionalProperties": false
},
"internal": {
"type": "object",
"properties": {
"id": {
"description": "ID of the build service to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"example-build-service"
],
"description": "ID of the build service to deploy",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"branch": {
"description": "Branch to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "Branch to deploy"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildSHA": {
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"examples": [
"latest"
],
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"type": "string"
},
{
"type": "string",
"const": "latest"
}
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildId": {
"description": "ID of the build that should be deployed",
"oneOf": [
{
"type": "string",
"examples": [
"premium-guide-6393"
],
"description": "ID of the build that should be deployed"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
},
"releaseFlowControlled": {
"type": "boolean",
"description": "When enabled the deployment source will only be set on creation. All changes to the deployment source must be done via a release flow or manually."
}
},
"additionalProperties": false
},
"buildConfiguration": {
"type": "object",
"default": {
"pathIgnoreRules": [],
"isAllowList": false,
"ciIgnoreFlagsEnabled": false
},
"properties": {
"pathIgnoreRules": {
"type": "array",
"description": "An array of path ignore rules. A commit will only be built if a file has been changed that does not match any of the ignore rules. Path ignore rules follow `.gitignore` syntax.",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"README.md"
],
"description": "A path ignore rule, following `.gitignore` syntax. For example, `*.md` will ignore all files ending with `.md`.",
"maxLength": 260
}
},
"isAllowList": {
"type": "boolean",
"examples": [
false
],
"description": "If `true`, the functionality of `pathIgnoreRules` will be inverted. A commit will only be built if a file has been changed that matches one or more of the rules in `pathIgnoreRules`."
},
"ciIgnoreFlagsEnabled": {
"type": "boolean",
"description": "If `true`, enables commit ignore flags. If a commit message contains one or more of the flags in `ciIgnoreFlags`, that commit will not be built."
},
"ciIgnoreFlags": {
"type": "array",
"examples": [
[
"[skip ci]",
"[ci skip]",
"[no ci]",
"[skip nf]",
"[nf skip]",
"[northflank skip]",
"[skip northflank]"
]
],
"description": "An array of commit ignore flags. If a commit message contains one or more of these flags, that commit will not be built. Defaults to `[\"[skip ci]\", \"[ci skip]\", \"[no ci]\", \"[skip nf]\", \"[nf skip]\", \"[northflank skip]\", \"[skip northflank]\"]`",
"maxItems": 200,
"items": {
"type": "string",
"examples": [
"[skip ci]"
],
"description": "A commit ignore flag.",
"maxLength": 72
}
},
"dockerfileTarget": {
"type": "string",
"description": "If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here."
},
"includeGitFolder": {
"type": "boolean",
"description": "Include .git folder inside the build context"
},
"fullGitClone": {
"type": "boolean",
"description": "Include the entire git history as part of the .git folder. Only relevant if \"includeGitFolder\" is set."
}
},
"additionalProperties": false
},
"buildSettings": {
"type": "object",
"properties": {
"dockerfile": {
"type": "object",
"properties": {
"buildEngine": {
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"oneOf": [
{
"type": "string",
"examples": [
"kaniko"
],
"description": "Build engine to use. Defaults to recommended build engine `kaniko`",
"default": "kaniko",
"enum": [
"kaniko",
"buildkit"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerFilePath": {
"description": "The file path of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/Dockerfile"
],
"description": "The file path of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"dockerWorkDir": {
"description": "The working directory of the Dockerfile.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory of the Dockerfile.",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should intermediate image layers be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should intermediate image layers be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"dockerFilePath",
"dockerWorkDir"
],
"additionalProperties": false
},
"buildpack": {
"type": "object",
"properties": {
"builder": {
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"oneOf": [
{
"type": "string",
"examples": [
"HEROKU_22_CLASSIC"
],
"description": "Buildpack stack to use. Defaults to recommended stack `HEROKU_22_CLASSIC`.",
"default": "HEROKU_22_CLASSIC",
"enum": [
"HEROKU_22",
"HEROKU_22_CLASSIC",
"HEROKU_20",
"HEROKU_18",
"GOOGLE_V1",
"CNB_ALPINE",
"CNB_BIONIC",
"PAKETO_TINY",
"PAKETO_BASE",
"PAKETO_FULL"
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildpackLocators": {
"type": "array",
"description": "Array of custom Buildpacks to use.",
"default": [],
"items": {
"description": "Url or registry identifier of custom Buildpack.",
"oneOf": [
{
"type": "string",
"examples": [
"https://buildpack-registry.heroku.com/cnb/mars/create-react-app"
],
"description": "Url or registry identifier of custom Buildpack."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"buildContext": {
"description": "The working directory to build in.",
"oneOf": [
{
"type": "string",
"examples": [
"/"
],
"description": "The working directory to build in.",
"default": "/",
"pattern": "^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"useCache": {
"description": "Should build dependencies be cached?",
"oneOf": [
{
"type": "boolean",
"examples": [
false
],
"description": "Should build dependencies be cached?",
"default": false
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"runtimeEnvironment": {
"type": "object",
"examples": [
{
"variable1": "abcdef",
"variable2": "12345"
}
],
"description": "An object containing the runtime environment to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"runtimeFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"buildArguments": {
"type": "object",
"examples": [
{
"variable1": "abcdef",
"variable2": "12345"
}
],
"description": "An object containing the build arguments to set for the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"default": {},
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"buildFiles": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
},
"healthChecks": {
"type": "array",
"description": "An array of health checks.",
"items": {
"type": "object",
"description": "A health check object.",
"properties": {
"protocol": {
"type": "string",
"examples": [
"HTTP"
],
"description": "The protocol to access the health check with.",
"enum": [
"HTTP",
"CMD",
"TCP"
]
},
"type": {
"type": "string",
"examples": [
"readinessProbe"
],
"description": "The type of health check.",
"enum": [
"livenessProbe",
"readinessProbe",
"startupProbe"
]
},
"path": {
"not": {}
},
"cmd": {
"not": {}
},
"port": {
"not": {}
},
"initialDelaySeconds": {
"type": "integer",
"examples": [
10
],
"description": "Initial delay, in seconds, before the health check is first run.",
"minimum": 1,
"maximum": 180
},
"periodSeconds": {
"type": "integer",
"examples": [
60
],
"description": "The time between each check, in seconds.",
"minimum": 10,
"maximum": 600
},
"timeoutSeconds": {
"type": "integer",
"examples": [
1
],
"description": "The time to wait for a response before marking the health check as a failure.",
"minimum": 1,
"maximum": 60
},
"failureThreshold": {
"type": "integer",
"examples": [
3
],
"description": "The maximum number of allowed failures.",
"minimum": 1,
"maximum": 255
},
"successThreshold": {
"not": {}
}
},
"required": [
"protocol",
"type",
"initialDelaySeconds",
"periodSeconds",
"timeoutSeconds",
"failureThreshold"
],
"additionalProperties": false
}
}
},
"required": [
"name",
"billing",
"backoffLimit"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Addon node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Addon"
],
"description": "The kind of node.",
"const": "Addon"
},
"spec": {
"type": "object",
"description": "The specification for the Addon node.",
"properties": {
"name": {
"description": "The name of the addon.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Addon"
],
"description": "The name of the addon.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the addon.",
"oneOf": [
{
"type": "string",
"examples": [
"An addon description"
],
"description": "A description of the addon.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"type": {
"type": "string",
"examples": [
"postgres"
],
"description": "The identifier for the type of addon. Addon types can be found at the Get Addon Types endpoint."
},
"version": {
"type": "string",
"examples": [
"latest"
],
"description": "The version of the addon type to use. If set to `latest`, the addon will be created with the most recent addon version. If set to a major version appended with `-latest`, e.g. `14-latest`, the addon will be created with the most recent minor version belonging to that major version. `latest` and `-latest` will only be applied on addon creation."
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"storageClass": {
"type": "string",
"examples": [
"ssd"
],
"description": "The type of storage. Only configurable if the relevant feature flag is enabled for you account",
"default": "ssd",
"enum": [
"ssd",
"hdd"
]
},
"storage": {
"type": "number",
"examples": [
4096
],
"description": "The size of the addon storage, in megabytes.",
"minimum": 4096
},
"replicas": {
"description": "The number of addon replicas to run.",
"oneOf": [
{
"type": "integer",
"examples": [
1
],
"description": "The number of addon replicas to run.",
"minimum": 1
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"deploymentPlan",
"storage",
"replicas"
],
"additionalProperties": false
},
"source": {
"type": "object",
"description": "Optional object containing data about an existing addon to fork. If provided, the addon will be created from that existing addon backup.",
"properties": {
"addonId": {
"description": "ID of the addon to fork.",
"oneOf": [
{
"type": "string",
"examples": [
"existing-addon"
],
"description": "ID of the addon to fork.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"backupId": {
"description": "ID of a backup belonging to that addon to use for the fork.",
"oneOf": [
{
"type": "string",
"examples": [
"existing-backup"
],
"description": "ID of a backup belonging to that addon to use for the fork.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"addonId",
"backupId"
],
"additionalProperties": false
},
"tlsEnabled": {
"type": "boolean",
"description": "Enables access to the addon via TLS (if supported by the addon type).",
"default": false
},
"externalAccessEnabled": {
"type": "boolean",
"description": "Enables external access to the addon via TLS (if supported by the addon type).",
"default": false
},
"ipPolicies": {
"type": "array",
"description": "An array of IP address policies.",
"default": [],
"items": {
"type": "object",
"properties": {
"addresses": {
"type": "array",
"description": "An array of IP addresses used for this rule",
"items": {
"type": "string",
"examples": [
"127.0.0.1"
],
"description": "An IP address used by this rule",
"format": "ipv4"
}
},
"action": {
"type": "string",
"examples": [
"DENY"
],
"description": "The action for this rule.",
"enum": [
"ALLOW",
"DENY"
]
}
},
"required": [
"addresses",
"action"
],
"additionalProperties": false
}
},
"pitrEnabled": {
"type": "boolean",
"description": "Enables point-in-time recovery (PITR) for the addon (if supported by the addon type).",
"default": false
},
"typeSpecificSettings": {
"type": "object",
"properties": {
"postgresHAEnabled": {
"type": "boolean",
"description": "Postgres only: enable high-availability mode."
}
},
"additionalProperties": false
}
},
"required": [
"name",
"type",
"version",
"billing"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "AddonBackup node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"AddonBackup"
],
"description": "The kind of node.",
"const": "AddonBackup"
},
"spec": {
"type": "object",
"description": "The specification for the AddonBackup node.",
"properties": {
"addonId": {
"description": "The ID of the addon to backup.",
"oneOf": [
{
"type": "string",
"description": "The ID of the addon to backup.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"backupType": {
"type": "string",
"examples": [
"snapshot"
],
"description": "The type of backup to perform. Defaults to `snapshot`.",
"default": "snapshot",
"enum": [
"dump",
"snapshot"
]
}
},
"required": [
"addonId"
],
"additionalProperties": false
},
"condition": {
"type": "string",
"const": "success"
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "SecretGroup node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"SecretGroup"
],
"description": "The kind of node.",
"const": "SecretGroup"
},
"spec": {
"type": "object",
"description": "The specification for the SecretGroup node.",
"properties": {
"name": {
"description": "The name of the secret.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Secret"
],
"description": "The name of the secret.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the secret.",
"oneOf": [
{
"type": "string",
"examples": [
"A description"
],
"description": "A description of the secret.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"secretType": {
"type": "string",
"examples": [
"environment"
],
"description": "The type of the created secret",
"enum": [
"environment-arguments",
"environment",
"arguments"
]
},
"priority": {
"type": "integer",
"examples": [
10
],
"description": "The priority with which different secrets will be merged.",
"minimum": 0,
"maximum": 100
},
"restrictions": {
"type": "object",
"description": "Restriction settings of the secret",
"default": {
"special": "deep"
},
"properties": {
"restricted": {
"type": "boolean",
"examples": [
true
],
"description": "Is the secret restricted",
"default": false
},
"nfObjects": {
"type": "array",
"description": "List of Northflank services & jobs the secret is restricted to",
"default": [],
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"id": {
"description": "ID of the entity the secret is restricted to.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "ID of the entity the secret is restricted to.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"type": {
"type": "string",
"examples": [
"service"
],
"description": "Type of the entity the secret is restricted to.",
"enum": [
"service",
"job"
]
}
},
"required": [
"id",
"type"
],
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"addonDependencies": {
"type": "array",
"description": "An array of addons to link to this secret group.",
"items": {
"type": "object",
"description": "An object containing data about the addon to link.",
"properties": {
"addonId": {
"description": "The id of the addon to link.",
"oneOf": [
{
"type": "string",
"examples": [
"example-addon"
],
"description": "The id of the addon to link.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"keys": {
"type": "array",
"description": "An array of objects containing details about the keys to link to this secret group.",
"default": [],
"uniqueItems": true,
"items": {
"type": "object",
"description": "Details about the key to link to this secret group.",
"properties": {
"keyName": {
"type": "string",
"examples": [
"USERNAME"
],
"description": "The name of the key to link.",
"pattern": "[a-zA-Z]+"
},
"aliases": {
"type": "array",
"description": "An array of aliases for the key.",
"default": [],
"uniqueItems": true,
"items": {
"type": "string",
"examples": [
"MONGO_USERNAME"
],
"description": "The name of the alias. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"pattern": "^[a-zA-Z0-9_./-]*$"
}
}
},
"required": [
"keyName"
],
"additionalProperties": false
}
}
},
"required": [
"addonId",
"keys"
],
"additionalProperties": false
}
},
"secrets": {
"type": "object",
"properties": {
"variables": {
"type": "object",
"examples": [
{
"NODE_ENV": "production",
"MONGO_DB": "some_connection_string"
}
],
"description": "Secret variables as JSON object, encrypted at rest. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"files": {
"type": "object",
"examples": [
{
"/dir/fileName": {
"data": "VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=",
"encoding": "utf-8"
}
}
],
"description": "Secret files as JSON object, encrypted at rest. File path must be absolute",
"properties": {
"/^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$/": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$": {
"type": "object",
"properties": {
"data": {
"type": "string",
"description": "base64 encoded file data"
},
"encoding": {
"type": "string",
"description": "Original encoding of the file"
}
},
"required": [
"data"
],
"additionalProperties": false
}
}
}
},
"additionalProperties": false
}
},
"required": [
"name",
"secretType",
"priority"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Pipeline node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Pipeline"
],
"description": "The kind of node.",
"const": "Pipeline"
},
"spec": {
"type": "object",
"description": "The specification for the Pipeline node.",
"properties": {
"name": {
"description": "The name of the pipeline.",
"oneOf": [
{
"type": "string",
"examples": [
"example-pipeline"
],
"description": "The name of the pipeline.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"description": {
"description": "A description of the pipeline.",
"oneOf": [
{
"type": "string",
"description": "A description of the pipeline.",
"default": "",
"maxLength": 200,
"pattern": "^[a-zA-Z0-9.,?\\s\\\\/'\"()[\\];`%^&*\\-_:!]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"nfObjects": {
"type": "array",
"description": "A list of services, jobs and addons to include in the pipeline.",
"items": {
"type": "object",
"properties": {
"id": {
"description": "The ID of the service, job or addon to include in the pipeline.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "The ID of the service, job or addon to include in the pipeline.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"type": {
"type": "string",
"examples": [
"service"
],
"description": "The type of the resource to include in the pipeline.",
"enum": [
"service",
"job",
"addon"
]
},
"stage": {
"type": "string",
"examples": [
"Production"
],
"description": "The stage in the pipeline to include the resource.",
"enum": [
"Development",
"Staging",
"Production"
]
}
},
"required": [
"id",
"type",
"stage"
],
"additionalProperties": false
}
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Volume node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Volume"
],
"description": "The kind of node.",
"const": "Volume"
},
"spec": {
"type": "object",
"description": "The specification for the Volume node.",
"properties": {
"name": {
"description": "The name of the volume.",
"oneOf": [
{
"type": "string",
"examples": [
"Example Volume"
],
"description": "The name of the volume.",
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z]((-|\\s)?[a-zA-Z0-9]+((-|\\s)[a-zA-Z0-9]+)*)?$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"tags": {
"type": "array",
"description": "An array of previously defined tags to help identify and group the resource.",
"items": {
"type": "string",
"examples": [
"my-tag"
],
"minLength": 3,
"maxLength": 39,
"pattern": "^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
}
},
"mounts": {
"type": "array",
"description": "Array of mounts, containerMountPaths must be unique",
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"volumeMountPath": {
"type": "string",
"examples": [
""
],
"description": "Optionally specify the path inside this volume that should be mounted",
"default": "",
"pattern": "^((?!\\/)).+$"
},
"containerMountPath": {
"type": "string",
"examples": [
"/container"
],
"description": "Specify the path into which the volume should be mounted",
"pattern": "^((?!:).)*$"
}
},
"required": [
"containerMountPath"
],
"additionalProperties": false
}
},
"spec": {
"type": "object",
"description": "Information about the desired size and type of the volume. Storage class is only configurable with the relevant feature flag enabled for your account.",
"properties": {
"storageClassName": {
"type": "string",
"examples": [
"ssd"
],
"description": "The type of the storage.",
"default": "ssd",
"enum": [
"ssd",
"hdd"
]
},
"storageSize": {
"oneOf": [
{
"type": "integer",
"examples": [
4096
],
"description": "Storage size of the SSD.",
"enum": [
5120,
10240,
20480,
40960
],
"minimum": 4096,
"maximum": 204800
},
{
"type": "integer",
"examples": [
40960
],
"description": "Storage size of the HDD.",
"const": 40960,
"minimum": 40960,
"maximum": 204800
},
{
"type": "integer",
"enum": [
5120,
10240,
20480,
40960
],
"minimum": 4096,
"maximum": 204800
}
]
}
},
"required": [
"storageSize"
],
"additionalProperties": false
},
"owningObject": {
"type": "object",
"description": "The object to attach this volume to.",
"properties": {
"id": {
"description": "The id of object to attach this volume to.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "The id of object to attach this volume to.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"type": {
"type": "string",
"examples": [
"service"
],
"description": "The type of the object to attach this volume to.",
"const": "service"
}
},
"required": [
"id",
"type"
],
"additionalProperties": false
}
},
"required": [
"name",
"mounts",
"spec"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Build node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Build"
],
"description": "The kind of node.",
"const": "Build"
},
"spec": {
"type": "object",
"description": "The specification for the Build node.",
"properties": {
"id": {
"description": "The id of object to build.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "The id of object to build.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"type": {
"type": "string",
"examples": [
"service"
],
"description": "The type of the object to build.",
"enum": [
"service",
"job"
]
},
"sha": {
"description": "Commit sha to build. If not provided, builds the most recent relevant commit.",
"oneOf": [
{
"type": "string",
"examples": [
"262ed9817b3cad5142fbceabe0c9e371e390d616"
],
"description": "Commit sha to build. If not provided, builds the most recent relevant commit."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"branch": {
"description": "Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.",
"oneOf": [
{
"type": "string",
"description": "Branch to build from. If `sha` is not provided, the latest commit of this branch will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"pullRequestId": {
"description": "ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both.",
"oneOf": [
{
"type": "integer",
"description": "ID of a pull request to build from. If `sha` is not provided, the latest commit of this pull request will be built. Only supported by build services. Build services require either `branch` or `pullRequestId` field, but cannot be provided with both."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"id",
"type"
],
"additionalProperties": false
},
"condition": {
"type": "string",
"const": "success"
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "JobRun node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"JobRun"
],
"description": "The kind of node.",
"const": "JobRun"
},
"spec": {
"type": "object",
"description": "The specification for the JobRun node.",
"properties": {
"runtimeEnvironment": {
"type": "object",
"examples": [
{
"VARIABLE_1": "abcdef",
"VARIABLE_2": "12345"
}
],
"description": "An object containing the environment variables overrides to use when running the job. Keys may only contain letters, numbers, hyphens, forward slashes and dots.",
"properties": {
"/^[a-zA-Z0-9_./-]*$/": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_./-]*$": {
"type": "string",
"properties": {},
"required": [],
"additionalProperties": false
}
}
},
"billing": {
"type": "object",
"properties": {
"deploymentPlan": {
"description": "The ID of the deployment plan override to use.",
"oneOf": [
{
"type": "string",
"examples": [
"nf-compute-20"
],
"description": "The ID of the deployment plan override to use.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
},
"deployment": {
"type": "object",
"description": "Details about the job run deployment overrides.",
"properties": {
"internal": {
"type": "object",
"properties": {
"id": {
"description": "ID of the build service to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"example-build-service"
],
"description": "ID of the build service to deploy",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"branch": {
"description": "Branch to deploy",
"oneOf": [
{
"type": "string",
"examples": [
"master"
],
"description": "Branch to deploy"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildSHA": {
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"examples": [
"latest"
],
"description": "Commit SHA to deploy, or 'latest' to deploy the most recent commit",
"oneOf": [
{
"type": "string"
},
{
"type": "string",
"const": "latest"
}
]
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"buildId": {
"description": "ID of the build that should be deployed",
"oneOf": [
{
"type": "string",
"examples": [
"premium-guide-6393"
],
"description": "ID of the build that should be deployed"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"additionalProperties": false
},
"external": {
"type": "object",
"properties": {
"imagePath": {
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"oneOf": [
{
"type": "string",
"examples": [
"nginx:latest"
],
"description": "Image to be deployed. When not deploying from Dockerhub the URL must be specified.",
"pattern": "^(?:(?:https?:\\/\\/)?([a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\.\\-]+)(\\/v1)?)?(?:\\/)?([a-zA-Z/-9\\.\\-_]+)(?:\\:([a-zA-Z/-9\\.\\-_\\:]+)|\\@([a-zA-Z/-9\\.\\-_\\:]+))$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"credentials": {
"description": "ID of the saved credentials to use to access this external image.",
"oneOf": [
{
"type": "string",
"examples": [
"example-credentials"
],
"description": "ID of the saved credentials to use to access this external image.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"imagePath"
],
"additionalProperties": false
},
"docker": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"enum": [
"default",
"customEntrypoint",
"customCommand",
"customEntrypointCustomCommand"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"buildpack": {
"type": "object",
"properties": {
"configType": {
"type": "string",
"examples": [
"default"
],
"enum": [
"default",
"customProcess",
"customCommand",
"customEntrypointCustomCommand",
"originalEntrypointCustomCommand"
]
},
"customProcess": {
"type": [
"string",
"null"
]
},
"customEntrypoint": {
"type": [
"string",
"null"
]
},
"customCommand": {
"type": [
"string",
"null"
]
}
},
"required": [
"configType"
],
"additionalProperties": false
},
"storage": {
"type": "object",
"properties": {
"ephemeralStorage": {
"type": "object",
"properties": {
"storageSize": {
"type": "integer",
"examples": [
1024
],
"description": "Ephemeral storage per container in MB",
"enum": [
1024,
2048,
5120,
10240,
20480
],
"minimum": 1024,
"maximum": 20480
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"jobId": {
"description": "The ID of the job to run.",
"oneOf": [
{
"type": "string",
"examples": [
"example-job"
],
"description": "The ID of the job to run.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"jobId"
],
"additionalProperties": false
},
"condition": {
"type": "string",
"const": "success"
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Action node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Action"
],
"description": "The kind of node.",
"const": "Action"
},
"spec": {
"description": "The specification for the Action node.",
"oneOf": [
{
"type": "object",
"description": "Addon action",
"properties": {
"kind": {
"type": "string",
"examples": [
"Addon"
],
"description": "The kind of action.",
"const": "Addon"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "restart"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"addonId": {
"description": "The id of the addon to restart.",
"oneOf": [
{
"type": "string",
"examples": [
"example-addon"
],
"description": "The id of the addon to restart.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"addonId"
],
"additionalProperties": false
}
]
},
"condition": {
"oneOf": [
{
"type": "string",
"const": "running"
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "AddonBackup action",
"properties": {
"kind": {
"type": "string",
"examples": [
"AddonBackup"
],
"description": "The kind of action.",
"const": "AddonBackup"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "restore"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"addonId": {
"description": "The id of the addon to restore a backup to.",
"oneOf": [
{
"type": "string",
"examples": [
"example-addon"
],
"description": "The id of the addon to restore a backup to.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"backupId": {
"description": "The id of the backup to restore.",
"oneOf": [
{
"type": "string",
"examples": [
"example-backup"
],
"description": "The id of the backup to restore.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"addonId",
"backupId"
],
"additionalProperties": false
}
]
},
"condition": {
"oneOf": [
{
"type": "string",
"const": "success"
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Job action",
"properties": {
"kind": {
"type": "string",
"examples": [
"Job"
],
"description": "The kind of action.",
"const": "Job"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "execute"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"jobId": {
"description": "The id of the job to run the command in.",
"oneOf": [
{
"type": "string",
"examples": [
"example-job"
],
"description": "The id of the job to run the command in.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"command": {
"type": "string"
},
"shell": {
"type": "string"
},
"user": {
"type": "string"
},
"group": {
"type": "string"
}
},
"required": [
"jobId",
"command"
],
"additionalProperties": false
}
]
},
"condition": {
"oneOf": []
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Service action",
"properties": {
"kind": {
"type": "string",
"examples": [
"Service"
],
"description": "The kind of action.",
"const": "Service"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"restart",
"execute"
]
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"serviceId": {
"description": "The id of the service to restart.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "The id of the service to restart.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"serviceId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"serviceId": {
"description": "The id of the service to run the command in.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "The id of the service to run the command in.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"command": {
"type": "string"
},
"shell": {
"type": "string"
},
"user": {
"type": "string"
},
"group": {
"type": "string"
}
},
"required": [
"serviceId",
"command"
],
"additionalProperties": false
}
]
},
"condition": {
"oneOf": [
{
"type": "string",
"const": "running"
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "VCS action",
"properties": {
"kind": {
"type": "string",
"examples": [
"VCS"
],
"description": "The kind of action.",
"const": "VCS"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "createRepoFromSource"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"sourceData": {
"type": "object",
"properties": {
"publicRepo": {
"type": "boolean"
},
"vcsService": {
"type": "string"
},
"oauthProvider": {
"type": "string"
},
"repoUrl": {
"type": "string"
},
"accountLogin": {
"type": "string"
},
"selfHostedVcsId": {
"type": "string"
}
},
"required": [
"repoUrl"
],
"additionalProperties": false
},
"targetData": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"privateRepo": {
"type": "boolean",
"default": false
},
"context": {
"type": "string"
},
"folder": {
"type": "string"
},
"accountLogin": {
"type": "string"
},
"oauthProvider": {
"type": "string"
},
"vcsService": {
"type": "string"
},
"selfHostedVcsId": {
"type": "string"
}
},
"required": [
"name",
"privateRepo"
],
"additionalProperties": false
}
},
"required": [
"sourceData",
"targetData"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
}
]
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Condition node",
"properties": {
"ref": {
"type": "string",
"description": "An identifier that can used to reference the output of this node later in the template."
},
"kind": {
"type": "string",
"examples": [
"Condition"
],
"description": "The kind of node.",
"const": "Condition"
},
"spec": {
"description": "The specification for the Condition node.",
"oneOf": [
{
"type": "object",
"description": "Addon condition",
"properties": {
"kind": {
"type": "string",
"examples": [
"Addon"
],
"description": "The kind of condition.",
"const": "Addon"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "running"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"addonId": {
"description": "The id of the addon to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"example-addon"
],
"description": "The id of the addon to monitor.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"addonId"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "AddonBackup condition",
"properties": {
"kind": {
"type": "string",
"examples": [
"AddonBackup"
],
"description": "The kind of condition.",
"const": "AddonBackup"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "success"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"addonId": {
"description": "The id of the addon to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"example-addon"
],
"description": "The id of the addon to monitor.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"backupId": {
"description": "The id of the backup to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"example-backup"
],
"description": "The id of the backup to monitor.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"addonId",
"backupId"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Build condition",
"properties": {
"kind": {
"type": "string",
"examples": [
"Build"
],
"description": "The kind of condition.",
"const": "Build"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "success"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"buildId": {
"description": "The id of the build to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"joyous-view-6290"
],
"description": "The id of the build to monitor.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"buildId"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "JobRun condition",
"properties": {
"kind": {
"type": "string",
"examples": [
"JobRun"
],
"description": "The kind of condition.",
"const": "JobRun"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "success"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"jobId": {
"description": "The id of the job to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"example-job"
],
"description": "The id of the job to monitor.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
},
"runId": {
"description": "The id of the job run to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"d34582a4-35bd-4c71-8e7c-e36999b88723"
],
"description": "The id of the job run to monitor."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"jobId",
"runId"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "Service condition",
"properties": {
"kind": {
"type": "string",
"examples": [
"Service"
],
"description": "The kind of condition.",
"const": "Service"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "running"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"serviceId": {
"description": "The id of the service to monitor.",
"oneOf": [
{
"type": "string",
"examples": [
"example-service"
],
"description": "The id of the service to monitor.",
"pattern": "^[A-Za-z0-9-]+$"
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"serviceId"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
},
{
"type": "object",
"description": "VCS condition",
"properties": {
"kind": {
"type": "string",
"examples": [
"VCS"
],
"description": "The kind of condition.",
"const": "VCS"
},
"spec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "createRepoFromSourceSuccess"
},
"data": {
"oneOf": [
{
"type": "object",
"properties": {
"trackerId": {
"description": "The tracker id outputted from the 'createRepoFromSource' action to monitor.",
"oneOf": [
{
"type": "objectId",
"examples": [
"507f1f77bcf86cd799439011"
],
"description": "The tracker id outputted from the 'createRepoFromSource' action to monitor."
},
{
"type": "string",
"pattern": "\\$\\{args\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*)}"
},
{
"type": "string",
"pattern": "\\$\\{resources\\.((services|jobs|addons|secretGroups|pipelines)\\.([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
},
{
"type": "string",
"pattern": "\\$\\{refs\\.(([A-Za-z0-9=_-]+)\\.([A-Za-z0-9=_-]+(\\.([A-Za-z0-9=_-]+))*))}"
}
]
}
},
"required": [
"trackerId"
],
"additionalProperties": false
}
]
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
}
]
}
},
"required": [
"kind",
"spec"
],
"additionalProperties": false
}
]
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment