Drone Environment Variables - Three tips


These are tricks I gathered over the years using Drone.io environment variables.

  • generating a practical Docker image tag
  • fixing an annoying issue with env vars
  • the sweetness of yaml anchors

All testable with drone exec.

Using built-in vars to generate a practical Docker image tag

Drone has a set of built in variables that you can use to name your artifacts. You can find most Git and Drone related metadata on the supported list of vars here.

Drone also provides Bash parameter substitution like features to further manipulate the environment variables.

Hence my favorite Docker image tag is generated like this:


First I replace forward slashes with a dash and only take the first 8 characters of the commit hash. You can use this .drone.yml and run it with drone exec.

kind: pipeline
name: default

  - name: docker-tag-demo
    image: debian:stable-slim
      - echo "The current branch is ${DRONE_BRANCH}"
      - echo "The current commit hash is ${DRONE_COMMIT_SHA}"
      - echo "The image tag is ${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}"
DRONE_COMMIT_SHA=3c1c9db713758d57a254eed96b0457cc9af3ae6b \
./drone exec \
  --branch feature/new-feature
[docker-tag-demo:1] The current branch is feature/new-feature
[docker-tag-demo:3] The current commit hash is 3c1c9db713758d57a254eed96b0457cc9af3ae6b
[docker-tag-demo:5] The image tag is feature-new-feature-3c1c9db7

When variables resolve to empty string

There is a gotcha with environment variables that is best presented with the following pipeline.

kind: pipeline
name: default

  - name: docker-tag-demo
    image: debian:stable-slim
      - echo "The value is ${MY_VAR}"
      - echo "It was empty, but not this one $MY_VAR
      - echo "Nor this one $${MY_VAR}"
echo "MY_VAR=dummyvalue" > varfile
drone exec --env-file=varfile
[docker-tag-demo:1] The value is 
[docker-tag-demo:3] It was empty, but not this one dummyvalue
[docker-tag-demo:5] Nor this one dummyvalue

This is an annoying one to fix. Due to the demonstrated substitution functions, the ${variable} expressions are subject to pre-processing. If you do not want the pre-processor to evaluate your expression, it must be escaped with an extra dollar sign: $${variable}.

Reusing common variable groups with Yaml anchors

It happens that I needed to set the same environment variables in several of my Drone pipeline steps.

This quickly grows the yaml file so that it difficult to work with it. But then I figured out the syntax of yaml anchors.

  debian_image: &debian_image debian:7.11-slim
  environment: &default_environment
    HOST: postgres
    USER: postgres

kind: pipeline
name: default

  - name: anchor test
    image: *debian_image
      <<: *default_environment
      - echo "The host is $${HOST}"
      - echo "The user is $${USER}"

Thanks for reading


Are you running Kubernetes?

You can bootstrap logging, metrics and ingress with my new project. Head over 1clickinfra.com and see if it helps you.