|
25 | 25 | from .pathmapper import PathMapper
|
26 | 26 | from .process import (UnsupportedRequirement, get_feature,
|
27 | 27 | stageFiles)
|
| 28 | +from .secrets import SecretStore |
28 | 29 | from .utils import bytes2str_in_dicts
|
29 | 30 | from .utils import copytree_with_merge, onWindows
|
30 | 31 |
|
@@ -170,8 +171,8 @@ def _setup(self, kwargs): # type: (Dict) -> None
|
170 | 171 | _logger.debug(u"[job %s] initial work dir %s", self.name,
|
171 | 172 | json.dumps({p: self.generatemapper.mapper(p) for p in self.generatemapper.files()}, indent=4))
|
172 | 173 |
|
173 |
| - def _execute(self, runtime, env, rm_tmpdir=True, move_outputs="move"): |
174 |
| - # type: (List[Text], MutableMapping[Text, Text], bool, Text) -> None |
| 174 | + def _execute(self, runtime, env, rm_tmpdir=True, move_outputs="move", secret_store=None): |
| 175 | + # type: (List[Text], MutableMapping[Text, Text], bool, Text, SecretStore) -> None |
175 | 176 |
|
176 | 177 | scr, _ = get_feature(self, "ShellCommandRequirement")
|
177 | 178 |
|
@@ -214,6 +215,10 @@ def _execute(self, runtime, env, rm_tmpdir=True, move_outputs="move"):
|
214 | 215 | stdout_path = absout
|
215 | 216 |
|
216 | 217 | commands = [Text(x) for x in (runtime + self.command_line)]
|
| 218 | + if secret_store: |
| 219 | + commands = secret_store.retrieve(commands) |
| 220 | + env = secret_store.retrieve(env) |
| 221 | + |
217 | 222 | job_script_contents = None # type: Text
|
218 | 223 | builder = getattr(self, "builder", None) # type: Builder
|
219 | 224 | if builder is not None:
|
@@ -269,6 +274,19 @@ def _execute(self, runtime, env, rm_tmpdir=True, move_outputs="move"):
|
269 | 274 | if _logger.isEnabledFor(logging.DEBUG):
|
270 | 275 | _logger.debug(u"[job %s] %s", self.name, json.dumps(outputs, indent=4))
|
271 | 276 |
|
| 277 | + if self.generatemapper and secret_store: |
| 278 | + # Delete any runtime-generated files containing secrets. |
| 279 | + for f, p in self.generatemapper.items(): |
| 280 | + if p.type == "CreateFile": |
| 281 | + if secret_store.has_secret(p.resolved): |
| 282 | + host_outdir = self.outdir |
| 283 | + container_outdir = self.builder.outdir |
| 284 | + host_outdir_tgt = p.target |
| 285 | + if p.target.startswith(container_outdir+"/"): |
| 286 | + host_outdir_tgt = os.path.join( |
| 287 | + host_outdir, p.target[len(container_outdir)+1:]) |
| 288 | + os.remove(host_outdir_tgt) |
| 289 | + |
272 | 290 | with job_output_lock:
|
273 | 291 | self.output_callback(outputs, processStatus)
|
274 | 292 |
|
@@ -307,12 +325,12 @@ def run(self, pull_image=True, rm_container=True,
|
307 | 325 | if "SYSTEMROOT" not in env and "SYSTEMROOT" in os.environ:
|
308 | 326 | env["SYSTEMROOT"] = str(os.environ["SYSTEMROOT"]) if onWindows() else os.environ["SYSTEMROOT"]
|
309 | 327 |
|
310 |
| - stageFiles(self.pathmapper, ignoreWritable=True, symLink=True) |
| 328 | + stageFiles(self.pathmapper, ignoreWritable=True, symLink=True, secret_store=kwargs.get("secret_store")) |
311 | 329 | if self.generatemapper:
|
312 |
| - stageFiles(self.generatemapper, ignoreWritable=self.inplace_update, symLink=True) |
| 330 | + stageFiles(self.generatemapper, ignoreWritable=self.inplace_update, symLink=True, secret_store=kwargs.get("secret_store")) |
313 | 331 | relink_initialworkdir(self.generatemapper, self.outdir, self.builder.outdir, inplace_update=self.inplace_update)
|
314 | 332 |
|
315 |
| - self._execute([], env, rm_tmpdir=rm_tmpdir, move_outputs=move_outputs) |
| 333 | + self._execute([], env, rm_tmpdir=rm_tmpdir, move_outputs=move_outputs, secret_store=kwargs.get("secret_store")) |
316 | 334 |
|
317 | 335 |
|
318 | 336 | class ContainerCommandLineJob(JobBase):
|
@@ -382,7 +400,7 @@ def run(self, pull_image=True, rm_container=True,
|
382 | 400 | runtime = self.create_runtime(env, rm_container, record_container_id, cidfile_dir, cidfile_prefix, **kwargs)
|
383 | 401 | runtime.append(img_id)
|
384 | 402 |
|
385 |
| - self._execute(runtime, env, rm_tmpdir=rm_tmpdir, move_outputs=move_outputs) |
| 403 | + self._execute(runtime, env, rm_tmpdir=rm_tmpdir, move_outputs=move_outputs, secret_store=kwargs.get("secret_store")) |
386 | 404 |
|
387 | 405 |
|
388 | 406 | def _job_popen(
|
|
0 commit comments