This is an automated email from the ASF dual-hosted git repository.
rantunes pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-pipelines.git
The following commit(s) were added to refs/heads/main by this push:
new 07c43fc2 NO-ISSUE: Updates and fixes for Apache 10 release (#1245)
07c43fc2 is described below
commit 07c43fc280d950f2281898a53255d9bad764d323
Author: Rodrigo Antunes <[email protected]>
AuthorDate: Mon Oct 7 13:11:41 2024 -0300
NO-ISSUE: Updates and fixes for Apache 10 release (#1245)
* Adjust release pipelines for the Apache 10 release (#1228)
* Staging Apache SVN credentials (#1237)
* NO-ISSUE: Fix release configuration keys (#1238)
* Fix release configuration keys
* Rename release.groovy file to avoid conflicts with the RELEASE env var
* Fix gpg import key utility (#1239)
* NO-ISSUE: Switch to GPG File Jenkins secret (#1240)
* Switch to GPG File Jenkins secret
* Switch to GPG File Jenkins secret
* [10.0.x] NO-ISSUE: Fix kogito apps git reference in the release cloud job
(#1243)
* Fix kogito apps git reference in the release cloud job
* Fix kogito apps git reference in the release cloud job
* [10.0.x] NO-ISSUE: Kogito Images release job fixes (#1244)
* Kogito Images release job fixes
* Kogito Images release job fixes
* Apache release changes
* [10.0.x] NO-ISSUE: Fix SVN upload utility function (#1246)
* Fix SVN upload utility function
* Add shasum func
* Fix release sources zip jenkins job (#1248)
* [10.0.x] NO-ISSUE: Add LICENSE, NOTICE and DISCLAIMER files to the root
folder of the sources zip file (#1252)
* Add Adding LICENSE, NOTICE and DISCLAIMER files to the root folder of the
sources zip file
* Add Adding LICENSE, NOTICE and DISCLAIMER files to the root folder of the
sources zip file
* Add Adding LICENSE, NOTICE and DISCLAIMER files to the root folder of the
sources zip file
---------
Co-authored-by: Rodrigo Antunes <[email protected]>
---------
Co-authored-by: Rodrigo Antunes <[email protected]>
---
.ci/jenkins/Jenkinsfile.release | 140 ++------------
.ci/jenkins/Jenkinsfile.release.cloud | 130 ++-----------
.ci/jenkins/Jenkinsfile.setup-branch.cloud | 2 +-
.ci/jenkins/Jenkinsfile.zip.sources | 26 +--
.ci/jenkins/config/branch.yaml | 8 +-
.ci/jenkins/dsl/jobs.groovy | 27 +--
.../vars/{release.groovy => releaseUtils.groovy} | 19 +-
tools/zip-sources-all.sh | 4 +
tools/zip-sources-files/DISCLAIMER | 26 +++
tools/zip-sources-files/LICENSE | 201 +++++++++++++++++++++
tools/zip-sources-files/NOTICE | 119 ++++++++++++
11 files changed, 418 insertions(+), 284 deletions(-)
diff --git a/.ci/jenkins/Jenkinsfile.release b/.ci/jenkins/Jenkinsfile.release
index a9dcf65b..9dfaa04b 100644
--- a/.ci/jenkins/Jenkinsfile.release
+++ b/.ci/jenkins/Jenkinsfile.release
@@ -4,10 +4,8 @@ import org.jenkinsci.plugins.workflow.libs.Library
kogitoRuntimesRepo = 'kogito-runtimes'
kogitoAppsRepo = 'kogito-apps'
-kogitoExamplesRepo = 'kogito-examples'
ARTIFACTS_STAGING_STAGE = 'stage.artifacts.staging'
-ARTIFACTS_RELEASE_STAGE = 'stage.artifacts.release'
JOB_PROPERTY_PREFIX = 'build'
JOB_RESULT_PROPERTY_KEY = 'result'
@@ -42,23 +40,17 @@ pipeline {
echo "Release properties imported from previous job:
${releaseProperties}"
}
- assert getDroolsVersion()
- assert getKogitoVersion()
+ assert getReleaseVersion()
currentBuild.displayName = getDisplayName()
- sendNotification("Release Pipeline has started...\nKogito
version = ${getKogitoVersion()}\n=> ${env.BUILD_URL}")
-
- // Safety measure to not publish to main JBoss
- if (getGitAuthor() != 'apache' &&
!getArtifactsRepositoryParam()) {
- sendNotification("Git Author is different from
`apache` and no `ARTIFACTS_REPOSITORY` parameter has been provided. Are you
sure you want to continue ? => ${env.BUILD_URL}input")
- input message: 'Should the pipeline continue with no
`ARTIFACTS_REPOSITORY` defined ?', ok: 'Yes'
- }
+ sendNotification("Release Pipeline has started...\nKogito
version = ${getReleaseVersion()}\n=> ${env.BUILD_URL}")
}
}
post {
always {
- setReleasePropertyIfneeded('kogito.version',
getKogitoVersion())
+ setReleasePropertyIfneeded('release.version',
getReleaseVersion())
+ setReleasePropertyIfneeded('git.tag.name', getGitTagName())
}
}
}
@@ -66,10 +58,9 @@ pipeline {
stage('Build & Deploy Kogito Runtimes') {
steps {
script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
+ def buildParams =
getDefaultBuildParams(getReleaseVersion())
addSkipTestsParam(buildParams)
- addStringParam(buildParams, 'DROOLS_VERSION',
getDroolsVersion())
-
+ addStringParam(buildParams, 'DROOLS_VERSION',
getReleaseVersion())
buildJob(getDeployJobName(kogitoRuntimesRepo), buildParams)
}
}
@@ -78,26 +69,13 @@ pipeline {
stage('Build & Deploy Kogito Apps') {
steps {
script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
+ def buildParams =
getDefaultBuildParams(getReleaseVersion())
addSkipTestsParam(buildParams)
-
buildJob(getDeployJobName(kogitoAppsRepo), buildParams)
}
}
}
- stage('Build & Deploy Kogito Examples') {
- steps {
- script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
- addSkipTestsParam(buildParams)
- addStringParam(buildParams, 'DROOLS_VERSION',
getDroolsVersion())
-
- buildJob(getDeployJobName(kogitoExamplesRepo), buildParams)
- }
- }
- }
-
stage('Artifacts\' staging finalization') {
steps {
script {
@@ -109,80 +87,15 @@ pipeline {
}
}
- stage('Are staged artifacts released?') {
- when {
- // Execute only if artifacts repository was not given, which
means the staging repository has been created
- expression { return !getArtifactsRepositoryParam() &&
!areArtifactsReleased() }
- }
- steps {
- script {
- String body = "${getKogitoVersion()} artifacts are ready
for release.\n" +
- "Please release the staging repositories and
then confirm here: ${env.BUILD_URL}input"
- sendNotification(body)
- input message: 'Has the staging repository been released
?', ok: 'Yes'
-
- sendNotification('Artifacts have been released. Finalizing
now the release ...')
- setArtifactsReleased()
- }
- }
- }
-
- stage('Promote Kogito Runtimes') {
- when {
- expression { return
isJobConsideredOk(getDeployJobName(kogitoRuntimesRepo)) }
- }
- steps {
- script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
- addDeployBuildUrlParam(buildParams,
getDeployJobName(kogitoRuntimesRepo))
- addStringParam(buildParams, 'DROOLS_VERSION',
getDroolsVersion())
-
- buildJob(getPromoteJobName(kogitoRuntimesRepo),
buildParams)
- }
- }
- }
-
- stage('Promote Kogito Apps') {
- when {
- expression { return
isJobConsideredOk(getDeployJobName(kogitoAppsRepo)) }
- }
- steps {
- script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
- addDeployBuildUrlParam(buildParams,
getDeployJobName(kogitoAppsRepo))
-
- buildJob(getPromoteJobName(kogitoAppsRepo), buildParams)
- }
- }
- }
-
- stage('Promote Kogito Examples') {
- when {
- expression { return
isJobConsideredOk(getDeployJobName(kogitoExamplesRepo)) }
- }
- steps {
- script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
- addStringParam(buildParams, 'DROOLS_VERSION',
getDroolsVersion())
- addDeployBuildUrlParam(buildParams,
getDeployJobName(kogitoExamplesRepo))
- addBooleanParam(buildParams, 'UPDATE_STABLE_BRANCH',
isDeployAsLatest())
-
- buildJob(getPromoteJobName(kogitoExamplesRepo),
buildParams)
- }
- }
- }
-
stage('Start Cloud release') {
when {
expression { isCloudRelease() }
}
steps {
script {
- def buildParams = getDefaultBuildParams(getKogitoVersion())
- addStringParam(buildParams, 'KOGITO_VERSION',
getKogitoVersion())
- addBooleanParam(buildParams, 'DEPLOY_AS_LATEST',
isDeployAsLatest())
+ def buildParams =
getDefaultBuildParams(getReleaseVersion())
+ addStringParam(buildParams, 'RELEASE_VERSION',
getReleaseVersion())
addSkipTestsParam(buildParams)
-
build(job: './0-kogito-release-cloud', wait: false,
parameters: buildParams, propagate: false)
}
}
@@ -257,10 +170,6 @@ String getDeployJobName(String repository) {
return "${repository}-deploy"
}
-String getPromoteJobName(String repository) {
- return "${repository}-promote"
-}
-
String getJobPropertySuffix(String jobName) {
return "${JOB_PROPERTY_PREFIX}.${jobName}"
}
@@ -358,6 +267,7 @@ List getDefaultBuildParams(String version) {
addDisplayNameParam(buildParams, getDisplayName(version))
addStringParam(buildParams, 'PROJECT_VERSION', version)
addStringParam(buildParams, 'KOGITO_PR_BRANCH', "kogito-${version}")
+ addStringParam(buildParams, 'GIT_TAG_NAME', getGitTagName())
return buildParams
}
@@ -396,34 +306,22 @@ String constructKey(String prefix, String paramId) {
}
String getDisplayName(version = '') {
- version = version ?: getKogitoVersion()
+ version = version ?: getReleaseVersion()
return "Release ${version}"
}
-String getKogitoVersion() {
- return params.KOGITO_VERSION ?: getReleaseProperty('kogito.version')
+String getReleaseVersion() {
+ return params.RELEASE_VERSION ?: getReleaseProperty('release.version')
}
-String getDroolsVersion() {
- return params.DROOLS_VERSION ?: getReleaseProperty('drools.version')
+String getGitTagName() {
+ return params.GIT_TAG_NAME ?: getReleaseProperty('git.tag.name')
}
String getGitAuthor() {
return env.GIT_AUTHOR
}
-String getArtifactsRepositoryParam() {
- return env['ARTIFACTS_REPOSITORY'] ?: ''
-}
-
-String getStagingRepository() {
- return getArtifactsRepositoryParam() ?: env.DEFAULT_STAGING_REPOSITORY
-}
-
-boolean isDeployAsLatest() {
- return params.DEPLOY_AS_LATEST ||
getReleaseProperty('deploy.latest')?.toBoolean()
-}
-
boolean isCloudRelease() {
return !params.SKIP_CLOUD_RELEASE
}
@@ -455,11 +353,3 @@ boolean areArtifactsStaged() {
void setArtifactsStaged() {
setReleasePropertyIfneeded(ARTIFACTS_STAGING_STAGE, true)
}
-
-boolean areArtifactsReleased() {
- return hasReleaseProperty(ARTIFACTS_RELEASE_STAGE)
-}
-
-void setArtifactsReleased() {
- setReleasePropertyIfneeded(ARTIFACTS_RELEASE_STAGE, true)
-}
diff --git a/.ci/jenkins/Jenkinsfile.release.cloud
b/.ci/jenkins/Jenkinsfile.release.cloud
index 12d4f897..31509fb4 100644
--- a/.ci/jenkins/Jenkinsfile.release.cloud
+++ b/.ci/jenkins/Jenkinsfile.release.cloud
@@ -3,10 +3,6 @@ import org.jenkinsci.plugins.workflow.libs.Library
@Library('jenkins-pipeline-shared-libraries')_
kogitoImagesRepo = 'kogito-images'
-kogitoServerlessOperatorRepo = 'kogito-serverless-operator'
-
-ARTIFACTS_STAGING_STAGE = 'stage.artifacts.staging'
-ARTIFACTS_RELEASE_STAGE = 'stage.artifacts.release'
JOB_PROPERTY_PREFIX = 'build'
JOB_RESULT_PROPERTY_KEY = 'result'
@@ -18,7 +14,6 @@ releaseProperties = [:]
defaultImageParamsPrefix = 'IMAGE'
baseImageParamsPrefix = 'BASE_IMAGE'
-promoteImageParamsPrefix = 'PROMOTE_IMAGE'
pipeline {
agent {
@@ -45,19 +40,17 @@ pipeline {
echo "Release properties imported from previous job:
${releaseProperties}"
}
- assert getKogitoVersion()
+ assert getReleaseVersion()
currentBuild.displayName = getDisplayName()
- sendNotification("Cloud Release Pipeline has
started...\nKogito version = ${getKogitoVersion()}\n=> ${env.BUILD_URL}")
+ sendNotification("Cloud Release Pipeline has
started...\nKogito version = ${getReleaseVersion()}\n=> ${env.BUILD_URL}")
}
}
post {
always {
- setReleasePropertyIfneeded('kogito.version',
getKogitoVersion())
- setReleasePropertyIfneeded('kogito.images.version',
getKogitoImagesVersion())
-
setReleasePropertyIfneeded('kogito.serverless.operator.version',
getKogitoServerlessOperatorVersion())
- setReleasePropertyIfneeded('deploy.latest',
isDeployAsLatest())
+ setReleasePropertyIfneeded('release.version',
getReleaseVersion())
+ setReleasePropertyIfneeded('git.tag.name', getGitTagName())
}
}
}
@@ -66,7 +59,7 @@ pipeline {
steps {
script {
env.APPS_URI = params.APPS_URI ?:
(getReleaseProperty('apps.uri') ?:
"https://github.com/${getGitAuthor()}/incubator-kie-kogito-apps")
- env.APPS_REF = params.APPS_REF ?:
(getReleaseProperty('apps.ref') ?: getKogitoVersion())
+ env.APPS_REF = params.APPS_REF ?:
(getReleaseProperty('apps.ref') ?: getGitTagName())
echo "Got apps uri ${env.APPS_URI}"
echo "Got apps ref ${env.APPS_REF}"
@@ -83,70 +76,15 @@ pipeline {
}
steps {
script {
- def buildParams =
getDefaultBuildParams(getKogitoImagesVersion())
- addStringParam(buildParams, 'KOGITO_ARTIFACTS_VERSION',
getKogitoVersion())
- addImageBuildParams(buildParams, getKogitoImagesTempTag())
+ def buildParams =
getDefaultBuildParams(getReleaseVersion())
+ addImageBuildParams(buildParams, getReleaseVersion())
addAppsParam(buildParams)
addSkipTestsParam(buildParams)
- addExamplesParam(buildParams)
buildJob(getDeployJobName(kogitoImagesRepo), buildParams)
}
}
}
-
- // stage('Build & Deploy Kogito Serverless Operator') {
- // when {
- // expression { return isServerlessOperatorRelease() }
- // }
- // steps {
- // script {
- // def buildParams =
getDefaultBuildParams(getKogitoServerlessOperatorVersion())
- // addSkipTestsParam(buildParams)
- // addImageBuildParams(buildParams,
getKogitoServerlessOperatorTempTag())
-
- //
buildJob(getDeployJobName(kogitoServerlessOperatorRepo), buildParams)
- // }
- // }
- // }
-
- // stage('Promote Kogito Images') {
- // when {
- // expression { return isImagesRelease() &&
isJobConsideredOk(getDeployJobName(kogitoImagesRepo)) }
- // }
- // steps {
- // script {
- // def buildParams =
getDefaultBuildParams(getKogitoImagesVersion())
- // addDeployBuildUrlParamOrClosure(buildParams,
getDeployJobName(kogitoImagesRepo)) {
- // addImageBuildParams(buildParams,
getKogitoImagesTempTag(), false, baseImageParamsPrefix)
- // }
- // addImageBuildParams(buildParams,
getKogitoImagesFinalTag(), true, promoteImageParamsPrefix)
- // addBooleanParam(buildParams, 'DEPLOY_WITH_LATEST_TAG',
isDeployAsLatest())
-
- // buildJob(getPromoteJobName(kogitoImagesRepo),
buildParams)
- // }
- // }
- // }
-
- // stage('Promote Kogito Serverless Operator') {
- // when {
- // expression { return isServerlessOperatorRelease() &&
isJobConsideredOk(getDeployJobName(kogitoServerlessOperatorRepo)) }
- // }
- // steps {
- // script {
- // def buildParams =
getDefaultBuildParams(getKogitoServerlessOperatorVersion())
- // addDeployBuildUrlParamOrClosure(buildParams,
getDeployJobName(kogitoServerlessOperatorRepo)) {
- // addImageBuildParams(buildParams,
getKogitoServerlessOperatorTempTag(), false, baseImageParamsPrefix)
- // }
-
- // // Base image information is given by the deploy URL
- // addImageBuildParams(buildParams,
getKogitoServerlessOperatorFinalTag(), true, promoteImageParamsPrefix)
- // addBooleanParam(buildParams, 'DEPLOY_WITH_LATEST_TAG',
isDeployAsLatest())
-
- //
buildJob(getPromoteJobName(kogitoServerlessOperatorRepo), buildParams)
- // }
- // }
- // }
}
post {
always {
@@ -217,10 +155,6 @@ String getDeployJobName(String repository) {
return "${repository}-deploy"
}
-String getPromoteJobName(String repository) {
- return "${repository}-promote"
-}
-
String getJobPropertySuffix(String jobName) {
return "${JOB_PROPERTY_PREFIX}.${jobName}"
}
@@ -318,6 +252,7 @@ List getDefaultBuildParams(String version) {
addDisplayNameParam(buildParams, getDisplayName(version))
addStringParam(buildParams, 'PROJECT_VERSION', version)
addStringParam(buildParams, 'KOGITO_PR_BRANCH', params.KOGITO_PR_BRANCH ?:
"kogito-${version}")
+ addStringParam(buildParams, 'GIT_TAG_NAME', getGitTagName())
return buildParams
}
@@ -349,9 +284,9 @@ void addAppsParam(buildParams) {
}
void addImageBuildParams(List buildParams, String tag, boolean isFinalImage =
false, String paramsPrefix = defaultImageParamsPrefix) {
- addBooleanParam(buildParams, constructKey(paramsPrefix,
'USE_OPENSHIFT_REGISTRY'), !isFinalImage && params.USE_TEMP_OPENSHIFT_REGISTRY)
- addStringParam(buildParams, constructKey(paramsPrefix,
'REGISTRY_USER_CREDENTIALS_ID'), env.IMAGE_REGISTRY_USER_CREDENTIALS_ID)
- addStringParam(buildParams, constructKey(paramsPrefix,
'REGISTRY_TOKEN_CREDENTIALS_ID'), env.IMAGE_REGISTRY_TOKEN_CREDENTIALS_ID)
+ addBooleanParam(buildParams, constructKey(paramsPrefix,
'USE_OPENSHIFT_REGISTRY'), false)
+ addStringParam(buildParams, constructKey(paramsPrefix,
'REGISTRY_USER_CREDENTIALS_ID'), '')
+ addStringParam(buildParams, constructKey(paramsPrefix,
'REGISTRY_TOKEN_CREDENTIALS_ID'), '')
addStringParam(buildParams, constructKey(paramsPrefix, 'REGISTRY'),
env.IMAGE_REGISTRY)
addStringParam(buildParams, constructKey(paramsPrefix, 'NAMESPACE'),
env.IMAGE_NAMESPACE)
addStringParam(buildParams, constructKey(paramsPrefix, 'TAG'), tag)
@@ -370,57 +305,24 @@ String constructKey(String prefix, String paramId) {
}
String getDisplayName(version = '') {
- version = version ?: getKogitoVersion()
+ version = version ?: getReleaseVersion()
return "Release ${version}"
}
-String getKogitoVersion() {
- return params.KOGITO_VERSION ?: getReleaseProperty('kogito.version')
-}
-
-String getKogitoImagesVersion() {
- return params.KOGITO_IMAGES_VERSION ?:
(getReleaseProperty('kogito.images.version') ?:
removeVersionSuffixIfExist(getKogitoVersion()))
-}
-
-String getKogitoServerlessOperatorVersion() {
- return params.KOGITO_SERVERLESS_OPERATOR_VERSION ?:
(getReleaseProperty('kogito.serverless.operator.version') ?:
removeVersionSuffixIfExist(getKogitoVersion()))
+String getReleaseVersion() {
+ return params.RELEASE_VERSION ?: getReleaseProperty('release.version')
}
String getGitAuthor() {
return env.GIT_AUTHOR
}
-boolean isDeployAsLatest() {
- return params.DEPLOY_AS_LATEST ||
getReleaseProperty('deploy.latest')?.toBoolean()
-}
-
boolean isImagesRelease() {
return !params.SKIP_IMAGES_RELEASE
}
-boolean isServerlessOperatorRelease() {
- return !params.SKIP_SERVERLESS_OPERATOR_RELEASE
-}
-
-String getKogitoImagesTempTag() {
- return "${getKogitoImagesVersion()}-temp".toLowerCase()
-}
-
-String getKogitoImagesFinalTag() {
- return "${getKogitoImagesVersion()}".toLowerCase()
-}
-
-String getKogitoServerlessOperatorTempTag() {
- return "${getKogitoServerlessOperatorVersion()}-temp".toLowerCase()
-}
-
-String getKogitoServerlessOperatorFinalTag() {
- return "${getKogitoServerlessOperatorVersion()}".toLowerCase()
-}
-
-String removeVersionSuffixIfExist(String version) {
- Integer[] versionSplit = util.parseVersion(version)
- return "${versionSplit[0]}.${versionSplit[1]}.${versionSplit[2]}"
+String getGitTagName() {
+ return params.GIT_TAG_NAME ?: getReleaseProperty('git.tag.name')
}
void setReleasePropertyIfneeded(String key, def value) {
diff --git a/.ci/jenkins/Jenkinsfile.setup-branch.cloud
b/.ci/jenkins/Jenkinsfile.setup-branch.cloud
index a198a890..2022b9c5 100644
--- a/.ci/jenkins/Jenkinsfile.setup-branch.cloud
+++ b/.ci/jenkins/Jenkinsfile.setup-branch.cloud
@@ -36,7 +36,7 @@ pipeline {
steps {
script {
def buildParams = getDefaultBuildParams()
- addStringParam(buildParams, 'KOGITO_VERSION',
getKogitoVersion().toLowerCase())
+ addStringParam(buildParams, 'KOGITO_VERSION',
getKogitoVersion())
addStringParam(buildParams, 'KOGITO_ARTIFACTS_VERSION',
getKogitoVersion())
buildJob('kogito-images', buildParams)
}
diff --git a/.ci/jenkins/Jenkinsfile.zip.sources
b/.ci/jenkins/Jenkinsfile.zip.sources
index 617ecbce..55bdeb54 100644
--- a/.ci/jenkins/Jenkinsfile.zip.sources
+++ b/.ci/jenkins/Jenkinsfile.zip.sources
@@ -9,7 +9,8 @@ pipeline {
environment {
SOURCES_FILE_NAME = "${SOURCES_FILE_NAME_TEMPLATE}.zip"
- SIGNATURE_FILE_NAME = "${SOURCES_FILE_NAME_TEMPLATE}.asc"
+ SIGNATURE_FILE_NAME = "${SOURCES_FILE_NAME_TEMPLATE}.zip.asc"
+ CHECKSUM_FILE_NAME = "${SOURCES_FILE_NAME_TEMPLATE}.zip.sha512"
}
options {
@@ -23,20 +24,21 @@ pipeline {
archiveArtifacts artifacts: "**/${SOURCES_FILE_NAME}"
}
}
- stage('Sign and upload the sources.zip') {
- steps {
- script {
-
release.gpgImportKeyFromStringWithoutPassword(getReleaseGpgSignKeyCredsId())
-
release.gpgSignFileDetachedSignatureWithoutPassword(SOURCES_FILE_NAME,
SIGNATURE_FILE_NAME)
-
release.svnUploadFileToRepository(getReleaseSvnRepository(),
getReleaseSvnCredsId(), TARGET_VERSION, SOURCES_FILE_NAME, SIGNATURE_FILE_NAME)
- }
- archiveArtifacts artifacts: "**/${SIGNATURE_FILE_NAME}"
- }
- }
+ stage('Sign and upload the sources.zip') {
+ steps {
+ dir('sources-out') {
+ script {
+
releaseUtils.gpgImportKeyFromStringWithoutPassword(getReleaseGpgSignKeyCredsId())
+
releaseUtils.gpgSignFileDetachedSignatureWithoutPassword(SOURCES_FILE_NAME,
SIGNATURE_FILE_NAME)
+
releaseUtils.svnUploadFileToRepository(getReleaseSvnRepository(),
getReleaseSvnCredsId(), TARGET_VERSION, SOURCES_FILE_NAME, SIGNATURE_FILE_NAME,
CHECKSUM_FILE_NAME)
+ }
+ archiveArtifacts artifacts: "**/${SIGNATURE_FILE_NAME}"
+ }
+ }
+ }
}
}
-
String getReleaseGpgSignKeyCredsId() {
return env.RELEASE_GPG_SIGN_KEY_CREDS_ID
}
diff --git a/.ci/jenkins/config/branch.yaml b/.ci/jenkins/config/branch.yaml
index 7fc0c49e..aa2d3bcb 100644
--- a/.ci/jenkins/config/branch.yaml
+++ b/.ci/jenkins/config/branch.yaml
@@ -88,11 +88,11 @@ cloud:
release:
gpg:
sign:
- key-credentials-id: 'GPG_KEY'
- passphrase-credentials-id: ''
+ key_credentials_id: GPG_KEY_FILE
+ passphrase_credentials_id: ''
svn:
- staging-repository: <TO-BE-DEFINED>
- credentials-id: <TO-BE-DEFINED>
+ staging_repository: https://dist.apache.org/repos/dist/dev/incubator/kie
+ credentials_id: kie-dist-acct
jenkins:
email_creds_id: KOGITO_CI_NOTIFICATION_EMAILS
agent:
diff --git a/.ci/jenkins/dsl/jobs.groovy b/.ci/jenkins/dsl/jobs.groovy
index 56177469..6b36c7d5 100644
--- a/.ci/jenkins/dsl/jobs.groovy
+++ b/.ci/jenkins/dsl/jobs.groovy
@@ -283,9 +283,8 @@ void setupReleaseArtifactsJob() {
parameters {
stringParam('RESTORE_FROM_PREVIOUS_JOB', '', 'URL to a previous
stopped release job which needs to be continued')
- stringParam('KOGITO_VERSION', '', 'Kogito version to release as
Major.minor.micro')
- stringParam('DROOLS_VERSION', '', 'Drools version to set for the
release')
- booleanParam('DEPLOY_AS_LATEST', false, 'Given project version is
considered the latest version')
+ stringParam('RELEASE_VERSION', '', 'Version to release as
Major.minor.micro')
+ stringParam('GIT_TAG_NAME', '', 'Git tag to create. i.e.:
10.0.0-rc1')
booleanParam('SKIP_TESTS', false, 'Skip all tests')
@@ -299,23 +298,18 @@ void setupReleaseCloudJob() {
jobParams.env.putAll([
JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}",
- GIT_BRANCH_NAME: "${GIT_BRANCH}",
- GIT_AUTHOR: "${GIT_AUTHOR_NAME}",
-
- IMAGE_REGISTRY_USER_CREDENTIALS_ID:
"${CLOUD_IMAGE_REGISTRY_USER_CREDENTIALS_ID}",
- IMAGE_REGISTRY_TOKEN_CREDENTIALS_ID:
"${CLOUD_IMAGE_REGISTRY_TOKEN_CREDENTIALS_ID}",
IMAGE_REGISTRY: "${CLOUD_IMAGE_REGISTRY}",
IMAGE_NAMESPACE: "${CLOUD_IMAGE_NAMESPACE}",
- BRANCH_FOR_LATEST: "${CLOUD_IMAGE_LATEST_GIT_BRANCH}",
+
+ GIT_BRANCH_NAME: "${GIT_BRANCH}",
+ GIT_AUTHOR: "${GIT_AUTHOR_NAME}",
])
KogitoJobTemplate.createPipelineJob(this, jobParams)?.with {
parameters {
stringParam('RESTORE_FROM_PREVIOUS_JOB', '', 'URL to a previous
stopped release job which needs to be continued')
- stringParam('KOGITO_VERSION', '', 'Kogito version to release as
Major.minor.micro')
- stringParam('KOGITO_IMAGES_VERSION', '', '(optional) To be set if
different from KOGITO_VERSION. Should be only a bug fix update from
KOGITO_VERSION.')
- stringParam('KOGITO_SERVERLESS_OPERATOR_VERSION', '', '(optional)
To be set if different from KOGITO_VERSION. Should be only a bug fix update
from KOGITO_VERSION.')
- booleanParam('DEPLOY_AS_LATEST', false, 'Given project version is
considered the latest version')
+ stringParam('RELEASE_VERSION', '', 'Version to release as
Major.minor.micro. i.e: 10.0.0')
+ stringParam('GIT_TAG_NAME', '', 'Git tag to create. i.e.:
10.0.0-rc1')
stringParam('APPS_URI', '', 'Override default. Git uri to the
kogito-apps repository to use for building images.')
stringParam('APPS_REF', '', 'Override default. Git reference
(branch/tag) to the kogito-apps repository to use for building images.')
@@ -323,9 +317,6 @@ void setupReleaseCloudJob() {
booleanParam('SKIP_TESTS', false, 'Skip all tests')
booleanParam('SKIP_IMAGES_RELEASE', false, 'To skip Images Test &
Deployment.')
- booleanParam('SKIP_SERVERLESS_OPERATOR_RELEASE', false, 'To skip
Serverless Operator Test & Deployment.')
-
- booleanParam('USE_TEMP_OPENSHIFT_REGISTRY', false, 'If enabled,
use Openshift registry to push temporary images')
}
}
}
@@ -340,8 +331,8 @@ void setupZipSourcesJob() {
RELEASE_GPG_SIGN_KEY_CREDS_ID:
Utils.getReleaseGpgSignKeyCredentialsId(this),
RELEASE_GPG_SIGN_PASSPHRASE_CREDS_ID:
Utils.getReleaseGpgSignPassphraseCredentialsId(this),
- RELEASE_SVN_REPOSITORY: Utils.getReleaseSvnCredentialsId(this),
- RELEASE_SVN_CREDS_ID: Utils.getReleaseSvnStagingRepository(this)
+ RELEASE_SVN_REPOSITORY: Utils.getReleaseSvnStagingRepository(this),
+ RELEASE_SVN_CREDS_ID: Utils.getReleaseSvnCredentialsId(this)
])
KogitoJobTemplate.createPipelineJob(this, jobParams)?.with {
diff --git a/jenkins-pipeline-shared-libraries/vars/release.groovy
b/jenkins-pipeline-shared-libraries/vars/releaseUtils.groovy
similarity index 74%
rename from jenkins-pipeline-shared-libraries/vars/release.groovy
rename to jenkins-pipeline-shared-libraries/vars/releaseUtils.groovy
index 6bb9564e..bab1596b 100644
--- a/jenkins-pipeline-shared-libraries/vars/release.groovy
+++ b/jenkins-pipeline-shared-libraries/vars/releaseUtils.groovy
@@ -14,14 +14,10 @@ def gpgImportKeyFromFileWithPassword(String
gpgKeyCredentialsId, String gpgKeyPa
}
def gpgImportKeyFromStringWithoutPassword(String gpgKeyCredentialsId) {
- withCredentials([string(credentialsId: gpgKeyCredentialsId, variable:
'SIGNING_KEY')]) {
- // copy the key to singkey.gpg file in *plain text* so we can import it
+ withCredentials([file(credentialsId: gpgKeyCredentialsId, variable:
'SIGNING_KEY')]) {
sh """
- echo "$SIGNING_KEY" > $WORKSPACE/signkey.gpg
- # Please do not remove list keys command. When gpg is run for the
first time, it may initialize some internals.
gpg --list-keys
- gpg --batch --pinentry-mode=loopback --import signkey.gpg
- rm $WORKSPACE/signkey.gpg
+ gpg --batch --pinentry-mode=loopback --import $SIGNING_KEY
"""
}
}
@@ -33,7 +29,10 @@ def gpgSignFileDetachedSignatureWithPassword(String file,
String signatureTarget
}
def gpgSignFileDetachedSignatureWithoutPassword(String file, String
signatureTarget) {
- sh "gpg --batch --sign --pinentry-mode=loopback --output
${signatureTarget} --detach-sig ${file}"
+ sh """
+ gpg --batch --sign --pinentry-mode=loopback --output ${signatureTarget}
--detach-sig ${file}
+ shasum -a 512 ${file} > ${file}.sha512
+ """
}
boolean gpgIsValidDetachedSignature(String file, String signature) {
@@ -42,13 +41,13 @@ boolean gpgIsValidDetachedSignature(String file, String
signature) {
def svnUploadFileToRepository(String svnRepository, String svnCredentialsId,
String releaseVersion, String... files) {
withCredentials([usernamePassword(credentialsId: svnCredentialsId,
usernameVariable: 'ASF_USERNAME', passwordVariable: 'ASF_PASSWORD')]) {
- sh "svn co --depth=empty ${svnRepository} svn-kie"
+ sh "svn co --depth=empty ${svnRepository}/${releaseVersion} svn-kie"
for (file in files) {
- sh "cp ${file} svn-kie/${releaseVersion}/"
+ sh "cp ${file} svn-kie"
}
sh """
- svn add "svn-kie/${releaseVersion}"
cd svn-kie
+ svn add . --force
svn ci --non-interactive --no-auth-cache --username ${ASF_USERNAME}
--password '${ASF_PASSWORD}' -m "Apache KIE ${releaseVersion} artifacts"
rm -rf svn-kie
"""
diff --git a/tools/zip-sources-all.sh b/tools/zip-sources-all.sh
index d84f0778..c1bb362e 100755
--- a/tools/zip-sources-all.sh
+++ b/tools/zip-sources-all.sh
@@ -86,6 +86,10 @@ function zip_sources() {
done <<< $SOURCES_REPOSITORIES
+ #Add LICENSE, NOTICE and DISCLAIMER files to the root folder of the zip file
+ echo "Adding LICENSE, NOTICE and DISCLAIMER files to the zip file"
+ cp ./tools/zip-sources-files/{LICENSE,NOTICE,DISCLAIMER}
${SOURCES_DIRECTORY_NAME}
+
#Creating ZIP
pushd ${SOURCES_DIRECTORY_NAME}
ZIP_FILE_NAME=$1
diff --git a/tools/zip-sources-files/DISCLAIMER
b/tools/zip-sources-files/DISCLAIMER
new file mode 100644
index 00000000..9d6cd54c
--- /dev/null
+++ b/tools/zip-sources-files/DISCLAIMER
@@ -0,0 +1,26 @@
+Apache KIE (incubating) is an effort undergoing incubation at The Apache
Software
+Foundation (ASF), sponsored by the name of Apache Incubator. Incubation is
+required of all newly accepted projects until a further review indicates that
+the infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of the
+code, it does indicate that the project has yet to be fully endorsed by the
ASF.
+
+Some of the incubating project’s releases may not be fully compliant with ASF
+policy. For example, releases may have incomplete or un-reviewed licensing
+conditions. What follows is a list of known issues the project is currently
+aware of (note that this list, by definition, is likely to be incomplete):
+
+* Hibernate, an LGPL project, is being used. Hibernate is in the process of
+ relicensing to ASL v2
+* Some files, particularly test files, and those not supporting comments, may
+ be missing the ASF Licensing Header
+* The following filetypes in the examples affect the build currently if file
+ headers are added: working on a ctt, exam, sol, exam, mm, txt, tsp, vrp,
+ They are not source files for the project.
+
+If you are planning to incorporate this work into your product/project, please
+be aware that you will need to conduct a thorough licensing review to determine
+the overall implications of including this work. For the current status of this
+project through the Apache Incubator visit:
+https://incubator.apache.org/projects/kie.html
diff --git a/tools/zip-sources-files/LICENSE b/tools/zip-sources-files/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/tools/zip-sources-files/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/tools/zip-sources-files/NOTICE b/tools/zip-sources-files/NOTICE
new file mode 100644
index 00000000..72f716f4
--- /dev/null
+++ b/tools/zip-sources-files/NOTICE
@@ -0,0 +1,119 @@
+Apache KIE
+Copyright 2023 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The Initial Developer of some parts of the framework, which are copied from,
derived from, or
+inspired by KIE (Knowledge Is Everthing) group, is Red Hat, Inc
(https://www.redhat.com/).
+Copyright Red Hat, Inc. and/or its affiliates.. All Rights Reserved.
+
+This product also includes the following third-party components:
+
+* Twitter bootstrap version: 2.3.2
+ Downloaded from: https://getbootstrap.com/
+ License: Apache License v2.0 (just like OptaPlanner)
+
+* jQuery version: 1.9.1
+ Downloaded from: http://jquery.com/
+ License: MIT (which can be used by Apache License v2.0 projects)
+
+* google-code-pretty version: 4-Mar-2013
+ Downloaded from: http://code.google.com/p/google-code-prettify
+ License: Apache License v2.0 (just like OptaPlanner)
+
+* jQuery version: 3.3.1
+ Downloaded from: http://jquery.com/
+ License: MIT - this is compatible with ASL 2.0:
http://www.apache.org/legal/resolved.html#category-a
+
+* jstree version: 3.3.5
+ Downloaded from: https://www.jstree.com/
+ License: MIT - this is compatible with ASL 2.0:
http://www.apache.org/legal/resolved.html#category-a
+
+* animate.css (http://daneden.me/animate)
+
+ Copyright (c) 2016 Daniel Eden
+
+* bootstrap (https://getbootstrap.com/)
+
+ Copyright 2011-2019 Twitter, Inc.
+
+* bootstrap-datepicker (https://github.com/smalot/bootstrap-datetimepicker)
+
+ Copyright 2012 Stefan Petre
+
+* bootstrap-select (http://silviomoreto.github.io/bootstrap-select)
+
+ Copyright 2013-2017 bootstrap-select
+
+* Context Dependency Injection (CDI)
+
+ Copyright (C) 2009 The JSR-330 Expert Group
+
+* connected (https://github.com/Vertispan/connected)
+
+ Copyright (C) 2017 Vertispan
+
+* Eclipse Modeling Framework (https://eclipse.dev/modeling/emf/)
+
+ Copyright (C) Eclipse and contributors: Copyright (c) 2010 SAP AG
+
+* Font Awesome (https://fontawesome.com/)
+
+ Copyright Dave Gandy 2016. All rights reserved
+
+* Google Web Toolkit (GWT) (https://www.gwtproject.org/)
+
+ Copyright 2007 Google Inc.
+
+* GWT Bootstrap 3 (https://github.com/gwtbootstrap3/gwtbootstrap3)
+
+ Copyright (C) 2013 GwtBootstrap3
+
+* highlight.js (https://highlightjs.org)
+
+ Copyright (C) highlight.js
+
+* Jakarta EE (https://jakarta.ee/)
+
+ Copyright (C) Eclipse and contributors
+
+* Java Enterprise Edition
(https://www.oracle.com/java/technologies/java-ee-glance.html)
+
+ Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+
+* Java Standard Edition
(https://www.oracle.com/java/technologies/java-se-glance.html)
+
+ Copyright (c) 2005-2013 Oracle and/or its affiliates
+
+* jQuery UI (http://jqueryui.com)
+
+ Copyright jQuery Foundation
+
+* libgdx (https://github.com/libgdx/libgdx)
+
+ Copyright (c) 2008, Avian Contributors
+
+* Lienzo (https://github.com/dikalo/lienzo-core)
+
+ Copyright (c) 2017 Ahome' Innovation Technologies
+
+* Respond.js (https://github.com/scottjehl/Respond)
+
+ Copyright 2013 Scott Jehl
+
+* SnakeYAML (https://bitbucket.org/snakeyaml/snakeyaml)
+
+ Copyright (c) 2018, SnakeYAML
+
+* wysihtml (https://github.com/Voog/wysihtml)
+
+ Copyright (C) 2012-2016 XING AG, Voog and contributors
+
+* lunr 2.3.9
+ Downloaded from: https://lunrjs.com/
+ License: MIT
+
+* search-ui
+ Downloaded from: https://gitlab.com/antora/antora-lunr-extension
+ License: Mozilla Public License 2.0
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]