Skip to content

Commit

Permalink
Upload binary cache and selective testing hashes to the server (tuist…
Browse files Browse the repository at this point in the history
…#7278)

* Upload binary cache and selective testing hashes to the server

* Address PR feedback
  • Loading branch information
fortmarek authored Feb 4, 2025
1 parent 6d50c90 commit 717d701
Show file tree
Hide file tree
Showing 42 changed files with 1,661 additions and 802 deletions.
67 changes: 12 additions & 55 deletions Sources/TuistCore/Analytics/CommandEvent.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import AnyCodable
import Foundation
import Path

Expand All @@ -7,7 +6,6 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
public let runId: String
public let name: String
public let subcommand: String?
public let params: [String: AnyCodable]
public let commandArguments: [String]
public let durationInMs: Int
public let clientId: String
Expand All @@ -21,14 +19,8 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
public let gitRef: String?
public let gitRemoteURLOrigin: String?
public let gitBranch: String?
public let targetHashes: [CommandEventGraphTarget: String]?
public let graphPath: AbsolutePath?
public let cacheableTargets: [String]
public let localCacheTargetHits: [String]
public let remoteCacheTargetHits: [String]
public let testTargets: [String]
public let localTestTargetHits: [String]
public let remoteTestTargetHits: [String]
public let graph: RunGraph?
public let previewId: String?

public enum Status: Codable, Equatable {
case success, failure(String)
Expand All @@ -42,7 +34,6 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
case runId
case name
case subcommand
case params
case commandArguments
case durationInMs = "duration"
case clientId
Expand All @@ -56,21 +47,14 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
case gitRef
case gitRemoteURLOrigin
case gitBranch
case targetHashes
case graphPath
case cacheableTargets
case localCacheTargetHits
case remoteCacheTargetHits
case testTargets
case localTestTargetHits
case remoteTestTargetHits
case graph
case previewId
}

public init(
runId: String,
name: String,
subcommand: String?,
params: [String: AnyCodable],
commandArguments: [String],
durationInMs: Int,
clientId: String,
Expand All @@ -84,19 +68,12 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
gitRef: String?,
gitRemoteURLOrigin: String?,
gitBranch: String?,
targetHashes: [CommandEventGraphTarget: String]?,
graphPath: AbsolutePath?,
cacheableTargets: [String],
localCacheTargetHits: [String],
remoteCacheTargetHits: [String],
testTargets: [String],
localTestTargetHits: [String],
remoteTestTargetHits: [String]
graph: RunGraph?,
previewId: String?
) {
self.runId = runId
self.name = name
self.subcommand = subcommand
self.params = params
self.commandArguments = commandArguments
self.durationInMs = durationInMs
self.clientId = clientId
Expand All @@ -110,14 +87,8 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
self.gitRef = gitRef
self.gitRemoteURLOrigin = gitRemoteURLOrigin
self.gitBranch = gitBranch
self.targetHashes = targetHashes
self.graphPath = graphPath
self.cacheableTargets = cacheableTargets
self.localCacheTargetHits = localCacheTargetHits
self.remoteCacheTargetHits = remoteCacheTargetHits
self.testTargets = testTargets
self.localTestTargetHits = localTestTargetHits
self.remoteTestTargetHits = remoteTestTargetHits
self.graph = graph
self.previewId = previewId
}
}

Expand All @@ -127,7 +98,6 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
runId: String = "",
name: String = "generate",
subcommand: String? = nil,
params: [String: AnyCodable] = [:],
commandArguments: [String] = [],
durationInMs: Int = 20,
clientId: String = "123",
Expand All @@ -140,20 +110,13 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
gitRef: String? = "refs/heads/main",
gitRemoteURLOrigin: String? = "https://github.com/tuist/tuist",
gitBranch: String? = "main",
targetHashes: [CommandEventGraphTarget: String]? = nil,
graphPath: AbsolutePath? = nil,
cacheableTargets: [String] = [],
localCacheTargetHits: [String] = [],
remoteCacheTargetHits: [String] = [],
testTargets: [String] = [],
localTestTargetHits: [String] = [],
remoteTestTargetHits: [String] = []
graph: RunGraph = RunGraph(name: "Graph", projects: []),
previewId: String? = nil
) -> CommandEvent {
CommandEvent(
runId: runId,
name: name,
subcommand: subcommand,
params: params,
commandArguments: commandArguments,
durationInMs: durationInMs,
clientId: clientId,
Expand All @@ -167,14 +130,8 @@ public struct CommandEvent: Codable, Equatable, AsyncQueueEvent {
gitRef: gitRef,
gitRemoteURLOrigin: gitRemoteURLOrigin,
gitBranch: gitBranch,
targetHashes: targetHashes,
graphPath: graphPath,
cacheableTargets: cacheableTargets,
localCacheTargetHits: localCacheTargetHits,
remoteCacheTargetHits: remoteCacheTargetHits,
testTargets: testTargets,
localTestTargetHits: localTestTargetHits,
remoteTestTargetHits: remoteTestTargetHits
graph: graph,
previewId: previewId
)
}
}
Expand Down
37 changes: 0 additions & 37 deletions Sources/TuistCore/Analytics/CommandEventGraphTarget.swift

This file was deleted.

32 changes: 0 additions & 32 deletions Sources/TuistCore/Analytics/CommandEventProject.swift

This file was deleted.

30 changes: 0 additions & 30 deletions Sources/TuistCore/Analytics/CommandEventTarget.swift

This file was deleted.

5 changes: 5 additions & 0 deletions Sources/TuistCore/Analytics/RunCacheHit.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Foundation

public enum RunCacheHit: Codable, Equatable {
case miss, local, remote
}
14 changes: 14 additions & 0 deletions Sources/TuistCore/Analytics/RunCacheTargetMetadata.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import Foundation

public struct RunCacheTargetMetadata: Codable, Hashable {
public let hash: String
public let hit: RunCacheHit

public init(
hash: String,
hit: RunCacheHit
) {
self.hash = hash
self.hit = hit
}
}
15 changes: 15 additions & 0 deletions Sources/TuistCore/Analytics/RunGraph.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Foundation

/// Graph to be sent with the run
public struct RunGraph: Codable, Equatable {
public let name: String
public let projects: [RunProject]

public init(
name: String,
projects: [RunProject]
) {
self.name = name
self.projects = projects
}
}
49 changes: 49 additions & 0 deletions Sources/TuistCore/Analytics/RunMetadataStorage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import Foundation
import Path
import ServiceContextModule
import XcodeGraph

/// Storage for run metadata, such as binary cache.
public actor RunMetadataStorage {
public init() {}

/// A unique ID associated with a specific run
public var runId = UUID().uuidString
/// Graph associated with the current run
public private(set) var graph: Graph?
public func update(graph: Graph?) {
self.graph = graph
}

/// Binar cache-specific cache items
public private(set) var binaryCacheItems: [AbsolutePath: [String: CacheItem]] = [:]
public func update(binaryCacheItems: [AbsolutePath: [String: CacheItem]]) {
self.binaryCacheItems = binaryCacheItems
}

/// Selective testing-specific cache items
public private(set) var selectiveTestingCacheItems: [AbsolutePath: [String: CacheItem]] = [:]
public func update(selectiveTestingCacheItems: [AbsolutePath: [String: CacheItem]]) {
self.selectiveTestingCacheItems = selectiveTestingCacheItems
}

/// Preview ID associated with the current run
public private(set) var previewId: String?
public func update(previewId: String?) {
self.previewId = previewId
}
}

private enum RunMetadataStorageContextKey: ServiceContextKey {
typealias Value = RunMetadataStorage
}

extension ServiceContext {
public var runMetadataStorage: RunMetadataStorage? {
get {
self[RunMetadataStorageContextKey.self]
} set {
self[RunMetadataStorageContextKey.self] = newValue
}
}
}
36 changes: 36 additions & 0 deletions Sources/TuistCore/Analytics/RunProject.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import Path
import XcodeGraph

/// A simplified `GraphTarget` to store in `CommandEvent`.
public struct RunProject: Codable, Hashable {
public let name: String
public let path: RelativePath
public let targets: [RunTarget]

public init(
name: String,
path: RelativePath,
targets: [RunTarget]
) {
self.name = name
self.path = path
self.targets = targets
}
}

#if DEBUG
extension RunProject {
public static func test(
name: String = "Project",
// swiftlint:disable:next force_try
path: RelativePath = try! RelativePath(validating: "App"),
targets: [RunTarget] = []
) -> Self {
Self(
name: name,
path: path,
targets: targets
)
}
}
#endif
Loading

0 comments on commit 717d701

Please sign in to comment.