Treat $$a as an escaped string in ExpandVariables::VARIABLES_REGEXP

When we enable the :variable_inside_variable FF, users will run into issues if they are leveraging escaping in their expressions. Let's say a user has defined the variable VAR_A=$$HOME, intending for the value to be expanded to $HOME by GitLab, and then to the actual HOME environment variable value by the Runner. In the current state, since ExpandVariables.VARIABLES_REGEXP is not smart enough to handle escaping, the value will get expanded to $ plus the value of $HOME by GitLab. The user will get a value for $HOME that is not the expected one (the one on the Runner where the build will be happening).

A user has come across this situation when we enabled the FF.


Current if a is defined as value_a, $$a will get resolved to $value_a. That is not the intended behavior, and ExpandVariables::VARIABLES_REGEXP should ignore references if the are escaped.

The following discussion from !54504 (merged) should be addressed:

  • @ayufan started a discussion: (+1 comment)

    I also noticed this being broken with this regex expansion:

    ExpandVariables.variable_references('$$aaaa') => ['aaaa']

    Where-as it should return empty array, since the $$ is escaped.

    However, it appears that ExpandVariables.expand('$$aaaa', {}) is broken as well, as it should return $aaaa.

    This seems to be ~bug in regexp.

Edited by Pedro Pombeiro