Add version in log, command and api

A task has been added to generate a BuildVersions file
when building the project. Project's version can be
found in that file at runtime.

Also centralized declaration of the dependencies
versions to buildSrc.
This commit is contained in:
Dominique Padiou 2024-03-20 16:01:45 +01:00
parent 6bffd418e8
commit 9d460eeee5
No known key found for this signature in database
GPG Key ID: 574C8C6A1673E987
7 changed files with 77 additions and 14 deletions

View File

@ -1,8 +1,10 @@
import Versions.ktor
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithHostTests import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithHostTests
import java.io.ByteArrayOutputStream
buildscript { buildscript {
dependencies { dependencies {
classpath("app.cash.sqldelight:gradle-plugin:2.0.1") classpath("app.cash.sqldelight:gradle-plugin:${Versions.sqlDelight}")
} }
repositories { repositories {
google() google()
@ -11,9 +13,9 @@ buildscript {
} }
plugins { plugins {
kotlin("multiplatform") version "1.9.23" kotlin("multiplatform") version Versions.kotlin
kotlin("plugin.serialization") version "1.9.23" kotlin("plugin.serialization") version Versions.kotlin
id("app.cash.sqldelight") version "2.0.1" id("app.cash.sqldelight") version Versions.sqlDelight
} }
allprojects { allprojects {
@ -30,6 +32,42 @@ allprojects {
} }
} }
/** Get the current git commit hash. */
fun gitCommitHash(): String {
val stream = ByteArrayOutputStream()
project.exec {
commandLine = "git rev-parse --verify --long HEAD".split(" ")
standardOutput = stream
}
return String(stream.toByteArray()).split("\n").first()
}
/**
* Generates a `BuildVersions` file in build/generated-src containing the current git commit and the lightning-kmp version.
* See https://stackoverflow.com/a/74771876 for details.
*/
val buildVersionsTask by tasks.registering(Sync::class) {
group = "build"
from(
resources.text.fromString(
"""
|package fr.acinq.lightning
|
|object BuildVersions {
| const val phoenixdCommit = "${gitCommitHash()}"
| const val phoenixdVersion = "${project.version}-${gitCommitHash().take(7)}"
| const val lightningKmpVersion = "${Versions.lightningKmp}"
|}
|
""".trimMargin()
)
) {
rename { "BuildVersions.kt" }
into("fr/acinq/lightning")
}
into(layout.buildDirectory.dir("generated/kotlin/"))
}
kotlin { kotlin {
jvm() jvm()
@ -59,13 +97,11 @@ kotlin {
} }
} }
val ktorVersion = "2.3.8"
fun ktor(module: String) = "io.ktor:ktor-$module:$ktorVersion"
sourceSets { sourceSets {
commonMain { commonMain {
kotlin.srcDir(buildVersionsTask.map { it.destinationDir })
dependencies { dependencies {
implementation("fr.acinq.lightning:lightning-kmp:1.6.2-FEECREDIT-2-SNAPSHOT") implementation("fr.acinq.lightning:lightning-kmp:${Versions.lightningKmp}")
// ktor serialization // ktor serialization
implementation(ktor("serialization-kotlinx-json")) implementation(ktor("serialization-kotlinx-json"))
// ktor server // ktor server
@ -81,20 +117,20 @@ kotlin {
implementation(ktor("client-auth")) implementation(ktor("client-auth"))
implementation(ktor("client-json")) implementation(ktor("client-json"))
implementation("com.squareup.okio:okio:3.8.0") implementation("com.squareup.okio:okio:${Versions.okio}")
implementation("com.github.ajalt.clikt:clikt:4.2.2") implementation("com.github.ajalt.clikt:clikt:${Versions.clikt}")
implementation("app.cash.sqldelight:coroutines-extensions:2.0.1") implementation("app.cash.sqldelight:coroutines-extensions:${Versions.sqlDelight}")
} }
} }
jvmMain { jvmMain {
dependencies { dependencies {
implementation("app.cash.sqldelight:sqlite-driver:2.0.1") implementation("app.cash.sqldelight:sqlite-driver:${Versions.sqlDelight}")
implementation(ktor("client-okhttp")) implementation(ktor("client-okhttp"))
} }
} }
nativeMain { nativeMain {
dependencies { dependencies {
implementation("app.cash.sqldelight:native-driver:2.0.1") implementation("app.cash.sqldelight:native-driver:${Versions.sqlDelight}")
} }
} }
linuxMain { linuxMain {
@ -123,3 +159,4 @@ sqldelight {
} }
} }
} }

View File

@ -0,0 +1,6 @@
repositories {
mavenCentral()
}
plugins {
`kotlin-dsl`
}

View File

@ -0,0 +1,9 @@
object Versions {
val kotlin = "1.9.23"
val lightningKmp = "1.6.2-FEECREDIT-2-SNAPSHOT"
val sqlDelight = "2.0.1"
val okio = "3.8.0"
val clikt = "4.2.2"
val ktor = "2.3.8"
fun ktor(module: String) = "io.ktor:ktor-$module:$ktor"
}

View File

@ -6,6 +6,7 @@ import fr.acinq.bitcoin.ByteVector32
import fr.acinq.bitcoin.Script import fr.acinq.bitcoin.Script
import fr.acinq.bitcoin.utils.Either import fr.acinq.bitcoin.utils.Either
import fr.acinq.bitcoin.utils.toEither import fr.acinq.bitcoin.utils.toEither
import fr.acinq.lightning.BuildVersions
import fr.acinq.lightning.Lightning.randomBytes32 import fr.acinq.lightning.Lightning.randomBytes32
import fr.acinq.lightning.NodeParams import fr.acinq.lightning.NodeParams
import fr.acinq.lightning.bin.db.SqlitePaymentsDb import fr.acinq.lightning.bin.db.SqlitePaymentsDb
@ -78,6 +79,7 @@ class Api(private val nodeParams: NodeParams, private val peer: Peer, private va
authenticate { authenticate {
get("getinfo") { get("getinfo") {
val info = NodeInfo( val info = NodeInfo(
version = BuildVersions.phoenixdVersion,
nodeId = nodeParams.nodeId, nodeId = nodeParams.nodeId,
channels = peer.channels.values.map { Channel.from(it) } channels = peer.channels.values.map { Channel.from(it) }
) )

View File

@ -21,6 +21,7 @@ import com.github.ajalt.mordant.rendering.TextColors.*
import com.github.ajalt.mordant.rendering.TextStyles.bold import com.github.ajalt.mordant.rendering.TextStyles.bold
import com.github.ajalt.mordant.rendering.TextStyles.underline import com.github.ajalt.mordant.rendering.TextStyles.underline
import fr.acinq.bitcoin.Chain import fr.acinq.bitcoin.Chain
import fr.acinq.lightning.BuildVersions
import fr.acinq.lightning.Lightning.randomBytes32 import fr.acinq.lightning.Lightning.randomBytes32
import fr.acinq.lightning.LiquidityEvents import fr.acinq.lightning.LiquidityEvents
import fr.acinq.lightning.NodeParams import fr.acinq.lightning.NodeParams
@ -64,7 +65,9 @@ import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
fun main(args: Array<String>) = Phoenixd().main(args) fun main(args: Array<String>) = Phoenixd()
.versionOption(BuildVersions.phoenixdVersion, names = setOf("--version", "-v"))
.main(args)
class LiquidityOptions : OptionGroup(name = "Liquidity Options") { class LiquidityOptions : OptionGroup(name = "Liquidity Options") {
val autoLiquidity by option("--auto-liquidity", help = "Amount automatically requested when inbound liquidity is needed").choice( val autoLiquidity by option("--auto-liquidity", help = "Amount automatically requested when inbound liquidity is needed").choice(
@ -198,6 +201,8 @@ class Phoenixd : CliktCommand() {
} }
} }
consoleLog(cyan("version: ${BuildVersions.phoenixdVersion}"))
consoleLog(cyan("lightning-kmp: ${BuildVersions.lightningKmpVersion}"))
consoleLog(cyan("datadir: ${FileSystem.SYSTEM.canonicalize(datadir)}")) consoleLog(cyan("datadir: ${FileSystem.SYSTEM.canonicalize(datadir)}"))
consoleLog(cyan("chain: $chain")) consoleLog(cyan("chain: $chain"))
consoleLog(cyan("autoLiquidity: ${liquidityOptions.autoLiquidity}")) consoleLog(cyan("autoLiquidity: ${liquidityOptions.autoLiquidity}"))

View File

@ -57,6 +57,7 @@ sealed class ApiType {
@Serializable @Serializable
data class NodeInfo( data class NodeInfo(
val version: String,
val nodeId: PublicKey, val nodeId: PublicKey,
val channels: List<Channel> val channels: List<Channel>
) )

View File

@ -12,6 +12,7 @@ import com.github.ajalt.clikt.sources.MapValueSource
import fr.acinq.bitcoin.Base58Check import fr.acinq.bitcoin.Base58Check
import fr.acinq.bitcoin.Bech32 import fr.acinq.bitcoin.Bech32
import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.ByteVector32
import fr.acinq.lightning.BuildVersions
import fr.acinq.lightning.bin.conf.readConfFile import fr.acinq.lightning.bin.conf.readConfFile
import fr.acinq.lightning.bin.homeDirectory import fr.acinq.lightning.bin.homeDirectory
import fr.acinq.lightning.payment.Bolt11Invoice import fr.acinq.lightning.payment.Bolt11Invoice
@ -26,11 +27,13 @@ import io.ktor.client.statement.*
import io.ktor.http.* import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.* import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.util.* import io.ktor.server.util.*
import io.ktor.util.*
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
fun main(args: Array<String>) = fun main(args: Array<String>) =
PhoenixCli() PhoenixCli()
.versionOption(BuildVersions.phoenixdVersion, names = setOf("--version", "-v"))
.subcommands(GetInfo(), GetBalance(), ListChannels(), GetOutgoingPayment(), GetIncomingPayment(), ListIncomingPayments(), CreateInvoice(), PayInvoice(), SendToAddress(), CloseChannel()) .subcommands(GetInfo(), GetBalance(), ListChannels(), GetOutgoingPayment(), GetIncomingPayment(), ListIncomingPayments(), CreateInvoice(), PayInvoice(), SendToAddress(), CloseChannel())
.main(args) .main(args)