Skip to content

Commit acb1486

Browse files
Merge pull request #3503 from SwiftPackageIndex/issue-3469-dependency-transition-6
Issue 3469 dependency transition 6
2 parents b228474 + bce10db commit acb1486

File tree

6 files changed

+262
-194
lines changed

6 files changed

+262
-194
lines changed

Sources/App/Commands/TriggerBuilds.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,14 @@ extension TriggerBuildsCommand {
125125
func triggerBuilds(on database: Database,
126126
client: Client,
127127
mode: TriggerBuildsCommand.Mode) async throws {
128+
@Dependency(\.environment) var environment
128129
let start = DispatchTime.now().uptimeNanoseconds
130+
129131
switch mode {
130132
case .limit(let limit):
131133
Current.logger().info("Triggering builds (limit: \(limit)) ...")
132134

133-
let withLatestSwiftVersion = Current.buildTriggerCandidatesWithLatestSwiftVersion
135+
let withLatestSwiftVersion = environment.buildTriggerCandidatesWithLatestSwiftVersion
134136
let candidates = try await fetchBuildCandidates(database,
135137
withLatestSwiftVersion: withLatestSwiftVersion)
136138
AppMetrics.buildCandidatesCount?.set(candidates.count)
@@ -177,6 +179,7 @@ func triggerBuilds(on database: Database,
177179
packages: [Package.Id],
178180
force: Bool = false) async throws {
179181
@Dependency(\.environment) var environment
182+
180183
guard environment.allowBuildTriggers() else {
181184
Current.logger().info("Build trigger override switch OFF - no builds are being triggered")
182185
return
@@ -205,9 +208,8 @@ func triggerBuilds(on database: Database,
205208

206209
await withThrowingTaskGroup(of: Void.self) { group in
207210
for pkgId in packages {
208-
let allowListed = Current.buildTriggerAllowList().contains(pkgId)
209-
let downscalingAccepted = Current.random(0...1) < Current.buildTriggerDownscaling()
210-
guard allowListed || downscalingAccepted else {
211+
let allowListed = environment.buildTriggerAllowList().contains(pkgId)
212+
guard allowListed || environment.buildTriggerDownscalingAccepted else {
211213
Current.logger().info("Build trigger downscaling in effect - skipping builds")
212214
continue
213215
}
@@ -328,7 +330,9 @@ func fetchBuildCandidates(_ database: Database,
328330

329331
let expectedBuildCount = BuildPair.all.count
330332
let expectedBuildCountWithoutLatestSwiftVersion = BuildPair.allExceptLatestSwiftVersion.count
331-
let priorityIDs = Current.buildTriggerAllowList()
333+
334+
@Dependency(\.environment) var environment
335+
let priorityIDs = environment.buildTriggerAllowList()
332336

333337
let query: SQLQueryString = withLatestSwiftVersion
334338
? """

Sources/App/Core/AppEnvironment.swift

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ import FoundationNetworking
2525
struct AppEnvironment: Sendable {
2626
var apiSigningKey: @Sendable () -> String?
2727
var appVersion: @Sendable () -> String?
28-
var buildTriggerAllowList: @Sendable () -> [Package.Id]
29-
var buildTriggerDownscaling: @Sendable () -> Double
30-
var buildTriggerLatestSwiftVersionDownscaling: @Sendable () -> Double
3128
var collectionSigningCertificateChain: @Sendable () -> [URL]
3229
var collectionSigningPrivateKey: @Sendable () -> Data?
3330
var currentReferenceCache: @Sendable () -> CurrentReferenceCache?
@@ -54,7 +51,6 @@ struct AppEnvironment: Sendable {
5451
var plausibleBackendReportingSiteID: @Sendable () -> String?
5552
var postPlausibleEvent: @Sendable (Client, Plausible.Event.Kind, Plausible.Path, User?) async throws -> Void
5653
var processingBuildBacklog: @Sendable () -> Bool
57-
var random: @Sendable (_ range: ClosedRange<Double>) -> Double
5854
var runnerIds: @Sendable () -> [String]
5955
var setHTTPClient: @Sendable (Client) -> Void
6056
var setLogger: @Sendable (Logger) -> Void
@@ -78,11 +74,6 @@ struct AppEnvironment: Sendable {
7874

7975

8076
extension AppEnvironment {
81-
var buildTriggerCandidatesWithLatestSwiftVersion: Bool {
82-
guard buildTriggerLatestSwiftVersionDownscaling() < 1 else { return true }
83-
return random(0...1) < Current.buildTriggerLatestSwiftVersionDownscaling()
84-
}
85-
8677
func postPlausibleEvent(_ event: Plausible.Event.Kind, path: Plausible.Path, user: User?) {
8778
Task {
8879
do {
@@ -102,22 +93,6 @@ extension AppEnvironment {
10293
static let live = AppEnvironment(
10394
apiSigningKey: { Environment.get("API_SIGNING_KEY") },
10495
appVersion: { App.appVersion },
105-
buildTriggerAllowList: {
106-
Environment.get("BUILD_TRIGGER_ALLOW_LIST")
107-
.map { Data($0.utf8) }
108-
.flatMap { try? JSONDecoder().decode([Package.Id].self, from: $0) }
109-
?? []
110-
},
111-
buildTriggerDownscaling: {
112-
Environment.get("BUILD_TRIGGER_DOWNSCALING")
113-
.flatMap(Double.init)
114-
?? 1.0
115-
},
116-
buildTriggerLatestSwiftVersionDownscaling: {
117-
Environment.get("BUILD_TRIGGER_LATEST_SWIFT_VERSION_DOWNSCALING")
118-
.flatMap(Double.init)
119-
?? 1.0
120-
},
12196
collectionSigningCertificateChain: {
12297
[
12398
SignedCollection.certsDir
@@ -172,7 +147,6 @@ extension AppEnvironment {
172147
processingBuildBacklog: {
173148
Environment.get("PROCESSING_BUILD_BACKLOG").flatMap(\.asBool) ?? false
174149
},
175-
random: { range in Double.random(in: range) },
176150
runnerIds: {
177151
Environment.get("RUNNER_IDS")
178152
.map { Data($0.utf8) }

Sources/App/Core/Dependencies/EnvironmentClient.swift

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@ import Vapor
2121
struct EnvironmentClient {
2222
// See https://swiftpackageindex.com/pointfreeco/swift-dependencies/main/documentation/dependenciesmacros/dependencyclient()#Restrictions
2323
// regarding the use of XCTFail here.
24-
var allowBuildTriggers: @Sendable () -> Bool = { XCTFail(#function); return true }
25-
var allowSocialPosts: @Sendable () -> Bool = { XCTFail(#function); return true }
24+
var allowBuildTriggers: @Sendable () -> Bool = { XCTFail("allowBuildTriggers"); return true }
25+
var allowSocialPosts: @Sendable () -> Bool = { XCTFail("allowSocialPosts"); return true }
2626
var awsAccessKeyId: @Sendable () -> String?
2727
var awsDocsBucket: @Sendable () -> String?
2828
var awsReadmeBucket: @Sendable () -> String?
2929
var awsSecretAccessKey: @Sendable () -> String?
3030
var builderToken: @Sendable () -> String?
31-
var buildTimeout: @Sendable () -> Int = { XCTFail(#function); return 10 }
31+
var buildTimeout: @Sendable () -> Int = { XCTFail("buildTimeout"); return 10 }
32+
var buildTriggerAllowList: @Sendable () -> [Package.Id] = { XCTFail("buildTriggerAllowList"); return [] }
33+
var buildTriggerDownscaling: @Sendable () -> Double = { XCTFail("buildTriggerDownscaling"); return 1 }
34+
var buildTriggerLatestSwiftVersionDownscaling: @Sendable () -> Double = { XCTFail("buildTriggerLatestSwiftVersionDownscaling"); return 1 }
3235
// We're not defaulting current to XCTFail, because its use is too pervasive and would require the vast
3336
// majority of tests to be wrapped with `withDependencies`.
3437
// We can do so at a later time once more tests are transitioned over for other dependencies. This is
@@ -37,6 +40,7 @@ struct EnvironmentClient {
3740
var current: @Sendable () -> Environment = { .development }
3841
var mastodonCredentials: @Sendable () -> Mastodon.Credentials?
3942
var mastodonPost: @Sendable (_ client: Client, _ post: String) async throws -> Void
43+
var random: @Sendable (_ range: ClosedRange<Double>) -> Double = { XCTFail("random"); return Double.random(in: $0) }
4044
}
4145

4246

@@ -57,17 +61,46 @@ extension EnvironmentClient: DependencyKey {
5761
awsSecretAccessKey: { Environment.get("AWS_SECRET_ACCESS_KEY") },
5862
builderToken: { Environment.get("BUILDER_TOKEN") },
5963
buildTimeout: { Environment.get("BUILD_TIMEOUT").flatMap(Int.init) ?? 10 },
64+
buildTriggerAllowList: {
65+
Environment.get("BUILD_TRIGGER_ALLOW_LIST")
66+
.map { Data($0.utf8) }
67+
.flatMap { try? JSONDecoder().decode([Package.Id].self, from: $0) }
68+
?? []
69+
},
70+
buildTriggerDownscaling: {
71+
Environment.get("BUILD_TRIGGER_DOWNSCALING")
72+
.flatMap(Double.init)
73+
?? 1.0
74+
},
75+
buildTriggerLatestSwiftVersionDownscaling: {
76+
Environment.get("BUILD_TRIGGER_LATEST_SWIFT_VERSION_DOWNSCALING")
77+
.flatMap(Double.init)
78+
?? 1.0
79+
},
6080
current: { (try? Environment.detect()) ?? .development },
6181
mastodonCredentials: {
6282
Environment.get("MASTODON_ACCESS_TOKEN")
6383
.map(Mastodon.Credentials.init(accessToken:))
6484
},
65-
mastodonPost: { client, message in try await Mastodon.post(client: client, message: message) }
85+
mastodonPost: { client, message in try await Mastodon.post(client: client, message: message) },
86+
random: { range in Double.random(in: range) }
6687
)
6788
}
6889
}
6990

7091

92+
extension EnvironmentClient {
93+
var buildTriggerCandidatesWithLatestSwiftVersion: Bool {
94+
guard buildTriggerLatestSwiftVersionDownscaling() < 1 else { return true }
95+
return random(0...1) < buildTriggerLatestSwiftVersionDownscaling()
96+
}
97+
98+
var buildTriggerDownscalingAccepted: Bool {
99+
random(0...1) < buildTriggerDownscaling()
100+
}
101+
}
102+
103+
71104
extension EnvironmentClient: TestDependencyKey {
72105
static var testValue: Self { Self() }
73106
}

0 commit comments

Comments
 (0)