Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions Sources/App/Commands/TriggerBuilds.swift
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,14 @@ extension TriggerBuildsCommand {
func triggerBuilds(on database: Database,
client: Client,
mode: TriggerBuildsCommand.Mode) async throws {
@Dependency(\.environment) var environment
let start = DispatchTime.now().uptimeNanoseconds

switch mode {
case .limit(let limit):
Current.logger().info("Triggering builds (limit: \(limit)) ...")

let withLatestSwiftVersion = Current.buildTriggerCandidatesWithLatestSwiftVersion
let withLatestSwiftVersion = environment.buildTriggerCandidatesWithLatestSwiftVersion
let candidates = try await fetchBuildCandidates(database,
withLatestSwiftVersion: withLatestSwiftVersion)
AppMetrics.buildCandidatesCount?.set(candidates.count)
Expand Down Expand Up @@ -177,6 +179,7 @@ func triggerBuilds(on database: Database,
packages: [Package.Id],
force: Bool = false) async throws {
@Dependency(\.environment) var environment

guard environment.allowBuildTriggers() else {
Current.logger().info("Build trigger override switch OFF - no builds are being triggered")
return
Expand Down Expand Up @@ -205,9 +208,8 @@ func triggerBuilds(on database: Database,

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

let expectedBuildCount = BuildPair.all.count
let expectedBuildCountWithoutLatestSwiftVersion = BuildPair.allExceptLatestSwiftVersion.count
let priorityIDs = Current.buildTriggerAllowList()

@Dependency(\.environment) var environment
let priorityIDs = environment.buildTriggerAllowList()

let query: SQLQueryString = withLatestSwiftVersion
? """
Expand Down
26 changes: 0 additions & 26 deletions Sources/App/Core/AppEnvironment.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ import FoundationNetworking
struct AppEnvironment: Sendable {
var apiSigningKey: @Sendable () -> String?
var appVersion: @Sendable () -> String?
var buildTriggerAllowList: @Sendable () -> [Package.Id]
var buildTriggerDownscaling: @Sendable () -> Double
var buildTriggerLatestSwiftVersionDownscaling: @Sendable () -> Double
var collectionSigningCertificateChain: @Sendable () -> [URL]
var collectionSigningPrivateKey: @Sendable () -> Data?
var currentReferenceCache: @Sendable () -> CurrentReferenceCache?
Expand All @@ -54,7 +51,6 @@ struct AppEnvironment: Sendable {
var plausibleBackendReportingSiteID: @Sendable () -> String?
var postPlausibleEvent: @Sendable (Client, Plausible.Event.Kind, Plausible.Path, User?) async throws -> Void
var processingBuildBacklog: @Sendable () -> Bool
var random: @Sendable (_ range: ClosedRange<Double>) -> Double
var runnerIds: @Sendable () -> [String]
var setHTTPClient: @Sendable (Client) -> Void
var setLogger: @Sendable (Logger) -> Void
Expand All @@ -78,11 +74,6 @@ struct AppEnvironment: Sendable {


extension AppEnvironment {
var buildTriggerCandidatesWithLatestSwiftVersion: Bool {
guard buildTriggerLatestSwiftVersionDownscaling() < 1 else { return true }
return random(0...1) < Current.buildTriggerLatestSwiftVersionDownscaling()
}

func postPlausibleEvent(_ event: Plausible.Event.Kind, path: Plausible.Path, user: User?) {
Task {
do {
Expand All @@ -102,22 +93,6 @@ extension AppEnvironment {
static let live = AppEnvironment(
apiSigningKey: { Environment.get("API_SIGNING_KEY") },
appVersion: { App.appVersion },
buildTriggerAllowList: {
Environment.get("BUILD_TRIGGER_ALLOW_LIST")
.map { Data($0.utf8) }
.flatMap { try? JSONDecoder().decode([Package.Id].self, from: $0) }
?? []
},
buildTriggerDownscaling: {
Environment.get("BUILD_TRIGGER_DOWNSCALING")
.flatMap(Double.init)
?? 1.0
},
buildTriggerLatestSwiftVersionDownscaling: {
Environment.get("BUILD_TRIGGER_LATEST_SWIFT_VERSION_DOWNSCALING")
.flatMap(Double.init)
?? 1.0
},
collectionSigningCertificateChain: {
[
SignedCollection.certsDir
Expand Down Expand Up @@ -172,7 +147,6 @@ extension AppEnvironment {
processingBuildBacklog: {
Environment.get("PROCESSING_BUILD_BACKLOG").flatMap(\.asBool) ?? false
},
random: { range in Double.random(in: range) },
runnerIds: {
Environment.get("RUNNER_IDS")
.map { Data($0.utf8) }
Expand Down
41 changes: 37 additions & 4 deletions Sources/App/Core/Dependencies/EnvironmentClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,17 @@ import Vapor
struct EnvironmentClient {
// See https://swiftpackageindex.com/pointfreeco/swift-dependencies/main/documentation/dependenciesmacros/dependencyclient()#Restrictions
// regarding the use of XCTFail here.
var allowBuildTriggers: @Sendable () -> Bool = { XCTFail(#function); return true }
var allowSocialPosts: @Sendable () -> Bool = { XCTFail(#function); return true }
var allowBuildTriggers: @Sendable () -> Bool = { XCTFail("allowBuildTriggers"); return true }
var allowSocialPosts: @Sendable () -> Bool = { XCTFail("allowSocialPosts"); return true }
var awsAccessKeyId: @Sendable () -> String?
var awsDocsBucket: @Sendable () -> String?
var awsReadmeBucket: @Sendable () -> String?
var awsSecretAccessKey: @Sendable () -> String?
var builderToken: @Sendable () -> String?
var buildTimeout: @Sendable () -> Int = { XCTFail(#function); return 10 }
var buildTimeout: @Sendable () -> Int = { XCTFail("buildTimeout"); return 10 }
var buildTriggerAllowList: @Sendable () -> [Package.Id] = { XCTFail("buildTriggerAllowList"); return [] }
var buildTriggerDownscaling: @Sendable () -> Double = { XCTFail("buildTriggerDownscaling"); return 1 }
var buildTriggerLatestSwiftVersionDownscaling: @Sendable () -> Double = { XCTFail("buildTriggerLatestSwiftVersionDownscaling"); return 1 }
// We're not defaulting current to XCTFail, because its use is too pervasive and would require the vast
// majority of tests to be wrapped with `withDependencies`.
// We can do so at a later time once more tests are transitioned over for other dependencies. This is
Expand All @@ -37,6 +40,7 @@ struct EnvironmentClient {
var current: @Sendable () -> Environment = { .development }
var mastodonCredentials: @Sendable () -> Mastodon.Credentials?
var mastodonPost: @Sendable (_ client: Client, _ post: String) async throws -> Void
var random: @Sendable (_ range: ClosedRange<Double>) -> Double = { XCTFail("random"); return Double.random(in: $0) }
}


Expand All @@ -57,17 +61,46 @@ extension EnvironmentClient: DependencyKey {
awsSecretAccessKey: { Environment.get("AWS_SECRET_ACCESS_KEY") },
builderToken: { Environment.get("BUILDER_TOKEN") },
buildTimeout: { Environment.get("BUILD_TIMEOUT").flatMap(Int.init) ?? 10 },
buildTriggerAllowList: {
Environment.get("BUILD_TRIGGER_ALLOW_LIST")
.map { Data($0.utf8) }
.flatMap { try? JSONDecoder().decode([Package.Id].self, from: $0) }
?? []
},
buildTriggerDownscaling: {
Environment.get("BUILD_TRIGGER_DOWNSCALING")
.flatMap(Double.init)
?? 1.0
},
buildTriggerLatestSwiftVersionDownscaling: {
Environment.get("BUILD_TRIGGER_LATEST_SWIFT_VERSION_DOWNSCALING")
.flatMap(Double.init)
?? 1.0
},
current: { (try? Environment.detect()) ?? .development },
mastodonCredentials: {
Environment.get("MASTODON_ACCESS_TOKEN")
.map(Mastodon.Credentials.init(accessToken:))
},
mastodonPost: { client, message in try await Mastodon.post(client: client, message: message) }
mastodonPost: { client, message in try await Mastodon.post(client: client, message: message) },
random: { range in Double.random(in: range) }
)
}
}


extension EnvironmentClient {
var buildTriggerCandidatesWithLatestSwiftVersion: Bool {
guard buildTriggerLatestSwiftVersionDownscaling() < 1 else { return true }
return random(0...1) < buildTriggerLatestSwiftVersionDownscaling()
}

var buildTriggerDownscalingAccepted: Bool {
random(0...1) < buildTriggerDownscaling()
}
}


extension EnvironmentClient: TestDependencyKey {
static var testValue: Self { Self() }
}
Expand Down
Loading
Loading