{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1.2"},"richInputs":{"$ref":"#/$defs/V1ReleaseFlowRichInputSchema"},"spec":{"$ref":"#/$defs/V1ReleaseFlowTemplateNodeSchema"}},"required":["apiVersion","spec"],"additionalProperties":false,"$defs":{"V1ReleaseFlowRichInputSchema":{"description":"A node representing a rich UI override for the Release Flow template.","oneOf":[{"type":"object","description":"BranchCommitSelector input","properties":{"kind":{"type":"string","examples":["BranchCommitSelector"],"description":"The kind of input.","const":"BranchCommitSelector"},"spec":{"type":"object","description":"The specification for the BranchCommitSelector input.","properties":{"title":{"type":"string","description":"The title displayed for the input."},"description":{"type":"string","description":"The description displayed for the input.","default":""},"required":{"type":"boolean","examples":[false],"description":"If true, an error will be displayed if this input is not provided a value."},"inputs":{"type":"object","description":"Inputs for the rich input node","properties":{"source":{"type":"string","examples":["build-service"],"description":"The ID of the build service to use for this input."}},"required":["source"],"additionalProperties":false},"outputs":{"type":"object","description":"Outputs for the rich input node. The value of each field corresponds to the argument name to be passed to the template.","properties":{"branch":{"type":"string","examples":["TARGET_BRANCH"]},"buildSha":{"type":"string","examples":["TARGET_COMMIT"]}},"additionalProperties":false}},"required":["title","inputs","outputs"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"BuildSelector input","properties":{"kind":{"type":"string","examples":["BuildSelector"],"description":"The kind of input.","const":"BuildSelector"},"spec":{"type":"object","description":"The specification for the BuildSelector input.","properties":{"title":{"type":"string","description":"The title displayed for the input."},"description":{"type":"string","description":"The description displayed for the input.","default":""},"required":{"type":"boolean","examples":[false],"description":"If true, an error will be displayed if this input is not provided a value."},"inputs":{"type":"object","description":"Inputs for the rich input node","properties":{"source":{"type":"string","examples":["build-service"],"description":"The ID of the build service to use for this input."}},"required":["source"],"additionalProperties":false},"outputs":{"type":"object","description":"Outputs for the rich input node. The value of each field corresponds to the argument name to be passed to the template.","properties":{"branch":{"type":"string","examples":["TARGET_BRANCH"]},"buildId":{"type":"string","examples":["TARGET_BUILD"]},"buildSha":{"type":"string","examples":["TARGET_COMMIT"]}},"additionalProperties":false}},"required":["title","inputs","outputs"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"V1ReleaseFlowTemplateWorkflowSchema":{"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/V1ReleaseFlowTemplateNodeSchema"}}},"required":["type","steps"],"additionalProperties":false},"V1ReleaseFlowTemplateLoopWorkflowSchema":{"type":"object","description":"The specification for the loop workflow node.","properties":{"iterations":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"object","properties":{},"additionalProperties":true},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"steps":{"type":"array","description":"An array of nodes that will be run multiple times.","items":{"$ref":"#/$defs/V1ReleaseFlowTemplateNodeSchema"}}},"required":["iterations","steps"],"additionalProperties":false},"V1ReleaseFlowTemplateNodeSchema":{"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/V1ReleaseFlowTemplateWorkflowSchema"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"RolloutStrategy 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":["RolloutStrategy"],"description":"The kind of node.","const":"RolloutStrategy"},"spec":{"type":"object","description":"The specification for the RolloutStrategy node.","properties":{"name":{"description":"Display name for the gradual rollout strategy","oneOf":[{"type":"string","examples":["my-canary-rollout"],"description":"Display name for the gradual rollout strategy"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"description":"Type of the gradual rollout strategy","oneOf":[{"type":"string","examples":["canary"],"description":"Type of the gradual rollout strategy","const":"canary"},{"type":"string","pattern":".*\\${.*}.*"}]},"options":{"oneOf":[{"type":"object","properties":{"triggers":{"description":"Conditions under which a new release will automatically initiate as a gradual rollout","oneOf":[{"type":"object","description":"Conditions under which a new release will automatically initiate as a gradual rollout","properties":{"releaseFromTemplate":{"description":"Automatically trigger the rollout strategy when a release is initiated from a template","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from a template"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromReleaseFlow":{"description":"Automatically trigger the rollout strategy when a release is initiated from a release flow","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from a release flow"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromCD":{"description":"Automatically trigger the rollout strategy when a release is initiated from a CD pipeline","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from a CD pipeline"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromUI":{"description":"Automatically trigger the rollout strategy when a release is initiated from the UI","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated from the UI"},{"type":"string","pattern":".*\\${.*}.*"}]},"releaseFromApi":{"description":"Automatically trigger the rollout strategy when a release is initiated via the API","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"Automatically trigger the rollout strategy when a release is initiated via the API"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"blockDeploymentOnActiveRollout":{"description":"When enabled, new deployments are blocked while a rollout is in progress","oneOf":[{"type":["boolean","null"],"examples":[true],"description":"When enabled, new deployments are blocked while a rollout is in progress"},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"details":{"description":"Strategy-specific configuration details","oneOf":[{"description":"Strategy-specific configuration details","oneOf":[{"type":"object","description":"Strategy-specific configuration details","properties":{"canaryStrategy":{"description":"Strategy used to split traffic between stable and canary deployments","oneOf":[{"type":"string","examples":["percentage"],"description":"Strategy used to split traffic between stable and canary deployments","enum":["percentage","header"]},{"type":"string","pattern":".*\\${.*}.*"}]},"config":{"description":"Configuration for the selected canary strategy","oneOf":[{"description":"Configuration for the selected canary strategy","oneOf":[{"type":"object","description":"Configuration for the selected canary strategy","properties":{"canaryPercentage":{"description":"Percentage of traffic to route to the canary deployment","oneOf":[{"type":"integer","examples":[20],"description":"Percentage of traffic to route to the canary deployment","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]},"stablePercentage":{"description":"Percentage of traffic to route to the stable deployment","oneOf":[{"type":"integer","examples":[80],"description":"Percentage of traffic to route to the stable deployment","minimum":0,"maximum":100},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["canaryPercentage","stablePercentage"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},{"description":"Configuration for the selected canary strategy","oneOf":[{"type":"object","description":"Configuration for the selected canary strategy","properties":{"headerName":{"description":"HTTP header name used to identify requests that should be routed to the canary deployment","oneOf":[{"type":"string","examples":["x-canary"],"description":"HTTP header name used to identify requests that should be routed to the canary deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]},"headerValue":{"description":"HTTP header value that routes matching requests to the canary deployment","oneOf":[{"type":"string","examples":["true"],"description":"HTTP header value that routes matching requests to the canary deployment","minLength":1},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["headerName","headerValue"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]}]}},"required":["canaryStrategy","config"],"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},{"not":{}}]}},"required":["type","details"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"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":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"backupType":{"type":"string","examples":["snapshot"],"description":"The type of backup to perform. Defaults to `snapshot`.","default":"snapshot","enum":["dump","snapshot"]},"compressionType":{"oneOf":[{"type":"string","enum":["zstd","gz","none"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customDestinationId":{"oneOf":[{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"additionalDestinations":{"type":"array","description":"List of destinations for which a backup should be created of this backup. Only applicable for snapshot backups.","items":{"type":"object","properties":{"destinationId":{"description":"Additional custom back up destination that should be used to store the snapshot.","oneOf":[{"type":"string","examples":["example-backup-destination"],"description":"Additional custom back up destination that should be used to store the snapshot.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"retentionTime":{"description":"Retention time of the additional back up in days.","oneOf":[{"type":"integer","examples":[7,7],"description":"Retention time of the additional back up in days.","minimum":1},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","examples":["custom"],"description":"The type of backup destination to use","const":"custom"}},"required":["destinationId","type"],"additionalProperties":false}}},"required":["addonId"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildRules":{"type":"object","properties":{"pathIgnoreRules":{"type":"array","maxItems":200,"items":{"type":"string","maxLength":260}},"isAllowList":{"type":"boolean"},"ciIgnoreFlagsEnabled":{"type":"boolean"},"ciIgnoreFlags":{"type":"array","maxItems":200,"items":{"type":"string","maxLength":72}}},"additionalProperties":false},"buildOverrides":{"type":"object","description":"An optional object that may specify several different overrides on the build level.","properties":{"buildArguments":{"examples":[{"ARGUMENT_1":"abcdef","ARGUMENT_2":"12345"}],"description":"Build arguments that will be set on this build only. In case of conflicts these values take precedence.","oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"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":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"additionalProperties":false},"docker":{"type":"object","description":"Overrides for docker build settings.","properties":{"dockerFilePath":{"type":"string","examples":["/Dockerfile"],"description":"The file path of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]+$"},"dockerWorkDir":{"type":"string","examples":["/"],"description":"The working directory of the Dockerfile.","pattern":"^\\/([a-zA-Z0-9-._]+\\/)*[a-zA-Z0-9-._]*$"},"dockerfileTarget":{"type":"string","description":"If your Dockerfile contains multiple build stages, you can specify the target stage by entering its name here.","pattern":"^[a-zA-Z0-9-_]+$"}},"additionalProperties":false}},"additionalProperties":false},"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":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"reuseExistingBuilds":{"type":"boolean","examples":[true],"description":"If true, the build node will return an existing build if one is available for that commit. Otherwise, a new build will be created with every new preview environment. Defaults to `true`.","default":true},"buildRuleFallThroughHandling":{"type":"string","examples":["fail"],"description":"Define handling if build rules do not match the specified commit","enum":["fail","skip","useLastBuild"]}},"required":["id","type"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"runtimeEnvironment":{"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.","oneOf":[{"type":"object","properties":{},"additionalProperties":false},{"type":"string","pattern":".*\\${.*}.*"}]},"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":{},"additionalProperties":false},"dockerSecretMounts":{"type":"object","examples":[{"example-secret-mount_1":{"data":"VGhpcyBpcyBhbiBleGFtcGxlIHdpdGggYSB0ZW1wbGF0ZWQgJHtOT0RFX0VOVn0gdmFyaWFibGU=","encoding":"utf-8"}}],"description":"Docker secret mount contents as JSON object, encrypted at rest. Must be a valid Docker secret mount identifier","properties":{},"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.","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"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","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["master"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"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","description":"A commit sha."},{"type":"string","description":"Latest commit.","const":"latest"}]},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]}},"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":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false},"docker":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","enum":["default","customEntrypoint","customCommand","customEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"buildpack":{"type":"object","properties":{"configType":{"oneOf":[{"type":"string","examples":["default"],"enum":["default","customProcess","customCommand","customEntrypointCustomCommand","originalEntrypointCustomCommand"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customProcess":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customEntrypoint":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]},"customCommand":{"oneOf":[{"type":["string","null"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["configType"],"additionalProperties":false},"storage":{"type":"object","properties":{"useHdbStorage":{"type":"boolean"},"usePdSsdStorage":{"type":"boolean"},"ephemeralStorage":{"type":"object","properties":{"storageSize":{"description":"Ephemeral storage per container in MB","oneOf":[{"type":"integer","examples":[1024],"description":"Ephemeral storage per container in MB","minimum":1024},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"shmSize":{"description":"Configures the amount of available memory-backed disk space available to /dev/shm","oneOf":[{"type":"integer","description":"Configures the amount of available memory-backed disk space available to /dev/shm","minimum":64},{"type":"string","pattern":".*\\${.*}.*"}]}},"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.","minLength":3,"maxLength":52,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["jobId"],"additionalProperties":false},"condition":{"type":"string","const":"success"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"LoopWorkflow 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":["LoopWorkflow"],"description":"The kind of node.","const":"LoopWorkflow"},"spec":{"description":"The specification for the LoopWorkflow node.","$ref":"#/$defs/V1ReleaseFlowTemplateLoopWorkflowSchema"},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["serviceId"],"additionalProperties":false},{"type":"object","properties":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]},"options":{"type":"object","properties":{"dispatchOnly":{"type":"boolean","examples":[true],"description":"Specify whether the command output should be awaited the node should succeed after having sent the command."}},"additionalProperties":false},"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":{"oneOf":[{"type":"boolean"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsService":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"oauthProvider":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"repoUrl":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"accountLogin":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["repoUrl"],"additionalProperties":false},"targetData":{"type":"object","properties":{"name":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"description":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"privateRepo":{"oneOf":[{"type":"boolean","default":false},{"type":"string","pattern":".*\\${.*}.*"}]},"context":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"folder":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"accountLogin":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsLinkId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"oauthProvider":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"vcsService":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["name","privateRepo"],"additionalProperties":false}},"required":["sourceData","targetData"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The id of the addon to monitor.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"addonId":{"description":"The id of the addon to monitor.","oneOf":[{"type":"string","examples":["example-addon"],"description":"The id of the addon to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"buildId":{"description":"The id of the build to monitor.","oneOf":[{"type":"string","examples":["joyous-view-6290"],"description":"The id of the build to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["buildId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"BYOCCluster condition","properties":{"kind":{"type":"string","examples":["BYOCCluster"],"description":"The kind of condition.","const":"BYOCCluster"},"spec":{"type":"object","properties":{"type":{"type":"string","const":"running"},"data":{"oneOf":[{"type":"object","properties":{"clusterId":{"description":"The id of the cluster to monitor.","oneOf":[{"type":"string","examples":["cluster-1"],"description":"The id of the cluster to monitor.","minLength":3,"maxLength":20,"pattern":"^[a-z]-?[a-z0-9]+(-[a-z0-9]+)*$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["clusterId"],"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"jobId":{"description":"The id of the job to monitor.","oneOf":[{"type":"string","examples":["example-job"],"description":"The id of the job to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"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":".*\\${.*}.*"}]}},"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":{"projectId":{"description":"ID of parent project","oneOf":[{"type":"string","examples":["example-project"],"description":"ID of parent project","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"serviceId":{"description":"The id of the service to monitor.","oneOf":[{"type":"string","examples":["example-service"],"description":"The id of the service to monitor.","minLength":3,"maxLength":54,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"timeoutDuration":{"oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","description":"A template reference that resolves to a timeout duration in seconds","pattern":".*\\${.*}.*"}]}},"required":["serviceId"],"additionalProperties":false}]}},"required":["type","data"],"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":".*\\${.*}.*"}]}},"required":["trackerId"],"additionalProperties":false}]}},"required":["type"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Release 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":["Release"],"description":"The kind of node.","const":"Release"},"spec":{"type":"object","description":"The specification for the Release node.","properties":{"type":{"type":"string","enum":["build","deployment","registry"]},"origin":{"oneOf":[{"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":".*\\${.*}.*"}]},"branch":{"description":"Branch to deploy","oneOf":[{"type":"string","examples":["main"],"description":"Branch to deploy"},{"type":"string","pattern":".*\\${.*}.*"}]},"build":{"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":".*\\${.*}.*"}]}},"required":["id","branch"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"ID of the deployment service or job to promote from.","oneOf":[{"type":"string","examples":["development-service"],"description":"ID of the deployment service or job to promote from.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"type":"string","description":"The type of resource to promote from.","enum":["service","job"]}},"required":["id","type"],"additionalProperties":false},{"type":"object","properties":{"imagePath":{"description":"The image path of the external image to deploy.","oneOf":[{"type":"string","examples":["nginx:latest"],"description":"The image path of the external image to deploy.","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":".*\\${.*}.*"}]},"credentials":{"description":"The ID of the credentials to authenticate with to access the external image.","oneOf":[{"type":"string","examples":["example-credentials"],"description":"The ID of the credentials to authenticate with to access the external image.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["imagePath"],"additionalProperties":false}]},"target":{"type":"object","properties":{"id":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"type":{"oneOf":[{"type":"string","enum":["service","job"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["id","type"],"additionalProperties":false}},"required":["type","origin","target"],"additionalProperties":false},"condition":{"type":"string","const":"running"},"timeoutDuration":{"description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","oneOf":[{"type":"integer","description":"Timeout for the condition in seconds. This will fail the condition after the timeout has elapsed.","minimum":30,"maximum":14400},{"type":"string","pattern":".*\\${.*}.*"}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Message 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":["Message"],"description":"The kind of node.","const":"Message"},"spec":{"description":"The specification for the Message node.","oneOf":[{"type":"object","description":"VCS message","properties":{"kind":{"type":"string","examples":["VCS"],"description":"The kind of message to send.","const":"VCS"},"spec":{"type":"object","properties":{"vcsService":{"description":"The VCS provider to use.","oneOf":[{"type":"string","examples":["github"],"description":"The VCS provider to use.","enum":["bitbucket","gitlab","github","self-hosted","azure"]},{"type":"string","pattern":".*\\${.*}.*"}]},"selfHostedVcsId":{"oneOf":[{"oneOf":[{"type":"string","pattern":"^([A-Za-z0-9-]+)|([0-9a-f]{24})$"},{"type":"string","pattern":".*\\${.*}.*"}]},{"type":"string"}]},"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":".*\\${.*}.*"}]},"repoUrl":{"description":"URL of the Git repo to send this message to.","oneOf":[{"type":"string","examples":["https://github.com/northflank-examples/remix-postgres-redis-demo"],"description":"URL of the Git repo to send this message to.","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":".*\\${.*}.*"}]},"pullRequestId":{"description":"The ID of the pull request to comment on.","oneOf":[{"type":"string","description":"The ID of the pull request to comment on."},{"type":"string","pattern":".*\\${.*}.*"}]},"message":{"description":"The rich text message to comment.","oneOf":[{"type":"string","examples":["Template run complete."],"description":"The rich text message to comment."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["vcsService","repoUrl","pullRequestId","message"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"SLACK message","properties":{"kind":{"type":"string","examples":["SLACK"],"description":"The kind of message to send.","const":"SLACK"},"spec":{"type":"object","properties":{"webhookUrl":{"description":"The Slack webhook URL to send messages to.","oneOf":[{"type":"string","examples":["https://hooks.slack.com/services/XXX/YYY/ZZZ"],"description":"The Slack webhook URL to send messages to.","format":"uri"},{"type":"string","pattern":".*\\${.*}.*"}]},"integrationInternalId":{"description":"The ID of an existing Slack integration to use.","oneOf":[{"type":"string","examples":["slack-integration-id"],"description":"The ID of an existing Slack integration to use.","minLength":3,"maxLength":39,"pattern":"^[a-zA-Z](-?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"},{"type":"string","pattern":".*\\${.*}.*"}]},"message":{"description":"The message content to send to Slack. Supports markdown formatting.","oneOf":[{"type":"string","examples":["Preview environment *${args.name}* is ready at ${args.url}"],"description":"The message content to send to Slack. Supports markdown formatting."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["message"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"RAW_WEBHOOK message","properties":{"kind":{"type":"string","examples":["RAW_WEBHOOK"],"description":"The kind of message to send.","const":"RAW_WEBHOOK"},"spec":{"type":"object","properties":{"webhookUrl":{"description":"The webhook URL to send messages to.","oneOf":[{"type":"string","description":"The webhook URL to send messages to.","format":"uri"},{"type":"string","pattern":".*\\${.*}.*"}]},"message":{"description":"The message content to send to the webhook.","oneOf":[{"type":"string","examples":["Preview environment *${args.name}* is ready at ${args.url}"],"description":"The message content to send to the webhook."},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["webhookUrl","message"],"additionalProperties":false}},"required":["kind","spec"],"additionalProperties":false}]},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"LoopData 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":["LoopData"],"description":"The kind of node.","const":"LoopData"},"spec":{"type":"object","description":"The specification for the LoopData node.","properties":{},"additionalProperties":true},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"SecretInheritance 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":["SecretInheritance"],"description":"The kind of node.","const":"SecretInheritance"},"spec":{"type":"object","description":"The specification for the SecretInheritance node.","properties":{"configs":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"secrets":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"requiredKeys":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]},"requiredFiles":{"oneOf":[{"type":"array","default":[],"items":{"oneOf":[{"type":"string"},{"type":"string","pattern":".*\\${.*}.*"}]}},{"type":"string","pattern":".*\\${.*}.*"}]}},"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"Approval 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":["Approval"],"description":"The kind of node.","const":"Approval"},"spec":{"type":"object","description":"The specification for the Approval node.","properties":{"amount":{"type":"integer"}},"required":["amount"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false},{"type":"object","description":"RunTemplate 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":["RunTemplate"],"description":"The kind of node.","const":"RunTemplate"},"spec":{"type":"object","description":"The specification for the RunTemplate node.","properties":{"templateId":{"description":"The id of the template to run.","oneOf":[{"type":"string","examples":["example-template"],"description":"The id of the template to run.","pattern":"^[A-Za-z0-9-]+$"},{"type":"string","pattern":".*\\${.*}.*"}]},"templateType":{"type":"string","enum":["template","release-flow-template","preview-env-template","workflow","preview-blueprint","template-teardown","workflow-teardown","preview-blueprint-teardown"]},"arguments":{"type":"object","properties":{"variables":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key"],"additionalProperties":false}}},"additionalProperties":true}},"required":["templateId","templateType"],"additionalProperties":false},"skipNodeExecution":{"oneOf":[{"type":"string","enum":["true","false"]},{"type":"string","pattern":".*\\${.*}.*"}]}},"required":["kind","spec"],"additionalProperties":false}]}}}