Convert more fastlane tools to swift commands (#5163)

* Upload dSYMs to sentry using swift and the sentry-cli instead of fastlane.

* Replace the fastlane `config_production` lane with a swift tools `ConfigureProduction` command.

* Replace Zsh with CI.run in the new ConfigureNightly command

* Replace the fastlane `tag_nightly` lane with a swift tools `TagNightly` command.

* Print out all the commands going through CI.Run and their arguments

* Address PR comments
This commit is contained in:
Stefan Ceriu
2026-03-05 16:14:09 +02:00
committed by GitHub
parent 51194c09e2
commit e23959a201
10 changed files with 133 additions and 85 deletions
@@ -0,0 +1,59 @@
import ArgumentParser
import CommandLineTools
import Foundation
struct UploadDSYMs: AsyncParsableCommand {
static let configuration = CommandConfiguration(commandName: "upload-dsyms",
abstract: "Uploads dSYMs to Sentry using sentry-cli.",
discussion: "Requires the SENTRY_AUTH_TOKEN environment variable to be set.")
@Option(help: "The path to the dSYMs directory or file to upload.")
var dsymPath: String
@Option(help: "The Sentry organization slug.")
var orgSlug = "element"
@Option(help: "The Sentry project slug.")
var projectSlug = "element-x-ios"
@Option(help: "The Sentry server URL.")
var url = "https://sentry.tools.element.io/"
@Option(help: "The maximum number of upload attempts.")
var maxRetries = 5
func run() async throws {
guard let authToken = ProcessInfo.processInfo.environment["SENTRY_AUTH_TOKEN"],
!authToken.isEmpty else {
throw ValidationError("SENTRY_AUTH_TOKEN environment variable is not set.")
}
let command = """
sentry-cli dif upload \
--auth-token "\(authToken)" \
--org "\(orgSlug)" \
--project "\(projectSlug)" \
--url "\(url)" \
--log-level DEBUG \
"\(dsymPath)"
"""
var lastError: Swift.Error?
for attempt in 1...maxRetries {
do {
logger.info("\n📡 Uploading dSYMs to Sentry (attempt \(attempt)/\(maxRetries))…\n")
try await CI.run(.path("/bin/zsh"), ["-cu", command])
logger.info("\n✅ Successfully uploaded dSYMs to Sentry.\n")
return
} catch {
lastError = error
logger.error("\n❌ Sentry upload attempt \(attempt) failed: \(error.localizedDescription)\n")
}
}
if let lastError {
throw lastError
}
}
}