From 1baf3900beff79f397fd39840eb06bec09e3a823 Mon Sep 17 00:00:00 2001 From: radtriste Date: Tue, 5 Sep 2023 11:11:51 +0200 Subject: [PATCH] kie-issues#574 Initial ASF Jenkins CI Setup update Remove PR job updated dsl config [apache_migration] Update pipelines (#2967) Update pipelines remove optaplanner-website PR multibranchPipelineJob (#2975) * PR multibranchPipelineJob * set Jenkinsfile timeout time as int --------- Co-authored-by: jstastny-cz Update kiegroup references to apache (#2981) Co-authored-by: radtriste Co-authored-by: jstastny-cz Fix CI references to kie-docs and kie-benchmarks (#2982) Co-authored-by: jstastny-cz use apache/incubator-kie-benchmarks in branch config (#2983) Co-authored-by: jstastny-cz Remove branch override for quickstarts from branch config (#2984) Co-authored-by: jstastny-cz Switch to main branch in config --- .ci/buildchain-config.yaml | 4 +- .ci/buildchain-project-dependencies.yaml | 6 +- .ci/environments/common/update_quarkus.sh | 2 +- .ci/jenkins/Jenkinsfile | 44 +++ .ci/jenkins/Jenkinsfile.deploy | 35 +-- .ci/jenkins/Jenkinsfile.prod.nightly | 291 ------------------ .ci/jenkins/Jenkinsfile.promote | 22 +- .ci/jenkins/Jenkinsfile.setup-branch | 19 +- .ci/jenkins/Jenkinsfile.turtle | 17 +- .ci/jenkins/config/branch.yaml | 87 ++---- .ci/jenkins/config/main.yaml | 22 +- .ci/jenkins/dsl/jobs.groovy | 21 +- .ci/jenkins/dsl/test.sh | 8 +- .ci/jenkins/project/Jenkinsfile.drools | 23 +- .ci/jenkins/project/Jenkinsfile.nightly | 10 +- .ci/jenkins/project/Jenkinsfile.post-release | 103 +++---- .ci/jenkins/project/Jenkinsfile.release | 12 +- .ci/jenkins/project/Jenkinsfile.setup-branch | 9 +- .ci/nightly-build-config.yaml | 42 --- .ci/nightly-project-dependencies.yaml | 15 - .ci/project-dependencies-rhbop.yaml | 25 -- .ci/pull-request-config-rhbop.yaml | 35 --- .github/pull_request_template.md | 8 +- .github/workflows/full-downstream.yml | 12 +- .github/workflows/generate_status_page.yaml | 4 +- .../workflows/generate_status_page_data.yaml | 6 +- .github/workflows/jenkins-tests-PR.yml | 4 +- .github/workflows/pull_request.yml | 4 +- .../rhbop_productized_pull_request.yml | 58 ---- 29 files changed, 207 insertions(+), 741 deletions(-) create mode 100644 .ci/jenkins/Jenkinsfile delete mode 100644 .ci/jenkins/Jenkinsfile.prod.nightly delete mode 100644 .ci/nightly-build-config.yaml delete mode 100644 .ci/nightly-project-dependencies.yaml delete mode 100644 .ci/project-dependencies-rhbop.yaml delete mode 100644 .ci/pull-request-config-rhbop.yaml delete mode 100644 .github/workflows/rhbop_productized_pull_request.yml diff --git a/.ci/buildchain-config.yaml b/.ci/buildchain-config.yaml index 7de9ecc290..9540bf5687 100644 --- a/.ci/buildchain-config.yaml +++ b/.ci/buildchain-config.yaml @@ -25,7 +25,7 @@ default: docker system prune -f build: - - project: kiegroup/optaplanner + - project: apache/incubator-kie-optaplanner build-command: before: upstream: | @@ -35,7 +35,7 @@ build: upstream: | mvn clean install -Dquickly ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_UPSTREAM }} ${{ env.OPTAPLANNER_BUILD_MVN_OPTS_UPSTREAM }} - - project: kiegroup/optaplanner-quickstarts + - project: apache/incubator-kie-optaplanner-quickstarts build-command: current: | mvn clean install ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_CURRENT }} ${{ env.OPTAPLANNER_QUICKSTARTS_BUILD_MVN_OPTS }} diff --git a/.ci/buildchain-project-dependencies.yaml b/.ci/buildchain-project-dependencies.yaml index f4c6113d2a..7d5a5b45a6 100644 --- a/.ci/buildchain-project-dependencies.yaml +++ b/.ci/buildchain-project-dependencies.yaml @@ -1,9 +1,9 @@ version: "2.1" dependencies: - - project: kiegroup/optaplanner - - project: kiegroup/optaplanner-quickstarts + - project: apache/incubator-kie-optaplanner + - project: apache/incubator-kie-optaplanner-quickstarts dependencies: - - project: kiegroup/optaplanner + - project: apache/incubator-kie-optaplanner mapping: dependencies: default: diff --git a/.ci/environments/common/update_quarkus.sh b/.ci/environments/common/update_quarkus.sh index 192f946390..9f4ecaf749 100755 --- a/.ci/environments/common/update_quarkus.sh +++ b/.ci/environments/common/update_quarkus.sh @@ -22,7 +22,7 @@ set -euo pipefail mvn_cmd="mvn ${BUILD_MVN_OPTS:-} ${BUILD_MVN_OPTS_QUARKUS_UPDATE:-}" -source <(curl -s https://raw.githubusercontent.com/kiegroup/kogito-pipelines/main/dsl/seed/scripts/install_quarkus.sh) +source <(curl -s https://raw.githubusercontent.com/apache/incubator-kie-kogito-pipelines/main/dsl/seed/scripts/install_quarkus.sh) echo "Update project with Quarkus version ${QUARKUS_VERSION}" diff --git a/.ci/jenkins/Jenkinsfile b/.ci/jenkins/Jenkinsfile new file mode 100644 index 0000000000..8f360bd068 --- /dev/null +++ b/.ci/jenkins/Jenkinsfile @@ -0,0 +1,44 @@ +@Library('jenkins-pipeline-shared-libraries')_ + +pr_check_script = null + +pipeline { + agent { + label 'ubuntu' + } + options { + timestamps() + timeout(time: 360, unit: 'MINUTES') + } + environment { + BUILDCHAIN_PROJECT = 'apache/incubator-kie-optaplanner' + BUILDCHAIN_CONFIG_REPO = 'incubator-kie-optaplanner' + BUILDCHAIN_CONFIG_FILE_PATH = '.ci/buildchain-config.yaml' + + ENABLE_SONARCLOUD = 'true' + SONARCLOUD_ANALYSIS_MVN_OPTS = '-Dsonar.projectKey=org.optaplanner:optaplanner' + OPTAPLANNER_BUILD_MVN_OPTS = '-Prun-code-coverage' + } + stages { + stage('Initialize') { + steps { + script { + // load `pr_check.groovy` file from kogito-pipelines:main + dir('kogito-pipelines') { + checkout(githubscm.resolveRepository('incubator-kie-kogito-pipelines', 'apache', 'main', false, 'ASF_Cloudbees_Jenkins_ci-builds')) + pr_check_script = load 'dsl/scripts/pr_check.groovy' + } + } + } + } + stage('PR check') { + steps { + script { + dir('kogito-pipelines') { + pr_check_script.launch() + } + } + } + } + } +} diff --git a/.ci/jenkins/Jenkinsfile.deploy b/.ci/jenkins/Jenkinsfile.deploy index 5e799a6249..e1e895a708 100644 --- a/.ci/jenkins/Jenkinsfile.deploy +++ b/.ci/jenkins/Jenkinsfile.deploy @@ -7,19 +7,17 @@ import org.kie.jenkins.MavenStagingHelper deployProperties = [:] -optaplannerRepository = 'optaplanner' -quickstartsRepository = 'optaplanner-quickstarts' +optaplannerRepository = 'incubator-kie-optaplanner' +quickstartsRepository = 'incubator-kie-optaplanner-quickstarts' imageUtils = null pipeline { agent { - label 'kie-rhel8 && docker && kie-mem16g && !built-in' - } - - tools { - maven env.BUILD_MAVEN_TOOL - jdk env.BUILD_JDK_TOOL + docker { + image env.AGENT_DOCKER_BUILDER_IMAGE + args env.AGENT_DOCKER_BUILDER_ARGS + } } options { @@ -28,21 +26,13 @@ pipeline { disableConcurrentBuilds(abortPrevious: true) } - // parameters { - // For parameters, check into .jenkins/dsl/jobs.groovy file - // } - environment { - // Some generated env is also defined into .jenkins/dsl/jobs.groovy file - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") - MAVEN_OPTS = '-Xms1024m -Xmx4g' - PR_BRANCH_HASH = "${util.generateHash(10)}" // Maven configuration - MAVEN_DEPLOY_LOCAL_DIR = "${WORKSPACE}/maven_deploy_dir" + MAVEN_DEPLOY_LOCAL_DIR = "/tmp/maven_deploy_dir" } stages { @@ -197,9 +187,6 @@ pipeline { when { expression { return shouldStageArtifacts() } } - tools { - jdk 'kie-jdk11' - } steps { script { // Stage release artifacts @@ -320,7 +307,7 @@ void checkoutRepo(String repo, String dirName = repo) { dir(dirName) { deleteDir() if (params.PR_TARGET_BRANCH) { - githubscm.checkoutIfExists(repo, getGitAuthor(), getBuildBranch(), 'kiegroup', getFallbackBranch(repo), true) + githubscm.checkoutIfExists(repo, getGitAuthor(), getBuildBranch(), 'apache', getFallbackBranch(repo), true) } else { checkout(githubscm.resolveRepository(repo, getGitAuthor(), getBuildBranch(), false)) } @@ -331,7 +318,7 @@ void checkoutQuickstarts(String dirName = quickstartsRepository) { dir(dirName) { deleteDir() if (params.PR_TARGET_BRANCH) { - githubscm.checkoutIfExists(quickstartsRepository, getGitAuthor(), getBuildBranch(), 'kiegroup', getQuickStartsBranch(), true) + githubscm.checkoutIfExists(quickstartsRepository, getGitAuthor(), getBuildBranch(), 'apache', getQuickStartsBranch(), true) } else { checkout(githubscm.resolveRepository(quickstartsRepository, getGitAuthor(), getQuickStartsBranch(), false)) } @@ -339,7 +326,7 @@ void checkoutQuickstarts(String dirName = quickstartsRepository) { } String getFallbackBranch(String repo) { - def repositoryScm = githubscm.getRepositoryScm(repo, 'kiegroup', params.PR_TARGET_BRANCH) + def repositoryScm = githubscm.getRepositoryScm(repo, 'apache', params.PR_TARGET_BRANCH) return repositoryScm ? params.PR_TARGET_BRANCH : 'main' } @@ -452,7 +439,7 @@ boolean shouldDeployToRepository() { } boolean isNotTestingBuild() { - return getGitAuthor() == 'kiegroup' + return getGitAuthor() == 'apache' } boolean isRelease() { diff --git a/.ci/jenkins/Jenkinsfile.prod.nightly b/.ci/jenkins/Jenkinsfile.prod.nightly deleted file mode 100644 index eb16656766..0000000000 --- a/.ci/jenkins/Jenkinsfile.prod.nightly +++ /dev/null @@ -1,291 +0,0 @@ -@Library('jenkins-pipeline-shared-libraries')_ - -pipeline { - agent { - label 'rhel8 && docker && !built-in' - } - tools { - maven 'kie-maven-3.8.7' - jdk 'kie-jdk11' - nodejs 'nodejs-16.2.0' - } - parameters { - string(description: 'The deployment URL', name: 'KIE_GROUP_DEPLOYMENT_REPO_URL') - string(description: 'The UMB message version', name: 'UMB_VERSION', defaultValue: 'main') - string(description: 'The product version, if not provided the optaplanner main branch one will be used', name: 'PRODUCT_VERSION') - string(description: 'The drools product version, if not provided the drools main branch one will be used', name: 'DROOLS_PRODUCT_VERSION') - string(description: 'The config repository branch', name: 'CONFIG_BRANCH', defaultValue: 'master') - } - options { - buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '10') - } - environment { - DATE_TIME_SUFFIX_FORMAT = 'yyyyMMddHH' - } - stages { - stage('Initialize') { - steps { - script { - // Fetch versions from pom if not provided - env.PRODUCT_VERSION = "${PRODUCT_VERSION ?: parseVersionFromPom('kiegroup/optaplanner')}" - env.DROOLS_PRODUCT_VERSION = "${DROOLS_PRODUCT_VERSION ?: parseVersionFromPom('kiegroup/drools')}" - } - } - } - stage('Install build-chain tool') { - steps { - script { - println "[INFO] Installing build-chain tool" - - def buildChainActionFilePath = "${env.WORKSPACE}/build_chain_action.yaml" - sh "curl https://raw.githubusercontent.com/kiegroup/kogito-pipelines/main/.ci/actions/build-chain/action.yml -o ${buildChainActionFilePath}" - - def buildChainVersion = buildChain.getBuildChainVersionFromCompositeActionFile(buildChainActionFilePath) - if ([null, 'null'].contains(buildChainVersion)) { - def errorMessage = "[ERROR] The build-chain version can't be recovered. Please contact administrator" - println errorMessage - error(errorMessage) - } - println "[INFO] build-chain version recovered '${buildChainVersion}'" - - sh "npm install -g @kie/build-chain-action@${buildChainVersion}${env.NPM_REGISTRY_URL ? " -registry=${NPM_REGISTRY_URL}" : ''}" - - sh "npm list -g | grep build-chain" - } - } - } - stage('Clone and parse build configuration repo') { - steps { - script { - def currentBranch = getBuildConfigBranch() - println "Checking out ${env.BUILD_CONFIGURATION_REPO_URL}:${currentBranch} into build_config folder" - sh "git clone -b ${currentBranch} --single-branch ${env.BUILD_CONFIGURATION_REPO_URL} build_config" - - // export PME parameters and build scripts from nightly build config - def buildConfigAdditionalVariables = [ - 'productVersion': env.PRODUCT_VERSION, - 'droolsProductVersion': env.DROOLS_PRODUCT_VERSION - ] - pmebuild.parseBuildConfig("$WORKSPACE/build_config/rhbop/nightly", buildConfigAdditionalVariables) - - // export Quarkus community version as QUARKUS_VERSION_COMMUNITY - def PME_BUILD_VARIABLES = env.PME_BUILD_VARIABLES.split(';').collect{ it.split('=')}.inject([:]) {map, item -> map << [(item.length == 2 ? item[0] : null): (item.length == 2 ? item[1] : null)]} - env.QUARKUS_VERSION_COMMUNITY = PME_BUILD_VARIABLES['quarkusVersionCommunity'] - env.QUARKUS_VERSION = PME_BUILD_VARIABLES['quarkusVersion'].replaceAll("\\{\\{.*\\}\\}", env.QUARKUS_VERSION_COMMUNITY) - } - } - } - stage('Build Nightly projects') { - steps { - script { - withCredentials([string(credentialsId: "kie-ci1-token", variable: 'GITHUB_TOKEN')]) { - def SETTINGS_XML_ID = '5d9884a1-178a-4d67-a3ac-9735d2df2cef' - def buildBranch = getBuildBranch() - def definitionFile = "https://raw.githubusercontent.com/\\\${GROUP:kiegroup}/optaplanner/${getDefinitionFileBranch()}/.ci/nightly-build-config.yaml" - - configFileProvider([configFile(fileId: "${SETTINGS_XML_ID}", variable: 'PME_MAVEN_SETTINGS_XML')]) { - sh "build-chain build branch --token=${GITHUB_TOKEN} -f ${definitionFile} -b ${buildBranch} -o bc -p kiegroup/optaplanner --fullProjectDependencyTree --skipParallelCheckout" - } - } - } - } - } - stage('Upload artifacts to repository') { - steps { - script { - echo "[INFO] Start uploading ${env.WORKSPACE}/deployDirectory" - dir("${env.WORKSPACE}/deployDirectory") { - withCredentials([usernameColonPassword(credentialsId: "${env.NIGHTLY_DEPLOYMENT_CREDENTIAL}", variable: 'deploymentCredentials')]) { - sh "zip -qr kiegroup ." - sh "curl --fail --upload-file kiegroup.zip -u $deploymentCredentials -v ${KIE_GROUP_DEPLOYMENT_REPO_URL}" - } - } - } - } - } - stage('Upload optaplanner sources') { - steps { - script { - echo "[INFO] Start uploading sources zip files.." - - def folder="rhbop/RHBOP-${PRODUCT_VERSION}.nightly" - - // zip source directories - dir("${env.WORKSPACE}/deployDirectory/org/kie/rhbop/rhbop/${PRODUCT_VERSION}.redhat-${env.DATE_TIME_SUFFIX}") { - def optaplannerSourcesFilename = computeSourcesFilename("optaplanner", env.DATE_TIME_SUFFIX) - uploadSources(optaplannerSourcesFilename, folder) - - def quickstartsSourcesFilename = computeSourcesFilename("optaplanner-quickstarts", env.DATE_TIME_SUFFIX) - uploadSources(quickstartsSourcesFilename, folder) - } - } - } - } - stage ('Extract Git Information') { - steps { - script { - def projectFolders = sh(returnStdout: true, script: "ls ${env.WORKSPACE}/bc").trim().split("\n") - for (f in projectFolders) { - dir("${env.WORKSPACE}/bc/${f}") { - def projectName = f.replace("_", "/") - // extract git infos - util.storeGitInformation(projectName) - env.ALREADY_BUILT_PROJECTS = "${env.ALREADY_BUILT_PROJECTS ?: ''}${projectName};" - - env["VERSION_${f}"] = maven.mvnGetVersionProperty('project.version') - } - } - - sh 'printenv' - } - } - } - stage ('Send UMB Message to QE.') { - steps { - script { - echo '[INFO] Sending RHBOP UMB message to QE.' - def optaplannerArchiveUrl = "https://${env.LOCAL_NEXUS_IP}:8443/nexus/content/groups/rhbop-${calculateArchiveRepoBranch()}-nightly/" - def optaplannerSourcesFileUrl = "${env.STAGING_SERVER_URL}rhbop/RHBOP-${PRODUCT_VERSION}.nightly/rhbop-${PRODUCT_VERSION}.redhat-${env.DATE_TIME_SUFFIX}-optaplanner-sources.zip" - def optaplannerQuickstartsSourcesFileUrl = "${env.STAGING_SERVER_URL}rhbop/RHBOP-${PRODUCT_VERSION}.nightly/rhbop-${PRODUCT_VERSION}.redhat-${env.DATE_TIME_SUFFIX}-optaplanner-quickstarts-sources.zip" - - def topic = "VirtualTopic.qe.ci.ba.rhbop.${env.UMB_VERSION}.nightly.trigger" - def eventType = "rhbop-${env.UMB_VERSION}-nightly-qe-trigger" - def messageBody = getMessageBody( - optaplannerArchiveUrl, - optaplannerSourcesFileUrl, - optaplannerQuickstartsSourcesFileUrl, - env.ALREADY_BUILT_PROJECTS, - [ - 'rhbop': env['VERSION_kiegroup_optaplanner'], - 'optaplanner': env['VERSION_kiegroup_optaplanner'], - 'drools': env['VERSION_kiegroup_drools'], - 'quarkus.bom': env['QUARKUS_VERSION'], - 'platform.quarkus.bom': env['QUARKUS_VERSION'] - ], - gitHashesToCollection(env.GIT_INFORMATION_HASHES) - ) - - echo "[INFO] Message Body: ${messageBody}" - echo "[INFO] Topic: ${topic}" - echo "[INFO] Event Type: ${eventType}" - build job: env.SEND_UMB_MESSAGE_JOB_PATH, parameters: [ - [$class: 'StringParameterValue', name: 'MESSAGE_BODY', value: messageBody], - [$class: 'StringParameterValue', name: 'TOPIC', value: topic], - [$class: 'StringParameterValue', name: 'EVENT_TYPE', value: eventType] - ] - echo '[SUCCESS] Message was successfully sent.' - } - } - } - } - post { - failure { - emailext body: 'RHBOP ${PRODUCT_VERSION}:nightly-build #${BUILD_NUMBER} was: ' + "${currentBuild.currentResult}" + '\n' + - 'Please look here: ${BUILD_URL} \n' + - ' \n' + - '${BUILD_LOG, maxLines=750}', subject: 'RHBOP ${PRODUCT_VERSION}:nightly-build #${BUILD_NUMBER}: ' + "${currentBuild.currentResult}", to: 'kie-jenkins-builds@redhat.com' - } - unstable { - emailext body: 'RHBOP ${PRODUCT_VERSION}:nightly-build #${BUILD_NUMBER} was: ' + "${currentBuild.currentResult}" + '\n' + - 'Please look here: ${BUILD_URL} \n' + - ' \n' + - 'Failed tests: ${BUILD_URL}/testReport \n' + - ' \n' + - '${BUILD_LOG, maxLines=750}', subject: 'RHBOP ${PRODUCT_VERSION}:nightly-build #${BUILD_NUMBER}: ' + "${currentBuild.currentResult}", to: 'kie-jenkins-builds@redhat.com' - } - fixed { - emailext body: 'RHBOP ${PRODUCT_VERSION}:nightly-build #${BUILD_NUMBER} was: ' + "${currentBuild.currentResult}" + '\n' + - 'Please look here: ${BUILD_URL}', subject: 'RHBOP ${PRODUCT_VERSION}:nightly-build #${BUILD_NUMBER}: ' + "${currentBuild.currentResult}", to: 'kie-jenkins-builds@redhat.com' - } - always { - archiveArtifacts artifacts: '**/*.maven.log', fingerprint: false, defaultExcludes: true, caseSensitive: true, allowEmptyArchive: true - - echo 'Generating JUnit report...' - junit allowEmptyResults: true, healthScaleFactor: 1.0, testResults: '**/target/*-reports/TEST-*.xml' - - echo 'Archiving logs...' - archiveArtifacts excludes: '**/target/checkstyle.log', artifacts: '**/*.maven.log,**/target/*.log', fingerprint: false, defaultExcludes: true, caseSensitive: true, allowEmptyArchive: true - } - cleanup { - cleanWs() - } - } -} - -String getBuildConfigBranch() { - return env.CONFIG_BRANCH ?: env.DEFAULT_CONFIG_BRANCH ?: env.BRANCH_NAME ?: env.GIT_BRANCH -} - -String getBuildBranch() { - // Fallback to main if none exist - return env.BRANCH_NAME ?: env.GIT_BRANCH ?: 'main' -} - -String getDefinitionFileBranch() { - // Fallback to getBuildBranch if DEFINITION_FILE_BRANCH not set - return env.DEFINITION_FILE_BRANCH ?: getBuildBranch() -} - -def getMessageBody(String optaplannerArchiveUrl, String optaplannerSourcesUrl, String optaplannerQuickstartsSourcesUrl, String alreadyBuiltProjects, Map versions, Map scmHashes) { - def alreadyBuiltProjectsArray = (alreadyBuiltProjects ?: '').split(";") - return """ -{ - "version": ${new groovy.json.JsonBuilder(versions).toString()}, - "scm_hash": ${new groovy.json.JsonBuilder(scmHashes).toString()}, - "built_projects": ${new groovy.json.JsonBuilder(alreadyBuiltProjectsArray).toString()}, - "archives": "${optaplannerArchiveUrl}", - "sources": { - "optaplanner": "${optaplannerSourcesUrl}", - "optaplanner-quickstarts": "${optaplannerQuickstartsSourcesUrl}" - } -}""" -} - -def computeSourcesFilename(String project, String suffix) { - return "rhbop-${PRODUCT_VERSION}.redhat-${suffix}-${project}-sources.zip" -} - -def uploadSources(String sourcesFilename, String folder) { - echo "[INFO] Start uploading $sourcesFilename sources zip file.." - util.withKerberos('rhba-prod-keytab') { - sh "ssh 'rhba-prod@${env.RCM_HOST}' 'mkdir -p ${env.RCM_GUEST_FOLDER}/${folder}'" - sh "rsync -rlp --info=progress2 $sourcesFilename rhba-prod@${env.RCM_HOST}:staging/${folder}" - } -} - -def gitHashesToCollection(String gitInformationHashes) { - return gitInformationHashes.replaceAll(/([\w\d\-\_\.]*\/)([\w\d\-\_\.]*)/,'$2').split(';').findAll { it.split('=').size() }.collectEntries{ [it.split('=')[0], it.split('=')[1]] } -} - -String getCurrentBranch() { - return env.CHANGE_BRANCH ?: env.BRANCH_NAME -} - -String getOptaPlannerQuickstartsBranch() { - def branch = getCurrentBranch() - return branch == 'main' ? 'development' : branch -} - -String calculateArchiveRepoBranch() { - def branch = getCurrentBranch() - String [] branchSplit = branch.split("\\.") - if (branchSplit.length == 3) { - // e.g., 8.29.x --> 8.29 - return "${branchSplit[0]}.${branchSplit[1]}" - } - // e.g., main - return branch -} - - -// Parse version from main branch of the given project -// * project: in the form of owner/repository -def parseVersionFromPom(String project) { - def currentBranch = getCurrentBranch() ?: env.GIT_BRANCH - def pomFilename = "${project.replaceAll("/", "_")}_pom.xml" - def pomPath = "${env.WORKSPACE}/${pomFilename}" - - sh "curl https://raw.githubusercontent.com/${project}/${currentBranch}/pom.xml -o ${pomPath}" - def pom = readMavenPom file: pomPath - return pom.getVersion().replaceAll('-SNAPSHOT', '') -} diff --git a/.ci/jenkins/Jenkinsfile.promote b/.ci/jenkins/Jenkinsfile.promote index b82c0da169..341460b3e4 100644 --- a/.ci/jenkins/Jenkinsfile.promote +++ b/.ci/jenkins/Jenkinsfile.promote @@ -6,19 +6,17 @@ import org.kie.jenkins.MavenCommand deployProperties = [:] pipelineProperties = [:] -String optaplannerRepository = 'optaplanner' -String quickstartsRepository = 'optaplanner-quickstarts' +String optaplannerRepository = 'incubator-kie-optaplanner' +String quickstartsRepository = 'incubator-kie-optaplanner-quickstarts' imageUtils = null pipeline { agent { - label 'kie-rhel8 && docker && !built-in' - } - - tools { - maven env.BUILD_MAVEN_TOOL - jdk env.BUILD_JDK_TOOL + docker { + image env.AGENT_DOCKER_BUILDER_IMAGE + args env.AGENT_DOCKER_BUILDER_ARGS + } } options { @@ -27,13 +25,7 @@ pipeline { disableConcurrentBuilds(abortPrevious: true) } - // parameters { - // For parameters, check into .jenkins/dsl/jobs.groovy file - // } - environment { - // Some generated env is also defined into .jenkins/dsl/jobs.groovy file - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") PR_BRANCH_HASH = "${util.generateHash(10)}" @@ -181,7 +173,7 @@ String getParamOrDeployProperty(String paramKey, String deployPropertyKey) { ////////////////////////////////////////////////////////////////////////////// boolean isNotTestingBuild() { - return getGitAuthor() == 'kiegroup' + return getGitAuthor() == 'apache' } String getProjectVersion() { diff --git a/.ci/jenkins/Jenkinsfile.setup-branch b/.ci/jenkins/Jenkinsfile.setup-branch index 6f7b303f04..196f687fbc 100644 --- a/.ci/jenkins/Jenkinsfile.setup-branch +++ b/.ci/jenkins/Jenkinsfile.setup-branch @@ -5,12 +5,10 @@ import org.kie.jenkins.MavenCommand pipeline { agent { - label 'kie-rhel8 && !built-in' - } - - tools { - maven env.BUILD_MAVEN_TOOL - jdk env.BUILD_JDK_TOOL + docker { + image env.AGENT_DOCKER_BUILDER_IMAGE + args env.AGENT_DOCKER_BUILDER_ARGS + } } options { @@ -18,18 +16,9 @@ pipeline { timeout(time: 60, unit: 'MINUTES') } - // parameters { - // For parameters, check into ./dsl/jobs.groovy file - // } - environment { - // Static env is defined into ./dsl/jobs.groovy file - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") - // Keep here for visitibility - MAVEN_OPTS = '-Xms1024m -Xmx4g' - BRANCH_HASH = "${util.generateHash(10)}" } diff --git a/.ci/jenkins/Jenkinsfile.turtle b/.ci/jenkins/Jenkinsfile.turtle index bb5742dd33..2130facecb 100644 --- a/.ci/jenkins/Jenkinsfile.turtle +++ b/.ci/jenkins/Jenkinsfile.turtle @@ -2,26 +2,21 @@ import org.kie.jenkins.MavenCommand -optaplannerRepo = 'optaplanner' +optaplannerRepo = 'incubator-kie-optaplanner' pipeline { agent { - label 'kie-rhel8 && docker && kie-mem16g && !built-in' - } - tools { - maven env.BUILD_MAVEN_TOOL - jdk env.BUILD_JDK_TOOL + docker { + image env.AGENT_DOCKER_BUILDER_IMAGE + args env.AGENT_DOCKER_BUILDER_ARGS + } } options { timestamps() timeout(time: 3, unit: 'DAYS') // Turtle tests take ~2 days to complete. disableConcurrentBuilds(abortPrevious: true) } - // parameters { - // For parameters, check the .jenkins/dsl/jobs.groovy file. - // } environment { - MAVEN_OPTS = '-Xms1024m -Xmx4g' // Contains the email address of the team's Zulip channel. OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") } @@ -38,7 +33,7 @@ pipeline { script { new MavenCommand(this) // Use the same settings.xml as for the nightly builds, including a maven mirror. - .withSettingsXmlId('kogito_release_settings') + .withSettingsXmlId('kie-release-settings') .inDirectory(optaplannerRepo) .withOptions(['-U', '-e', '-fae', '-ntp']) .withProperty('full') diff --git a/.ci/jenkins/config/branch.yaml b/.ci/jenkins/config/branch.yaml index b6d9a2655c..19b4873402 100644 --- a/.ci/jenkins/config/branch.yaml +++ b/.ci/jenkins/config/branch.yaml @@ -17,52 +17,30 @@ environments: QUARKUS_BRANCH: '2.16' ids: - quarkus - quarkus-lts: - pull_request_default_check: false - env_vars: - BUILD_MVN_OPTS: -Dproductized - QUARKUS_BRANCH: '2.13' - ids: - - quarkus - - lts - - prod - native-lts: - env_vars: - NATIVE: true - BUILD_MVN_OPTS: -Dproductized - BUILD_MVN_OPTS_CURRENT: -Dnative -Dquarkus.native.container-build=true - QUARKUS_BRANCH: '2.13' - QUARKUS_NATIVE_BUILDER_IMAGE: mandrel - ADDITIONAL_TIMEOUT: 720 - ids: - - native - - prod - - lts ecosystem: auto_generation: false ids: - ecosystem -productized_branch: true disable: - triggers: false + triggers: true # TODO to set back repositories: -- name: optaplanner - branch: main -- name: optaplanner-quickstarts +- name: incubator-kie-optaplanner + job_display_name: optaplanner +- name: incubator-kie-optaplanner-quickstarts + job_display_name: optaplanner-quickstarts branch: 8.x -- name: optaplanner-website - branch: main -- name: kie-benchmarks - branch: main -productized_repositories: -- name: optaplanner -- name: optaplanner-quickstarts -- name: optaplanner-website +# Not migrated to Apache yet +# - name: incubator-kie-optaplanner-website +# job_display_name: optaplanner-website +- name: incubator-kie-benchmarks + job_display_name: kie-benchmarks git: author: - name: kiegroup - credentials_id: kie-ci5 - token_credentials_id: kie-ci5-token + name: apache + # Taken from https://ci-builds.apache.org/credentials/ + # Need to be verified + credentials_id: 399061d0-5ab5-4142-a186-a52081fef742 + token_credentials_id: ci-builds fork_author: name: kie-ci credentials_id: kie-ci @@ -74,30 +52,31 @@ git: jenkins_config_path: .ci/jenkins buildchain_config: git: - repository: optaplanner + repository: incubator-kie-optaplanner file_path: .ci/buildchain-config.yaml maven: - settings_file_id: kogito_release_settings + settings_file_id: kie-release-settings nexus: - release_url: https://repository.jboss.org/nexus - release_repository: jboss-releases-repository - staging_profile_url: https://repository.jboss.org/nexus/content/groups/kogito-public/ - staging_profile_id: 2161b7b8da0080 - build_promotion_profile_id: ea49ccd6f174 + release_url: TO_DEFINE + release_repository: TO_DEFINE + staging_profile_url: TO_DEFINE + staging_profile_id: TO_DEFINE + build_promotion_profile_id: TO_DEFINE artifacts_repository: '' - pr_checks: - repository: - url: https://bxms-qe.rhev-ci-vms.eng.rdu2.redhat.com:8443/nexus/content/repositories/kogito-runtimes-pr-full-testing/ - creds_id: unpacks-zip-on-qa-nexus cloud: image: - registry_credentials: optaplanner-quay-token + registry_credentials: tradisso_registry_token # TODO set to `kogito-quay-token` registry: quay.io - namespace: optaplanner + namespace: tradisso latest_git_branch: main jenkins: - email_creds_id: OPTAPLANNER_CI_EMAIL + email_creds_id: OPTAPLANNER_CI_NOTIFICATION_EMAILS + agent: + docker: + builder: + image: quay.io/kiegroup/kogito-ci-build:latest + args: -v /var/run/docker.sock:/var/run/docker.sock --group-add docker --group-add input --group-add render default_tools: - jdk: kie-jdk17 - maven: kie-maven-3.8.7 - sonar_jdk: kie-jdk17 + jdk: jdk_17_latest + maven: maven_3.8.6 + sonar_jdk: jdk_17_latest diff --git a/.ci/jenkins/config/main.yaml b/.ci/jenkins/config/main.yaml index 8c4cdc9ed4..4eded94d4b 100644 --- a/.ci/jenkins/config/main.yaml +++ b/.ci/jenkins/config/main.yaml @@ -3,34 +3,24 @@ ecosystem: projects: - name: optaplanner regexs: + - incubator-kie-opta.* - opta.* - name: kie-benchmarks ignore_release: true - ignore_productization: true regexs: - - kie-benchmarks.* + - incubator-kie-benchmarks.* git: branches: - name: main main_branch: true - seed: - branch: main - - name: 8.38.x-prod - seed: - branch: seed-optaplanner-8.38.x - - name: 8.44.x - seed: - branch: seed-optaplanner-8.44.x - main_branch: - default: main seed: config_file: git: - repository: optaplanner + repository: incubator-kie-optaplanner author: - name: kiegroup - credentials_id: kie-ci5 + name: apache + credentials_id: ASF_Cloudbees_Jenkins_ci-builds branch: main path: .ci/jenkins/config/branch.yaml jenkins: - email_creds_id: OPTAPLANNER_CI_EMAIL + email_creds_id: OPTAPLANNER_CI_NOTIFICATION_EMAILS diff --git a/.ci/jenkins/dsl/jobs.groovy b/.ci/jenkins/dsl/jobs.groovy index 155442f786..d15dc4719d 100644 --- a/.ci/jenkins/dsl/jobs.groovy +++ b/.ci/jenkins/dsl/jobs.groovy @@ -21,10 +21,10 @@ * This file is describing all the Jenkins jobs in the DSL format (see https://plugins.jenkins.io/job-dsl/) * needed by the Kogito pipelines. * -* The main part of Jenkins job generation is defined into the https://github.com/kiegroup/kogito-pipelines repository. +* The main part of Jenkins job generation is defined into the https://github.com/apache/incubator-kie-kogito-pipelines repository. * * This file is making use of shared libraries defined in -* https://github.com/kiegroup/kogito-pipelines/tree/main/dsl/seed/src/main/groovy/org/kie/jenkins/jobdsl. +* https://github.com/apache/incubator-kie-kogito-pipelines/tree/main/dsl/seed/src/main/groovy/org/kie/jenkins/jobdsl. */ import org.kie.jenkins.jobdsl.model.JenkinsFolder @@ -66,7 +66,7 @@ KogitoJobUtils.createMainQuarkusUpdateToolsJob(this, void setupProjectDroolsJob(String droolsBranch) { def jobParams = JobParamsUtils.getBasicJobParamsWithEnv(this, 'optaplanner-drools-snapshot', JobType.NIGHTLY, 'ecosystem', "${jenkins_path_project}/Jenkinsfile.drools", 'Optaplanner testing against Drools snapshot') - JobParamsUtils.setupJobParamsDefaultMavenConfiguration(this, jobParams) + JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, jobParams) jobParams.triggers = [ cron : 'H 2 * * *' ] jobParams.env.putAll([ JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}", @@ -149,7 +149,7 @@ void setupProjectReleaseJob() { void setupProjectPostReleaseJob() { def jobParams = JobParamsUtils.getBasicJobParams(this, 'optaplanner-post-release', JobType.RELEASE, "${jenkins_path_project}/Jenkinsfile.post-release", 'Optaplanner Post Release') - JobParamsUtils.setupJobParamsDefaultMavenConfiguration(this, jobParams) + JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, jobParams) jobParams.env.putAll([ JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}", @@ -198,7 +198,7 @@ Map getMultijobPRConfig(JenkinsFolder jobFolder) { ] ], [ id: 'optaplanner-quickstarts', - repository: 'optaplanner-quickstarts', + repository: 'incubator-kie-optaplanner-quickstarts', env : [ BUILD_MVN_OPTS_CURRENT: '-Dfull', OPTAPLANNER_BUILD_MVN_OPTS_UPSTREAM: '-Dfull', @@ -211,7 +211,7 @@ Map getMultijobPRConfig(JenkinsFolder jobFolder) { } // Optaplanner PR checks -KogitoJobUtils.createAllEnvironmentsPerRepoPRJobs(this) { jobFolder -> getMultijobPRConfig(jobFolder) } +Utils.isMainBranch(this) && KogitoJobTemplate.createPullRequestMultibranchPipelineJob(this, "${jenkins_path}/Jenkinsfile") // Setup branch branch createSetupBranchJob() @@ -251,9 +251,8 @@ void setupSpecificBuildChainNightlyJob(String envName) { void createSetupBranchJob() { def jobParams = JobParamsUtils.getBasicJobParams(this, 'optaplanner', JobType.SETUP_BRANCH, "${jenkins_path}/Jenkinsfile.setup-branch", 'OptaPlanner Setup Branch') - JobParamsUtils.setupJobParamsDefaultMavenConfiguration(this, jobParams) + JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, jobParams) jobParams.env.putAll([ - REPO_NAME: 'optaplanner', JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}", GIT_AUTHOR: "${GIT_AUTHOR_NAME}", @@ -279,7 +278,7 @@ void createSetupBranchJob() { void setupDeployJob(JobType jobType, String envName = '') { def jobParams = JobParamsUtils.getBasicJobParamsWithEnv(this, 'optaplanner-deploy', jobType, envName, "${jenkins_path}/Jenkinsfile.deploy", 'Optaplanner Deploy') - JobParamsUtils.setupJobParamsDefaultMavenConfiguration(this, jobParams) + JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, jobParams) if (jobType == JobType.PULL_REQUEST) { jobParams.git.branch = '${BUILD_BRANCH_NAME}' jobParams.git.author = '${GIT_AUTHOR}' @@ -357,7 +356,7 @@ void setupDeployJob(JobType jobType, String envName = '') { void setupPromoteJob(JobType jobType) { def jobParams = JobParamsUtils.getBasicJobParams(this, 'optaplanner-promote', jobType, "${jenkins_path}/Jenkinsfile.promote", 'Optaplanner Promote') - JobParamsUtils.setupJobParamsDefaultMavenConfiguration(this, jobParams) + JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, jobParams) jobParams.env.putAll([ JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}", @@ -400,7 +399,7 @@ void setupPromoteJob(JobType jobType) { void setupOptaPlannerTurtleTestsJob(String constraintStreamImplType) { def jobParams = JobParamsUtils.getBasicJobParams(this, "optaplanner-turtle-tests-${constraintStreamImplType}", JobType.OTHER, "${jenkins_path}/Jenkinsfile.turtle", "Run OptaPlanner turtle tests with CS-${constraintStreamImplType} on a weekly basis.") - JobParamsUtils.setupJobParamsDefaultMavenConfiguration(this, jobParams) + JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, jobParams) jobParams.env.putAll([ CONSTRAINT_STREAM_IMPL_TYPE: "${constraintStreamImplType}", JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}" diff --git a/.ci/jenkins/dsl/test.sh b/.ci/jenkins/dsl/test.sh index d43b6ddc04..d412c5b3e0 100755 --- a/.ci/jenkins/dsl/test.sh +++ b/.ci/jenkins/dsl/test.sh @@ -41,13 +41,13 @@ fi git_author="$(echo ${git_url} | awk -F"${git_server_url}" '{print $2}' | awk -F. '{print $1}' | awk -F/ '{print $1}')" -export DSL_DEFAULT_MAIN_CONFIG_FILE_REPO="${git_author}"/optaplanner -export DSL_DEFAULT_FALLBACK_MAIN_CONFIG_FILE_REPO=kiegroup/optaplanner +export DSL_DEFAULT_MAIN_CONFIG_FILE_REPO="${git_author}"/incubator-kie-optaplanner +export DSL_DEFAULT_FALLBACK_MAIN_CONFIG_FILE_REPO=apache/incubator-kie-optaplanner export DSL_DEFAULT_MAIN_CONFIG_FILE_PATH=.ci/jenkins/config/main.yaml -export DSL_DEFAULT_BRANCH_CONFIG_FILE_REPO="${git_author}"/optaplanner +export DSL_DEFAULT_BRANCH_CONFIG_FILE_REPO="${git_author}"/incubator-kie-optaplanner file=$(mktemp) # For more usage of the script, use ./test.sh -h -curl -o ${file} https://raw.githubusercontent.com/kiegroup/kogito-pipelines/main/dsl/seed/scripts/seed_test.sh +curl -o ${file} https://raw.githubusercontent.com/apache/incubator-kie-kogito-pipelines/main/dsl/seed/scripts/seed_test.sh chmod u+x ${file} ${file} $@ \ No newline at end of file diff --git a/.ci/jenkins/project/Jenkinsfile.drools b/.ci/jenkins/project/Jenkinsfile.drools index b6cf03f559..6c6c1d7471 100644 --- a/.ci/jenkins/project/Jenkinsfile.drools +++ b/.ci/jenkins/project/Jenkinsfile.drools @@ -2,24 +2,19 @@ import org.kie.jenkins.MavenCommand -droolsRepo = 'drools' -optaplannerRepo = 'optaplanner' -quickstartsRepo = 'optaplanner-quickstarts' +droolsRepo = 'incubator-kie-drools' +optaplannerRepo = 'incubator-kie-optaplanner' +quickstartsRepo = 'incubator-kie-optaplanner-quickstarts' pipeline { agent { - label 'kie-rhel8 && docker && kie-mem16g' + docker { + image env.AGENT_DOCKER_BUILDER_IMAGE + args env.AGENT_DOCKER_BUILDER_ARGS + } } environment { - // DROOLS_BRANCH should be defined directly into the job environment - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") - - MAVEN_OPTS = '-Xms1024m -Xmx4g' - } - tools { - maven env.BUILD_MAVEN_TOOL - jdk env.BUILD_JDK_TOOL } options { timestamps() @@ -145,13 +140,13 @@ void checkoutOptaplannerQuickstartsRepo() { void checkoutDroolsRepo() { dir(droolsRepo) { - checkout(githubscm.resolveRepository(droolsRepo, 'kiegroup', getDroolsBranch(), false)) + checkout(githubscm.resolveRepository(droolsRepo, 'apache', getDroolsBranch(), false)) } } MavenCommand getMavenCommand(String directory) { def mvnCmd = new MavenCommand(this, ['-fae', '-ntp']) - .withSettingsXmlId('kogito_release_settings') + .withSettingsXmlId('kie-release-settings') .inDirectory(directory) if (env.BUILD_MVN_OPTS) { mvnCmd.withOptions([ env.BUILD_MVN_OPTS ]) diff --git a/.ci/jenkins/project/Jenkinsfile.nightly b/.ci/jenkins/project/Jenkinsfile.nightly index 9d5d5133d8..63234592fb 100644 --- a/.ci/jenkins/project/Jenkinsfile.nightly +++ b/.ci/jenkins/project/Jenkinsfile.nightly @@ -1,7 +1,7 @@ import org.jenkinsci.plugins.workflow.libs.Library @Library('jenkins-pipeline-shared-libraries')_ -String optaPlannerRepository = 'optaplanner' +String optaPlannerRepository = 'incubator-kie-optaplanner' String optaPlannerMainBranch = 'main' String optaPlanner9xBranch = '9.x' @@ -19,20 +19,14 @@ UNSTABLE_STAGES = [:] // Should be multibranch pipeline pipeline { agent { - label 'rhel8 && !built-in' + label 'ubuntu' } options { timeout(time: 1380, unit: 'MINUTES') } - // parameters { - // For parameters, check into ./dsl/jobs.groovy file - // } - environment { - // Some generated env is also defined into ./dsl/jobs.groovy file - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") // Use branch name in nightly tag as we may have parallel main and release branch builds diff --git a/.ci/jenkins/project/Jenkinsfile.post-release b/.ci/jenkins/project/Jenkinsfile.post-release index 53fe3c8292..4a4bfb8c21 100644 --- a/.ci/jenkins/project/Jenkinsfile.post-release +++ b/.ci/jenkins/project/Jenkinsfile.post-release @@ -4,18 +4,16 @@ import org.jenkinsci.plugins.workflow.libs.Library import org.kie.jenkins.MavenCommand -String optaplannerRepository = 'optaplanner' -String quickstartsRepository = 'optaplanner-quickstarts' +String optaplannerRepository = 'incubator-kie-optaplanner' +String quickstartsRepository = 'incubator-kie-optaplanner-quickstarts' String stableBranchName = 'stable' pipeline { agent { - label 'kie-rhel8 && !built-in' - } - - tools { - maven env.BUILD_MAVEN_TOOL - jdk env.BUILD_JDK_TOOL + docker { + image env.AGENT_DOCKER_BUILDER_IMAGE + args env.AGENT_DOCKER_BUILDER_ARGS + } } options { @@ -24,13 +22,7 @@ pipeline { disableConcurrentBuilds(abortPrevious: true) } - // parameters { - // For parameters, check into .jenkins/dsl/jobs.groovy file - // } - environment { - // Some generated env is also defined into .jenkins/dsl/jobs.groovy file - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") PR_BRANCH_HASH = "${util.generateHash(10)}" @@ -48,10 +40,7 @@ pipeline { // Verify version is set and if on right release branch assert getProjectVersion() - assert getBuildBranch() == util.getReleaseBranchFromVersion(getProjectVersion()) - - installGithubCLI() } } } @@ -93,40 +82,41 @@ pipeline { } } - stage('Update OptaPlanner website') { - steps { - script { - final String websiteRepository = 'optaplanner-website' - String prLink = null - String prBranchName = "${getProjectVersion().toLowerCase()}-${env.PR_BRANCH_HASH}" - dir("$websiteRepository-pr") { - checkoutRepo(websiteRepository, 'main') // there is no other branch - githubscm.createBranch(prBranchName) - - // Update versions in links on the website and in the docs. - sh "./build/update-versions.sh ${getProjectVersion()} ${getNextMinorSnapshotVersion(getProjectVersion())}" - - // Update the XSDs. OptaPlanner must be cloned and build with the full profile before. - String optaplannerRoot = "${WORKSPACE}/${optaplannerRepository}" - String optaplannerWebsiteModule = 'optaplanner-website-root' - String optaplannerWebsiteXsd = "${optaplannerWebsiteModule}/content/xsd" - String optaplannerWebsiteDocs = 'optaplanner-website-docs' - sh "cp ${optaplannerRoot}/core/optaplanner-core-impl/target/classes/solver.xsd ${optaplannerWebsiteXsd}/solver/solver-${env.OPTAPLANNER_LATEST_STREAM}.xsd" - sh "cp ${optaplannerRoot}/optaplanner-benchmark/target/classes/benchmark.xsd ${optaplannerWebsiteXsd}/benchmark/benchmark-${env.OPTAPLANNER_LATEST_STREAM}.xsd" - - // Add changed files, commit, open and merge PR - prLink = commitAndCreatePR("Release OptaPlanner ${getProjectVersion()}", - { sh "git add $optaplannerWebsiteXsd/\\*.xsd $optaplannerWebsiteModule/data/pom.yml $optaplannerWebsiteDocs/antora-playbook.yml" }, - prBranchName, 'main') - } - dir(websiteRepository) { - checkoutRepo(websiteRepository, 'main') - mergeAndPush(prLink, 'main') - githubscm.removeRemoteBranch('origin', prBranchName, getGitAuthorCredsID()) - } - } - } - } + // Optaplanner website is not migrated to Apache + // stage('Update OptaPlanner website') { + // steps { + // script { + // final String websiteRepository = 'optaplanner-website' + // String prLink = null + // String prBranchName = "${getProjectVersion().toLowerCase()}-${env.PR_BRANCH_HASH}" + // dir("$websiteRepository-pr") { + // checkoutRepo(websiteRepository, 'main') // there is no other branch + // githubscm.createBranch(prBranchName) + + // // Update versions in links on the website and in the docs. + // sh "./build/update-versions.sh ${getProjectVersion()} ${getNextMinorSnapshotVersion(getProjectVersion())}" + + // // Update the XSDs. OptaPlanner must be cloned and build with the full profile before. + // String optaplannerRoot = "${WORKSPACE}/${optaplannerRepository}" + // String optaplannerWebsiteModule = 'optaplanner-website-root' + // String optaplannerWebsiteXsd = "${optaplannerWebsiteModule}/content/xsd" + // String optaplannerWebsiteDocs = 'optaplanner-website-docs' + // sh "cp ${optaplannerRoot}/core/optaplanner-core-impl/target/classes/solver.xsd ${optaplannerWebsiteXsd}/solver/solver-${env.OPTAPLANNER_LATEST_STREAM}.xsd" + // sh "cp ${optaplannerRoot}/optaplanner-benchmark/target/classes/benchmark.xsd ${optaplannerWebsiteXsd}/benchmark/benchmark-${env.OPTAPLANNER_LATEST_STREAM}.xsd" + + // // Add changed files, commit, open and merge PR + // prLink = commitAndCreatePR("Release OptaPlanner ${getProjectVersion()}", + // { sh "git add $optaplannerWebsiteXsd/\\*.xsd $optaplannerWebsiteModule/data/pom.yml $optaplannerWebsiteDocs/antora-playbook.yml" }, + // prBranchName, 'main') + // } + // dir(websiteRepository) { + // checkoutRepo(websiteRepository, 'main') + // mergeAndPush(prLink, 'main') + // githubscm.removeRemoteBranch('origin', prBranchName, getGitAuthorCredsID()) + // } + // } + // } + // } } post { unsuccessful { @@ -150,7 +140,7 @@ void sendErrorNotification() { ////////////////////////////////////////////////////////////////////////////// boolean isNotTestingBuild() { - return getGitAuthor() == 'kiegroup' + return getGitAuthor() == 'apache' } String getProjectVersion() { @@ -232,15 +222,6 @@ void commitAndForcePushBranch(String repo, String branch) { } } -void installGithubCLI() { - sh """ - wget https://github.com/cli/cli/releases/download/v${env.GITHUB_CLI_VERSION}/gh_${env.GITHUB_CLI_VERSION}_linux_amd64.tar.gz - tar xzf gh_${env.GITHUB_CLI_VERSION}_linux_amd64.tar.gz - mv gh_${env.GITHUB_CLI_VERSION}_linux_amd64/bin/gh . - rm -r gh_${env.GITHUB_CLI_VERSION}_linux_amd64* - """ -} - void uploadDistribution(String directory) { if (isNotTestingBuild()) { echo "uploadDistribution for ${directory}" diff --git a/.ci/jenkins/project/Jenkinsfile.release b/.ci/jenkins/project/Jenkinsfile.release index d39ec1f8cc..50b036cb0a 100644 --- a/.ci/jenkins/project/Jenkinsfile.release +++ b/.ci/jenkins/project/Jenkinsfile.release @@ -18,16 +18,10 @@ releaseProperties = [:] pipeline { agent { - label 'rhel8 && !built-in' + label 'ubuntu' } - // parameters { - // For parameters, check into ./dsl/jobs.groovy file - // } - environment { - // Some generated env is also defined into ./dsl/jobs.groovy file - CI_EMAIL = credentials("${JENKINS_EMAIL_CREDS_ID}") } @@ -48,8 +42,8 @@ pipeline { sendNotification("Release Pipeline has started...\nOptaplanner version = ${getOptaPlannerVersion()}\n=> ${env.BUILD_URL}") // Safety measure to not publish to main JBoss - if (getGitAuthor() != 'kiegroup' && !getArtifactsRepositoryParam()) { - sendNotification("Git Author is different from `kiegroup` and no `ARTIFACTS_REPOSITORY` parameter has been provided. Are you sure you want to continue ? => ${env.BUILD_URL}input") + 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' } } diff --git a/.ci/jenkins/project/Jenkinsfile.setup-branch b/.ci/jenkins/project/Jenkinsfile.setup-branch index c6a75a10c8..11d417b835 100644 --- a/.ci/jenkins/project/Jenkinsfile.setup-branch +++ b/.ci/jenkins/project/Jenkinsfile.setup-branch @@ -10,23 +10,16 @@ JOBS = [:] FAILED_STAGES = [:] UNSTABLE_STAGES = [:] -// Should be multibranch pipeline pipeline { agent { - label 'kie-rhel8 && !built-in' + label 'ubuntu' } options { timeout(time: 360, unit: 'MINUTES') } - // parameters { - // For parameters, check into ./dsl/jobs.groovy file - // } - environment { - // Some generated env is also defined into ./dsl/jobs.groovy file - OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}") // Use branch name in nightly tag as we may have parallel main and release branch builds diff --git a/.ci/nightly-build-config.yaml b/.ci/nightly-build-config.yaml deleted file mode 100644 index e655100557..0000000000 --- a/.ci/nightly-build-config.yaml +++ /dev/null @@ -1,42 +0,0 @@ -version: "2.1" - -dependencies: ./nightly-project-dependencies.yaml - -pre: | - export PME_CMD="java -jar ${{ env.PME_CLI_PATH }} -s ${{ env.PME_MAVEN_SETTINGS_XML }} -DallowConfigFilePrecedence=true -DprojectSrcSkip=false" - echo "PME_CMD=${{ env.PME_CMD }}" - export BUILD_MVN_OPTS="${{ env.BUILD_MVN_OPTS }} -s ${{ env.PME_MAVEN_SETTINGS_XML }}" - echo "BUILD_MVN_OPTS=${{ env.BUILD_MVN_OPTS }}" - export ALIGN_QUARKUS="mvn versions:compare-dependencies -DremotePom=io.quarkus:quarkus-bom:${{ env.QUARKUS_VERSION_COMMUNITY }} -DupdatePropertyVersions=true -DupdateDependencies=true -DgenerateBackupPoms=false -s ${{ env.PME_MAVEN_SETTINGS_XML }}" - echo "ALIGN_QUARKUS=${{ env.ALIGN_QUARKUS }}" - -default: - build-command: - current: mvn clean install -Dproductized=true -DskipTests=true ${{ env.BUILD_MVN_OPTS }} - upstream: mvn clean install -Dquickly -Dproductized=true -DskipTests=true ${{ env.BUILD_MVN_OPTS }} - downstream: mvn clean install -Dquickly -Dproductized=true -DskipTests=true ${{ env.BUILD_MVN_OPTS }} - after: - current: | - docker system prune -f - -build: - - project: kiegroup/drools - build-command: - upstream: | - ${{ env.PME_CMD }} ${{ env.PME_ALIGNMENT_PARAMS_kiegroup_drools }} - bash -c "${{ env.ALIGN_QUARKUS }} -pl :drools-build-parent ; set -o pipefail ; ${{ env.PME_BUILD_SCRIPT_kiegroup_drools }} ${{ env.BUILD_MVN_OPTS }} | tee ${{ env.WORKSPACE }}/drools.maven.log" - - project: kiegroup/optaplanner - build-command: - current: | - ${{ env.PME_CMD }} ${{ env.PME_ALIGNMENT_PARAMS_kiegroup_optaplanner }} - bash -c "set -o pipefail ; ${{ env.PME_BUILD_SCRIPT_kiegroup_optaplanner }} ${{ env.BUILD_MVN_OPTS }} | tee ${{ env.WORKSPACE }}/optaplanner.maven.log" - - project: kiegroup/optaplanner-quickstarts - build-command: - downstream: | - ${{ env.PME_CMD }} ${{ env.PME_ALIGNMENT_PARAMS_kiegroup_optaplanner_quickstarts }} - bash -c "set -o pipefail ; ${{ env.PME_BUILD_SCRIPT_kiegroup_optaplanner_quickstarts }} ${{ env.BUILD_MVN_OPTS }} | tee ${{ env.WORKSPACE }}/optaplanner_quickstarts.maven.log" - - project: jboss-integration/rhbop-optaplanner - build-command: - downstream: | - ${{ env.PME_CMD }} ${{ env.PME_ALIGNMENT_PARAMS_jboss_integration_rhbop_optaplanner }} - bash -c "set -o pipefail ; ${{ env.PME_BUILD_SCRIPT_jboss_integration_rhbop_optaplanner }} ${{ env.BUILD_MVN_OPTS }} | tee ${{ env.WORKSPACE }}/rhbop_optaplanner.maven.log" \ No newline at end of file diff --git a/.ci/nightly-project-dependencies.yaml b/.ci/nightly-project-dependencies.yaml deleted file mode 100644 index 668bd6c588..0000000000 --- a/.ci/nightly-project-dependencies.yaml +++ /dev/null @@ -1,15 +0,0 @@ -version: "2.1" - -extends: ./project-dependencies-rhbop.yaml - -dependencies: - - project: kiegroup/drools - mapping: - dependencies: - default: - - source: main-integration-quarkus-lts - target: main - dependant: - default: - - source: main - target: main-integration-quarkus-lts diff --git a/.ci/project-dependencies-rhbop.yaml b/.ci/project-dependencies-rhbop.yaml deleted file mode 100644 index 60faddc132..0000000000 --- a/.ci/project-dependencies-rhbop.yaml +++ /dev/null @@ -1,25 +0,0 @@ -version: "2.1" - -dependencies: - - project: kiegroup/drools - - - project: kiegroup/optaplanner - dependencies: - - project: kiegroup/drools - - - project: kiegroup/optaplanner-quickstarts - dependencies: - - project: kiegroup/optaplanner - mapping: - dependencies: - default: - - source: 8.x - target: main - dependant: - default: - - source: main - target: 8.x - - - project: jboss-integration/rhbop-optaplanner - dependencies: - - project: kiegroup/optaplanner-quickstarts \ No newline at end of file diff --git a/.ci/pull-request-config-rhbop.yaml b/.ci/pull-request-config-rhbop.yaml deleted file mode 100644 index f1baa3c7df..0000000000 --- a/.ci/pull-request-config-rhbop.yaml +++ /dev/null @@ -1,35 +0,0 @@ -version: "2.1" - -dependencies: ./project-dependencies-rhbop.yaml - -pre: | - export BUILD_MVN_OPTS="${{ env.BUILD_MVN_OPTS }} -nsu -ntp -fae -e -DskipTests=true -Dproductized=true -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.count=3" - echo "BUILD_MVN_OPTS=${{ env.BUILD_MVN_OPTS }}" - export BUILD_MVN_OPTS_CURRENT="${{ env.BUILD_MVN_OPTS_CURRENT }} dependency:tree" - echo "BUILD_MVN_OPTS_CURRENT=${{ env.BUILD_MVN_OPTS_CURRENT }}" -default: - build-command: - current: mvn clean install ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_CURRENT }} - upstream: mvn clean install -Dquickly ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_UPSTREAM }} - after: - current: | - docker system prune -f -build: - - project: kiegroup/drools - build-command: - current: mvn clean install -Dfull ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_CURRENT }} ${{ env.DROOLS_BUILD_MVN_OPTS }} - upstream: mvn clean install -Dquickly ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_UPSTREAM }} ${{ env.DROOLS_BUILD_MVN_OPTS_UPSTREAM }} - after: - upstream: | - export DROOLS_VERSION=`mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout` - echo "DROOLS_VERSION=${{ env.DROOLS_VERSION }}" - - - project: kiegroup/optaplanner - build-command: - current: mvn clean install -Dfull ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_CURRENT }} ${{ env.OPTAPLANNER_BUILD_MVN_OPTS }} -Dversion.org.drools=${{ env.DROOLS_VERSION }} - upstream: mvn clean install -Dquickly ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_UPSTREAM }} ${{ env.OPTAPLANNER_BUILD_MVN_OPTS_UPSTREAM }} -Dversion.org.drools=${{ env.DROOLS_VERSION }} - - - project: kiegroup/optaplanner-quickstarts - build-command: - current: mvn clean install ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_CURRENT }} ${{ env.OPTAPLANNER_QUICKSTARTS_BUILD_MVN_OPTS }} -Dversion.org.drools=${{ env.DROOLS_VERSION }} - upstream: mvn clean install -Dquickly ${{ env.BUILD_MVN_OPTS }} ${{ env.BUILD_MVN_OPTS_UPSTREAM }} ${{ env..OPTAPLANNER_QUICKSTARTS_BUILD_MVN_OPTS_UPSTREAM }} -Dversion.org.drools=${{ env.DROOLS_VERSION }} \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index b76b3608fa..6be679386e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,11 +13,11 @@ a section if that type of information is not available. ### Referenced pull requests +changes that span multiple apache repositories and depend on each other. --> @@ -106,7 +106,7 @@ How to retest this PR or trigger a specific build: ### CI Status - You can check OptaPlanner repositories CI status from [Chain Status webpage](https://kiegroup.github.io/optaplanner/). + You can check OptaPlanner repositories CI status from [Chain Status webpage](https://apache.github.io/incubator-kie-optaplanner/).
diff --git a/.github/workflows/full-downstream.yml b/.github/workflows/full-downstream.yml index edb2bc13f1..aba1bd41d6 100644 --- a/.github/workflows/full-downstream.yml +++ b/.github/workflows/full-downstream.yml @@ -29,24 +29,24 @@ jobs: name: ${{ matrix.os }} - Java ${{ matrix.java-version }} - Maven steps: - name: Clean Disk Space - uses: kiegroup/kie-ci/.ci/actions/ubuntu-disk-space@main + uses: apache/incubator-kie-kogito-pipelines/.ci/actions/ubuntu-disk-space@main if: ${{ matrix.os == 'ubuntu-latest' }} - name: Support long paths if: ${{ matrix.os == 'windows-latest' }} - uses: kiegroup/kie-ci/.ci/actions/long-paths@main + uses: apache/incubator-kie-kogito-pipelines/.ci/actions/long-paths@main - name: Java and Maven Setup - uses: kiegroup/kie-ci/.ci/actions/maven@main + uses: apache/incubator-kie-kogito-pipelines/.ci/actions/maven@main with: java-version: ${{ matrix.java-version }} maven-version: ${{ matrix.maven-version }} cache-key-prefix: ${{ runner.os }}-${{ matrix.java-version }}-maven${{ matrix.maven-version }} - name: Build Chain - uses: kiegroup/kie-ci/.ci/actions/build-chain@main + uses: apache/incubator-kie-kogito-pipelines/.ci/actions/build-chain@main with: - definition-file: https://raw.githubusercontent.com/${GROUP:kiegroup}/optaplanner/${BRANCH:main}/.ci/buildchain-config.yaml + definition-file: https://raw.githubusercontent.com/${GROUP:apache}/incubator-kie-optaplanner/${BRANCH:main}/.ci/buildchain-config.yaml annotations-prefix: ${{ runner.os }}-${{ matrix.java-version }}/${{ matrix.maven-version }} github-token: "${{ secrets.GITHUB_TOKEN }}" flow-type: full-downstream - name: Surefire Report - uses: kiegroup/kie-ci/.ci/actions/surefire-report@main + uses: apache/incubator-kie-kogito-pipelines/.ci/actions/surefire-report@main if: ${{ always() }} diff --git a/.github/workflows/generate_status_page.yaml b/.github/workflows/generate_status_page.yaml index 041fbdd694..4774a93861 100644 --- a/.github/workflows/generate_status_page.yaml +++ b/.github/workflows/generate_status_page.yaml @@ -4,7 +4,7 @@ on: workflow_dispatch jobs: generate-status-page: - if: github.repository == 'kiegroup/optaplanner' + if: github.repository == 'apache/incubator-kie-optaplanner' concurrency: group: generate-status-page cancel-in-progress: true @@ -18,6 +18,6 @@ jobs: - name: Generate status page uses: kiegroup/chain-status/.ci/actions/generate-app@main with: - info-md-url: "https://raw.githubusercontent.com/kiegroup/optaplanner/main/.ci/chain-status-info.md" + info-md-url: "https://raw.githubusercontent.com/apache/incubator-kie-optaplanner/main/.ci/chain-status-info.md" github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/generate_status_page_data.yaml b/.github/workflows/generate_status_page_data.yaml index 65aeb72291..8af962d554 100644 --- a/.github/workflows/generate_status_page_data.yaml +++ b/.github/workflows/generate_status_page_data.yaml @@ -6,7 +6,7 @@ on: - cron: '0 * * * *' jobs: generate-status-page-data: - if: github.repository == 'kiegroup/optaplanner' + if: github.repository == 'apache/incubator-kie-optaplanner' concurrency: group: generate-status-page-data cancel-in-progress: true @@ -20,11 +20,11 @@ jobs: - name: Generate status page data uses: kiegroup/chain-status/.ci/actions/generate-data@main with: - definition-file: https://raw.githubusercontent.com/kiegroup/optaplanner/main/.ci/builchain-config.yaml + definition-file: https://raw.githubusercontent.com/apache/incubator-kie-optaplanner/main/.ci/builchain-config.yaml title: Pull Request Status subtitle: OptaPlanner organization repositories CI Status base-branch-filter: main,8\.* - project-filter: kiegroup/opta.*$ + project-filter: apache/incubator-kie-opta.*$ created-by: GitHub Action created-url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/jenkins-tests-PR.yml b/.github/workflows/jenkins-tests-PR.yml index 09ff92f65c..c83cc488e9 100644 --- a/.github/workflows/jenkins-tests-PR.yml +++ b/.github/workflows/jenkins-tests-PR.yml @@ -20,6 +20,6 @@ jobs: uses: kiegroup/kie-ci/.ci/actions/dsl-tests@main with: project: optaplanner - main-config-file-repo: kiegroup/optaplanner + main-config-file-repo: apache/incubator-kie-optaplanner main-config-file-path: .ci/jenkins/config/main.yaml - branch-config-file-repo: kiegroup/optaplanner + branch-config-file-repo: apache/incubator-kie-optaplanner diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index c64e99628f..04e6d7ba82 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -59,9 +59,9 @@ jobs: # maven-assembly-plugin occasionally fails on heap space when building the ZIP in optaplanner-docs MAVEN_OPTS: "-Xmx2048m" with: - definition-file: https://raw.githubusercontent.com/${GROUP:kiegroup}/optaplanner/${BRANCH:main}/.ci/buildchain-config.yaml + definition-file: https://raw.githubusercontent.com/${GROUP:apache}/incubator-kie-optaplanner/${BRANCH:main}/.ci/buildchain-config.yaml annotations-prefix: ${{ runner.os }}-${{ matrix.java-version }}/${{ matrix.maven-version }} - starting-project: kiegroup/optaplanner + starting-project: apache/incubator-kie-optaplanner flow-type: ${{ env.FLOW_TYPE }} github-token: "${{ secrets.GITHUB_TOKEN }}" - name: Surefire Report diff --git a/.github/workflows/rhbop_productized_pull_request.yml b/.github/workflows/rhbop_productized_pull_request.yml deleted file mode 100644 index f9d97586d2..0000000000 --- a/.github/workflows/rhbop_productized_pull_request.yml +++ /dev/null @@ -1,58 +0,0 @@ -# Tests RHBOP productized profile builds on PRs -name: Productized Build Chain - -on: - pull_request: - types: [opened, synchronize, reopened, labeled] - branches: - - main - - 8.* - paths-ignore: - - 'LICENSE*' - - '.gitignore' - - '**.md' - - '**.adoc' - - '*.txt' - - '.ci/jenkins/**' - -defaults: - run: - shell: bash - -jobs: - productized-build-chain: - concurrency: - group: rhbop_pull_request-${{ github.event_name }}-${{ github.head_ref }}-${{ matrix.os }}-${{ matrix.java-version }} - cancel-in-progress: true - timeout-minutes: 120 - strategy: - matrix: - os: [ubuntu-latest] - java-version: [11] - maven-version: ['3.8.7'] - fail-fast: false - runs-on: ${{ matrix.os }} - name: ${{ matrix.os }} - Java ${{ matrix.java-version }} - Maven - steps: - - name: Clean Disk Space - uses: kiegroup/kie-ci/.ci/actions/ubuntu-disk-space@main - - name: Java and Maven Setup - uses: kiegroup/kie-ci/.ci/actions/maven@main - with: - java-version: ${{ matrix.java-version }} - maven-version: ${{ matrix.maven-version }} - cache-key-prefix: ${{ runner.os }}-${{ matrix.java-version }}-maven${{ matrix.maven-version }} - - name: Productized Build Chain - uses: kiegroup/kie-ci/.ci/actions/build-chain@main - env: - # maven-assembly-plugin occasionally fails on heap space when building the ZIP in optaplanner-docs - MAVEN_OPTS: "-Xmx2048m" - with: - definition-file: https://raw.githubusercontent.com/${GROUP:kiegroup}/optaplanner/${BRANCH:main}/.ci/pull-request-config-rhbop.yaml - annotations-prefix: ${{ runner.os }}-${{ matrix.java-version }}/${{ matrix.maven-version }} - github-token: "${{ secrets.GITHUB_TOKEN }}" - - name: Surefire Report - uses: kiegroup/kie-ci/.ci/actions/surefire-report@main - if: ${{ always() }} - with: - report_paths: '**/*-reports/TEST-*.xml'