Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ci/variables/collection.rb')
-rw-r--r--lib/gitlab/ci/variables/collection.rb86
1 files changed, 43 insertions, 43 deletions
diff --git a/lib/gitlab/ci/variables/collection.rb b/lib/gitlab/ci/variables/collection.rb
index e9766061072..9960a6fbdf5 100644
--- a/lib/gitlab/ci/variables/collection.rb
+++ b/lib/gitlab/ci/variables/collection.rb
@@ -72,8 +72,36 @@ module Gitlab
Collection.new(@variables.reject(&block))
end
- # `expand_raw_refs` will be deleted with the FF `ci_raw_variables_in_yaml_config`.
- def expand_value(value, keep_undefined: false, expand_file_refs: true, expand_raw_refs: true, project: nil)
+ def sort_and_expand_all(keep_undefined: false, expand_file_refs: true, expand_raw_refs: true)
+ sorted = Sort.new(self)
+ return self.class.new(self, sorted.errors) unless sorted.valid?
+
+ new_collection = self.class.new
+
+ sorted.tsort.each do |item|
+ unless item.depends_on
+ new_collection.append(item)
+ next
+ end
+
+ # expand variables as they are added
+ variable = item.to_runner_variable
+ variable[:value] = new_collection.expand_value(variable[:value], keep_undefined: keep_undefined,
+ expand_file_refs: expand_file_refs,
+ expand_raw_refs: expand_raw_refs)
+ new_collection.append(variable)
+ end
+
+ new_collection
+ end
+
+ def to_s
+ "#{@variables_by_key.keys}, @errors='#{@errors}'"
+ end
+
+ protected
+
+ def expand_value(value, keep_undefined: false, expand_file_refs: true, expand_raw_refs: true)
value.gsub(Item::VARIABLES_REGEXP) do
match = Regexp.last_match # it is either a valid variable definition or a ($$ / %%)
full_match = match[0]
@@ -88,19 +116,20 @@ module Gitlab
if variable # VARIABLE_NAME is an existing variable
if variable.file?
- # Will be cleaned up with https://gitlab.com/gitlab-org/gitlab/-/issues/378266
- if project
- # We only log if `project` exists to make sure it is called from `Ci::BuildRunnerPresenter`
- # when the variables are sent to Runner.
- Gitlab::AppJsonLogger.info(event: 'file_variable_is_referenced_in_another_variable',
- project_id: project.id,
- variable: variable_name)
- end
-
expand_file_refs ? variable.value : full_match
elsif variable.raw?
- # With `full_match`, we defer the expansion of raw variables to the runner. If we expand them here,
- # the runner will not know the expanded value is a raw variable and it tries to expand it again.
+ # Normally, it's okay to expand a raw variable if it's referenced in another variable because
+ # its rawness is not broken. However, the runner also tries to expand variables.
+ # Here, with `full_match`, we defer the expansion of raw variables to the runner.
+ # If we expand them here, the runner will not know that the expanded value is a raw variable
+ # and it tries to expand it again.
+ # Example: `A` is a normal variable with value `normal`.
+ # `B` is a raw variable with value `raw-$A`.
+ # `C` is a normal variable with value `$B`.
+ # If we expanded `C` here, the runner would receive `C` as `raw-$A`. And since `A` is a normal
+ # variable, the runner would expand it. So, the result would be `raw-normal`.
+ # With `full_match`, the runner receives `C` as `$B`. And since `B` is a raw variable, the
+ # runner expanded it as `raw-$A`, which is what we want.
# Discussion: https://gitlab.com/gitlab-org/gitlab/-/issues/353991#note_1103274951
expand_raw_refs ? variable.value : full_match
else
@@ -115,36 +144,7 @@ module Gitlab
end
end
- # `expand_raw_refs` will be deleted with the FF `ci_raw_variables_in_yaml_config`.
- def sort_and_expand_all(keep_undefined: false, expand_file_refs: true, expand_raw_refs: true, project: nil)
- sorted = Sort.new(self)
- return self.class.new(self, sorted.errors) unless sorted.valid?
-
- new_collection = self.class.new
-
- sorted.tsort.each do |item|
- unless item.depends_on
- new_collection.append(item)
- next
- end
-
- # expand variables as they are added
- variable = item.to_runner_variable
- variable[:value] = new_collection.expand_value(variable[:value], keep_undefined: keep_undefined,
- expand_file_refs: expand_file_refs,
- expand_raw_refs: expand_raw_refs,
- project: project)
- new_collection.append(variable)
- end
-
- new_collection
- end
-
- def to_s
- "#{@variables_by_key.keys}, @errors='#{@errors}'"
- end
-
- protected
+ private
attr_reader :variables
end