mirror of
https://github.com/corda/corda.git
synced 2024-12-24 07:06:44 +00:00
CORDA-3696: JDK 11 Testing branch (#6131)
* CORDA-3696: Temporary update to enable JDK11 build and test. Will eventually be switchable. * CORDA-3696: Filter out the Nashorn warning. * CORDA-3696: Add JDK11 classifier. * CORDA-3696: Updated match string to cope with JDK11. * CORDA-3696: Filtering out SPHINCS256_SHA256 where failing due to JDK11. * CORDA-3696: Now remove SPHINCS256_SHA256 only if JDK11. * CORDA-3696: Fix test failure - switch to regex matching. * CORDA-3696: Hide the illegal access warnings. * CORDA-3696: Check for Java11 when disabling Java11 warnings. * CORDA-3696: Fix unneccessary non null check. * CORDA-3696: Reverting build env to JDK8 * CORDA-3696: Revert hiding of illegal access warnings via Unsafe class. * CORDA-3696: Remove internal access warnings and new JDK11 version checker. * CORDA-3696: Updated build file for OS * CORDA-3696: Removed typo * CORDA-3696: Fixed space typo. * CORDA-3696: Open modules to remove the illegal access warnings. Co-authored-by: Adel El-Beik <adelel-beik@19LDN-MAC108.local>
This commit is contained in:
parent
2ad996c0bd
commit
27ea570fbb
83
.ci/dev/compatibility/JenkinsfileJDK11Azul
Normal file
83
.ci/dev/compatibility/JenkinsfileJDK11Azul
Normal file
@ -0,0 +1,83 @@
|
||||
import static com.r3.build.BuildControl.killAllExistingBuildsForJob
|
||||
@Library('corda-shared-build-pipeline-steps')
|
||||
import static com.r3.build.BuildControl.killAllExistingBuildsForJob
|
||||
|
||||
killAllExistingBuildsForJob(env.JOB_NAME, env.BUILD_NUMBER.toInteger())
|
||||
|
||||
pipeline {
|
||||
agent { label 'local-k8s' }
|
||||
options {
|
||||
timestamps()
|
||||
timeout(time: 3, unit: 'HOURS')
|
||||
}
|
||||
|
||||
environment {
|
||||
DOCKER_TAG_TO_USE = "${env.GIT_COMMIT.subSequence(0, 8)}"
|
||||
EXECUTOR_NUMBER = "${env.EXECUTOR_NUMBER}"
|
||||
BUILD_ID = "${env.BUILD_ID}-${env.JOB_NAME}"
|
||||
ARTIFACTORY_CREDENTIALS = credentials('artifactory-credentials')
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Corda Pull Request - Generate Build Image') {
|
||||
steps {
|
||||
withCredentials([string(credentialsId: 'container_reg_passwd', variable: 'DOCKER_PUSH_PWD')]) {
|
||||
sh "./gradlew --no-daemon " +
|
||||
"-Dkubenetize=true " +
|
||||
"-Ddocker.push.password=\"\${DOCKER_PUSH_PWD}\" " +
|
||||
"-Ddocker.work.dir=\"/tmp/\${EXECUTOR_NUMBER}\" " +
|
||||
"-Ddocker.build.tag=\"\${DOCKER_TAG_TO_USE}\" " +
|
||||
"-Ddocker.buildbase.tag=11latest " +
|
||||
"-Ddocker.dockerfile=DockerfileJDK11Azul" +
|
||||
" clean pushBuildImage --stacktrace"
|
||||
}
|
||||
sh "kubectl auth can-i get pods"
|
||||
}
|
||||
}
|
||||
|
||||
stage('Corda Pull Request - Run Tests') {
|
||||
parallel {
|
||||
stage('Integration Tests') {
|
||||
steps {
|
||||
sh "./gradlew --no-daemon " +
|
||||
"-DbuildId=\"\${BUILD_ID}\" " +
|
||||
"-Dkubenetize=true " +
|
||||
"-Ddocker.run.tag=\"\${DOCKER_TAG_TO_USE}\" " +
|
||||
"-Dartifactory.username=\"\${ARTIFACTORY_CREDENTIALS_USR}\" " +
|
||||
"-Dartifactory.password=\"\${ARTIFACTORY_CREDENTIALS_PSW}\" " +
|
||||
"-Dgit.branch=\"\${GIT_BRANCH}\" " +
|
||||
"-Dgit.target.branch=\"\${CHANGE_TARGET}\" " +
|
||||
"-Ddependx.branch.origin=${env.GIT_COMMIT} " +
|
||||
"-Ddependx.branch.target=${CHANGE_TARGET} " +
|
||||
" allParallelIntegrationTest --stacktrace"
|
||||
}
|
||||
}
|
||||
stage('Unit Tests') {
|
||||
steps {
|
||||
sh "./gradlew --no-daemon " +
|
||||
"-DbuildId=\"\${BUILD_ID}\" " +
|
||||
"-Dkubenetize=true " +
|
||||
"-Ddocker.run.tag=\"\${DOCKER_TAG_TO_USE}\" " +
|
||||
"-Dartifactory.username=\"\${ARTIFACTORY_CREDENTIALS_USR}\" " +
|
||||
"-Dartifactory.password=\"\${ARTIFACTORY_CREDENTIALS_PSW}\" " +
|
||||
"-Dgit.branch=\"\${GIT_BRANCH}\" " +
|
||||
"-Dgit.target.branch=\"\${CHANGE_TARGET}\" " +
|
||||
"-Ddependx.branch.origin=${env.GIT_COMMIT} " +
|
||||
"-Ddependx.branch.target=${CHANGE_TARGET} " +
|
||||
" allParallelUnitTest --stacktrace"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
always {
|
||||
archiveArtifacts artifacts: '**/pod-logs/**/*.log', fingerprint: false
|
||||
junit '**/build/test-results-xml/**/*.xml'
|
||||
}
|
||||
cleanup {
|
||||
deleteDir() /* clean up our workspace */
|
||||
}
|
||||
}
|
||||
}
|
@ -48,6 +48,20 @@ fun checkMinimumPlatformVersion(minimumPlatformVersion: Int, requiredMinPlatform
|
||||
@Throws(NumberFormatException::class)
|
||||
fun getJavaUpdateVersion(javaVersion: String): Long = javaVersion.substringAfter("_").substringBefore("-").toLong()
|
||||
|
||||
enum class JavaVersion(val versionString: String) {
|
||||
Java_1_8("1.8"),
|
||||
Java_11("11");
|
||||
|
||||
companion object {
|
||||
fun isVersionAtLeast(version: JavaVersion): Boolean {
|
||||
return currentVersion.toFloat() >= version.versionString.toFloat()
|
||||
}
|
||||
|
||||
private val currentVersion: String = System.getProperty("java.specification.version") ?:
|
||||
throw IllegalStateException("Unable to retrieve system property java.specification.version")
|
||||
}
|
||||
}
|
||||
|
||||
/** Provide access to internal method for AttachmentClassLoaderTests. */
|
||||
@DeleteForDJVM
|
||||
fun TransactionBuilder.toWireTransaction(services: ServicesForResolution, serializationContext: SerializationContext): WireTransaction {
|
||||
|
@ -15,6 +15,7 @@ import net.corda.core.crypto.Crypto.generateKeyPair
|
||||
import net.corda.core.crypto.SignatureScheme
|
||||
import net.corda.core.crypto.newSecureRandom
|
||||
import net.corda.core.identity.CordaX500Name
|
||||
import net.corda.core.internal.JavaVersion
|
||||
import net.corda.core.internal.div
|
||||
import net.corda.core.serialization.SerializationContext
|
||||
import net.corda.core.serialization.deserialize
|
||||
@ -96,6 +97,7 @@ class X509UtilitiesTest {
|
||||
Pair(ECDSA_SECP256K1_SHA256, RSA_SHA256),
|
||||
Pair(EDDSA_ED25519_SHA512, ECDSA_SECP256K1_SHA256),
|
||||
Pair(RSA_SHA256, EDDSA_ED25519_SHA512),
|
||||
Pair(EDDSA_ED25519_SHA512, ECDSA_SECP256R1_SHA256),
|
||||
Pair(SPHINCS256_SHA256, ECDSA_SECP256R1_SHA256)
|
||||
)
|
||||
|
||||
@ -115,7 +117,8 @@ class X509UtilitiesTest {
|
||||
|
||||
@Test(timeout=300_000)
|
||||
fun `create valid self-signed CA certificate`() {
|
||||
Crypto.supportedSignatureSchemes().filter { it != COMPOSITE_KEY }.forEach { validSelfSignedCertificate(it) }
|
||||
Crypto.supportedSignatureSchemes().filter { it != COMPOSITE_KEY
|
||||
&& ( !JavaVersion.isVersionAtLeast(JavaVersion.Java_11) || it != SPHINCS256_SHA256)}.forEach { validSelfSignedCertificate(it) }
|
||||
}
|
||||
|
||||
private fun validSelfSignedCertificate(signatureScheme: SignatureScheme) {
|
||||
@ -150,7 +153,8 @@ class X509UtilitiesTest {
|
||||
|
||||
@Test(timeout=300_000)
|
||||
fun `create valid server certificate chain`() {
|
||||
certChainSchemeCombinations.forEach { createValidServerCertChain(it.first, it.second) }
|
||||
certChainSchemeCombinations.filter{ !JavaVersion.isVersionAtLeast(JavaVersion.Java_11) || it.first != SPHINCS256_SHA256 }
|
||||
.forEach { createValidServerCertChain(it.first, it.second) }
|
||||
}
|
||||
|
||||
private fun createValidServerCertChain(signatureSchemeRoot: SignatureScheme, signatureSchemeChild: SignatureScheme) {
|
||||
|
@ -79,6 +79,11 @@ task buildCordaJAR(type: FatCapsule, dependsOn: [
|
||||
manifest {
|
||||
// These are the dependencies that the deterministic Corda libraries share with Corda.
|
||||
attributes('Corda-DJVM-Dependencies': cordaResolved.values().collect { it.name }.join(' '))
|
||||
|
||||
if (JavaVersion.current() == JavaVersion.VERSION_11) {
|
||||
attributes('Add-Opens': 'java.management/com.sun.jmx.mbeanserver java.base/java.lang')
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
into('djvm') {
|
||||
|
@ -173,6 +173,27 @@ public class CordaCaplet extends Capsule {
|
||||
}
|
||||
}
|
||||
|
||||
// Capsule does not handle multiple instances of same option hence we add in the args here to process builder
|
||||
// For multiple instances Capsule jvm args handling works on basis that one overrides the other.
|
||||
@Override
|
||||
protected int launch(ProcessBuilder pb) throws IOException, InterruptedException {
|
||||
if (isAtLeastJavaVersion11()) {
|
||||
List<String> args = pb.command();
|
||||
List<String> myArgs = Arrays.asList(
|
||||
"--add-opens=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.lang=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.lang.invoke=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.util=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.time=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.io=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.nio=ALL-UNNAMED");
|
||||
args.addAll(1, myArgs);
|
||||
pb.command(args);
|
||||
}
|
||||
return super.launch(pb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overriding the Caplet classpath generation via the intended interface in Capsule.
|
||||
*/
|
||||
@ -227,6 +248,9 @@ public class CordaCaplet extends Capsule {
|
||||
jvmArgs.add("-XX:+HeapDumpOnOutOfMemoryError");
|
||||
jvmArgs.add("-XX:+CrashOnOutOfMemoryError");
|
||||
}
|
||||
if (isAtLeastJavaVersion11()) {
|
||||
jvmArgs.add("-Dnashorn.args=--no-deprecation-warning");
|
||||
}
|
||||
return (T) jvmArgs;
|
||||
} else if (ATTR_SYSTEM_PROPERTIES == attr) {
|
||||
// Add system properties, if specified, from the config.
|
||||
@ -271,6 +295,14 @@ public class CordaCaplet extends Capsule {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isAtLeastJavaVersion11() {
|
||||
String version = System.getProperty("java.specification.version");
|
||||
if (version != null) {
|
||||
return Float.parseFloat(version) >= 11f;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private Boolean checkIfCordappDirExists(File dir) {
|
||||
try {
|
||||
if (!dir.mkdir() && !dir.exists()) { // It is unlikely to enter this if-branch, but just in case.
|
||||
|
@ -5,6 +5,7 @@ import net.corda.testing.driver.DriverParameters
|
||||
import net.corda.testing.driver.driver
|
||||
import net.corda.testing.node.internal.FINANCE_CONTRACTS_CORDAPP
|
||||
import net.corda.testing.node.internal.FINANCE_WORKFLOWS_CORDAPP
|
||||
import org.apache.commons.lang3.SystemUtils
|
||||
import org.junit.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertTrue
|
||||
@ -14,8 +15,9 @@ class NodeRPCTests {
|
||||
private val CORDA_VENDOR = "Corda Open Source"
|
||||
private val CORDAPPS = listOf(FINANCE_CONTRACTS_CORDAPP, FINANCE_WORKFLOWS_CORDAPP)
|
||||
private val CORDAPP_TYPES = setOf("Contract CorDapp", "Workflow CorDapp")
|
||||
private val CLASSIFIER = if (SystemUtils.IS_JAVA_11) "-jdk11" else ""
|
||||
private val CORDAPP_CONTRACTS_NAME_REGEX = "corda-finance-contracts-$CORDA_VERSION_REGEX".toRegex()
|
||||
private val CORDAPP_WORKFLOWS_NAME_REGEX = "corda-finance-workflows-$CORDA_VERSION_REGEX".toRegex()
|
||||
private val CORDAPP_WORKFLOWS_NAME_REGEX = "corda-finance-workflows-$CORDA_VERSION_REGEX$CLASSIFIER".toRegex()
|
||||
private val CORDAPP_SHORT_NAME = "Corda Finance Demo"
|
||||
private val CORDAPP_VENDOR = "R3"
|
||||
private val CORDAPP_LICENCE = "Open Source (Apache 2)"
|
||||
|
@ -62,7 +62,7 @@ class NonDeterministicContractVerifyTest {
|
||||
.returnValue.getOrThrow()
|
||||
}
|
||||
assertThat(ex)
|
||||
.hasMessageStartingWith("NoSuchMethodError: sandbox.java.time.Instant.now()Lsandbox/java/time/Instant;, ")
|
||||
.hasMessageMatching("^NoSuchMethodError: .*\\Qsandbox.java.time.Instant.now()\\E.*\$")
|
||||
}
|
||||
}
|
||||
|
||||
@ -75,7 +75,7 @@ class NonDeterministicContractVerifyTest {
|
||||
.returnValue.getOrThrow()
|
||||
}
|
||||
assertThat(ex)
|
||||
.hasMessageStartingWith("NoSuchMethodError: sandbox.java.lang.System.currentTimeMillis()J, ")
|
||||
.hasMessageMatching("^NoSuchMethodError: .*\\Qsandbox.java.lang.System.currentTimeMillis()\\E.*\$")
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,7 +88,7 @@ class NonDeterministicContractVerifyTest {
|
||||
.returnValue.getOrThrow()
|
||||
}
|
||||
assertThat(ex)
|
||||
.hasMessageStartingWith("NoSuchMethodError: sandbox.java.lang.System.nanoTime()J, ")
|
||||
.hasMessageMatching("^NoSuchMethodError: .*\\Qsandbox.java.lang.System.nanoTime()\\E.*\$")
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,7 +101,7 @@ class NonDeterministicContractVerifyTest {
|
||||
.returnValue.getOrThrow()
|
||||
}
|
||||
assertThat(ex)
|
||||
.hasMessageStartingWith("NoSuchMethodError: sandbox.java.util.UUID.randomUUID()Lsandbox/java/util/UUID;, ")
|
||||
.hasMessageMatching("^NoSuchMethodError: .*\\Qsandbox.java.util.UUID.randomUUID()\\E.*\$")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,6 +106,12 @@ task runRPCCashIssue(type: JavaExec) {
|
||||
args 20000
|
||||
args '--currency'
|
||||
args 'USD'
|
||||
if (JavaVersion.current() == JavaVersion.VERSION_11) {
|
||||
jvmArgs '--add-opens'
|
||||
jvmArgs 'java.base/java.time=ALL-UNNAMED'
|
||||
jvmArgs '--add-opens'
|
||||
jvmArgs 'java.base/java.io=ALL-UNNAMED'
|
||||
}
|
||||
}
|
||||
|
||||
task runWebCashIssue(type: JavaExec) {
|
||||
@ -117,6 +123,12 @@ task runWebCashIssue(type: JavaExec) {
|
||||
args 30000
|
||||
args '--currency'
|
||||
args 'GBP'
|
||||
if (JavaVersion.current() == JavaVersion.VERSION_11) {
|
||||
jvmArgs '--add-opens'
|
||||
jvmArgs 'java.base/java.time=ALL-UNNAMED'
|
||||
jvmArgs '--add-opens'
|
||||
jvmArgs 'java.base/java.io=ALL-UNNAMED'
|
||||
}
|
||||
}
|
||||
|
||||
jar {
|
||||
|
4
testing/DockerfileJDK11Azul
Normal file
4
testing/DockerfileJDK11Azul
Normal file
@ -0,0 +1,4 @@
|
||||
FROM stefanotestingcr.azurecr.io/buildbase:11latest
|
||||
COPY . /tmp/source
|
||||
CMD cd /tmp/source && GRADLE_USER_HOME=/tmp/gradle ./gradlew clean testClasses integrationTestClasses --parallel --info
|
||||
|
@ -42,6 +42,7 @@ class CordaCliWrapperErrorHandlingTests(val arguments: List<String>, val outputR
|
||||
val processErrorOutput = BufferedReader(
|
||||
InputStreamReader(process.errorStream))
|
||||
.lines()
|
||||
.filter { !it.startsWith("Warning: Nashorn") }
|
||||
.collect(Collectors.joining("\n"))
|
||||
.toString()
|
||||
|
||||
|
@ -6,6 +6,7 @@ import com.typesafe.config.*;
|
||||
import sun.misc.Signal;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
@ -86,6 +87,23 @@ public class CordaWebserverCaplet extends Capsule {
|
||||
return super.prelaunch(jvmArgs, args);
|
||||
}
|
||||
|
||||
// Capsule does not handle multiple instances of same option hence we add in the args here to process builder
|
||||
// For multiple instances Capsule jvm args handling works on basis that one overrides the other.
|
||||
@Override
|
||||
protected int launch(ProcessBuilder pb) throws IOException, InterruptedException {
|
||||
if (isAtLeastJavaVersion11()) {
|
||||
List<String> args = pb.command();
|
||||
List<String> myArgs = Arrays.asList(
|
||||
"--add-opens=java.base/java.lang=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.time=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.io=ALL-UNNAMED",
|
||||
"--add-opens=java.base/java.nio=ALL-UNNAMED");
|
||||
args.addAll(1, myArgs);
|
||||
pb.command(args);
|
||||
}
|
||||
return super.launch(pb);
|
||||
}
|
||||
|
||||
// Add working directory variable to capsules string replacement variables.
|
||||
@Override
|
||||
protected String getVarValue(String var) {
|
||||
@ -139,6 +157,9 @@ public class CordaWebserverCaplet extends Capsule {
|
||||
} catch (ConfigException e) {
|
||||
log(LOG_QUIET, e);
|
||||
}
|
||||
if (isAtLeastJavaVersion11()) {
|
||||
jvmArgs.add("-Dnashorn.args=--no-deprecation-warning");
|
||||
}
|
||||
return (T) jvmArgs;
|
||||
} else if (ATTR_SYSTEM_PROPERTIES == attr) {
|
||||
// Add system properties, if specified, from the config.
|
||||
@ -181,6 +202,14 @@ public class CordaWebserverCaplet extends Capsule {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isAtLeastJavaVersion11() {
|
||||
String version = System.getProperty("java.specification.version");
|
||||
if (version != null) {
|
||||
return Float.parseFloat(version) >= 11f;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private Boolean checkIfCordappDirExists(File dir) {
|
||||
try {
|
||||
if (!dir.mkdir() && !dir.exists()) { // It is unlikely to enter this if-branch, but just in case.
|
||||
|
@ -56,6 +56,12 @@ task buildWebserverJar(type: FatCapsule, dependsOn: project(':node').tasks.jar)
|
||||
// If you change these flags, please also update Driver.kt
|
||||
jvmArgs = ['-Xmx200m', '-XX:+UseG1GC']
|
||||
}
|
||||
|
||||
manifest {
|
||||
if (JavaVersion.current() == JavaVersion.VERSION_11) {
|
||||
attributes('Add-Opens': 'java.management/com.sun.jmx.mbeanserver java.base/java.lang')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assemble.dependsOn buildWebserverJar
|
||||
|
Loading…
Reference in New Issue
Block a user