|
|
|
/*
|
|
|
|
* 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-<version> 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'
|
|
|
|
}
|