Github Actions ‘type’ metadata on custom action or workflow inputs is, pretty much, just documentation – it doesn’t seem to be enforced, at least when it comes to supplying a default value. That means that just because you’ve claimed it’s a bool
doesn’t make it so.
And worse, it seems that default values get coerced to strings if you use an expression.
At TILLIT we have custom GitHub composite actions to perform various tasks during CI. We recently hit a snag with one roughly structured as follows
name: ...
inputs:
readonly:
type: boolean
default: ${{ some logic here }}
runs:
using: "composite"
steps:
- name: ...
uses: ...
with:
some-property: ...${{ inputs.readonly && 'true-val' || 'false-val' }}...
That mess in the some-property
definition is the closest you can get in Github Actions to a ternary operator in the absence of any if
-like construct, where you want to format a string based on some boolean.
In our case – the ‘true’ path was the only path ever taken. Diagnostic logging on the action showed that inputs.readonly
was ‘false’. Wait, are those quotes?
Of course they are! The default value ended up being set to be a string, even though the input’s default value expression is purely boolean in nature and it’s specified as being a boolean.
The fix then is to our ternary, and to be very explicit as to the comparison being made.
with:
some-property: ...${{ inputs.readonly == 'true' && 'true-val' || 'false-val'