public function handle(Pusher $pusher) { $timeStarted = time(); $key = $this->writePrivateKey(); try { $this->release->update(['status' => Release::RUNNING, 'started_at' => new \DateTime()]); $ansible = new Ansible($this->release->path(), Release::INVENTORY_FILENAME, Release::PLAYBOOK_FILENAME, $this->release->inventory->params + ['private_key' => $key]); $process = $ansible->play(); $process->start(); $lastOut = $process->getOutput(); while ($process->isRunning() && !$this->release->isCancelled()) { $out = $process->getOutput(); if ($lastOut != $out) { $this->updateRelease($process); $pusher->trigger(['releases'], "release-" . $this->release->id, $this->release->toArray()); $lastOut = $out; } sleep(1); } if ($process->isRunning()) { $process->stop(0); } $this->fs()->delete($key); $this->updateRelease($process); if ($this->release->status == Release::CANCELLED) { $pusher->trigger(['releases'], "release-" . $this->release->id, $this->release->toArray()); } elseif ($process->getExitCode() == 0) { $this->notifier()->notifySuccess($this->release); $this->release->update(['status' => Release::COMPLETED, 'time' => time() - $timeStarted]); $pusher->trigger(['releases'], "release-" . $this->release->id, $this->release->toArray()); } else { $this->notifier()->notifyFailure($this->release, $process->getErrorOutput()); throw new AnsibleException($this->release, $ansible, $process->getErrorOutput()); } } catch (\Exception $e) { $this->release->update(['status' => Release::ERROR, 'time' => time() - $timeStarted]); $pusher->trigger(['releases'], "release-" . $this->release->id, $this->release->toArray()); $this->fs()->delete($key); throw $e; } }
/** * @param Release $release * @param Ansible $ansible * @param string $message */ public function __construct(Release $release, Ansible $ansible, $message = "") { $this->ansible = $ansible; $message = sprintf("Error while running ansible (%s/%s): %s", $ansible->getPlaybookFile(), $ansible->getInventoryFile(), $message); parent::__construct($release, $message); }