Emcee
103 строки · 3.7 Кб
1import Deployer
2import FileSystem
3import Foundation
4import EmceeLogging
5import PathLib
6import QueueModels
7import SocketModels
8import SSHDeployer
9import Tmp
10import UniqueIdentifierGenerator
11import Zip
12
13public final class DefaultRemoteWorkersStarter: RemoteWorkerStarter {
14private let sshClientProvider: SSHClientProvider
15private let deploymentDestination: DeploymentDestination
16private let emceeVersion: Version
17private let fileSystem: FileSystem
18private let logger: ContextualLogger
19private let tempFolder: TemporaryFolder
20private let uniqueIdentifierGenerator: UniqueIdentifierGenerator
21private let zipCompressor: ZipCompressor
22
23public init(
24sshClientProvider: SSHClientProvider,
25deploymentDestination: DeploymentDestination,
26emceeVersion: Version,
27fileSystem: FileSystem,
28logger: ContextualLogger,
29tempFolder: TemporaryFolder,
30uniqueIdentifierGenerator: UniqueIdentifierGenerator,
31zipCompressor: ZipCompressor
32) {
33self.sshClientProvider = sshClientProvider
34self.deploymentDestination = deploymentDestination
35self.emceeVersion = emceeVersion
36self.fileSystem = fileSystem
37self.logger = logger
38self.tempFolder = tempFolder
39self.uniqueIdentifierGenerator = uniqueIdentifierGenerator
40self.zipCompressor = zipCompressor
41}
42
43public func deployAndStartWorker(
44queueAddress: SocketAddress
45) throws {
46let deployablesGenerator = DeployablesGenerator(
47emceeVersion: emceeVersion,
48remoteEmceeBinaryName: "EmceeWorker"
49)
50let deployableItems = try deployablesGenerator.deployables()
51let emceeBinaryDeployableItem = try deployablesGenerator.runnerTool()
52
53let launchdPlist = RemoteWorkerLaunchdPlist(
54deploymentDestination: deploymentDestination,
55emceeVersion: emceeVersion,
56executableDeployableItem: emceeBinaryDeployableItem,
57queueAddress: queueAddress
58)
59let launchdPlistTargetPath = "launchd_\(deploymentDestination.workerId.value).plist"
60
61let filePath = try tempFolder.createFile(
62filename: launchdPlistTargetPath,
63contents: try launchdPlist.plistData()
64)
65
66logger.debug("Deploying to \(deploymentDestination)")
67
68let launchdDeployableItem = DeployableItem(
69name: "launchd_plist",
70files: [
71DeployableFile(
72source: filePath,
73destination: RelativePath(launchdPlistTargetPath)
74)
75]
76)
77let launchctlDeployableCommands = LaunchctlDeployableCommands(
78launchdPlistDeployableItem: launchdDeployableItem,
79plistFilename: launchdPlistTargetPath
80)
81
82let deployer = DistDeployer(
83sshClientProvider: sshClientProvider,
84deploymentId: emceeVersion.value,
85deploymentDestination: deploymentDestination,
86deployableItems: deployableItems + [launchdDeployableItem],
87deployableCommands: [
88launchctlDeployableCommands.forceUnloadFromBackgroundCommand(),
89[
90"sleep", "2" // launchctl is async, so we have to wait :(
91],
92launchctlDeployableCommands.forceLoadInBackgroundCommand()
93],
94fileSystem: fileSystem,
95logger: logger,
96tempFolder: tempFolder,
97uniqueIdentifierGenerator: uniqueIdentifierGenerator,
98zipCompressor: zipCompressor
99)
100
101try deployer.deploy()
102}
103}
104