public void Run( Project project, Package package, Deployment deployment, DeploymentProcess deploymentProcess) { try { // todo: extract part of it to another class var deploymentWorkingDir = _deploymentProcessSettings.WorkingDir .AddSegment(project.Id) .AddSegment("deploying-packages") .AddSegment($"{_clock.UtcNow.FileFriendlyFormat()}_{deployment.EnvironmentId}_package-{package.Id}"); // todo: make asynchronous var processDirectory = _deploymentProcessDirectoryFactory.CreateFromZip( deploymentProcessZip: deploymentProcess.File, toDirectory: deploymentWorkingDir ); var processOutput = _deploymentProcessRunner.Run( processDirectory.Path.ToString(), deploymentProcessFile: processDirectory.OpenProcessDescriptionFile(), variablesForEnvironment: package.GetVariablesForEnvironment(deployment.EnvironmentId) ); deployment.MarkFinished(processOutput); } catch (Exception) { deployment.MarkExecutionFailed(); throw; } }