Azure Pipelines has been interesting to me especially given the generous free open source tier and seemingly instant availability of build agents. The setup is easy if you’re building .NET targets with lots of useful starters available.
Some areas have been frustrating, specifically build variables, the difficulty in getting the app installed, and the limitations on triggers if you can’t (non-GitHub apps can’t be installed on Enterprise accounts even if FREE).
We’ll concentrate on the build variable oddities for this post.
The Pipeline configuration helpfully has a tab named Variables that looks much like you’d expect with a big list of names, values, a lock icon and a checkbox for ‘Settable at queue time’.
There are, however, some oddities when compared to existing CI servers with these - especially if you expect to be able to use them as environment variables.
The documentation for these - especially for Predefined build variables shows the expected variables but, they use a dot naming convention.
This dot naming convention does not work if you are using them as environment variables. They are upper-cased and . is replaced with _ so for example:
Build.BuildNumber is actually
One even more confusing element is that when you mark your own (sensibly named) value as secret it suddenly stops being available as an environment variable.
Note: You should never build PRs with secret variables. Doing so allows anyone to submit a PR that simply echos them to the build log for harvesting. By default secrets are not available to pull requests in Azure Pipelines - leave it that way!
So how do you get these secret variables re-exposed as environment variables? While Stack Overflow has a bunch of complicated answers there is a much simpler way:
- Select the step from your job
- Expand the environment variables section
- Repeat the following steps for each environment variable
- Enter your variable name in the Name box
$(variable_name)in the Value box
Now when you run the job, the build step will use the secure variable. This screenshot shows you an example:
If I find workarounds for the app installations, I’ll blog them!