/* * Copyright ConsenSys AG. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. * * SPDX-License-Identifier: Apache-2.0 * */ plugins { id 'org.graalvm.buildtools.native' version '0.9.17' } apply plugin: 'java-library' apply plugin: 'application' apply plugin: 'idea' jar { archiveBaseName = 'besu-evmtool' manifest { attributes( 'Specification-Title': archiveBaseName, 'Specification-Version': project.version, 'Implementation-Title': archiveBaseName, 'Implementation-Version': calculateVersion() ) } } dependencies { implementation project(':besu') implementation project(':config') implementation project(':crypto:algorithms') implementation project(':datatypes') implementation project(':ethereum:api') implementation project(':ethereum:core') implementation project(':ethereum:referencetests') implementation project(':ethereum:rlp') implementation project(':evm') implementation project(':metrics:core') implementation project(':plugins:rocksdb') implementation project(':services:kvstore') implementation project(':util') implementation 'com.fasterxml.jackson.core:jackson-databind' implementation 'com.google.dagger:dagger' implementation 'com.google.guava:guava' implementation 'info.picocli:picocli' implementation 'io.vertx:vertx-core' annotationProcessor 'com.google.dagger:dagger-compiler' annotationProcessor 'info.picocli:picocli-codegen' testImplementation 'org.assertj:assertj-core' testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.mockito:mockito-core' testImplementation 'org.mockito:mockito-junit-jupiter' testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' // No logging in graalvm EvmTool nativeImageClasspath 'org.slf4j:slf4j-nop' } mainClassName = 'org.hyperledger.besu.evmtool.EvmTool' startScripts { applicationName = 'evm' defaultJvmOpts = [ "-Dsecp256k1.randomize=false" ] doLast { unixScript.text = unixScript.text.replace('BESU_HOME', '\$APP_HOME') windowsScript.text = windowsScript.text.replace('BESU_HOME', '%~dp0..') } } // rename the top level dir from besu- to besu and this makes it really // simple for use in docker tasks.register("dockerDistUntar") { dependsOn distTar dependsOn distZip def dockerBuildDir = "${buildDir}/docker-besu-evmtool" def distTarFile = distTar.outputs.files.singleFile def distTarFileName = distTar.outputs.files.singleFile.name.replace(".tar", "") doFirst { new File(dockerBuildDir).mkdir() copy { from tarTree(distTarFile) into(dockerBuildDir) } file("${dockerBuildDir}/${distTarFileName}").renameTo("${dockerBuildDir}/besu-evmtool") } } tasks.register('distDocker', Exec) { dependsOn dockerDistUntar def dockerBuildVersion = project.hasProperty('release.releaseVersion') ? project.property('release.releaseVersion') : "${rootProject.version}" def dockerOrgName = project.hasProperty('dockerOrgName') ? project.getProperty("dockerOrgName") : "hyperledger" def dockerArtifactName = project.hasProperty("dockerArtifactName") ? "${project.getProperty("dockerArtifactName")}-evmtool" : "besu-evmtool" def imageName = "${dockerOrgName}/${dockerArtifactName}" def image = "${imageName}:${dockerBuildVersion}" def dockerBuildDir = "${buildDir}/docker-besu-evmtool/" workingDir "${dockerBuildDir}" doFirst { copy { from file("${projectDir}/src/main/docker/Dockerfile") into(workingDir) } } def gitDetails = getGitCommitDetails(10) executable "sh" args "-c", "docker build --build-arg BUILD_DATE=${buildTime()} --build-arg VERSION=${dockerBuildVersion} --build-arg VCS_REF=${gitDetails.hash} -t ${image} ." } tasks.register('dockerUpload', Exec) { dependsOn distDocker String dockerBuildVersion = project.hasProperty('release.releaseVersion') ? project.property('release.releaseVersion') : "${rootProject.version}" def dockerOrgName = project.hasProperty('dockerOrgName') ? project.getProperty("dockerOrgName") : "hyperledger" def dockerArtifactName = project.hasProperty("dockerArtifactName") ? "${project.getProperty("dockerArtifactName")}-evmtool" : "besu-evmtool" def imageName = "${dockerOrgName}/${dockerArtifactName}" def image = "${imageName}:${dockerBuildVersion}" def cmd = "docker push '${image}'" def additionalTags = [] if (project.hasProperty('branch') && project.property('branch') == 'main') { additionalTags.add('develop') } if (!(dockerBuildVersion ==~ /.*-SNAPSHOT/)) { additionalTags.add('latest') additionalTags.add(dockerBuildVersion.split(/\./)[0..1].join('.')) } additionalTags.each { tag -> cmd += " && docker tag '${image}' '${imageName}:${tag.trim()}' && docker push '${imageName}:${tag.trim()}'" } executable "sh" args "-c", cmd } graalvmNative { binaries { main { sharedLibrary = false buildArgs.addAll( "-H:ReflectionConfigurationFiles=${projectDir}/src/main/graal/reflection-config.json", "-H:AdditionalSecurityProviders=org.bouncycastle.jce.provider.BouncyCastleProvider", '-H:+TraceSecurityServices' ) // Netty drags in older versions of bouncy castle, exclude it so there are no conflicts excludeConfig.put("io.netty:netty-buffer", [".*"]) } } } configurations.nativeImageClasspath { // netty statically allocates some problematic classes exclude group: 'io.netty', module: 'netty-buffer' exclude group: 'io.netty', module: 'netty-common' exclude group: 'io.netty', module: 'netty-transport' // keep log4j from sneaking in. GraalVM has an aleric reaction if it sees even one class exclude group: 'org.slf4j', module: 'log4j-over-slf4j:1.7.36' exclude group: "log4j", module: "log4j" exclude group: "org.apache.logging.log4j" exclude group: 'org.bouncycastle', module: 'bcprov-jdk18on' }