Pipelines
Pipelines allow you to fully customize the execution logic in DevSpace, i.e. they define what happens when a users run commands such as devspace dev
, devspace build
, devspace deploy
or devspace run-pipeline my-custom-pipeline
Pipelines are defined in POSIX shell syntax and a DevSpace pipeline reads as a regular POSIX script. However, DevSpace implements certain special commands that can be used inside the POSIX script to tell DevSpace when to build, deploy or start developing. For a complete function reference, please take a look below.
- Execution Order
- Dynamic Config
- Rerun Pipeline
- Deploy / Sync / Open
- Custom Dockerfile Flag
# Simple deployment that deploys an nginx pod
deployments:
test:
helm:
values:
containers:
- image: nginx
pipelines:
deploy: |-
# You can use the --set, --set-string, --from and --from-file
# arguments to dynamically change the config of the images,
# deployments or dev configurations you want to use inside the
# pipeline.
# Exchange the image in our deployment
if is_equal ${DEVSPACE_NAMESPACE} "test"; then
create_deployments test --set "helm.values.containers[0].image=bitnami/nginx"
fi
# Create a new deployment based on another deployment and change the image.
# This will copy over the values from the test deployment and then change the image
create_deployments nginx --from test \
--set helm.values.containers[0].image=mysql
# Create a new deployment from a file. ${DEVSPACE_TMPDIR} is always cleaned up
# after each run
echo """
helm:
values:
containers:
- image: nginx
""" > ${DEVSPACE_TMPDIR}/my-deployment.yaml
create_deployments nginx-from-file --from-file ${DEVSPACE_TMPDIR}/my-deployment.yaml
# Force the container name to be a string (true) as DevSpace will otherwise convert
# those automatically.
create_deployments nginx-string-annotation --from test \
--set-string "helm.values.containers[0].name=true"
pipelines:
deploy: |-
# Pipelines are a great tool to define your custom execution order of
# building, deploying and starting dev configurations. This works for
# all special commands such as: build_images, create_deployments, start_dev
# run_dependencies and run_pipelines.
# Run two pipelines in parallel
run_pipelines other-pipeline-1 other-pipeline-2
# Wait until all 4 deployments were deployed
echo "All deployments are deployed"
other-pipeline-1: |-
# Deploys deployments deploy-a and deploy-b in parallel
create_deployments deploy-a deploy-b
echo "Deployment deploy-a and deploy-b are deployed"
other-pipeline-2: |-
# Deploys deployments deploy-c and then deploy-d
create_deployments deploy-c
echo "Deployment deploy-c is deployed"
create_deployments deploy-d
echo "Deployment deploy-d is deployed"
deployments:
deploy-a: ...
deploy-b: ...
deploy-c: ...
deploy-d: ...
pipelines:
deploy: |-
# This pipeline watches a secret and applies it as well as deploys the application
# Start two pipelines in parallel
run_pipelines watch-secret default-deploy
watch-secret: |-
# Rerun the pipeline as soon as the secret.yaml changes
run_watch -p secret.yaml -- kubectl apply -n ${DEVSPACE_NAMESPACE} -f secret.yaml
default-deploy: |-
# Run regular deploy pipeline to start the application
run_default_pipeline deploy
deployments: ...
dev: ...
pipelines:
# Run with devspace run-pipeline custom-pipeline
custom-pipeline: |-
# Deploy simple nginx pod with the default DevSpace component chart
create_deployments nginx --set helm.values.containers[0].image=nginx
# Create a file we want to sync to the nginx pod
echo "Hello World!" > ${DEVSPACE_TMPDIR}/index.html
# Sync the file into the nginx pod via DevSpace sync
start_dev nginx --set imageSelector=nginx \
--set "sync[0].path=${DEVSPACE_TMPDIR}:/usr/share/nginx/html" \
--set "sync[0].noWatch=true"
# Print contents within the nginx pod
exec_container --image-selector=nginx -- cat /usr/share/nginx/html/index.html
# Start port-forwarding and open the url
start_dev nginx --set imageSelector=nginx \
--set 'ports[0].port=8080:80' \
--set 'open[0].url=http://localhost:8080'
images:
my-image:
dockerfile: ./Dockerfile
pipelines:
# Executed on 'devspace deploy'
deploy:
flags:
- name: dockerfile
description: If enabled, will build the image with the given dockerfile
type: string
run: |-
if ! is_empty $(get_flag dockerfile); then
echo "Building the image with the overriden dockerfile $(get_flag dockerfile)"
run_default_pipeline deploy --set "images.my-image.dockerfile=$(get_flag dockerfile)"
else
run_default_pipeline deploy
fi
Using Pipelines
1. Define Pipelines
An example pipelines
section could look like this in devspace.yaml
:
version: v2beta1
pipelines:
# Override the default pipeline for 'devspace dev'
dev: |-
run_dependency_pipelines --all # 1. Deploy any projects this project needs (see "dependencies")
create_deployments --all # 2. Deploy Helm charts and manifests specfied as "deployments"
start_dev app # 3. Start dev mode "app" (see "dev" section)
deploy: |-
run_dependency_pipelines --all # 1. Deploy any projects this project needs (see "dependencies")
build_images --all -t $(git describe --always) # 2. Build, tag (git commit hash) and push all images (see "images")
create_deployments --all # 3. Deploy Helm charts and manifests specfied as "deployments"
build:
# Here we are using the long-form using `run:` instead of passing the script directly
run: |-
build_images --all -t $(git describe --always)
custom: ...
Pipelines can:
- Call built-in functions such as
build_images
,create_deployments
orstart_dev
- Call functions defined in
devspace.yaml
or in anyimport
- Use bash-like syntax including
if []; then ... fi
,&&
,||
or;
- Access environment variables and DevSpace variables
2. Run Pipelines
Pipelines are invoked via:
devspace run-pipeline [name]
Write all pipeline scrips in bash
fashion. DevSpace is using a library to make them cross-platform executable.
Default Pipelines
Internally DevSpace uses pipelines for the following commands that can be overriden according to your preferences. DevSpace provides default pipeline scripts for the following top-level commands:
dev
dev
deploy
deploy
build
build
purge
purge
Custom Flags
To add custom flags to commands such as devspace dev
or devspace run-pipeline my-custom-pipeline
, you can specify the flags
field for the respective pipeline.
The following example defines two flags for devspace dev
:
--logs / -l
withtype
not specified (defaults tobool
)--env / -e
withtype: stringArray
version: v2beta1
pipelines:
dev:
flags:
- name: logs
short: l
- name: env
short: e
type: stringArray
run: |-
extraEnv=($(get_flag "env")) # Retrieve the value of the `env` flag and store it in an array variable
echo ${extraEnv[0]} # Arrays are zero indexed
TERMINAL_ENABLED=true
if [ $(get_flag "logs") == "true" ]; then # Test if --logs/-l flag is used or not
TERMINAL_ENABLED=false # Disable terminal, so DevSpace falls back to log streaming
fi
start_dev app --set terminal.enabled=$TERMINAL_ENABLED
Built-In Functions
DevSpace provides a set of built-in functions. There are two types of functions:
Pipeline-Only Functions
Pipeline-only functions can only be used inside the scripts within the pipelines
section of devspace.yaml
.
build_images
[image-1][image-2] ... pipeline only
Builds all images passed as arguments in parallel
build_images
[image-1][image-2] ... pipeline onlyensure_pull_secrets
[image-1][image-2] ... pipeline only
Creates pull secrets for all images passed as arguments
ensure_pull_secrets
[image-1][image-2] ... pipeline onlyget_image
[image] string pipeline only
Returns the most recently built image and/or tag for a given image name
get_image
[image] string pipeline onlycreate_deployments
[deployment-1][deployment-2] ... pipeline only
Creates all deployments passed as arguments in parallel
create_deployments
[deployment-1][deployment-2] ... pipeline onlypurge_deployments
[deployment-1][deployment-2] ... pipeline only
Purges all deployments passed as arguments
purge_deployments
[deployment-1][deployment-2] ... pipeline onlystart_dev
[dev-1][dev-2] ... pipeline only
Starts all dev modes passed as arguments
start_dev
[dev-1][dev-2] ... pipeline onlystop_dev
[dev-1][dev-2] ... pipeline only
Stops all dev modes passed as arguments
stop_dev
[dev-1][dev-2] ... pipeline onlyrun_pipelines
[pipeline-1][pipeline-2] ... pipeline only
Runs all pipelines passed as arguments
run_pipelines
[pipeline-1][pipeline-2] ... pipeline onlyrun_default_pipeline
[pipeline] pipeline only
Runs the default pipeline passed as arguments
run_default_pipeline
[pipeline] pipeline onlyrun_dependency_pipelines
[dependency-1][dependency-2] ... pipeline only
Runs a pipeline of each dependency passed as arguments
run_dependency_pipelines
[dependency-1][dependency-2] ... pipeline onlyis_dependency
int pipeline only
Returns exit code 0 if the pipeline currently being executed is run because the project is a dependency of another project
is_dependency
int pipeline onlyselect_pod
string pipeline only
Returns the name of a Kubernetes pod
select_pod
string pipeline onlywait_pod
[command] pipeline only
Waits for a pod to become running
wait_pod
[command] pipeline onlyexec_container
[command] pipeline only
Executes the command provided as argument inside a container
exec_container
[command] pipeline onlyget_config_value
[json.path] string pipeline only
Returns the value of the config loaded from devspace.yaml
get_config_value
[json.path] string pipeline onlyGlobal Functions
Global functions can be used anywhere in devspace.yaml
, either in config fields that expect a bash script such as within functions
or using $(command)
vars in any other config field.
is_empty
[value] int pipeline only
Returns exit code 0 if the value of the argument is empty string
is_empty
[value] int pipeline onlyis_equal
[value-1][value-2] int pipeline only
Returns exit code 0 if the values of both arguments provided are equal
is_equal
[value-1][value-2] int pipeline onlyis_in
[value-1][value-2] int pipeline only
Returns exit code 0 if the value of the first argument can be found in the second argument (second argument being a blank-separated list of strings e.g "bananas apples peaches"
)
is_in
[value-1][value-2] int pipeline only"bananas apples peaches"
)is_os
[os] darwin linux windows aix android dragonfly freebsd hurd illumos ios js nacl netbsd openbsd plan9 solaris zos int pipeline only
Returns exit code 0 if the current operating system equals the value provided as argument
is_os
[os] darwin linux windows aix android dragonfly freebsd hurd illumos ios js nacl netbsd openbsd plan9 solaris zos int pipeline onlyis_true
[value] int pipeline only
Returns exit code 0 if the value of the argument is "true"
is_true
[value] int pipeline onlycat
[file-path] string pipeline only
Returns the content of a file
cat
[file-path] string pipeline onlyget_flag
[flag-name] string pipeline only
Returns the value of the flag that is provided as argument
get_flag
[flag-name] string pipeline onlyrun_watch
[command] pipeline only
Executes the command provided as argument and watches for conditions to restart the command
run_watch
[command] pipeline onlysleep
[seconds] pipeline only
Pauses the script execution for the number of seconds provided as argument
sleep
[seconds] pipeline onlyxargs
[command] pipeline only
Reads from stdin, splits input by blanks and executes the command provided as argument for each blank-separated input value (often used in pipes, e.g. echo 'image-1 image-2' | xargs build_images
)
xargs
[command] pipeline onlyecho 'image-1 image-2' | xargs build_images
)Config Reference
pipelines
required <pipeline_name>:object
Pipelines are the work blocks that DevSpace should execute when devspace dev, devspace build, devspace deploy or devspace purge
is called. Pipelines are defined through a special POSIX script that allows you to use special commands
such as create_deployments, start_dev, build_images etc. to signal DevSpace you want to execute
a specific functionality. The pipelines dev, build, deploy and purge are special and will override
the default functionality of the respective command if defined. All other pipelines can be either run
via the devspace run-pipeline command or used within another pipeline through run_pipelines.
pipelines
required <pipeline_name>:object <pipeline_name>
required string dev
deploy
build
purge
.*
Name of the pipeline, will be filled automatically
<pipeline_name>
required string devdeploy
build
purge
.*
run
required string
Run is the actual shell command that should be executed during this pipeline
run
required string flags
required object[]
Flags are extra flags that can be used for running the pipeline via
devspace run-pipeline.
flags
required object[] continueOnError
required boolean false
ContinueOnError will not fail the whole job and pipeline if
a call within the step fails.
continueOnError
required boolean false