Skip to content

Commit

Permalink
Merge pull request #30 from brsyuksel/native-image
Browse files Browse the repository at this point in the history
Building native-image
  • Loading branch information
brsyuksel committed Jan 26, 2022
2 parents 0bce94c + c47b2be commit e116e8d
Show file tree
Hide file tree
Showing 10 changed files with 1,324 additions and 7 deletions.
30 changes: 30 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
FROM ubuntu:20.04 AS builder

RUN apt-get update && \
apt-get install -yqq wget build-essential libz-dev zlib1g-dev apt-transport-https curl gnupg

RUN wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz
RUN tar zxvf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz && \
mkdir -v /usr/lib/jvm && \
mv -v graalvm-ce-java11-22.0.0.2/ /usr/lib/jvm && \
update-alternatives --install /usr/bin/java java /usr/lib/jvm/graalvm-ce-java11-22.0.0.2/bin/java 0 && \
/usr/lib/jvm/graalvm-ce-java11-22.0.0.2/bin/gu install native-image && \
ln -sv /usr/lib/jvm/graalvm-ce-java11-22.0.0.2/bin/native-image /usr/local/bin/native-image

RUN echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list && \
echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | tee /etc/apt/sources.list.d/sbt_old.list && \
curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import && \
chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg && \
apt-get update && \
apt-get install -y sbt

COPY . /build
WORKDIR /build
RUN sbt graalvm-native-image:packageBin

FROM ubuntu:20.04

RUN mkdir -v /app
WORKDIR /app
COPY --from=builder /build/target/graalvm-native-image/xurl xurl
CMD ./xurl
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,15 @@ the grafana' default credentials have been used so you can log in with **admin**

the dashboard name is `xurl`, you can also take a look community-driven `postgres` and `redis` dashboards to see metrics of them.

## docker container

after building a docker image for the project by using a command like `docker build . -t xurl:latest`, you should create a container using the host network since the configuration is not updated:
```
docker run --rm --network host xurl:latest
```

>> graalvm native image causes a bug on the metrics endpoint that are used by prometheus, the relevant endpoint somehow returns 500 for requests.
## todo

- basen character uniqueness tests
Expand All @@ -121,4 +130,4 @@ the dashboard name is `xurl`, you can also take a look community-driven `postgre
- clear error messages
- ~~github actions for ci~~ [PR#9](https://github.com/brsyuksel/xurl/pull/9)
- scala 3
- graalvm native image
- ~~graalvm native image~~ [PR#30](https://github.com/brsyuksel/xurl/pull/30)
23 changes: 20 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ ThisBuild / organizationName := "xurl"
ThisBuild / scalafixDependencies += libraries.scalafixOrganizeImports
ThisBuild / semanticdbEnabled := true
ThisBuild / semanticdbVersion := scalafixSemanticdb.revision
ThisBuild / assemblyMergeStrategy := {
case x if x.contains("io.netty.versions.properties") => MergeStrategy.concat
case x =>
val oldStrategy = (ThisBuild / assemblyMergeStrategy).value
oldStrategy(x)
}

val scalafixSettings = inConfig(IntegrationTest)(scalafixConfigSettings(IntegrationTest))
lazy val root = (project in file("."))
Expand All @@ -18,10 +24,21 @@ lazy val root = (project in file("."))
scalafixSettings,
testFrameworks += TestFramework("weaver.framework.CatsEffect"),
libraryDependencies ++= dependencies,
packGenerateWindowsBatFile := false,
packMain := Map("xurl" -> "xurl.main")
assembly / mainClass := Some("xurl.main"),
assembly / assemblyJarName := "xurl-assembly.jar",
// java -agentlib:native-image-agent=config-output-dir=./ci/native-image-configs -jar xurl-assembly.jar
graalVMNativeImageOptions ++= Seq(
"--allow-incomplete-classpath",
"--enable-http",
"--enable-https",
"-H:+AllowVMInspection",
"-H:ResourceConfigurationFiles=../../ci/native-image-configs/resource-config.json",
"-H:ReflectionConfigurationFiles=../../ci/native-image-configs/reflect-config.json",
"-H:JNIConfigurationFiles=../../ci/native-image-configs/jni-config.json",
"-H:DynamicProxyConfigurationFiles=../../ci/native-image-configs/proxy-config.json",
),
)
.enablePlugins(PackPlugin)
.enablePlugins(GraalVMNativeImagePlugin)

addCommandAlias("sfix", ";scalafixAll --rules OrganizeImports")
addCommandAlias("scalafixCheck", ";scalafixAll --check --rules OrganizeImports")
Expand Down
51 changes: 51 additions & 0 deletions ci/native-image-configs/jni-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
[
{
"name":"[Lcom.sun.management.internal.DiagnosticCommandArgumentInfo;"
},
{
"name":"[Lcom.sun.management.internal.DiagnosticCommandInfo;"
},
{
"name":"com.sun.management.internal.DiagnosticCommandArgumentInfo",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","boolean","boolean","int"] }]
},
{
"name":"com.sun.management.internal.DiagnosticCommandInfo",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","java.util.List"] }]
},
{
"name":"java.lang.Boolean",
"methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.lang.ClassLoader",
"methods":[
{"name":"getPlatformClassLoader","parameterTypes":[] },
{"name":"loadClass","parameterTypes":["java.lang.String"] }
]
},
{
"name":"java.util.Arrays",
"methods":[{"name":"asList","parameterTypes":["java.lang.Object[]"] }]
},
{
"name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"
},
{
"name":"org.graalvm.jniutils.JNIExceptionWrapperEntryPoints",
"methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }]
},
{
"name":"sun.management.VMManagementImpl",
"fields":[
{"name":"compTimeMonitoringSupport"},
{"name":"currentThreadCpuTimeSupport"},
{"name":"objectMonitorUsageSupport"},
{"name":"otherThreadCpuTimeSupport"},
{"name":"remoteDiagnosticCommandsSupport"},
{"name":"synchronizerUsageSupport"},
{"name":"threadAllocatedMemorySupport"},
{"name":"threadContentionMonitoringSupport"}
]
}
]
8 changes: 8 additions & 0 deletions ci/native-image-configs/predefined-classes-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"type":"agent-extracted",
"classes":[
]
}
]

8 changes: 8 additions & 0 deletions ci/native-image-configs/proxy-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"interfaces":["io.lettuce.core.api.sync.RedisCommands","io.lettuce.core.cluster.api.sync.RedisClusterCommands"]}
,
{
"interfaces":["sun.misc.SignalHandler"]}

]
Loading

0 comments on commit e116e8d

Please sign in to comment.