@@ -100,7 +100,12 @@ export class Job {
100100 readonly exists : string [ ] ;
101101 readonly pipelineIid : number ;
102102 readonly gitData : GitData ;
103+ readonly inherit : {
104+ variables ?: boolean | string [ ] ;
105+ default ?: boolean | string [ ] ;
106+ } ;
103107
108+ private readonly _globalVariables : { [ key : string ] : string } = { } ;
104109 private readonly _variables : { [ key : string ] : string } = { } ;
105110 private _dotenvVariables : { [ key : string ] : string } = { } ;
106111 private _prescriptsExitCode : number | null = null ;
@@ -126,7 +131,6 @@ export class Job {
126131 const jobData = opt . data ;
127132 const gitData = opt . gitData ;
128133 const jobVariables = jobData . variables ?? { } ;
129- const globalVariables = opt . globalVariables ?? { } ;
130134 const variablesFromFiles = opt . variablesFromFiles ;
131135 const argv = opt . argv ;
132136 const cwd = argv . cwd ;
@@ -143,6 +147,15 @@ export class Job {
143147 this . jobId = this . generateJobId ( ) ;
144148 this . jobData = opt . data ;
145149 this . pipelineIid = opt . pipelineIid ;
150+ this . _globalVariables = opt . globalVariables ;
151+
152+ this . inherit = { } ;
153+ this . inherit . variables = this . jobData . inherit ?. variables ?? true ;
154+ this . inherit . default = this . jobData . inherit ?. default ?? true ;
155+
156+ if ( this . inherit . default === false ) {
157+ this . writeStreams . memoStdout ( chalk `{black.bgYellowBright WARN } \`.inherit.default\` has not been implemented!\n` ) ;
158+ }
146159
147160 this . when = jobData . when || "on_success" ;
148161 this . exists = jobData . exists || [ ] ;
@@ -153,7 +166,7 @@ export class Job {
153166
154167 const matrixVariables = opt . matrixVariables ?? { } ;
155168 const fileVariables = Utils . findEnvMatchedVariables ( variablesFromFiles , this . fileVariablesDir ) ;
156- this . _variables = { ...globalVariables , ...jobVariables , ...matrixVariables , ...predefinedVariables , ...fileVariables , ...argvVariables } ;
169+ this . _variables = { ...this . globalVariables , ...jobVariables , ...matrixVariables , ...predefinedVariables , ...fileVariables , ...argvVariables } ;
157170
158171 let ciProjectDir = `${ cwd } ` ;
159172 if ( this . jobData [ "image" ] ) {
@@ -209,14 +222,14 @@ export class Job {
209222 const envMatchedVariables = Utils . findEnvMatchedVariables ( variablesFromFiles , this . fileVariablesDir , this . environment ) ;
210223
211224 // Merge and expand after finding env matched variables
212- this . _variables = { ...globalVariables , ...jobVariables , ...matrixVariables , ...predefinedVariables , ...envMatchedVariables , ...argvVariables } ;
225+ this . _variables = { ...this . globalVariables , ...jobVariables , ...matrixVariables , ...predefinedVariables , ...envMatchedVariables , ...argvVariables } ;
213226
214227 // Set {when, allowFailure} based on rules result
215228 if ( this . rules ) {
216229 const ruleResult = Utils . getRulesResult ( { cwd, rules : this . rules , variables : this . _variables } , this . gitData , this . when , this . allowFailure ) ;
217230 this . when = ruleResult . when ;
218231 this . allowFailure = ruleResult . allowFailure ;
219- this . _variables = { ...globalVariables , ...jobVariables , ...ruleResult . variables , ...matrixVariables , ...predefinedVariables , ...envMatchedVariables , ...argvVariables } ;
232+ this . _variables = { ...this . globalVariables , ...jobVariables , ...ruleResult . variables , ...matrixVariables , ...predefinedVariables , ...envMatchedVariables , ...argvVariables } ;
220233 }
221234 // Delete variables the user intentionally wants unset
222235 for ( const unsetVariable of argv . unsetVariables ) {
@@ -450,6 +463,18 @@ export class Job {
450463 return `/tmp/gitlab-ci-local-file-variables-${ this . _variables [ "CI_PROJECT_PATH_SLUG" ] } -${ this . jobId } ` ;
451464 }
452465
466+ get globalVariables ( ) {
467+ if ( this . inherit . variables === false ) {
468+ return { } ;
469+ } else if ( Array . isArray ( this . inherit . variables ) ) {
470+ const inheritVariables = this . inherit . variables ;
471+ return Object . fromEntries (
472+ Object . entries ( this . _globalVariables ) . filter ( ( [ k ] ) => inheritVariables . includes ( k ) )
473+ ) ;
474+ }
475+ return this . _globalVariables ;
476+ }
477+
453478 async start ( ) : Promise < void > {
454479 this . _running = true ;
455480
0 commit comments