2020-06-18 22:46:29 +00:00
|
|
|
#!groovy
|
|
|
|
/**
|
2020-09-18 06:46:08 +00:00
|
|
|
* Jenkins pipeline to build Corda OS release branches and tags.
|
|
|
|
* PLEASE NOTE: we DO want to run a build for each commit!!!
|
2020-06-18 22:46:29 +00:00
|
|
|
*/
|
2022-05-09 12:22:33 +00:00
|
|
|
@Library('corda-shared-build-pipeline-steps')
|
2020-06-18 22:46:29 +00:00
|
|
|
|
2023-03-14 11:52:55 +00:00
|
|
|
import com.r3.build.utils.GitUtils
|
2023-07-17 17:27:28 +00:00
|
|
|
import com.r3.build.enums.SnykOrganisation
|
|
|
|
import com.r3.build.utils.SnykUtils
|
2023-03-14 11:52:55 +00:00
|
|
|
|
|
|
|
GitUtils gitUtils = new GitUtils(this)
|
2023-07-17 17:27:28 +00:00
|
|
|
SnykUtils snykUtils = new SnykUtils(this)
|
2020-06-18 22:46:29 +00:00
|
|
|
/**
|
|
|
|
* Sense environment
|
|
|
|
*/
|
2022-03-15 07:58:36 +00:00
|
|
|
boolean isReleaseBranch = (env.BRANCH_NAME =~ /^release\/os\/.*/)
|
2020-06-20 10:08:52 +00:00
|
|
|
boolean isReleaseTag = (env.TAG_NAME =~ /^release-.*(?<!_JDK11)$/)
|
2020-07-16 15:46:10 +00:00
|
|
|
boolean isInternalRelease = (env.TAG_NAME =~ /^internal-release-.*$/)
|
2020-09-18 06:46:08 +00:00
|
|
|
boolean isReleaseCandidate = (env.TAG_NAME =~ /^(release-.*(RC|HC).*(?<!_JDK11))$/)
|
2022-01-18 11:12:32 +00:00
|
|
|
def buildEdition = (isReleaseTag || isReleaseCandidate) ? "Corda Community Edition" : "Corda Open Source"
|
2020-09-18 06:46:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Common Gradle arguments for all Gradle executions
|
|
|
|
*/
|
|
|
|
String COMMON_GRADLE_PARAMS = [
|
|
|
|
'--no-daemon',
|
|
|
|
'--stacktrace',
|
|
|
|
'--info',
|
|
|
|
'-Pcompilation.warningsAsErrors=false',
|
|
|
|
'-Ptests.failFast=true',
|
2023-11-19 19:56:09 +00:00
|
|
|
'--build-cache',
|
|
|
|
'-DexcludeShell'
|
2020-09-18 06:46:08 +00:00
|
|
|
].join(' ')
|
|
|
|
|
2019-10-08 14:33:24 +00:00
|
|
|
pipeline {
|
2023-08-30 13:28:29 +00:00
|
|
|
agent { label 'standard' }
|
2020-09-18 06:46:08 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* List options in alphabetical order
|
|
|
|
*/
|
2019-11-09 08:57:19 +00:00
|
|
|
options {
|
2020-07-15 09:17:58 +00:00
|
|
|
buildDiscarder(logRotator(daysToKeepStr: '14', artifactDaysToKeepStr: '14'))
|
2020-09-18 06:46:08 +00:00
|
|
|
parallelsAlwaysFailFast()
|
|
|
|
timeout(time: 6, unit: 'HOURS')
|
|
|
|
timestamps()
|
2019-11-09 08:57:19 +00:00
|
|
|
}
|
2019-10-08 14:33:24 +00:00
|
|
|
|
2020-08-06 19:20:19 +00:00
|
|
|
parameters {
|
2022-01-11 11:44:42 +00:00
|
|
|
booleanParam defaultValue: true, description: 'Run tests during this build?', name: 'DO_TEST'
|
2020-08-06 19:20:19 +00:00
|
|
|
}
|
|
|
|
|
2020-09-18 06:46:08 +00:00
|
|
|
/*
|
|
|
|
* List environment variables in alphabetical order
|
|
|
|
*/
|
2019-10-08 14:33:24 +00:00
|
|
|
environment {
|
2020-09-18 06:46:08 +00:00
|
|
|
ARTIFACTORY_BUILD_NAME = "Corda :: Publish :: Publish Release to Artifactory :: ${env.BRANCH_NAME}"
|
2019-11-04 13:05:13 +00:00
|
|
|
ARTIFACTORY_CREDENTIALS = credentials('artifactory-credentials')
|
2023-11-17 17:41:45 +00:00
|
|
|
BUILD_CACHE_CREDENTIALS = credentials('gradle-ent-cache-credentials')
|
|
|
|
BUILD_CACHE_PASSWORD = "${env.BUILD_CACHE_CREDENTIALS_PSW}"
|
|
|
|
BUILD_CACHE_USERNAME = "${env.BUILD_CACHE_CREDENTIALS_USR}"
|
2020-07-17 08:39:45 +00:00
|
|
|
CORDA_ARTIFACTORY_PASSWORD = "${env.ARTIFACTORY_CREDENTIALS_PSW}"
|
2020-09-18 06:46:08 +00:00
|
|
|
CORDA_ARTIFACTORY_USERNAME = "${env.ARTIFACTORY_CREDENTIALS_USR}"
|
2023-11-17 17:41:45 +00:00
|
|
|
CORDA_GRADLE_SCAN_KEY = credentials('gradle-build-scans-key')
|
2022-01-18 11:12:32 +00:00
|
|
|
CORDA_BUILD_EDITION = "${buildEdition}"
|
2023-06-23 19:46:36 +00:00
|
|
|
CORDA_USE_CACHE = "corda-remotes"
|
2020-09-18 06:46:08 +00:00
|
|
|
DOCKER_URL = "https://index.docker.io/v1/"
|
2022-05-09 12:22:33 +00:00
|
|
|
EMAIL_RECIPIENTS = credentials('corda4-email-recipient')
|
2023-07-17 17:27:28 +00:00
|
|
|
INTEGRATION_ID = credentials('snyk-artifactory-c4')
|
2023-03-14 11:51:14 +00:00
|
|
|
SNYK_API_KEY = "c4-os-snyk" //Jenkins credential type: Snyk Api token
|
2023-07-17 17:27:28 +00:00
|
|
|
SNYK_TOKEN = credentials('c4-os-snyk-api-token-secret') //Jenkins credential type: Secret text
|
2023-03-14 11:51:14 +00:00
|
|
|
C4_OS_SNYK_ORG_ID = credentials('corda4-os-snyk-org-id')
|
Upgrade to gradle 7.6, kotlin 1.8 and jdk 17
Major changes due to JDK 17:
1. JDK17 JCE Provider now has built-in support for eddsas, corda uses
the bouncycastle (i2p) implementation. This PR removes the conflicting
algorithms from the built-in JCE provider.
2. JavaScript scripting has been removed from the JDK, the corda log4j config was using
scripting to conditionally output additional diagnostic info if the MDC
was populated. This PR has removed the scripting.
3. The artifactory plug-ins used are now deprecated, this PR has removed them
and uses the same code as Corda 5 for publishing to artifactory.
4. Javadoc generation has been modified to use the latest dokka plug-ins.
5. Gradle 7.6 has implemented an incredibly annoying change where transitive
dependencies are not put on the compile classpath, so that they have to be
explicitly added as dependencies to projects.
6. Mockito has been updated, which sadly meant that quite a few source files
have to changes to use the new (org.mockito.kotlin) package name. This makes
this PR appear much larger than it is.
7. A number of tests have been marked as ignored to get a green, broadly they fall
into 3 classes.
The first is related to crypto keypair tests, it appears some logic
in the JDK prefers to use the SunJCE implementation and we prefer to use
bouncycastle. I believe this issue can be fixed with better test setup.
The second group is related to our use of a method called "uncheckedCast(..)",
the purpose of this method was to get rid of the annoying unchecked cast compiler
warning that would otherwise exist. It looks like the Kotlin 1.9 compiler type
inference differs and at runtime sometimes the type it infers is "Void" which causes
an exception at runtime. The simplest solution is to use an explicit cast instead of
unchecked cast, Corda 5 have removed unchecked cast from their codebase.
The third class are a number of ActiveMQ tests which appear to have a memory leak somewhere.
2023-03-08 12:19:05 +00:00
|
|
|
JAVA_HOME = "/usr/lib/jvm/java-17-amazon-corretto"
|
2024-01-22 11:31:51 +00:00
|
|
|
JAVA_8_HOME = "/usr/lib/jvm/java-1.8.0-amazon-corretto"
|
2019-10-08 14:33:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
stages {
|
2020-09-18 06:46:08 +00:00
|
|
|
stage('Compile') {
|
|
|
|
steps {
|
2022-02-14 17:04:47 +00:00
|
|
|
authenticateGradleWrapper()
|
2020-09-18 06:46:08 +00:00
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
|
|
|
'clean',
|
2023-11-17 17:41:45 +00:00
|
|
|
'jar',
|
|
|
|
'--parallel'
|
2020-09-18 06:46:08 +00:00
|
|
|
].join(' ')
|
2020-07-30 10:27:45 +00:00
|
|
|
}
|
2020-09-18 06:46:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
stage('Stash') {
|
2022-01-11 11:44:42 +00:00
|
|
|
when {
|
|
|
|
expression { params.DO_TEST }
|
|
|
|
}
|
2020-09-18 06:46:08 +00:00
|
|
|
steps {
|
|
|
|
stash name: 'compiled', useDefaultExcludes: false
|
|
|
|
}
|
|
|
|
}
|
2019-10-08 14:33:24 +00:00
|
|
|
|
2022-07-10 18:33:37 +00:00
|
|
|
stage('Snyk Security') {
|
|
|
|
when {
|
|
|
|
expression { isReleaseTag || isReleaseCandidate || isReleaseBranch }
|
|
|
|
}
|
2020-06-26 09:48:47 +00:00
|
|
|
steps {
|
|
|
|
script {
|
2022-09-02 12:17:53 +00:00
|
|
|
// Invoke Snyk for each Gradle sub project we wish to scan
|
2023-06-06 15:43:28 +00:00
|
|
|
def modulesToScan = ['node', 'capsule']
|
2022-09-02 12:17:53 +00:00
|
|
|
modulesToScan.each { module ->
|
|
|
|
snykSecurityScan("${env.SNYK_API_KEY}", "--sub-project=$module --configuration-matching='^runtimeClasspath\$' --prune-repeated-subdependencies --debug --target-reference='${env.BRANCH_NAME}' --project-tags=Branch='${env.BRANCH_NAME.replaceAll("[^0-9|a-z|A-Z]+","_")}'")
|
|
|
|
}
|
2020-06-26 09:48:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-07-10 18:33:37 +00:00
|
|
|
|
2023-03-14 11:51:14 +00:00
|
|
|
stage('Generate Snyk License Report') {
|
2022-05-24 14:45:09 +00:00
|
|
|
when {
|
2023-03-14 11:51:14 +00:00
|
|
|
expression { isReleaseTag || isReleaseCandidate || isReleaseBranch }
|
2022-05-24 14:45:09 +00:00
|
|
|
}
|
|
|
|
steps {
|
2023-07-17 17:27:28 +00:00
|
|
|
snykLicenseGeneration(env.SNYK_TOKEN, env.C4_OS_SNYK_ORG_ID)
|
2022-05-24 14:45:09 +00:00
|
|
|
}
|
2023-03-14 11:51:14 +00:00
|
|
|
post {
|
|
|
|
always {
|
|
|
|
script {
|
|
|
|
archiveArtifacts artifacts: 'snyk-license-report/*-snyk-license-report.html', allowEmptyArchive: true, fingerprint: true
|
|
|
|
}
|
2022-05-24 14:45:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-06-26 09:48:47 +00:00
|
|
|
|
2020-09-18 06:46:08 +00:00
|
|
|
stage('All Tests') {
|
2022-01-11 11:44:42 +00:00
|
|
|
when {
|
|
|
|
expression { params.DO_TEST }
|
|
|
|
beforeAgent true
|
|
|
|
}
|
2020-03-03 11:16:38 +00:00
|
|
|
parallel {
|
2020-09-18 06:46:08 +00:00
|
|
|
stage('Another agent') {
|
|
|
|
agent {
|
|
|
|
label 'standard'
|
2020-08-21 10:18:54 +00:00
|
|
|
}
|
2020-09-18 06:46:08 +00:00
|
|
|
options {
|
|
|
|
skipDefaultCheckout true
|
2020-08-21 10:18:54 +00:00
|
|
|
}
|
2020-09-18 06:46:08 +00:00
|
|
|
post {
|
|
|
|
always {
|
2023-11-17 17:41:45 +00:00
|
|
|
archiveArtifacts artifacts: '**/*.log', allowEmptyArchive: true, fingerprint: false
|
|
|
|
junit testResults: '**/build/test-results/**/*.xml', keepLongStdio: true, allowEmptyResults: true
|
2020-09-18 06:46:08 +00:00
|
|
|
/*
|
|
|
|
* Copy all JUnit results files into a single top level directory.
|
|
|
|
* This is necessary to stop the allure plugin from hitting out
|
|
|
|
* of memory errors due to being passed many directories with
|
|
|
|
* long paths.
|
|
|
|
*
|
|
|
|
* File names are pre-pended with a prefix when
|
|
|
|
* copied to avoid collisions between files where the same test
|
|
|
|
* classes have run on multiple agents.
|
|
|
|
*/
|
|
|
|
fileOperations([fileCopyOperation(
|
|
|
|
includes: '**/build/test-results/**/*.xml',
|
|
|
|
targetLocation: 'allure-input',
|
|
|
|
flattenFiles: true,
|
|
|
|
renameFiles: true,
|
|
|
|
sourceCaptureExpression: '.*/([^/]+)$',
|
|
|
|
targetNameExpression: 'other-agent-$1')])
|
|
|
|
stash name: 'allure-input', includes: 'allure-input/**', useDefaultExcludes: false
|
|
|
|
}
|
|
|
|
cleanup {
|
|
|
|
deleteDir() /* clean up our workspace */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stages {
|
|
|
|
stage('Unstash') {
|
|
|
|
steps {
|
|
|
|
unstash 'compiled'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stage('Recompile') {
|
|
|
|
steps {
|
2022-05-26 11:06:47 +00:00
|
|
|
authenticateGradleWrapper()
|
2020-09-18 06:46:08 +00:00
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
2023-11-17 17:41:45 +00:00
|
|
|
'jar',
|
|
|
|
'--parallel'
|
2020-09-18 06:46:08 +00:00
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stage('Unit Test') {
|
|
|
|
steps {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
|
|
|
'test'
|
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stage('Smoke Test') {
|
|
|
|
steps {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
|
|
|
'smokeTest'
|
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stage('Slow Integration Test') {
|
|
|
|
steps {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
|
|
|
'slowIntegrationTest'
|
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
2020-03-03 11:16:38 +00:00
|
|
|
}
|
|
|
|
}
|
2020-09-18 06:46:08 +00:00
|
|
|
stage('Same agent') {
|
|
|
|
post {
|
|
|
|
always {
|
2023-11-17 17:41:45 +00:00
|
|
|
archiveArtifacts artifacts: '**/*.log', allowEmptyArchive: true, fingerprint: false
|
|
|
|
junit testResults: '**/build/test-results/**/*.xml', keepLongStdio: true, allowEmptyResults: true
|
2020-09-18 06:46:08 +00:00
|
|
|
/*
|
|
|
|
* Copy all JUnit results files into a single top level directory.
|
|
|
|
* This is necessary to stop the allure plugin from hitting out
|
|
|
|
* of memory errors due to being passed many directories with
|
|
|
|
* long paths.
|
|
|
|
*
|
|
|
|
* File names are pre-pended with a prefix when
|
|
|
|
* copied to avoid collisions between files where the same test
|
|
|
|
* classes have run on multiple agents.
|
|
|
|
*/
|
|
|
|
fileOperations([fileCopyOperation(
|
|
|
|
includes: '**/build/test-results/**/*.xml',
|
|
|
|
targetLocation: 'allure-input',
|
|
|
|
flattenFiles: true,
|
|
|
|
renameFiles: true,
|
|
|
|
sourceCaptureExpression: '.*/([^/]+)$',
|
|
|
|
targetNameExpression: 'same-agent-$1')])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stages {
|
|
|
|
stage('Integration Test') {
|
|
|
|
steps {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
|
|
|
'integrationTest'
|
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
stage('Deploy Node') {
|
|
|
|
steps {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
|
|
|
'deployNode'
|
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
2020-03-03 11:16:38 +00:00
|
|
|
}
|
|
|
|
}
|
2019-10-08 14:33:24 +00:00
|
|
|
}
|
|
|
|
}
|
2020-06-20 10:08:52 +00:00
|
|
|
|
|
|
|
stage('Publish to Artifactory') {
|
|
|
|
when {
|
|
|
|
expression { isReleaseTag }
|
|
|
|
}
|
|
|
|
steps {
|
|
|
|
rtServer(
|
|
|
|
id: 'R3-Artifactory',
|
|
|
|
url: 'https://software.r3.com/artifactory',
|
|
|
|
credentialsId: 'artifactory-credentials'
|
|
|
|
)
|
|
|
|
rtGradleDeployer(
|
|
|
|
id: 'deployer',
|
|
|
|
serverId: 'R3-Artifactory',
|
2020-07-15 20:33:49 +00:00
|
|
|
repo: 'corda-releases'
|
2020-06-20 10:08:52 +00:00
|
|
|
)
|
|
|
|
rtGradleRun(
|
|
|
|
usesPlugin: true,
|
|
|
|
useWrapper: true,
|
2022-03-07 17:00:10 +00:00
|
|
|
switches: '-s --info -DpublishApiDocs',
|
2020-06-20 10:08:52 +00:00
|
|
|
tasks: 'artifactoryPublish',
|
|
|
|
deployerId: 'deployer',
|
|
|
|
buildName: env.ARTIFACTORY_BUILD_NAME
|
|
|
|
)
|
|
|
|
rtPublishBuildInfo(
|
|
|
|
serverId: 'R3-Artifactory',
|
|
|
|
buildName: env.ARTIFACTORY_BUILD_NAME
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
2020-06-30 19:12:27 +00:00
|
|
|
|
2020-12-02 16:26:15 +00:00
|
|
|
stage('Publish Release Candidate to Internal Repository') {
|
|
|
|
when {
|
|
|
|
expression { isReleaseCandidate }
|
|
|
|
}
|
|
|
|
steps {
|
|
|
|
withCredentials([
|
|
|
|
usernamePassword(credentialsId: 'docker-image-pusher-os',
|
|
|
|
usernameVariable: 'DOCKER_USERNAME',
|
|
|
|
passwordVariable: 'DOCKER_PASSWORD')
|
|
|
|
]) {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
2020-12-03 21:42:57 +00:00
|
|
|
'-Pdocker.image.repository=entdocker.software.r3.com/corda',
|
2020-12-02 16:26:15 +00:00
|
|
|
'docker:pushDockerImage',
|
|
|
|
'--image OFFICIAL',
|
|
|
|
'--registry-url=entdocker.software.r3.com'
|
|
|
|
].join(' ')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-30 19:12:27 +00:00
|
|
|
stage('Publish Release to Docker Hub') {
|
|
|
|
when {
|
2020-12-02 16:26:15 +00:00
|
|
|
expression { isReleaseTag && !isInternalRelease && !isReleaseCandidate}
|
2020-06-30 19:12:27 +00:00
|
|
|
}
|
|
|
|
steps {
|
|
|
|
withCredentials([
|
|
|
|
usernamePassword(credentialsId: 'corda-publisher-docker-hub-credentials',
|
|
|
|
usernameVariable: 'DOCKER_USERNAME',
|
2020-09-18 06:46:08 +00:00
|
|
|
passwordVariable: 'DOCKER_PASSWORD')
|
|
|
|
]) {
|
|
|
|
sh script: [
|
|
|
|
'./gradlew',
|
|
|
|
COMMON_GRADLE_PARAMS,
|
2020-11-24 17:36:53 +00:00
|
|
|
'docker:pushDockerImage',
|
2024-06-28 08:03:42 +00:00
|
|
|
'-Pdocker.image.repository=corda/open-source',
|
2020-11-30 22:30:29 +00:00
|
|
|
'--image OFFICIAL'
|
2020-09-18 06:46:08 +00:00
|
|
|
].join(' ')
|
2020-06-30 19:12:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-10-08 14:33:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
post {
|
|
|
|
always {
|
2020-01-16 11:55:01 +00:00
|
|
|
script {
|
2023-11-17 17:41:45 +00:00
|
|
|
findBuildScans()
|
2023-03-14 11:52:55 +00:00
|
|
|
if (gitUtils.isReleaseTag()) {
|
2023-07-12 19:01:56 +00:00
|
|
|
gitUtils.getGitLog(env.TAG_NAME, env.GIT_URL.replace('https://github.com/corda/', ''))
|
2023-03-14 11:52:55 +00:00
|
|
|
}
|
2020-01-16 11:55:01 +00:00
|
|
|
try {
|
2022-01-11 11:44:42 +00:00
|
|
|
if (params.DO_TEST) {
|
|
|
|
unstash 'allure-input'
|
|
|
|
allure includeProperties: false,
|
|
|
|
jdk: '',
|
|
|
|
results: [[path: '**/allure-input']]
|
|
|
|
}
|
2020-01-16 11:55:01 +00:00
|
|
|
} catch (err) {
|
|
|
|
echo("Allure report generation failed: $err")
|
|
|
|
|
|
|
|
if (currentBuild.resultIsBetterOrEqualTo('SUCCESS')) {
|
|
|
|
currentBuild.result = 'UNSTABLE'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-06-18 22:46:29 +00:00
|
|
|
|
2020-01-14 11:52:05 +00:00
|
|
|
script
|
|
|
|
{
|
2020-06-20 10:08:52 +00:00
|
|
|
if (!isReleaseTag) {
|
2020-06-18 22:46:29 +00:00
|
|
|
// We want to send a summary email, but want to limit to once per day.
|
|
|
|
// Comparing the dates of the previous and current builds achieves this,
|
|
|
|
// i.e. we will only send an email for the first build on a given day.
|
|
|
|
def prevBuildDate = new Date(
|
2020-09-18 06:46:08 +00:00
|
|
|
currentBuild.previousBuild?.timeInMillis ?: 0).clearTime()
|
2020-06-18 22:46:29 +00:00
|
|
|
def currentBuildDate = new Date(
|
|
|
|
currentBuild.timeInMillis).clearTime()
|
2020-01-14 11:52:05 +00:00
|
|
|
|
2020-06-18 22:46:29 +00:00
|
|
|
if (prevBuildDate != currentBuildDate) {
|
|
|
|
def statusSymbol = '\u2753'
|
|
|
|
switch(currentBuild.result) {
|
|
|
|
case 'SUCCESS':
|
|
|
|
statusSymbol = '\u2705'
|
|
|
|
break;
|
|
|
|
case 'UNSTABLE':
|
2020-09-18 06:46:08 +00:00
|
|
|
statusSymbol = '\u26A0'
|
|
|
|
break;
|
2020-06-18 22:46:29 +00:00
|
|
|
case 'FAILURE':
|
|
|
|
statusSymbol = '\u274c'
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2020-01-14 11:52:05 +00:00
|
|
|
|
2020-06-18 22:46:29 +00:00
|
|
|
echo('First build for this date, sending summary email')
|
|
|
|
emailext to: '$DEFAULT_RECIPIENTS',
|
|
|
|
subject: "$statusSymbol" + '$BRANCH_NAME regression tests - $BUILD_STATUS',
|
|
|
|
mimeType: 'text/html',
|
|
|
|
body: '${SCRIPT, template="groovy-html.template"}'
|
|
|
|
} else {
|
|
|
|
echo('Already sent summary email today, suppressing')
|
|
|
|
}
|
2019-12-20 14:44:45 +00:00
|
|
|
}
|
|
|
|
}
|
2019-10-08 14:33:24 +00:00
|
|
|
}
|
2022-05-09 12:22:33 +00:00
|
|
|
success {
|
2023-03-14 17:06:20 +00:00
|
|
|
script {
|
|
|
|
sendSlackNotifications("good", "BUILD PASSED", false, "#corda-corda4-open-source-build-notifications")
|
2022-07-11 21:01:25 +00:00
|
|
|
if (isReleaseTag || isReleaseCandidate || isReleaseBranch) {
|
|
|
|
snykSecurityScan.generateHtmlElements()
|
|
|
|
}
|
2023-07-17 17:27:28 +00:00
|
|
|
|
|
|
|
if (isReleaseTag || isReleaseCandidate) {
|
|
|
|
// auto import and scanning of Docker images tag is dictated by below properties, so retrieve these first to scan the approproate tag
|
|
|
|
String cordaVersion = sh(script: 'grep "cordaVersion" constants.properties | awk -F= \'{print $2}\'', returnStdout: true).trim()
|
|
|
|
String versionSuffix = sh(script: 'grep "versionSuffix" constants.properties | awk -F= \'{print $2}\'', returnStdout: true).trim()
|
|
|
|
snykUtils.SnykApiImport(!versionSuffix.isEmpty() ? "${cordaVersion}-${versionSuffix}" : cordaVersion, SnykOrganisation.CORDA_4_OS, env.C4_OS_SNYK_ORG_ID)
|
|
|
|
}
|
2023-03-14 17:06:20 +00:00
|
|
|
}
|
2022-05-09 12:22:33 +00:00
|
|
|
}
|
|
|
|
unstable {
|
2023-03-14 17:06:20 +00:00
|
|
|
script {
|
|
|
|
sendSlackNotifications("warning", "BUILD UNSTABLE", false, "#corda-corda4-open-source-build-notifications")
|
2022-07-11 21:01:25 +00:00
|
|
|
if (isReleaseTag || isReleaseCandidate || isReleaseBranch) {
|
|
|
|
snykSecurityScan.generateHtmlElements()
|
|
|
|
}
|
2022-07-11 21:01:25 +00:00
|
|
|
if (isReleaseTag || isReleaseCandidate || isReleaseBranch) {
|
|
|
|
snykSecurityScan.generateHtmlElements()
|
|
|
|
}
|
2023-03-14 17:06:20 +00:00
|
|
|
}
|
2022-05-09 12:22:33 +00:00
|
|
|
}
|
2022-03-23 16:52:30 +00:00
|
|
|
failure {
|
|
|
|
script {
|
2022-05-09 12:22:33 +00:00
|
|
|
sendSlackNotifications("danger", "BUILD FAILURE", true, "#corda-corda4-open-source-build-notifications")
|
2022-03-23 16:52:30 +00:00
|
|
|
if (isReleaseTag || isReleaseBranch || isReleaseCandidate) {
|
2022-05-09 12:22:33 +00:00
|
|
|
sendEmailNotifications("${env.EMAIL_RECIPIENTS}")
|
2022-03-23 16:52:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-10-08 14:33:24 +00:00
|
|
|
cleanup {
|
|
|
|
deleteDir() /* clean up our workspace */
|
|
|
|
}
|
|
|
|
}
|
2020-06-05 06:56:37 +00:00
|
|
|
}
|