Pipelines Environment Variable Usage¶
Environment variables (also known as environment parameters) are a first grade citizen of the pipelines
utility.
The pipelines
utility has support for Bitbucket Cloud Pipelines Plugin environment variables. This document describes along the list of default variables [BBPL-ENV] the level of support and provides useful information for setting and using these variables.
This document is a lengthier review of all variables at the time of writing and provides additional information next to the short introduction in the read me, both for limitations of the pipelines
utility to this regard (and therefore feature planning) and usage guidelines for "dot env" environment files in project scope in a suggested (and best-intend compatible) fashion (façon).
Default Variables¶
Variable Name | Remarks |
---|---|
CI | all options; always set to "true " |
BITBUCKET_BOOKMARK | --trigger <ref> where <ref> is bookmark:<name> ; for Mercurial projects |
BITBUCKET_BRANCH | --trigger <ref> where <ref> is branch:<name> , pr:<name> , pr:<source>:<destination> ; (source) branch |
BITBUCKET_BUILD_NUMBER | all options; always set to "0 " |
BITBUCKET_CLONE_DIR | all options; set by pipelines, it is the deploy directory inside the container (not clone directory) as pipelines has more options than cloning (it currently actually never clones) |
BITBUCKET_COMMIT | all options; always set to "0000000000000000000000000000000000000000 " |
BITBUCKET_DEPLOYMENT_ENVIRONMENT | -/-; currently unsupported |
BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID | -/-; currently unsupported |
BITBUCKET_EXIT_CODE | all options; set to the exit status of the script for use in the after-script |
BITBUCKET_GIT_HTTP_ORIGIN | -/-; currently unsupported |
BITBUCKET_GIT_SSH_ORIGIN | -/-; currently unsupported |
BITBUCKET_PARALLEL_STEP | all options; in a parallel step set to zero-based index of the current step in the group, e.g. 0, 1, 2, ... |
BITBUCKET_PARALLEL_STEP_COUNT | all options; in a parallel step set to the total number of steps in the group, e.g. 5. |
BITBUCKET_PR_DESTINATION_BRANCH | --trigger <ref> where <ref> is pr:<source>:<destination> for the <destination> branch (see as well BITBUCKET_BRANCH ); destination branch |
BITBUCKET_PR_ID | -/-; currently unsupported |
BITBUCKET_PROJECT_KEY | -/-; currently unsupported |
BITBUCKET_PROJECT_UUID | -/-; currently unsupported |
BITBUCKET_REPO_FULL_NAME | -/-; currently unsupported |
BITBUCKET_REPO_OWNER | all options; always set to current username from environment or if not available "nobody " (which might align w/ the Apache httpd project) |
BITBUCKET_REPO_OWNER_UUID | -/-; currently unsupported |
BITBUCKET_REPO_SLUG | all options; always set to base name of project directory |
BITBUCKET_REPO_UUID | -/-; currently unsupported |
BITBUCKET_STEP_RUN_NUMBER | all options; defaults to "1 " and is set to "1 " after the first run step |
BITBUCKET_STEP_TRIGGERER_UUID | -/-; currently unsupported |
BITBUCKET_TAG | --trigger <ref> where <ref> is tag:<name> ; Git projects |
Comments on Support and Usage¶
All environment variables are supported in the meaning they can be explicitly passed with any value of the users wish (or command) into the container. That is even true for those variables "always" set to a specific value - variables passed by the user will always override any automatically "always" set values.
Unsupported Features and Environment Variables¶
Some variables yet do not make sense as the pipelines utility does not support the underlying feature.
For example, the variable BITBUCKET_DEPLOYMENT_ENVIRONMENT
and the depployments are not (yet) supported, therefore the variable BITBUCKET_DEPLOYMENT_ENVIRONMENT
is not set. Setting it before call makes not much sense as it would be set for every script, and not the deployment script only.
However: Some variables which are valid per project and which are marked "currently unsupported" above do make sense to be put into the auto-loading environment files (.env
and .env.dist
). As long as their values are not considered a secret, they can be added including the values to .env.dist
which intention is to be committed in the project repository (see your VCS/SCMs' documentation, e.g. for git
see git-ignore [GIT-IGNORE]).
Otherwise, instead of poisoning your local environment, project secrets can be put into the private .env
file (or any other *.env
file via the --env-file
option).
This is as long as you consider your local system safe (if your computer is connected to the internet this might not be the case and might be an overall short-coming with the Atlassian Bitbucket Cloud Pipelines Plugin, take care [!] as Secured Variables are just masked and can be read by any user who has write access to a Bitbucket repository - similar to read access on a/your local system).
Dealing w/ Secrets as Variable Values¶
For secret environment parameters, put them into the .env
file only (or other .env
files - if at all) which by intention is/are not to be committed in the project repository.
However: Required variables (with secrets) should be added with their name only to .env.dist
file which is the project distribution parameter definition so that it clearly is documented which variables are required (this can be very helpful to document which secrets are needed and for non-secret what [sane] defaults are).
Example Configuration of an Environment File¶
Example configuration in a git based project with "dot env" files as they work w/ the pipelines utility:
The pipelines utility adheres to environment files as by the Docker project. That is mainly b/c it is highly dependent on the Docker client utility and the environment file-format in the Docker project ships with all needed features:
- environment variables,
- environment parameter imports / definitions and
- comments .
The following example consists of three files: First a .gitignore
file that takes care that no environment files but .env.dist
is getting committed to the git repository.
This is necessary as these files might contain secrets (even in plain text) which should never go into the projects history (applies to git
-utility managed projects only for .gitignore
see your VCS utility if different for similar options).
From pipelines
perspective, the file intended to be committed is the .env.dist
file. It should contain all major variables but no secrets. This is possible by writing down the variable (parameter) name only. One such variable in the example is AWS_ACCESS_KEY_ID
. The key-id and the access key are considered a secret in the following example.
The .env
file then (can) contain private information if ok persisted in the local file-system. Different dot-env files can be provided w/ the --env-file <path>
option of the pipelines
(or docker
) utility.
-
.gitignore
file:# ... # Private environment variable files (dot env) /.env* !/.env.dist # ...
(for more information on the
.gitignore
file format best see the gitignore documentation [GIT-IGNORE]) -
.env.dist
file:# --- # Pipeline: Gitlab Cloud Project # BITBUCKET_REPO_OWNER=ACME.Inc. BITBUCKET_REPO_OWNER_UUID=894510a8-be2a-4660-a276-10fd5280cc61 BITBUCKET_REPO_SLUG=sudo-make-sandwich BITBUCKET_REPO_UUID=894510a8-be2a-4660-a276-10fd5280cc61 # --- # Pipeline: AWS ECR # AWS_REGION=eu-west-1 AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
(secrets in this
.env
file are hidden, only their variable names are given, e.g.AWS_SECRET_ACCESS_KEY
) -
.env
file:# --- # Pipeline: AWS ECR # AWS_REGION=eu-west-1 AWS_ACCESS_KEY_ID=ETI1ZUOWJ2GO5Q8IDFDC AWS_SECRET_ACCESS_KEY=IzuobhF55og9fel6hleyuo4UOA0lUL9+GE2RmH6J
This example provides the project-wide information which environment variables are required for it. Additionally the project-wide default values are provided and the configuration setup does allow (local) (secret) configuration.
The comment blocks for a section are multi-line and follow an exemplary format of the first line of the comment block having a separating three-dash-line and a single (empty) line at the end after the second line containing a section title so that it is easy to diff between .env
and .env.dist
(and other) files.
Why Multi-Line Comments?¶
Why multi-line comments? In practice I found that single line comments are not that practical with text differs for sections, actually this is how this format came to life; when using various diff
-utilities to compare these various dot-env files.
It is however up to every users discreet own experience(s) and need(s) on how to introduce sections in dot env files. It is only a subjective suggestion.
Note that there is a single empty line before any other but the first section comment block if the first section comment block starts on the very first line of the file. This is crucial for all differs I've run across.
Environment Parameters Considered for Distribution¶
If a project fully relies on Atlassian Bitbucket Cloud Pipelines Environment (by my reading of their documentation) the following environment variables and values should be distributed within the project:
BITBUCKET_PROJECT_KEY
BITBUCKET_PROJECT_UUID
BITBUCKET_REPO_FULL_NAME
BITBUCKET_REPO_OWNER
BITBUCKET_REPO_OWNER_UUID
BITBUCKET_REPO_SLUG
- if not matching project base nameBITBUCKET_REPO_UUID
Note: Perhaps UUID values are gained best via the Bitbucket Cloud REST API on the shell command line.