1# frozen_string_literal: true 2 3module Ci 4 ## 5 # This module implements methods that provide context in form of 6 # essential CI/CD variables that can be used by a build / bridge job. 7 # 8 module Contextable 9 ## 10 # Variables in the environment name scope. 11 # 12 def scoped_variables(environment: expanded_environment_name, dependencies: true) 13 track_duration do 14 variables = pipeline.variables_builder.scoped_variables(self, environment: environment, dependencies: dependencies) 15 16 variables.concat(project.predefined_variables) 17 variables.concat(pipeline.predefined_variables) 18 variables.concat(runner.predefined_variables) if runnable? && runner 19 variables.concat(kubernetes_variables) 20 variables.concat(deployment_variables(environment: environment)) 21 variables.concat(yaml_variables) 22 variables.concat(user_variables) 23 variables.concat(dependency_variables) if dependencies 24 variables.concat(secret_instance_variables) 25 variables.concat(secret_group_variables(environment: environment)) 26 variables.concat(secret_project_variables(environment: environment)) 27 variables.concat(trigger_request.user_variables) if trigger_request 28 variables.concat(pipeline.variables) 29 variables.concat(pipeline.pipeline_schedule.job_variables) if pipeline.pipeline_schedule 30 31 variables 32 end 33 end 34 35 def track_duration 36 start_time = ::Gitlab::Metrics::System.monotonic_time 37 result = yield 38 duration = ::Gitlab::Metrics::System.monotonic_time - start_time 39 40 ::Gitlab::Ci::Pipeline::Metrics 41 .pipeline_builder_scoped_variables_histogram 42 .observe({}, duration.seconds) 43 44 result 45 end 46 47 ## 48 # Variables that do not depend on the environment name. 49 # 50 def simple_variables 51 strong_memoize(:simple_variables) do 52 scoped_variables(environment: nil) 53 end 54 end 55 56 def simple_variables_without_dependencies 57 strong_memoize(:variables_without_dependencies) do 58 scoped_variables(environment: nil, dependencies: false) 59 end 60 end 61 62 def user_variables 63 Gitlab::Ci::Variables::Collection.new.tap do |variables| 64 break variables if user.blank? 65 66 variables.append(key: 'GITLAB_USER_ID', value: user.id.to_s) 67 variables.append(key: 'GITLAB_USER_EMAIL', value: user.email) 68 variables.append(key: 'GITLAB_USER_LOGIN', value: user.username) 69 variables.append(key: 'GITLAB_USER_NAME', value: user.name) 70 end 71 end 72 73 def kubernetes_variables 74 ::Gitlab::Ci::Variables::Collection.new.tap do |collection| 75 # Should get merged with the cluster kubeconfig in deployment_variables, see 76 # https://gitlab.com/gitlab-org/gitlab/-/issues/335089 77 template = ::Ci::GenerateKubeconfigService.new(self).execute 78 79 if template.valid? 80 collection.append(key: 'KUBECONFIG', value: template.to_yaml, public: false, file: true) 81 end 82 end 83 end 84 85 def deployment_variables(environment:) 86 return [] unless environment 87 88 project.deployment_variables( 89 environment: environment, 90 kubernetes_namespace: expanded_kubernetes_namespace 91 ) 92 end 93 94 def secret_instance_variables 95 project.ci_instance_variables_for(ref: git_ref) 96 end 97 98 def secret_group_variables(environment: expanded_environment_name) 99 return [] unless project.group 100 101 project.group.ci_variables_for(git_ref, project, environment: environment) 102 end 103 104 def secret_project_variables(environment: expanded_environment_name) 105 project.ci_variables_for(ref: git_ref, environment: environment) 106 end 107 end 108end 109