Files
letro-ios/Tools/Sources/Commands/CI/ConfigureNightly.swift
Stefan Ceriu c3ba6113fe Replace the last of the fastlane lanes with swift tooling
- move more sharable code to CI static methods
- merge `release_to_github` and `prepare_next_release` into one single command as they had dependencies on each other
- remove all traces of ruby and fastlane
2026-03-11 10:06:44 +02:00

50 lines
2.2 KiB
Swift

import ArgumentParser
import Foundation
import Yams
struct ConfigureNightly: AsyncParsableCommand {
static let configuration = CommandConfiguration(abstract: "Configures the project for a Nightly build.",
discussion: "Adds the Nightly variant to project.yml, updates secrets, runs xcodegen, and generates the app icon banner.")
@Option(help: "The build number to display on the app icon banner.")
var buildNumber: String
func run() async throws {
guard !buildNumber.isEmpty else {
throw ValidationError("Invalid build number.")
}
try addNightlyVariant()
try await CI.run(.name("swift"), ["run", "pipeline", "update-foss-secrets"])
try await CI.run(.name("xcodegen"))
let releaseVersion = try CI.readMarketingVersion()
try await generateAppIconBanner(version: releaseVersion, buildNumber: buildNumber)
}
/// Adds the Nightly variant include path to `project.yml` if it isn't already present.
private func addNightlyVariant() throws {
let projectURL = URL.projectDirectory.appending(component: "project.yml")
let projectString = try String(contentsOf: projectURL)
guard var projectConfig = try Yams.compose(yaml: projectString) else {
throw ValidationError("Failed to parse project.yml.")
}
// Check if the nightly variant is already included
if projectConfig["include"]?.sequence?.contains(where: { $0.mapping?["path"] == "Variants/Nightly/nightly.yml" }) == false {
projectConfig["include"]?.sequence?.append(["path": "Variants/Nightly/nightly.yml"])
}
let updatedYAMLString = try Yams.serialize(node: projectConfig)
try updatedYAMLString.write(to: projectURL, atomically: true, encoding: .utf8)
}
/// Generates the app icon banner with version and build number.
private func generateAppIconBanner(version: String, buildNumber: String) async throws {
let bannerText = "\(version) (\(buildNumber))"
let iconPath = "Variants/Nightly/Resources/NightlyAppIcon.icon/Assets/Version.png"
try await AppIconBanner.parse([iconPath, "--banner-text", bannerText]).run()
}
}