Passed
Push — master ( 913299...dd4b11 )
by Tom
04:05
created

StepScriptRunner::generateCommand()   B

Complexity

Conditions 9
Paths 24

Size

Total Lines 23
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 9

Importance

Changes 0
Metric Value
cc 9
eloc 12
nc 24
nop 1
dl 0
loc 23
ccs 13
cts 13
cp 1
crap 9
rs 8.0555
c 0
b 0
f 0
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines\Runner;
6
7
use Ktomk\Pipelines\Cli\Exec;
8
use Ktomk\Pipelines\File\Pipeline\Step;
9
use Ktomk\Pipelines\Lib;
10
11
/**
12
 * Class StepScriptRunner
13
 *
14
 * Running step and after-step scripts or exec scripts in a running docker container
15
 *
16
 * @package Ktomk\Pipelines\Runner
17
 *
18
 * @see StepRunner::runStepScript
19
 */
20
class StepScriptRunner
21
{
22
    /**
23
     * @var Runner
24
     */
25
    private $runner;
26
27
    /**
28
     * @var string
29
     */
30
    private $name;
31
32
    /**
33
     * Static factory method to create a run step script
34
     *
35
     * @param Runner $runner
36
     * @param string $name container name
37
     * @param Step $step
38
     *
39
     * @return int status of step script, non-zero if a script command failed
40
     */
41 1
    public static function createRunStepScript(Runner $runner, $name, Step $step)
42
    {
43 1
        $self = new self($runner, $name);
44
45 1
        return $self->runStepScript($step);
46
    }
47
48
    /**
49
     * StepScriptRunner constructor.
50
     *
51
     * @param Runner $runner
52
     * @param string $name of container to run script in
53
     */
54 5
    public function __construct(Runner $runner, $name)
55
    {
56 5
        $this->runner = $runner;
57 5
        $this->name = $name;
58 5
    }
59
60
    /**
61
     * @param Step $step
62
     *
63
     * @return int status of step script, non-zero if a script command failed
64
     */
65 5
    public function runStepScript(Step $step)
66
    {
67 5
        $streams = $this->runner->getStreams();
68 5
        $exec = $this->runner->getExec();
69 5
        $name = $this->name;
70
71 5
        $buffer = StepScriptWriter::writeStepScript(
72 5
            $step->getScript(),
73 5
            $this->runner->getRunOpts()->getBoolOption('script.exit-early')
74
        );
75
76 5
        $status = $this->execScript($buffer, $exec, $name);
77 5
        if (0 !== $status) {
78 2
            $streams->err(sprintf("script non-zero exit status: %d\n", $status));
79
        }
80
81 5
        if (!($script = $step->getAfterScript())) {
82 3
            return $status;
83
        }
84
85 2
        $streams->out("After script:\n");
86
87 2
        $buffer = StepScriptWriter::writeAfterScript($script, $status);
88
89 2
        $afterStatus = $this->execScript($buffer, $exec, $name);
90 2
        if (0 !== $afterStatus) {
91 1
            $streams->err(sprintf("after-script non-zero exit status: %d\n", $afterStatus));
92
        }
93
94 2
        return $status;
95
    }
96
97
    /**
98
     *
99
     * @param string $script "\n" terminated script lines
100
     * @param Exec $exec
101
     * @param string $name
102
     *
103
     * @return int
104
     */
105 5
    private function execScript($script, Exec $exec, $name)
106
    {
107 5
        $buffer = Lib::cmd("<<'SCRIPT' docker", array(
108 5
                'exec', '-i', $name, '/bin/sh',
109 5
            )) . "\n";
110 5
        $buffer .= $script;
111 5
        $buffer .= "SCRIPT\n";
112
113 5
        return $exec->pass($buffer, array());
114
    }
115
}
116