fixed native image configuration task
All checks were successful
CI / build (push) Successful in 37m16s

This commit is contained in:
2025-02-26 17:42:02 +08:00
parent 1f93602102
commit a1398045ac
9 changed files with 144 additions and 108 deletions

View File

@@ -90,13 +90,21 @@ Provider<EnvelopeJarTask> envelopeJarTaskProvider = tasks.named(EnvelopePlugin.E
} }
tasks.named(NativeImagePlugin.CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask) { tasks.named(NativeImagePlugin.CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask) {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(21)
vendor = JvmVendorSpec.ORACLE
}
mainClass = "net.woggioni.rbcs.cli.graal.GraalNativeImageConfiguration" mainClass = "net.woggioni.rbcs.cli.graal.GraalNativeImageConfiguration"
setClasspath(configurations.configureNativeImageRuntimeClasspath + sourceSets.graal.output.classesDirs) classpath = project.files(
configurations.configureNativeImageRuntimeClasspath,
sourceSets.configureNativeImage.output
)
mergeConfiguration = false mergeConfiguration = false
systemProperty('logback.configurationFile', 'classpath:net/woggioni/rbcs/cli/logback.xml') systemProperty('logback.configurationFile', 'classpath:net/woggioni/rbcs/cli/logback.xml')
systemProperty('io.netty.leakDetectionLevel', 'DISABLED') systemProperty('io.netty.leakDetectionLevel', 'DISABLED')
modularity.inferModulePath = false modularity.inferModulePath = false
enabled = false enabled = true
} }
nativeImage { nativeImage {

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rbcs-client:profiles xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rbcs-client="urn:net.woggioni.rbcs.client"
xs:schemaLocation="urn:net.woggioni.rbcs.client jpms://net.woggioni.rbcs.client/net/woggioni/rbcs/client/schema/rbcs-client.xsd"
>
<profile name="profile1" base-url="https://rbcs1.example.com/">
<no-auth/>
<connection write-idle-timeout="PT60S"
read-idle-timeout="PT60S"
idle-timeout="PT30S" />
</profile>
<profile name="profile2" base-url="https://rbcs2.example.com/">
<basic-auth user="user" password="password"/>
</profile>
</rbcs-client:profiles>

View File

@@ -1,74 +1,46 @@
{ {
"resources":{ "resources":{
"includes": [ "includes":[{
{
"pattern":"\\QMETA-INF/MANIFEST.MF\\E" "pattern":"\\QMETA-INF/MANIFEST.MF\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E" "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E" "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/java.net.spi.InetAddressResolverProvider\\E" "pattern":"\\QMETA-INF/services/java.net.spi.InetAddressResolverProvider\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E" "pattern":"\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/java.nio.channels.spi.SelectorProvider\\E" "pattern":"\\QMETA-INF/services/java.nio.channels.spi.SelectorProvider\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E" "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory\\E" "pattern":"\\QMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E" "pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/net.woggioni.rbcs.api.CacheProvider\\E" "pattern":"\\QMETA-INF/services/net.woggioni.rbcs.api.CacheProvider\\E"
}, }, {
{
"pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E" "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E"
}, }, {
{
"pattern":"\\Qclasspath:net/woggioni/rbcs/cli/logback.xml\\E" "pattern":"\\Qclasspath:net/woggioni/rbcs/cli/logback.xml\\E"
}, }, {
{
"pattern":"\\Qlogback-test.scmo\\E" "pattern":"\\Qlogback-test.scmo\\E"
}, }, {
{
"pattern":"\\Qlogback.scmo\\E" "pattern":"\\Qlogback.scmo\\E"
}, }, {
{
"pattern":"\\Qnet/woggioni/rbcs/cli/logback.xml\\E" "pattern":"\\Qnet/woggioni/rbcs/cli/logback.xml\\E"
}, }, {
{
"pattern": "\\Qnet/woggioni/rbcs/server/rbcs-default.xml\\E"
},
{
"pattern": "\\Qnet/woggioni/rbcs/server/schema/rbcs-server.xsd\\E"
},
{
"pattern":"\\Qnet/woggioni/rbcs/client/schema/rbcs-client.xsd\\E" "pattern":"\\Qnet/woggioni/rbcs/client/schema/rbcs-client.xsd\\E"
}, }, {
{ "pattern":"\\Qnet/woggioni/rbcs/server/rbcs-default.xml\\E"
"pattern": "\\Q/net/woggioni/rbcs/server/memcache/schema/rbcs-memcache.xsd\\E" }, {
}, "pattern":"\\Qnet/woggioni/rbcs/server/schema/rbcs-server.xsd\\E"
{ }, {
"pattern":"java.base:\\Qsun/text/resources/LineBreakIteratorData\\E" "pattern":"java.base:\\Qsun/text/resources/LineBreakIteratorData\\E"
} }]},
] "bundles":[{
},
"bundles": [
{
"name":"com.sun.org.apache.xerces.internal.impl.xpath.regex.message", "name":"com.sun.org.apache.xerces.internal.impl.xpath.regex.message",
"locales": [ "locales":[""]
"" }]
]
}
]
} }

View File

@@ -1,5 +1,8 @@
{ {
"types":[ "types":[
{
"name":"java.lang.String"
},
{ {
"name":"net.woggioni.rbcs.api.CacheValueMetadata" "name":"net.woggioni.rbcs.api.CacheValueMetadata"
} }

View File

@@ -1,12 +1,14 @@
package net.woggioni.rbcs.cli.graal package net.woggioni.rbcs.cli.graal
import net.woggioni.jwo.NullOutputStream
import net.woggioni.rbcs.api.Configuration import net.woggioni.rbcs.api.Configuration
import net.woggioni.rbcs.api.Configuration.User import net.woggioni.rbcs.api.Configuration.User
import net.woggioni.rbcs.api.Role import net.woggioni.rbcs.api.Role
import net.woggioni.rbcs.cli.RemoteBuildCacheServerCli import net.woggioni.rbcs.cli.RemoteBuildCacheServerCli
import net.woggioni.rbcs.cli.impl.commands.BenchmarkCommand import net.woggioni.rbcs.cli.impl.commands.BenchmarkCommand
import net.woggioni.rbcs.cli.impl.commands.GetCommand
import net.woggioni.rbcs.cli.impl.commands.HealthCheckCommand import net.woggioni.rbcs.cli.impl.commands.HealthCheckCommand
import net.woggioni.rbcs.client.RemoteBuildCacheClient import net.woggioni.rbcs.cli.impl.commands.PutCommand
import net.woggioni.rbcs.common.HostAndPort import net.woggioni.rbcs.common.HostAndPort
import net.woggioni.rbcs.common.PasswordSecurity.hashPassword import net.woggioni.rbcs.common.PasswordSecurity.hashPassword
import net.woggioni.rbcs.common.RBCS import net.woggioni.rbcs.common.RBCS
@@ -16,12 +18,15 @@ import net.woggioni.rbcs.server.cache.FileSystemCacheConfiguration
import net.woggioni.rbcs.server.cache.InMemoryCacheConfiguration import net.woggioni.rbcs.server.cache.InMemoryCacheConfiguration
import net.woggioni.rbcs.server.configuration.Parser import net.woggioni.rbcs.server.configuration.Parser
import net.woggioni.rbcs.server.memcache.MemcacheCacheConfiguration import net.woggioni.rbcs.server.memcache.MemcacheCacheConfiguration
import java.io.ByteArrayInputStream
import java.net.URI import java.net.URI
import java.nio.file.Path import java.nio.file.Path
import java.time.Duration import java.time.Duration
import java.time.temporal.ChronoUnit import java.time.temporal.ChronoUnit
import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutionException
import java.util.zip.Deflater import java.util.zip.Deflater
import net.woggioni.rbcs.client.Configuration as ClientConfiguration
import net.woggioni.rbcs.client.impl.Parser as ClientConfigurationParser
object GraalNativeImageConfiguration { object GraalNativeImageConfiguration {
@JvmStatic @JvmStatic
@@ -30,15 +35,16 @@ object GraalNativeImageConfiguration {
val serverDoc = RemoteBuildCacheServer.DEFAULT_CONFIGURATION_URL.openStream().use { val serverDoc = RemoteBuildCacheServer.DEFAULT_CONFIGURATION_URL.openStream().use {
Xml.parseXml(RemoteBuildCacheServer.DEFAULT_CONFIGURATION_URL, it) Xml.parseXml(RemoteBuildCacheServer.DEFAULT_CONFIGURATION_URL, it)
} }
Parser.parse(doc) Parser.parse(serverDoc)
val clientDoc = RemoteBuildCacheClient.Configuration.openStream().use { val url = URI.create("file:conf/rbcs-client.xml").toURL()
Xml.parseXml(RemoteBuildCacheServer.DEFAULT_CONFIGURATION_URL, it) val clientDoc = url.openStream().use {
Xml.parseXml(url, it)
} }
Parser.parse(doc) ClientConfigurationParser.parse(clientDoc)
val PASSWORD = "password" val PASSWORD = "password"
val readersGroup = Configuration.Group("readers", setOf(Role.Reader), null, null) val readersGroup = Configuration.Group("readers", setOf(Role.Reader, Role.Healthcheck), null, null)
val writersGroup = Configuration.Group("writers", setOf(Role.Writer), null, null) val writersGroup = Configuration.Group("writers", setOf(Role.Writer), null, null)
@@ -126,30 +132,44 @@ object GraalNativeImageConfiguration {
val serverHandle = RemoteBuildCacheServer(serverConfiguration).run() val serverHandle = RemoteBuildCacheServer(serverConfiguration).run()
val clientProfile = RemoteBuildCacheClient.Configuration.Profile( val clientProfile = ClientConfiguration.Profile(
URI.create("http://127.0.0.1:$serverPort/"), URI.create("http://127.0.0.1:$serverPort/"),
null, null,
RemoteBuildCacheClient.Configuration.Authentication.BasicAuthenticationCredentials("user3", PASSWORD), ClientConfiguration.Authentication.BasicAuthenticationCredentials("user3", PASSWORD),
Duration.ofSeconds(3), Duration.ofSeconds(3),
10, 10,
true, true,
RemoteBuildCacheClient.Configuration.RetryPolicy( ClientConfiguration.RetryPolicy(
3, 3,
1000, 1000,
1.2 1.2
), ),
RemoteBuildCacheClient.Configuration.TrustStore(null, null, false, false) ClientConfiguration.TrustStore(null, null, false, false)
) )
HealthCheckCommand.run(clientProfile) HealthCheckCommand.execute(clientProfile)
BenchmarkCommand.run( BenchmarkCommand.execute(
clientProfile, clientProfile,
1000, 1000,
0x100, 0x100,
true true
) )
PutCommand.execute(
clientProfile,
"some-file.bin",
ByteArrayInputStream(ByteArray(0x1000) { it.toByte() }),
"application/octet-setream",
"attachment; filename=\"some-file.bin\""
)
GetCommand.execute(
clientProfile,
"some-file.bin",
NullOutputStream()
)
serverHandle.sendShutdownSignal() serverHandle.sendShutdownSignal()
try { try {
serverHandle.get() serverHandle.get()

View File

@@ -30,7 +30,7 @@ class BenchmarkCommand : RbcsCommand() {
companion object { companion object {
private val log = createLogger<BenchmarkCommand>() private val log = createLogger<BenchmarkCommand>()
fun run(profile : Configuration.Profile, fun execute(profile : Configuration.Profile,
numberOfEntries : Int, numberOfEntries : Int,
entrySize : Int, entrySize : Int,
useRandomValue : Boolean, useRandomValue : Boolean,
@@ -176,7 +176,7 @@ class BenchmarkCommand : RbcsCommand() {
clientCommand.configuration.profiles[profileName] clientCommand.configuration.profiles[profileName]
?: throw IllegalArgumentException("Profile $profileName does not exist in configuration") ?: throw IllegalArgumentException("Profile $profileName does not exist in configuration")
} }
run( execute(
profile, profile,
numberOfEntries, numberOfEntries,
size, size,

View File

@@ -1,9 +1,11 @@
package net.woggioni.rbcs.cli.impl.commands package net.woggioni.rbcs.cli.impl.commands
import net.woggioni.rbcs.cli.impl.RbcsCommand import net.woggioni.rbcs.cli.impl.RbcsCommand
import net.woggioni.rbcs.client.Configuration
import net.woggioni.rbcs.client.RemoteBuildCacheClient import net.woggioni.rbcs.client.RemoteBuildCacheClient
import net.woggioni.rbcs.common.createLogger import net.woggioni.rbcs.common.createLogger
import picocli.CommandLine import picocli.CommandLine
import java.io.OutputStream
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
@@ -15,6 +17,18 @@ import java.nio.file.Path
class GetCommand : RbcsCommand() { class GetCommand : RbcsCommand() {
companion object { companion object {
private val log = createLogger<GetCommand>() private val log = createLogger<GetCommand>()
fun execute(profile : Configuration.Profile, key : String, outputStream: OutputStream) {
RemoteBuildCacheClient(profile).use { client ->
client.get(key).thenApply { value ->
value?.let {
outputStream.use {
it.write(value)
}
} ?: throw NoSuchElementException("No value found for key $key")
}.get()
}
}
} }
@CommandLine.Spec @CommandLine.Spec
@@ -40,14 +54,6 @@ class GetCommand : RbcsCommand() {
clientCommand.configuration.profiles[profileName] clientCommand.configuration.profiles[profileName]
?: throw IllegalArgumentException("Profile $profileName does not exist in configuration") ?: throw IllegalArgumentException("Profile $profileName does not exist in configuration")
} }
RemoteBuildCacheClient(profile).use { client -> execute(profile, key, (output?.let(Files::newOutputStream) ?: System.out))
client.get(key).thenApply { value ->
value?.let {
(output?.let(Files::newOutputStream) ?: System.out).use {
it.write(value)
}
} ?: throw NoSuchElementException("No value found for key $key")
}.get()
}
} }
} }

View File

@@ -17,7 +17,7 @@ class HealthCheckCommand : RbcsCommand() {
companion object{ companion object{
private val log = createLogger<HealthCheckCommand>() private val log = createLogger<HealthCheckCommand>()
fun run(profile : Configuration.Profile) { fun execute(profile : Configuration.Profile) {
RemoteBuildCacheClient(profile).use { client -> RemoteBuildCacheClient(profile).use { client ->
val random = Random(SecureRandom.getInstance("NativePRNGNonBlocking").nextLong()) val random = Random(SecureRandom.getInstance("NativePRNGNonBlocking").nextLong())
val nonce = ByteArray(0xa0) val nonce = ByteArray(0xa0)
@@ -48,6 +48,6 @@ class HealthCheckCommand : RbcsCommand() {
clientCommand.configuration.profiles[profileName] clientCommand.configuration.profiles[profileName]
?: throw IllegalArgumentException("Profile $profileName does not exist in configuration") ?: throw IllegalArgumentException("Profile $profileName does not exist in configuration")
} }
run(profile) execute(profile)
} }
} }

View File

@@ -5,6 +5,7 @@ import net.woggioni.jwo.JWO
import net.woggioni.jwo.NullOutputStream import net.woggioni.jwo.NullOutputStream
import net.woggioni.rbcs.api.CacheValueMetadata import net.woggioni.rbcs.api.CacheValueMetadata
import net.woggioni.rbcs.cli.impl.RbcsCommand import net.woggioni.rbcs.cli.impl.RbcsCommand
import net.woggioni.rbcs.client.Configuration
import net.woggioni.rbcs.client.RemoteBuildCacheClient import net.woggioni.rbcs.client.RemoteBuildCacheClient
import net.woggioni.rbcs.common.createLogger import net.woggioni.rbcs.common.createLogger
import picocli.CommandLine import picocli.CommandLine
@@ -21,6 +22,20 @@ import java.util.UUID
class PutCommand : RbcsCommand() { class PutCommand : RbcsCommand() {
companion object { companion object {
private val log = createLogger<PutCommand>() private val log = createLogger<PutCommand>()
fun execute(profile: Configuration.Profile,
actualKey : String,
inputStream: InputStream,
mimeType : String?,
contentDisposition: String?
) {
RemoteBuildCacheClient(profile).use { client ->
inputStream.use {
client.put(actualKey, it.readAllBytes(), CacheValueMetadata(contentDisposition, mimeType))
}.get()
println(profile.serverURI.resolve(actualKey))
}
}
} }
@@ -92,10 +107,7 @@ class PutCommand : RbcsCommand() {
} }
actualKey = key ?: UUID.randomUUID().toString() actualKey = key ?: UUID.randomUUID().toString()
} }
inputStream.use { execute(profile, actualKey, inputStream, mimeType, contentDisposition)
client.put(actualKey, it.readAllBytes(), CacheValueMetadata(contentDisposition, mimeType))
}.get()
println(profile.serverURI.resolve(actualKey))
} }
} }
} }