A REST server for compiling and executing Kotlin code. The server provides the API for Kotlin Playground library.
Download Kotlin dependencies and build an executor before starting the server:
$ ./gradlew build -x test
Start the Spring Boot project. The main class: com.compiler.server.CompilerApplication
To build the app inside a Docker container, run the following command from the project directory:
$ ./docker-image-build.sh
Based on aws-serverless-container.
$ ./gradlew buildLambda
Getting .zip
file from build/distributions
.
Lambda handler: com.compiler.server.lambdas.StreamLambdaHandler::handleRequest
.
Publish your Lambda function: you can follow the instructions in AWS Lambda's documentation on how to package your function for deployment.
Add Kotless and remove aws-serverless-container =)
Swagger url: http://localhost:8080/swagger-ui/
Just put whatever you need as dependencies
to build.gradle.kts via a
task called kotlinDependency
:
kotlinDependency "your dependency"
NOTE: If the library you're adding uses reflection, accesses the file system, or performs any other type of security-sensitive operations, don't forget to configure the executor.policy . Click here for more information about Java Security Policy.
How to set Java Security Policy in executors.policy
If you want to configure a custom dependency, use the marker @LIB_DIR@
:
grant codeBase "file:%%LIB_DIR%%/junit-4.12.jar"{
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.lang.RuntimePermission "setIO";
permission java.io.FilePermission "<<ALL FILES>>", "read";
permission java.lang.RuntimePermission "accessDeclaredMembers";
};
Set the environment variables
ENV | Default value |
---|---|
ACCESS_CONTROL_ALLOW_ORIGIN_VALUE | * |
ACCESS_CONTROL_ALLOW_HEADER_VALUE | * |
We use prod
spring active profile to stream logs as JSON format.
You can set the spring profile by supplying -Dspring.profiles.active=prod
or set env variable SPRING_PROFILES_ACTIVE
to prod
value.
In case of an unsuccessful execution in the standard output will be the event with INFO level:
{
"date_time": "31/Aug/2021:11:49:45 +03:00",
"@version": "1",
"message": "Code execution is complete.",
"logger_name": "com.compiler.server.service.KotlinProjectExecutor",
"thread_name": "http-nio-8080-exec-1",
"level": "INFO",
"level_value": 20000,
"hasErrors": true,
"confType": "JAVA",
"kotlinVersion": "$kotlinVersion"
}
- Update the kotlin version in libs.versions.toml
- Make sure everything is going well via the task:
$ ./gradlew build
- Save branch with the name of the kotlin version. Pattern:
/^[0-9.]+$/
(optional) - Bump version on GitHub releases (optional)
Gradle Build Scans can provide insights into an Kotlin Compiler Server Build. JetBrains runs a Gradle Develocity server. that can be used to automatically upload reports.
To automatically opt in add the following to $GRADLE_USER_HOME/gradle.properties
.
org.jetbrains.kotlin.compiler.server.build.scan.enabled=true
# optionally provide a username that will be attached to each report
org.jetbrains..kotlin.compiler.server.build.scan.username=John Wick
Also you need to create an access key:
./gradlew provisionDevelocityAccessKey
A Build Scan may contain identifiable information. See the Terms of Use https://gradle.com/legal/terms-of-use/.