[sysadmin/ci-tooling] /: Fully purge support for Qt 5.12 and Qt 5.13 builds from the CI infrastructure.

Ben Cooksley null at kde.org
Fri Nov 27 07:54:10 GMT 2020


Git commit d09a4d5a149eb1c7f47bd7323fadcb2f21c7e3e0 by Ben Cooksley.
Committed on 27/11/2020 at 07:54.
Pushed by bcooksley into branch 'master'.

Fully purge support for Qt 5.12 and Qt 5.13 builds from the CI infrastructure.

CCMAIL: kde-frameworks-devel at kde.org

M  +0    -2    archive-configs/production.yaml
M  +0    -2    archive-configs/sandbox.yaml
D  +0    -9    build-specs/Applications/akonadi-SUSEQt5.12.yaml
R  +1    -1    custom-jobs/Extragear craft master SUSEQt5.14.pipeline [from: custom-jobs/Extragear craft master SUSEQt5.12.pipeline - 098% similarity]
M  +1    -1    custom-jobs/known-jobs.json
M  +0    -2    helpers/check-platform.py
M  +2    -2    helpers/extract-cmake-dependency-metadata.py
M  +2    -2    helpers/generate-dependency-diagram-data.py
M  +1    -1    local-metadata/abi-compliance-checker.yaml
M  +0    -6    local-metadata/project-ignore-rules.yaml
D  +0    -212  pipeline-templates/Frameworks/SUSEQt5.12.template
D  +0    -1    pipeline-templates/Frameworks/SUSEQt5.13.template
M  +1    -1    pipeline-templates/Frameworks/SUSEQt5.14.template
T  +212  -1    pipeline-templates/Frameworks/SUSEQt5.15.template
D  +0    -192  pipeline-templates/SUSEQt5.12.template
D  +0    -1    pipeline-templates/SUSEQt5.13.template
M  +1    -1    pipeline-templates/SUSEQt5.14.template
T  +192  -1    pipeline-templates/SUSEQt5.15.template
M  +1    -1    pipeline-templates/dependency-build/AndroidQt5.15.template
D  +0    -65   pipeline-templates/dependency-build/SUSEQt5.12.template
D  +0    -1    pipeline-templates/dependency-build/SUSEQt5.13.template
M  +1    -1    pipeline-templates/dependency-build/SUSEQt5.14.template
T  +65   -1    pipeline-templates/dependency-build/SUSEQt5.15.template
D  +0    -217  system-images/suse-qt512/Dockerfile
D  +0    -221  system-images/suse-qt513/Dockerfile

https://invent.kde.org/sysadmin/ci-tooling/commit/d09a4d5a149eb1c7f47bd7323fadcb2f21c7e3e0

diff --git a/archive-configs/production.yaml b/archive-configs/production.yaml
index 11de746..33d5176 100644
--- a/archive-configs/production.yaml
+++ b/archive-configs/production.yaml
@@ -10,8 +10,6 @@ server:
 
 cacheLocation:
   WindowsMSVCQt5.15: "C:\\CI\\archives\\WindowsMSVCQt5.15\\"
-  SUSEQt5.12: "/srv/archives/production/SUSEQt5.12/"
-  SUSEQt5.13: "/srv/archives/production/SUSEQt5.13/"
   SUSEQt5.14: "/srv/archives/production/SUSEQt5.14/"
   SUSEQt5.15: "/srv/archives/production/SUSEQt5.15/"
   FreeBSDQt5.15: "/usr/home/jenkins/archives/production/"
diff --git a/archive-configs/sandbox.yaml b/archive-configs/sandbox.yaml
index 80bb5c8..d719e8c 100644
--- a/archive-configs/sandbox.yaml
+++ b/archive-configs/sandbox.yaml
@@ -10,8 +10,6 @@ server:
 
 cacheLocation:
   WindowsMSVCQt5.15: "C:\\CI\\sandbox-archives\\WindowsMSVCQt5.15\\"
-  SUSEQt5.12: "/srv/archives/sandbox/SUSEQt5.12/"
-  SUSEQt5.13: "/srv/archives/sandbox/SUSEQt5.13/"
   SUSEQt5.14: "/srv/archives/sandbox/SUSEQt5.14/"
   SUSEQt5.15: "/srv/archives/sandbox/SUSEQt5.15/"
   FreeBSDQt5.15: "/usr/home/jenkins/archives/sandbox/"
diff --git a/build-specs/Applications/akonadi-SUSEQt5.12.yaml b/build-specs/Applications/akonadi-SUSEQt5.12.yaml
deleted file mode 100644
index d8b7697..0000000
--- a/build-specs/Applications/akonadi-SUSEQt5.12.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-kf5-qt5:
-  "ctest-arguments": "--verbose"
-  run-tests: True
-  per-test-timeout: 60
-
-stable-kf5-qt5:
-  "ctest-arguments": "--verbose"
-  run-tests: True
-  per-test-timeout: 60
diff --git a/custom-jobs/Extragear craft master SUSEQt5.12.pipeline b/custom-jobs/Extragear craft master SUSEQt5.14.pipeline
similarity index 98%
rename from custom-jobs/Extragear craft master SUSEQt5.12.pipeline
rename to custom-jobs/Extragear craft master SUSEQt5.14.pipeline
index 63dc9ba..e7e94cf 100644
--- a/custom-jobs/Extragear craft master SUSEQt5.12.pipeline	
+++ b/custom-jobs/Extragear craft master SUSEQt5.14.pipeline	
@@ -1,5 +1,5 @@
 // Request a node to be allocated to us
-node( "SUSEQt5.12" ) {
+node( "SUSEQt5.14" ) {
 // We want Timestamps on everything
 timestamps {
 	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
diff --git a/custom-jobs/known-jobs.json b/custom-jobs/known-jobs.json
index 22d41e6..d4bb552 100644
--- a/custom-jobs/known-jobs.json
+++ b/custom-jobs/known-jobs.json
@@ -1,3 +1,3 @@
 [
-	{"name": "Extragear craft master SUSEQt5.12"}
+	{"name": "Extragear craft master SUSEQt5.14"}
 ]
diff --git a/helpers/check-platform.py b/helpers/check-platform.py
index 6e2fb26..d6832ab 100644
--- a/helpers/check-platform.py
+++ b/helpers/check-platform.py
@@ -11,8 +11,6 @@ parser.add_argument('metainfo', nargs='+', help='metainfo.yaml files', type=str)
 arguments = parser.parse_args()
 
 allPlatforms = {
-    'SUSEQt5.12': 'Linux',
-    'SUSEQt5.13': 'Linux',
     'SUSEQt5.14': 'Linux',
     'SUSEQt5.15': 'Linux',
     'FreeBSDQt5.15': 'FreeBSD',
diff --git a/helpers/extract-cmake-dependency-metadata.py b/helpers/extract-cmake-dependency-metadata.py
index 12ef47c..408b52a 100755
--- a/helpers/extract-cmake-dependency-metadata.py
+++ b/helpers/extract-cmake-dependency-metadata.py
@@ -26,8 +26,8 @@ sourcesLocation = os.getcwd()
 buildLocation = CommonUtils.buildDirectoryForSources( sources=sourcesLocation, inSourceBuild=buildSpecification['in-source-build'] )
 
 # Are we allowed to run?
-# We only gather this metadata from the principal Linux platform, which at the moment is SUSEQt5.12 for Frameworks and everyone else
-if arguments.platform != 'SUSEQt5.12':
+# We only gather this metadata from the principal Linux platform, which at the moment is SUSEQt5.14 for Frameworks and everyone else
+if arguments.platform != 'SUSEQt5.14':
 	# Then there is nothing for us to do
 	sys.exit(0)
 
diff --git a/helpers/generate-dependency-diagram-data.py b/helpers/generate-dependency-diagram-data.py
index fc441eb..e70c600 100755
--- a/helpers/generate-dependency-diagram-data.py
+++ b/helpers/generate-dependency-diagram-data.py
@@ -22,8 +22,8 @@ buildEnvironment = EnvironmentHandler.generateFor( installPrefix=arguments.using
 sourcesLocation = os.getcwd()
 
 # Are we allowed to run?
-# We only gather this metadata from the principal Linux platform, which at the moment is SUSEQt5.12 for everything
-if arguments.platform != 'SUSEQt5.12':
+# We only gather this metadata from the principal Linux platform, which at the moment is SUSEQt5.14 for everything
+if arguments.platform != 'SUSEQt5.14':
 	# Then there is nothing for us to do
 	sys.exit(0)
 
diff --git a/local-metadata/abi-compliance-checker.yaml b/local-metadata/abi-compliance-checker.yaml
index 5573d9b..45510e3 100644
--- a/local-metadata/abi-compliance-checker.yaml
+++ b/local-metadata/abi-compliance-checker.yaml
@@ -26,7 +26,7 @@
     checkABIDumpFailHard: False
     NoLibrariesFoundFail: False
 
-#   "SUSEQt5.12": # special settings for one platform
+#   "SUSEQt5.14": # special settings for one platform
 #     gcc_options:
 #       - something
 #       - nextsetting
diff --git a/local-metadata/project-ignore-rules.yaml b/local-metadata/project-ignore-rules.yaml
index 186f153..cc479ff 100644
--- a/local-metadata/project-ignore-rules.yaml
+++ b/local-metadata/project-ignore-rules.yaml
@@ -1,9 +1,3 @@
-'SUSEQt5.12':
-- 'kdesupport/qca'
-
-'SUSEQt5.13':
-- 'kdesupport/qca'
-
 'SUSEQt5.14':
 - 'kdesupport/qca'
 
diff --git a/pipeline-templates/Frameworks/SUSEQt5.12.template b/pipeline-templates/Frameworks/SUSEQt5.12.template
deleted file mode 100644
index 9d5571c..0000000
--- a/pipeline-templates/Frameworks/SUSEQt5.12.template
+++ /dev/null
@@ -1,212 +0,0 @@
-// Provisionally mark the build as successful
-currentBuild.result = 'SUCCESS'
-
-// Request a node to be allocated to us
-node( currentPlatform ) {
-// We want Timestamps on everything
-timestamps {
-	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
-	catchError {
-		// First Thing: Checkout Sources
-		stage('Checkout Sources') {
-
-			// Actual Application Sources
-			checkout changelog: true, poll: true, scm: [
-				$class: 'GitSCM',
-				branches: [[name: branchToBuild]],
-				browser: [$class: 'CGit', repoUrl: browserUrl],
-				extensions: [[$class: 'CloneOption', timeout: 120]],
-				userRemoteConfigs: [[url: repositoryUrl]]
-			]
-
-			// Our CI scripts
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/ci-tooling.git']]
-			]
-
-			// Projects metadata and next generation dependency metadata
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/repo-metadata/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/repo-metadata.git']]
-			]
-
-			// KApiDox Tooling for Capturing Dependency Information
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/kapidox/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/frameworks/kapidox.git']]
-			]
-
-		}
-
-		// Now Prepare to Build: Get the dependencies ready
-		stage('Setup Dependencies') {
-			// Now we can determine what our dependencies are
-			// Then update to the latest version of the dependencies available from the master server
-			// Finally extract all of those dependencies in turn into the given 'installTo' directory
-			sh "python3 -u ci-tooling/helpers/prepare-dependencies.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
-		}
-
-		// Now we can configure our build
-		stage('Configuring Build') {
-			// This is delegated through a helper script to handle minor special cases like inSourceBuilds, non-CMake build systems, etc
-			sh "python3 -u ci-tooling/helpers/configure-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
-		}
-
-		// Finally we can build it! (Once again, through a helper)
-		stage('Compiling') {
-			// We use a helper here so we can determine the appropriate number of CPUs (-j) to build with
-			sh "python3 -u ci-tooling/helpers/compile-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-		}
-
-		// Now we can run our tests
-		stage('Running Tests') {
-			// Run the unit tests for this project
-			// Tests are run in a basic environment (X, DBus)
-			sh "python3 -u ci-tooling/helpers/run-tests.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-
-			// Collect our results
-			junit allowEmptyResults: true, testResults: 'JUnitTestResults.xml'
-		}
-
-		// Now ensure that it installs....
-		stage('Installing') {
-			// The helper ensures that DESTDIR and INSTALL_ROOT are set to 'divertTo'
-			// This allows us to capture the install at the next stage for later reuse in the Setup Dependencies step
-			sh "python3 -u ci-tooling/helpers/install-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/' --divertTo '$WORKSPACE/install-divert/'"
-		}
-
-		// Looks like it built okay - let's capture this for later use
-		// We'll also take the opportunity to extract metadata from CMake used by packagers and api.kde.org
-		stage('Capturing Installation') {
-			// First we create a tar archive of the installation which was diverted
-			// Then we upload a copy of that to the master server and have it publish the new archive
-			// Finally to save bandwidth our copy of the tar archive is moved to our local cache for reuse on later builds on this node
-			sh "python3 -u ci-tooling/helpers/capture-install.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --divertedTo '$WORKSPACE/install-divert/' --installedTo '$HOME/install-prefix/'"
-
-			// Capture information for later use by the API Documentation Generation system
-			sh "python3 -u ci-tooling/helpers/capture-dependency-diagram-data.py --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' || true"
-
-			// Now we extract the CMake metadata and upload that to the appropriate hosts
-			sh "python3 -u ci-tooling/helpers/extract-cmake-dependency-metadata.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-			//sh "python3 -u ci-tooling/helpers/generate-dependency-diagram-data.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-		}
-
-		// Final thing to do: some code quality checks
-		stage('Checking Code Quality') {
-
-			// Perform Appstream Compliance Checks
-			sh "python3 -u ci-tooling/helpers/check-appstream-compliance.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' --withDiverted '$WORKSPACE/install-divert/'"
-
-			// Gather ABI Reference information for later checking
-			sh """
-				curl '$BUILD_URL/consoleText' -o currentBuildLog.txt
-				python3 -u ci-tooling/helpers/create-abi-dump.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --buildLog currentBuildLog.txt --environment production --usingInstall '$HOME/install-prefix/' || true
-			"""
-
-			// Save the ABI build logs to review if necessary
-			archiveArtifacts artifacts: 'logs/*/*/log.txt', onlyIfSuccessful: false, allowEmptyArchive: true
-			// Save the input for ACC for building abi dumps locally
-			archiveArtifacts artifacts: 'acc/*.xml', onlyIfSuccessful: false, allowEmptyArchive: true
-
-			// Now perform the ABI Compatibility checks
-			// This tool will produce reports stored at compat_reports/ which we will also need to capture
-			sh """
-				python3 -u ci-tooling/helpers/check-abi.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --environment production || true
-			"""
-			// Save the ABI Compatibility reports for developers to review if necessary
-			archiveArtifacts artifacts: 'compat_reports/*_compat_report.html', onlyIfSuccessful: false, allowEmptyArchive: true
-
-			// Save the ABI Compatibility results yaml file
-			archiveArtifacts artifacts: 'abi-compatibility-results.yaml', onlyIfSuccessful: false, allowEmptyArchive: true
-
-			// Platform Enablement Checks
-			// Frameworks have a metadata file which specifies the platforms it supports and should be built on
-			// This check compares that metadata file against the records held by the CI system 
-			sh """
-				touch PlatformCheckOutput.txt
-				if [[ -e metainfo.yaml ]]; then python3 ci-tooling/helpers/check-platform.py '$WORKSPACE/metainfo.yaml' &> PlatformCheckOutput.txt; fi
-			"""
-
-			// If the platform check indicates there are missing platforms then we should flag the build as unstable
-			// We start this process by reading the output of the check command
-			def platformCheckResult = readFile "${env.WORKSPACE}/PlatformCheckOutput.txt"
-			// Then we check to see if it had anything in it - it will be empty if everything is okay
-			if( platformCheckResult != '' ) {
-				// If it does, then mark the build as unstable
-				currentBuild.result = 'UNSTABLE'
-				// We also print the check results so it can be examined easily
-				echo platformCheckResult
-			}
-
-			// cppcheck is not supported by Pipeline at the moment, so we don't run that for now
-			// See https://issues.jenkins-ci.org/browse/JENKINS-35096
-
-			// Perform Cobertura Processing
-			// First, run the LCov extraction
-			sh "python3 -u ci-tooling/helpers/extract-lcov-results.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform}"
-
-			// Collect the results from the LCov extraction
-			step([
-				$class: 'CoberturaPublisher',
-				autoUpdateHealth: false, autoUpdateStability: false,
-				coberturaReportFile: 'CoberturaLcovResults.xml',
-				failNoReports: false, failUnhealthy: false, failUnstable: false,
-				maxNumberOfBuilds: 0,
-				onlyStable: false,
-				zoomCoverageChart: false
-			])
-
-			// Scan the logs and publish a warnings report
-			warnings consoleParsers: [[parserName: 'GNU Make + GNU C Compiler (gcc)'], [parserName: 'Appstreamercli']], excludePattern: "/tmp/**|/home/jenkins/workspace/**/build/**|/usr/include/**"
-
-		}
-
-	}
-
-	// Let's determine if we need to send out notifications
-	// What happened in our previous build?
-	def previousResult = currentBuild.previousBuild?.result
-	// If our condition has changed, is FAILURE or UNSTABLE then we want to send an email
-	if( previousResult != currentBuild.result || currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE' ) {
-		// Start constructing the list of our recipients
-		// At this point we can only be either a failure or an unstable build, so notify those who have requested unstable build notifications
-		def mailTo = [ unstableBuildEmails ]
-
-		// If the build was a solid failure (either now or previously) then notify those who want to know about failures only
-		if( previousResult == 'FAILURE' || currentBuild.result == 'FAILURE' ) {
-			// Add them to the list
-			mailTo << buildFailureEmails
-		}
-
-		// If someone kicked this job off, they're presumably interested as well
-		mailTo << emailextrecipients( [[$class: 'RequesterRecipientProvider']] )
-		// We always want to notify our dashboard as well
-		mailTo << "kde-dashboard at kde.org"
-
-		// Finalise the list of recipients
-		mailTo = mailTo.join(',')
-
-		// Send the email now
-		emailext(
-			to: mailTo,
-			body: '${JELLY_SCRIPT,template="html_gmail"}',
-			mimeType: 'text/html',
-			subject: 'KDE CI: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', 
-			attachLog: false
-		)
-	}
-
-	// IRC Notifications are currently not supported by Pipeline
-	// See https://issues.jenkins-ci.org/browse/JENKINS-33922
-	// We can probably workaround this using Pursuivant and the emails Jenkins sends out
-	// This would allow subscribing to build notifications for IRC channels in much the same way one subscribes for Commits and Bugzilla changes
-
-}
-}
diff --git a/pipeline-templates/Frameworks/SUSEQt5.13.template b/pipeline-templates/Frameworks/SUSEQt5.13.template
deleted file mode 120000
index d9efd28..0000000
--- a/pipeline-templates/Frameworks/SUSEQt5.13.template
+++ /dev/null
@@ -1 +0,0 @@
-SUSEQt5.12.template
\ No newline at end of file
diff --git a/pipeline-templates/Frameworks/SUSEQt5.14.template b/pipeline-templates/Frameworks/SUSEQt5.14.template
index d9efd28..7aa4679 120000
--- a/pipeline-templates/Frameworks/SUSEQt5.14.template
+++ b/pipeline-templates/Frameworks/SUSEQt5.14.template
@@ -1 +1 @@
-SUSEQt5.12.template
\ No newline at end of file
+SUSEQt5.15.template
\ No newline at end of file
diff --git a/pipeline-templates/Frameworks/SUSEQt5.15.template b/pipeline-templates/Frameworks/SUSEQt5.15.template
deleted file mode 120000
index d9efd28..0000000
--- a/pipeline-templates/Frameworks/SUSEQt5.15.template
+++ /dev/null
@@ -1 +0,0 @@
-SUSEQt5.12.template
\ No newline at end of file
diff --git a/pipeline-templates/Frameworks/SUSEQt5.15.template b/pipeline-templates/Frameworks/SUSEQt5.15.template
new file mode 100644
index 0000000..9d5571c
--- /dev/null
+++ b/pipeline-templates/Frameworks/SUSEQt5.15.template
@@ -0,0 +1,212 @@
+// Provisionally mark the build as successful
+currentBuild.result = 'SUCCESS'
+
+// Request a node to be allocated to us
+node( currentPlatform ) {
+// We want Timestamps on everything
+timestamps {
+	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
+	catchError {
+		// First Thing: Checkout Sources
+		stage('Checkout Sources') {
+
+			// Actual Application Sources
+			checkout changelog: true, poll: true, scm: [
+				$class: 'GitSCM',
+				branches: [[name: branchToBuild]],
+				browser: [$class: 'CGit', repoUrl: browserUrl],
+				extensions: [[$class: 'CloneOption', timeout: 120]],
+				userRemoteConfigs: [[url: repositoryUrl]]
+			]
+
+			// Our CI scripts
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/ci-tooling.git']]
+			]
+
+			// Projects metadata and next generation dependency metadata
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/repo-metadata/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/repo-metadata.git']]
+			]
+
+			// KApiDox Tooling for Capturing Dependency Information
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/kapidox/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/frameworks/kapidox.git']]
+			]
+
+		}
+
+		// Now Prepare to Build: Get the dependencies ready
+		stage('Setup Dependencies') {
+			// Now we can determine what our dependencies are
+			// Then update to the latest version of the dependencies available from the master server
+			// Finally extract all of those dependencies in turn into the given 'installTo' directory
+			sh "python3 -u ci-tooling/helpers/prepare-dependencies.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
+		}
+
+		// Now we can configure our build
+		stage('Configuring Build') {
+			// This is delegated through a helper script to handle minor special cases like inSourceBuilds, non-CMake build systems, etc
+			sh "python3 -u ci-tooling/helpers/configure-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
+		}
+
+		// Finally we can build it! (Once again, through a helper)
+		stage('Compiling') {
+			// We use a helper here so we can determine the appropriate number of CPUs (-j) to build with
+			sh "python3 -u ci-tooling/helpers/compile-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+		}
+
+		// Now we can run our tests
+		stage('Running Tests') {
+			// Run the unit tests for this project
+			// Tests are run in a basic environment (X, DBus)
+			sh "python3 -u ci-tooling/helpers/run-tests.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+
+			// Collect our results
+			junit allowEmptyResults: true, testResults: 'JUnitTestResults.xml'
+		}
+
+		// Now ensure that it installs....
+		stage('Installing') {
+			// The helper ensures that DESTDIR and INSTALL_ROOT are set to 'divertTo'
+			// This allows us to capture the install at the next stage for later reuse in the Setup Dependencies step
+			sh "python3 -u ci-tooling/helpers/install-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/' --divertTo '$WORKSPACE/install-divert/'"
+		}
+
+		// Looks like it built okay - let's capture this for later use
+		// We'll also take the opportunity to extract metadata from CMake used by packagers and api.kde.org
+		stage('Capturing Installation') {
+			// First we create a tar archive of the installation which was diverted
+			// Then we upload a copy of that to the master server and have it publish the new archive
+			// Finally to save bandwidth our copy of the tar archive is moved to our local cache for reuse on later builds on this node
+			sh "python3 -u ci-tooling/helpers/capture-install.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --divertedTo '$WORKSPACE/install-divert/' --installedTo '$HOME/install-prefix/'"
+
+			// Capture information for later use by the API Documentation Generation system
+			sh "python3 -u ci-tooling/helpers/capture-dependency-diagram-data.py --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' || true"
+
+			// Now we extract the CMake metadata and upload that to the appropriate hosts
+			sh "python3 -u ci-tooling/helpers/extract-cmake-dependency-metadata.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+			//sh "python3 -u ci-tooling/helpers/generate-dependency-diagram-data.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+		}
+
+		// Final thing to do: some code quality checks
+		stage('Checking Code Quality') {
+
+			// Perform Appstream Compliance Checks
+			sh "python3 -u ci-tooling/helpers/check-appstream-compliance.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' --withDiverted '$WORKSPACE/install-divert/'"
+
+			// Gather ABI Reference information for later checking
+			sh """
+				curl '$BUILD_URL/consoleText' -o currentBuildLog.txt
+				python3 -u ci-tooling/helpers/create-abi-dump.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --buildLog currentBuildLog.txt --environment production --usingInstall '$HOME/install-prefix/' || true
+			"""
+
+			// Save the ABI build logs to review if necessary
+			archiveArtifacts artifacts: 'logs/*/*/log.txt', onlyIfSuccessful: false, allowEmptyArchive: true
+			// Save the input for ACC for building abi dumps locally
+			archiveArtifacts artifacts: 'acc/*.xml', onlyIfSuccessful: false, allowEmptyArchive: true
+
+			// Now perform the ABI Compatibility checks
+			// This tool will produce reports stored at compat_reports/ which we will also need to capture
+			sh """
+				python3 -u ci-tooling/helpers/check-abi.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --environment production || true
+			"""
+			// Save the ABI Compatibility reports for developers to review if necessary
+			archiveArtifacts artifacts: 'compat_reports/*_compat_report.html', onlyIfSuccessful: false, allowEmptyArchive: true
+
+			// Save the ABI Compatibility results yaml file
+			archiveArtifacts artifacts: 'abi-compatibility-results.yaml', onlyIfSuccessful: false, allowEmptyArchive: true
+
+			// Platform Enablement Checks
+			// Frameworks have a metadata file which specifies the platforms it supports and should be built on
+			// This check compares that metadata file against the records held by the CI system 
+			sh """
+				touch PlatformCheckOutput.txt
+				if [[ -e metainfo.yaml ]]; then python3 ci-tooling/helpers/check-platform.py '$WORKSPACE/metainfo.yaml' &> PlatformCheckOutput.txt; fi
+			"""
+
+			// If the platform check indicates there are missing platforms then we should flag the build as unstable
+			// We start this process by reading the output of the check command
+			def platformCheckResult = readFile "${env.WORKSPACE}/PlatformCheckOutput.txt"
+			// Then we check to see if it had anything in it - it will be empty if everything is okay
+			if( platformCheckResult != '' ) {
+				// If it does, then mark the build as unstable
+				currentBuild.result = 'UNSTABLE'
+				// We also print the check results so it can be examined easily
+				echo platformCheckResult
+			}
+
+			// cppcheck is not supported by Pipeline at the moment, so we don't run that for now
+			// See https://issues.jenkins-ci.org/browse/JENKINS-35096
+
+			// Perform Cobertura Processing
+			// First, run the LCov extraction
+			sh "python3 -u ci-tooling/helpers/extract-lcov-results.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform}"
+
+			// Collect the results from the LCov extraction
+			step([
+				$class: 'CoberturaPublisher',
+				autoUpdateHealth: false, autoUpdateStability: false,
+				coberturaReportFile: 'CoberturaLcovResults.xml',
+				failNoReports: false, failUnhealthy: false, failUnstable: false,
+				maxNumberOfBuilds: 0,
+				onlyStable: false,
+				zoomCoverageChart: false
+			])
+
+			// Scan the logs and publish a warnings report
+			warnings consoleParsers: [[parserName: 'GNU Make + GNU C Compiler (gcc)'], [parserName: 'Appstreamercli']], excludePattern: "/tmp/**|/home/jenkins/workspace/**/build/**|/usr/include/**"
+
+		}
+
+	}
+
+	// Let's determine if we need to send out notifications
+	// What happened in our previous build?
+	def previousResult = currentBuild.previousBuild?.result
+	// If our condition has changed, is FAILURE or UNSTABLE then we want to send an email
+	if( previousResult != currentBuild.result || currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE' ) {
+		// Start constructing the list of our recipients
+		// At this point we can only be either a failure or an unstable build, so notify those who have requested unstable build notifications
+		def mailTo = [ unstableBuildEmails ]
+
+		// If the build was a solid failure (either now or previously) then notify those who want to know about failures only
+		if( previousResult == 'FAILURE' || currentBuild.result == 'FAILURE' ) {
+			// Add them to the list
+			mailTo << buildFailureEmails
+		}
+
+		// If someone kicked this job off, they're presumably interested as well
+		mailTo << emailextrecipients( [[$class: 'RequesterRecipientProvider']] )
+		// We always want to notify our dashboard as well
+		mailTo << "kde-dashboard at kde.org"
+
+		// Finalise the list of recipients
+		mailTo = mailTo.join(',')
+
+		// Send the email now
+		emailext(
+			to: mailTo,
+			body: '${JELLY_SCRIPT,template="html_gmail"}',
+			mimeType: 'text/html',
+			subject: 'KDE CI: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', 
+			attachLog: false
+		)
+	}
+
+	// IRC Notifications are currently not supported by Pipeline
+	// See https://issues.jenkins-ci.org/browse/JENKINS-33922
+	// We can probably workaround this using Pursuivant and the emails Jenkins sends out
+	// This would allow subscribing to build notifications for IRC channels in much the same way one subscribes for Commits and Bugzilla changes
+
+}
+}
diff --git a/pipeline-templates/SUSEQt5.12.template b/pipeline-templates/SUSEQt5.12.template
deleted file mode 100644
index 2d28587..0000000
--- a/pipeline-templates/SUSEQt5.12.template
+++ /dev/null
@@ -1,192 +0,0 @@
-// Provisionally mark the build as successful
-currentBuild.result = 'SUCCESS'
-
-// Request a node to be allocated to us
-node( currentPlatform ) {
-// We want Timestamps on everything
-timestamps {
-	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
-	catchError {
-		// First Thing: Checkout Sources
-		stage('Checkout Sources') {
-
-			// Actual Application Sources
-			checkout changelog: true, poll: true, scm: [
-				$class: 'GitSCM',
-				branches: [[name: branchToBuild]],
-				browser: [$class: 'CGit', repoUrl: browserUrl],
-				extensions: [[$class: 'CloneOption', timeout: 120]],
-				userRemoteConfigs: [[url: repositoryUrl]]
-			]
-
-			// Our CI scripts
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/ci-tooling.git']]
-			]
-
-			// Projects metadata and next generation dependency metadata
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/repo-metadata/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/repo-metadata.git']]
-			]
-
-			// KApiDox Tooling for Capturing Dependency Information
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/kapidox/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/frameworks/kapidox.git']]
-			]
-
-		}
-
-		// Now Prepare to Build: Get the dependencies ready
-		stage('Setup Dependencies') {
-			// Now we can determine what our dependencies are
-			// Then update to the latest version of the dependencies available from the master server
-			// Finally extract all of those dependencies in turn into the given 'installTo' directory
-			sh "python3 -u ci-tooling/helpers/prepare-dependencies.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
-		}
-
-		// Now we can configure our build
-		stage('Configuring Build') {
-			// This is delegated through a helper script to handle minor special cases like inSourceBuilds, non-CMake build systems, etc
-			sh "python3 -u ci-tooling/helpers/configure-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
-		}
-
-		// Finally we can build it! (Once again, through a helper)
-		stage('Compiling') {
-			// We use a helper here so we can determine the appropriate number of CPUs (-j) to build with
-			sh "python3 -u ci-tooling/helpers/compile-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-		}
-
-		// Now ensure that it installs....
-		stage('Installing') {
-			// The helper ensures that DESTDIR and INSTALL_ROOT are set to 'divertTo'
-			// This allows us to capture the install at the next stage for later reuse in the Setup Dependencies step
-			sh "python3 -u ci-tooling/helpers/install-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/' --divertTo '$WORKSPACE/install-divert/'"
-		}
-
-		// Looks like it built okay - let's capture this for later use
-		// We'll also take the opportunity to extract metadata from CMake used by packagers and api.kde.org
-		stage('Capturing Installation') {
-			// First we create a tar archive of the installation which was diverted
-			// Then we upload a copy of that to the master server and have it publish the new archive
-			// Finally to save bandwidth our copy of the tar archive is moved to our local cache for reuse on later builds on this node
-			sh "python3 -u ci-tooling/helpers/capture-install.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --divertedTo '$WORKSPACE/install-divert/' --installedTo '$HOME/install-prefix/'"
-
-			// Capture information for later use by the API Documentation Generation system
-			sh "python3 -u ci-tooling/helpers/capture-dependency-diagram-data.py --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' || true"
-
-			// Now we extract the CMake metadata and upload that to the appropriate hosts
-			sh "python3 -u ci-tooling/helpers/extract-cmake-dependency-metadata.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-			//sh "python3 -u ci-tooling/helpers/generate-dependency-diagram-data.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-		}
-
-		// Now we can run our tests
-		stage('Running Tests') {
-			// Run the unit tests for this project
-			// Tests are run in a basic environment (X, DBus)
-			sh "python3 -u ci-tooling/helpers/run-tests.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
-
-			// Collect our results
-			junit allowEmptyResults: true, testResults: 'JUnitTestResults.xml'
-		}
-
-		// Final thing to do: some code quality checks
-		stage('Checking Code Quality') {
-
-			// Perform Appstream Compliance Checks
-			sh "python3 -u ci-tooling/helpers/check-appstream-compliance.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' --withDiverted '$WORKSPACE/install-divert/'"
-
-			// Gather ABI Reference information for later checking
-			sh """
-				curl '$BUILD_URL/consoleText' -o currentBuildLog.txt
-				python3 -u ci-tooling/helpers/create-abi-dump.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --buildLog currentBuildLog.txt --environment production --usingInstall '$HOME/install-prefix/' || true
-			"""
-			// Save the ABI build logs to review if necessary
-			archiveArtifacts artifacts: 'logs/*/*/log.txt', onlyIfSuccessful: false, allowEmptyArchive: true
-			// Save the input for ACC for building abi dumps locally
-			archiveArtifacts artifacts: 'acc/*.xml', onlyIfSuccessful: false, allowEmptyArchive: true
-
-			// Now perform the ABI Compatibility checks
-			// This tool will produce reports stored at compat_reports/ which we will also need to capture
-			sh """
-				python3 -u ci-tooling/helpers/check-abi.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --environment production || true
-			"""
-			// Save the ABI Compatibility reports for developers to review if necessary
-			archiveArtifacts artifacts: 'compat_reports/*_compat_report.html', onlyIfSuccessful: false, allowEmptyArchive: true
-
-			// Save the ABI Compatibility results yaml file
-			archiveArtifacts artifacts: 'abi-compatibility-results.yaml', onlyIfSuccessful: false, allowEmptyArchive: true
-
-			// cppcheck is not supported by Pipeline at the moment, so we don't run that for now
-			// See https://issues.jenkins-ci.org/browse/JENKINS-35096
-
-			// Perform Cobertura Processing
-			// First, run the LCov extraction
-			sh "python3 -u ci-tooling/helpers/extract-lcov-results.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform}"
-
-			// Collect the results from the LCov extraction
-			step([
-				$class: 'CoberturaPublisher',
-				autoUpdateHealth: false, autoUpdateStability: false,
-				coberturaReportFile: 'CoberturaLcovResults.xml',
-				failNoReports: false, failUnhealthy: false, failUnstable: false,
-				maxNumberOfBuilds: 0,
-				onlyStable: false,
-				zoomCoverageChart: false
-			])
-
-			// Scan the logs and publish a warnings report
-			warnings consoleParsers: [[parserName: 'GNU Make + GNU C Compiler (gcc)'], [parserName: 'Appstreamercli']], excludePattern: "/tmp/**|/home/jenkins/workspace/**/build/**|/usr/include/**"
-
-		}
-
-	}
-
-	// Let's determine if we need to send out notifications
-	// What happened in our previous build?
-	def previousResult = currentBuild.previousBuild?.result
-	// If our condition has changed, is FAILURE or UNSTABLE then we want to send an email
-	if( previousResult != currentBuild.result || currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE' ) {
-		// Start constructing the list of our recipients
-		// At this point we can only be either a failure or an unstable build, so notify those who have requested unstable build notifications
-		def mailTo = [ unstableBuildEmails ]
-
-		// If the build was a solid failure (either now or previously) then notify those who want to know about failures only
-		if( previousResult == 'FAILURE' || currentBuild.result == 'FAILURE' ) {
-			// Add them to the list
-			mailTo << buildFailureEmails
-		}
-
-		// If someone kicked this job off, they're presumably interested as well
-		mailTo << emailextrecipients( [[$class: 'RequesterRecipientProvider']] )
-		// We always want to notify our dashboard as well
-		mailTo << "kde-dashboard at kde.org"
-
-		// Finalise the list of recipients
-		mailTo = mailTo.join(',')
-
-		// Send the email now
-		emailext(
-			to: mailTo,
-			body: '${JELLY_SCRIPT,template="html_gmail"}',
-			mimeType: 'text/html',
-			subject: 'KDE CI: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', 
-			attachLog: false
-		)
-	}
-
-	// IRC Notifications are currently not supported by Pipeline
-	// See https://issues.jenkins-ci.org/browse/JENKINS-33922
-	// We can probably workaround this using Pursuivant and the emails Jenkins sends out
-	// This would allow subscribing to build notifications for IRC channels in much the same way one subscribes for Commits and Bugzilla changes
-
-}
-}
diff --git a/pipeline-templates/SUSEQt5.13.template b/pipeline-templates/SUSEQt5.13.template
deleted file mode 120000
index d9efd28..0000000
--- a/pipeline-templates/SUSEQt5.13.template
+++ /dev/null
@@ -1 +0,0 @@
-SUSEQt5.12.template
\ No newline at end of file
diff --git a/pipeline-templates/SUSEQt5.14.template b/pipeline-templates/SUSEQt5.14.template
index d9efd28..7aa4679 120000
--- a/pipeline-templates/SUSEQt5.14.template
+++ b/pipeline-templates/SUSEQt5.14.template
@@ -1 +1 @@
-SUSEQt5.12.template
\ No newline at end of file
+SUSEQt5.15.template
\ No newline at end of file
diff --git a/pipeline-templates/SUSEQt5.15.template b/pipeline-templates/SUSEQt5.15.template
deleted file mode 120000
index d9efd28..0000000
--- a/pipeline-templates/SUSEQt5.15.template
+++ /dev/null
@@ -1 +0,0 @@
-SUSEQt5.12.template
\ No newline at end of file
diff --git a/pipeline-templates/SUSEQt5.15.template b/pipeline-templates/SUSEQt5.15.template
new file mode 100644
index 0000000..2d28587
--- /dev/null
+++ b/pipeline-templates/SUSEQt5.15.template
@@ -0,0 +1,192 @@
+// Provisionally mark the build as successful
+currentBuild.result = 'SUCCESS'
+
+// Request a node to be allocated to us
+node( currentPlatform ) {
+// We want Timestamps on everything
+timestamps {
+	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
+	catchError {
+		// First Thing: Checkout Sources
+		stage('Checkout Sources') {
+
+			// Actual Application Sources
+			checkout changelog: true, poll: true, scm: [
+				$class: 'GitSCM',
+				branches: [[name: branchToBuild]],
+				browser: [$class: 'CGit', repoUrl: browserUrl],
+				extensions: [[$class: 'CloneOption', timeout: 120]],
+				userRemoteConfigs: [[url: repositoryUrl]]
+			]
+
+			// Our CI scripts
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/ci-tooling.git']]
+			]
+
+			// Projects metadata and next generation dependency metadata
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/repo-metadata/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/repo-metadata.git']]
+			]
+
+			// KApiDox Tooling for Capturing Dependency Information
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/kapidox/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/frameworks/kapidox.git']]
+			]
+
+		}
+
+		// Now Prepare to Build: Get the dependencies ready
+		stage('Setup Dependencies') {
+			// Now we can determine what our dependencies are
+			// Then update to the latest version of the dependencies available from the master server
+			// Finally extract all of those dependencies in turn into the given 'installTo' directory
+			sh "python3 -u ci-tooling/helpers/prepare-dependencies.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
+		}
+
+		// Now we can configure our build
+		stage('Configuring Build') {
+			// This is delegated through a helper script to handle minor special cases like inSourceBuilds, non-CMake build systems, etc
+			sh "python3 -u ci-tooling/helpers/configure-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
+		}
+
+		// Finally we can build it! (Once again, through a helper)
+		stage('Compiling') {
+			// We use a helper here so we can determine the appropriate number of CPUs (-j) to build with
+			sh "python3 -u ci-tooling/helpers/compile-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+		}
+
+		// Now ensure that it installs....
+		stage('Installing') {
+			// The helper ensures that DESTDIR and INSTALL_ROOT are set to 'divertTo'
+			// This allows us to capture the install at the next stage for later reuse in the Setup Dependencies step
+			sh "python3 -u ci-tooling/helpers/install-build.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --installTo '$HOME/install-prefix/' --divertTo '$WORKSPACE/install-divert/'"
+		}
+
+		// Looks like it built okay - let's capture this for later use
+		// We'll also take the opportunity to extract metadata from CMake used by packagers and api.kde.org
+		stage('Capturing Installation') {
+			// First we create a tar archive of the installation which was diverted
+			// Then we upload a copy of that to the master server and have it publish the new archive
+			// Finally to save bandwidth our copy of the tar archive is moved to our local cache for reuse on later builds on this node
+			sh "python3 -u ci-tooling/helpers/capture-install.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --divertedTo '$WORKSPACE/install-divert/' --installedTo '$HOME/install-prefix/'"
+
+			// Capture information for later use by the API Documentation Generation system
+			sh "python3 -u ci-tooling/helpers/capture-dependency-diagram-data.py --project ${projectName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' || true"
+
+			// Now we extract the CMake metadata and upload that to the appropriate hosts
+			sh "python3 -u ci-tooling/helpers/extract-cmake-dependency-metadata.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+			//sh "python3 -u ci-tooling/helpers/generate-dependency-diagram-data.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+		}
+
+		// Now we can run our tests
+		stage('Running Tests') {
+			// Run the unit tests for this project
+			// Tests are run in a basic environment (X, DBus)
+			sh "python3 -u ci-tooling/helpers/run-tests.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/'"
+
+			// Collect our results
+			junit allowEmptyResults: true, testResults: 'JUnitTestResults.xml'
+		}
+
+		// Final thing to do: some code quality checks
+		stage('Checking Code Quality') {
+
+			// Perform Appstream Compliance Checks
+			sh "python3 -u ci-tooling/helpers/check-appstream-compliance.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --usingInstall '$HOME/install-prefix/' --withDiverted '$WORKSPACE/install-divert/'"
+
+			// Gather ABI Reference information for later checking
+			sh """
+				curl '$BUILD_URL/consoleText' -o currentBuildLog.txt
+				python3 -u ci-tooling/helpers/create-abi-dump.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --buildLog currentBuildLog.txt --environment production --usingInstall '$HOME/install-prefix/' || true
+			"""
+			// Save the ABI build logs to review if necessary
+			archiveArtifacts artifacts: 'logs/*/*/log.txt', onlyIfSuccessful: false, allowEmptyArchive: true
+			// Save the input for ACC for building abi dumps locally
+			archiveArtifacts artifacts: 'acc/*.xml', onlyIfSuccessful: false, allowEmptyArchive: true
+
+			// Now perform the ABI Compatibility checks
+			// This tool will produce reports stored at compat_reports/ which we will also need to capture
+			sh """
+				python3 -u ci-tooling/helpers/check-abi.py --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform} --environment production || true
+			"""
+			// Save the ABI Compatibility reports for developers to review if necessary
+			archiveArtifacts artifacts: 'compat_reports/*_compat_report.html', onlyIfSuccessful: false, allowEmptyArchive: true
+
+			// Save the ABI Compatibility results yaml file
+			archiveArtifacts artifacts: 'abi-compatibility-results.yaml', onlyIfSuccessful: false, allowEmptyArchive: true
+
+			// cppcheck is not supported by Pipeline at the moment, so we don't run that for now
+			// See https://issues.jenkins-ci.org/browse/JENKINS-35096
+
+			// Perform Cobertura Processing
+			// First, run the LCov extraction
+			sh "python3 -u ci-tooling/helpers/extract-lcov-results.py --product ${productName} --project ${projectName} --branchGroup ${branchGroup} --platform ${currentPlatform}"
+
+			// Collect the results from the LCov extraction
+			step([
+				$class: 'CoberturaPublisher',
+				autoUpdateHealth: false, autoUpdateStability: false,
+				coberturaReportFile: 'CoberturaLcovResults.xml',
+				failNoReports: false, failUnhealthy: false, failUnstable: false,
+				maxNumberOfBuilds: 0,
+				onlyStable: false,
+				zoomCoverageChart: false
+			])
+
+			// Scan the logs and publish a warnings report
+			warnings consoleParsers: [[parserName: 'GNU Make + GNU C Compiler (gcc)'], [parserName: 'Appstreamercli']], excludePattern: "/tmp/**|/home/jenkins/workspace/**/build/**|/usr/include/**"
+
+		}
+
+	}
+
+	// Let's determine if we need to send out notifications
+	// What happened in our previous build?
+	def previousResult = currentBuild.previousBuild?.result
+	// If our condition has changed, is FAILURE or UNSTABLE then we want to send an email
+	if( previousResult != currentBuild.result || currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE' ) {
+		// Start constructing the list of our recipients
+		// At this point we can only be either a failure or an unstable build, so notify those who have requested unstable build notifications
+		def mailTo = [ unstableBuildEmails ]
+
+		// If the build was a solid failure (either now or previously) then notify those who want to know about failures only
+		if( previousResult == 'FAILURE' || currentBuild.result == 'FAILURE' ) {
+			// Add them to the list
+			mailTo << buildFailureEmails
+		}
+
+		// If someone kicked this job off, they're presumably interested as well
+		mailTo << emailextrecipients( [[$class: 'RequesterRecipientProvider']] )
+		// We always want to notify our dashboard as well
+		mailTo << "kde-dashboard at kde.org"
+
+		// Finalise the list of recipients
+		mailTo = mailTo.join(',')
+
+		// Send the email now
+		emailext(
+			to: mailTo,
+			body: '${JELLY_SCRIPT,template="html_gmail"}',
+			mimeType: 'text/html',
+			subject: 'KDE CI: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', 
+			attachLog: false
+		)
+	}
+
+	// IRC Notifications are currently not supported by Pipeline
+	// See https://issues.jenkins-ci.org/browse/JENKINS-33922
+	// We can probably workaround this using Pursuivant and the emails Jenkins sends out
+	// This would allow subscribing to build notifications for IRC channels in much the same way one subscribes for Commits and Bugzilla changes
+
+}
+}
diff --git a/pipeline-templates/dependency-build/AndroidQt5.15.template b/pipeline-templates/dependency-build/AndroidQt5.15.template
index d9efd28..7aa4679 120000
--- a/pipeline-templates/dependency-build/AndroidQt5.15.template
+++ b/pipeline-templates/dependency-build/AndroidQt5.15.template
@@ -1 +1 @@
-SUSEQt5.12.template
\ No newline at end of file
+SUSEQt5.15.template
\ No newline at end of file
diff --git a/pipeline-templates/dependency-build/SUSEQt5.12.template b/pipeline-templates/dependency-build/SUSEQt5.12.template
deleted file mode 100644
index 8d50aa7..0000000
--- a/pipeline-templates/dependency-build/SUSEQt5.12.template
+++ /dev/null
@@ -1,65 +0,0 @@
-// Request a node to be allocated to us
-node( currentPlatform ) {
-// We want Timestamps on everything
-timestamps {
-	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
-	catchError {
-		// First Thing: Checkout Sources
-		stage('Checkout Sources') {
-
-			// Our CI scripts
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/ci-tooling.git']]
-			]
-
-			// Projects metadata and next generation dependency metadata
-			checkout changelog: false, poll: false, scm: [
-				$class: 'GitSCM',
-				branches: [[name: 'master']],
-				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/repo-metadata/']],
-				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/repo-metadata.git']]
-			]
-
-		}
-
-		// Now we run the Product Dependency Build Process
-		stage('Build Product Dependencies') {
-			// This script will do the following:
-			// 1) Determine what is in this Product
-			// 2) Determine what those repositories depend on
-			// 3) Determine what dependencies are outside of this Product
-			// 4) Sort those dependencies into an appropriate order to build them
-			// 5) Checkout, Configure, Compile, Install and Capture the Installation each of those dependencies in turn
-			// We can't do this as Pipeline steps unfortunately (at least not easily)
-			// Tests and Other Quality Tests won't be run during this process
-			// The results of this process are only intended to be used as part of the base of this Product, so don't need testing
-			sh "python3 -u ci-tooling/helpers/build-product-dependencies.py --product ${productName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
-		}
-	}
-
-	// Let's determine if we need to send out notifications
-	// What happened in our previous build?
-	def previousResult = currentBuild.previousBuild?.result
-	// If our condition has changed, is FAILURE or UNSTABLE then we want to send an email
-	if( previousResult != currentBuild.result || currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE' ) {
-		// Construct the list of our recipients - these people always want to be notified about Dependency Build jobs
-		def mailTo = []
-		// If someone kicked this job off, they're presumably interested as well
-		mailTo << emailextrecipients( [[$class: 'RequesterRecipientProvider']] )
-		// Finalise the list of recipients
-		mailTo = mailTo.join(',')
-
-		// Send the email now
-		emailext(
-			to: mailTo,
-			body: '${JELLY_SCRIPT,template="html_gmail"}',
-			mimeType: 'text/html',
-			subject: 'KDE CI: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', 
-			attachLog: false
-		)
-	}
-}
-}
diff --git a/pipeline-templates/dependency-build/SUSEQt5.13.template b/pipeline-templates/dependency-build/SUSEQt5.13.template
deleted file mode 120000
index d9efd28..0000000
--- a/pipeline-templates/dependency-build/SUSEQt5.13.template
+++ /dev/null
@@ -1 +0,0 @@
-SUSEQt5.12.template
\ No newline at end of file
diff --git a/pipeline-templates/dependency-build/SUSEQt5.14.template b/pipeline-templates/dependency-build/SUSEQt5.14.template
index d9efd28..7aa4679 120000
--- a/pipeline-templates/dependency-build/SUSEQt5.14.template
+++ b/pipeline-templates/dependency-build/SUSEQt5.14.template
@@ -1 +1 @@
-SUSEQt5.12.template
\ No newline at end of file
+SUSEQt5.15.template
\ No newline at end of file
diff --git a/pipeline-templates/dependency-build/SUSEQt5.15.template b/pipeline-templates/dependency-build/SUSEQt5.15.template
deleted file mode 120000
index d9efd28..0000000
--- a/pipeline-templates/dependency-build/SUSEQt5.15.template
+++ /dev/null
@@ -1 +0,0 @@
-SUSEQt5.12.template
\ No newline at end of file
diff --git a/pipeline-templates/dependency-build/SUSEQt5.15.template b/pipeline-templates/dependency-build/SUSEQt5.15.template
new file mode 100644
index 0000000..8d50aa7
--- /dev/null
+++ b/pipeline-templates/dependency-build/SUSEQt5.15.template
@@ -0,0 +1,65 @@
+// Request a node to be allocated to us
+node( currentPlatform ) {
+// We want Timestamps on everything
+timestamps {
+	// We want to catch any errors that occur to allow us to send out notifications (ie. emails) if needed
+	catchError {
+		// First Thing: Checkout Sources
+		stage('Checkout Sources') {
+
+			// Our CI scripts
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/ci-tooling.git']]
+			]
+
+			// Projects metadata and next generation dependency metadata
+			checkout changelog: false, poll: false, scm: [
+				$class: 'GitSCM',
+				branches: [[name: 'master']],
+				extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'ci-tooling/repo-metadata/']],
+				userRemoteConfigs: [[url: 'https://invent.kde.org/sysadmin/repo-metadata.git']]
+			]
+
+		}
+
+		// Now we run the Product Dependency Build Process
+		stage('Build Product Dependencies') {
+			// This script will do the following:
+			// 1) Determine what is in this Product
+			// 2) Determine what those repositories depend on
+			// 3) Determine what dependencies are outside of this Product
+			// 4) Sort those dependencies into an appropriate order to build them
+			// 5) Checkout, Configure, Compile, Install and Capture the Installation each of those dependencies in turn
+			// We can't do this as Pipeline steps unfortunately (at least not easily)
+			// Tests and Other Quality Tests won't be run during this process
+			// The results of this process are only intended to be used as part of the base of this Product, so don't need testing
+			sh "python3 -u ci-tooling/helpers/build-product-dependencies.py --product ${productName} --branchGroup ${branchGroup} --environment ${ciEnvironment} --platform ${currentPlatform} --installTo '$HOME/install-prefix/'"
+		}
+	}
+
+	// Let's determine if we need to send out notifications
+	// What happened in our previous build?
+	def previousResult = currentBuild.previousBuild?.result
+	// If our condition has changed, is FAILURE or UNSTABLE then we want to send an email
+	if( previousResult != currentBuild.result || currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE' ) {
+		// Construct the list of our recipients - these people always want to be notified about Dependency Build jobs
+		def mailTo = []
+		// If someone kicked this job off, they're presumably interested as well
+		mailTo << emailextrecipients( [[$class: 'RequesterRecipientProvider']] )
+		// Finalise the list of recipients
+		mailTo = mailTo.join(',')
+
+		// Send the email now
+		emailext(
+			to: mailTo,
+			body: '${JELLY_SCRIPT,template="html_gmail"}',
+			mimeType: 'text/html',
+			subject: 'KDE CI: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', 
+			attachLog: false
+		)
+	}
+}
+}
diff --git a/system-images/suse-qt512/Dockerfile b/system-images/suse-qt512/Dockerfile
deleted file mode 100755
index 55a7632..0000000
--- a/system-images/suse-qt512/Dockerfile
+++ /dev/null
@@ -1,217 +0,0 @@
-FROM opensuse/tumbleweed
-MAINTAINER openSUSE KDE Maintainers <opensuse-kde at opensuse.org>
-
-# Add KDE:Qt:5.12 repo
-RUN zypper --non-interactive addrepo --priority 50 --refresh obs://KDE:Qt:5.12/openSUSE_Tumbleweed KDE:Qt:5.12
-# Update container, import GPG key for KUQ
-RUN zypper --non-interactive --gpg-auto-import-keys -v dup
-# Install various other packages
-RUN zypper --non-interactive install java-1_8_0-openjdk-headless python3-lxml python3-paramiko python3-PyYAML python3-simplejson php-composer php7-iconv php7-ctype php7-tokenizer php7-intl php7-dom
-# Install build dependencies
-RUN zypper --non-interactive install --recommends -t pattern devel_qt5 devel_C_C++
-# The pattern is likely not enough, so just install all Qt devel packages from KUQ
-RUN zypper -q se --not-installed-only --repo KDE:Qt:5.12 libqt5*devel libQt5*devel | tail -n +4 | cut -d "|" -f 2 | grep -v "libqt5-creator" | grep -v "libqt5-qtvirtualkeyboard-private-headers" | grep -v "libQt5HunspellInputMethod-private-headers" | grep -vi "libqt5xdg" | grep -v "libQt5Pas" | xargs zypper --non-interactive in
-# And some other useful and base packages
-RUN zypper --non-interactive in git clang python3-Sphinx python3-qt5 xvfb-run AppStream python3-pip ruby-devel libffi-devel openbox sassc \
-    # temporarily: curl needed for appstreamcli, cmp. https://bugzilla.opensuse.org/show_bug.cgi?id=1080446
-    curl \
-    # abi tracking software and it's dependencies
-    abi-compliance-checker ctags \
-    # basic Qt5 packages, which have no -devel and should be manually installed
-    libqt5-qtquickcontrols libqt5-qtquickcontrols2 libqt5-qtgraphicaleffects \
-    # Other basic Qt based libraries
-    libqca-qt5-devel \
-    # For building documentation tarballs
-    bzip2 \
-    # For image thumbnails for the KDE.org/applications subsite
-    ImageMagick \
-    # Hidden dependency of appstream tools
-    gsettings-desktop-schemas \
-    # Useful tools for static analysis
-    clazy
-RUN pip install gcovr reuse doxyqml
-RUN gem install atspi cucumber ftpd
-RUN ln -s /usr/bin/cucumber.ruby* /usr/bin/cucumber
-# KDE stuff also depends on the following
-RUN zypper --non-interactive in --allow-vendor-change \
-    # modemmanager-qt
-    ModemManager-devel \
-    # networkmanager-qt
-    NetworkManager-devel \
-    # kcoreaddons
-    lsof \
-    # kauth
-    polkit-devel \
-    # kwindowsystem
-    xcb-*-devel \
-    # prison
-    libdmtx-devel qrencode-devel \
-    # kwayland
-    wayland-devel \
-    # baloo/kfilemetadata (some for okular)
-    libattr-devel libexiv2-devel libtag-devel taglib-*-devel libepub-devel libpoppler-qt5-devel lmdb-devel \
-    # kdoctools
-    perl-URI docbook_4 docbook-xsl-stylesheets libxml2-devel libxslt-devel perl-URI \
-    # khtml
-    giflib-devel libopenssl-devel \
-    # kdelibs4support
-    libSM-devel \
-    # kdnssd
-    libavahi-devel libavahi-glib-devel libavahi-gobject-devel \
-    # khelpcenter (and pim for grantlee)
-    grantlee5-devel libxapian-devel \
-    # sonnet
-    aspell \
-    aspell-devel \
-    hunspell-devel \
-    libvoikko-devel \
-    # kio-extras and krdc
-    libssh-devel \
-    # plasma-pa
-    gconf2-devel libpulse-devel libcanberra-devel \
-    # user-manager
-    libpwquality-devel \
-    # sddm-kcm
-    libXcursor-devel \
-    # plasma-workspace
-    libXtst-devel \
-    # breeze-plymouth
-    plymouth-devel \
-    # kde-gtk-config/breeze-gtk
-    gtk3-devel gtk2-devel python3-cairo \
-    # plasma-desktop/discover
-    libAppStreamQt-devel fwupd-devel \
-    # plasma-desktop
-    xf86-input-synaptics-devel xf86-input-evdev-devel libxkbfile-devel xorg-x11-server-sdk \
-    # kimpanel
-    ibus-devel scim-devel \
-    # libksane
-    sane-backends-devel \
-    # pim
-    libical-devel libkolabxml-devel libxerces-c-devel \
-    # <misc>
-    alsa-devel libraw-devel fftw3-devel adobe-sourcecodepro-fonts \
-    # choqok
-    qoauth-qt5-devel qtkeychain-qt5-devel \
-    # krita
-    eigen3-devel OpenColorIO-devel dejavu-fonts gnu-free-fonts quazip-devel \
-    # kaccounts / telepathy
-    libaccounts-qt5-devel libaccounts-glib-devel libsignon-qt5-devel intltool \
-    # skrooge
-    sqlcipher sqlcipher-devel sqlite3-devel sqlite3 libofx-devel poppler-tools \
-    # kwin
-    libepoxy-devel Mesa-demo Mesa-demo-x xorg-x11-server-extra dmz-icon-theme-cursors libgbm-devel weston \
-    xorg-x11-server-wayland \
-    # kgamma5
-    libXxf86vm-devel \
-    # kgraphviewer
-    graphviz-devel \
-    # drkonqi
-    at-spi2-core which libgirepository-1_0-1 typelib-1_0-Atspi-2_0 gobject-introspection-devel \
-    # kcalc
-    mpfr-devel \
-    # kdevelop
-    gdb \
-    # labplot
-    gsl-devel \
-    # kuserfeedback
-    php7 \
-    # digikam
-    QtAV-devel opencv-devel \
-    # wacomtablet
-    libwacom-devel \
-    xf86-input-wacom-devel \
-    # rust-qt-binding-generator
-    rust rust-std \
-    cargo \
-    # kdevelop
-    clang \
-    clang-devel \
-    llvm-devel \
-    subversion-devel \
-    python3-devel \
-    # clazy
-    clang-devel-static \
-    # libkleo
-    libqgpgme-devel \
-    # akonadi
-    mariadb libQt5Sql5-mysql \
-    # libkdegames
-    openal-soft-devel \
-    libsndfile-devel \
-    # kscd
-    libmusicbrainz-devel \
-    libmusicbrainz5-devel \
-    # ktp-common-internals (also rest of KDE Telepathy)
-    telepathy-qt5-devel \
-    # audiocd-kio
-    cdparanoia-devel \
-    # ark
-    libarchive-devel libzip-devel \
-    # ffmpegthumbs
-    ffmpeg-4-libavcodec-devel ffmpeg-4-libavfilter-devel ffmpeg-4-libavformat-devel ffmpeg-4-libavdevice-devel ffmpeg-4-libavutil-devel ffmpeg-4-libswscale-devel ffmpeg-4-libpostproc-devel \
-    # k3b
-    flac-devel \
-    libmad-devel \
-    libmp3lame-devel \
-    libogg-devel libvorbis-devel \
-    libsamplerate-devel \
-    # kamera
-    libgphoto2-devel \
-    # signon-kwallet-extension
-    libsignon-glib-devel signond-libs-devel \
-    # kdenlive
-    libmlt-devel libmlt++-devel libmlt6-modules libmlt6-data rttr-devel \
-    # print-manager
-    cups-devel \
-    # krfb
-    LibVNCServer-devel \
-    # kscd
-    libdiscid-devel \
-    # minuet
-    fluidsynth-devel \
-    # kajongg
-    python3-Twisted \
-    # okular
-    texlive-latex \
-    # ksmtp tests
-    cyrus-sasl-plain \
-    # kdb
-    libmariadb-devel postgresql-devel \
-    # Gwenview
-    cfitsio-devel \
-    # Calligra, Krita and probably other things elsewhere too
-    libboost_*-devel \
-    # Amarok
-    gmock gtest libcurl-devel libofa-devel libgpod-devel libmtp-devel loudmouth-devel liblastfm-qt5-devel libmysqld-devel \
-    # Cantor
-    libspectre-devel python3-numpy python3-matplotlib octave maxima libqalculate-devel moonjit-devel julia-devel \
-    # KPat
-    freecell-solver-devel black-hole-solver-devel \
-    # RKWard
-    R-base-devel gcc-fortran \
-    # Kaffeine
-    libdvbv5-devel vlc-devel libXss-devel \
-    # Keysmith
-    libsodium-devel \
-    # Plasma Phone Components
-    libphonenumber-devel \
-    # kquickcharts
-    glslang-devel \
-    # xdg-desktop-portal-kde
-    pipewire-devel \
-    # Spectacle
-    kImageAnnotator-devel kColorPicker-devel
-
-# For D-Bus to be willing to start it needs a Machine ID
-RUN dbus-uuidgen > /etc/machine-id
-
-# OpenSUSE has a different GID for the 'video' group compared to the Physical Ubuntu and Debian hosts
-# Therefore we create a group which matches the physical hosts 'video' group GID
-# This is necessary to allow us to grant Jenkins access to the vgem device
-RUN groupadd -g 44 docker-video
-# We need a user account to do things as, and SSHD needs keys
-RUN useradd -d /home/jenkins/ -u 1000 --user-group --create-home -G video,docker-video jenkins && /usr/sbin/sshd-gen-keys-start
-# We want to run SSHD so that Jenkins can remotely connect to this container
-EXPOSE 22
-CMD ["/usr/sbin/sshd", "-D"]
diff --git a/system-images/suse-qt513/Dockerfile b/system-images/suse-qt513/Dockerfile
deleted file mode 100755
index fb457f7..0000000
--- a/system-images/suse-qt513/Dockerfile
+++ /dev/null
@@ -1,221 +0,0 @@
-FROM opensuse/tumbleweed
-MAINTAINER openSUSE KDE Maintainers <opensuse-kde at opensuse.org>
-
-# Add KDE:Qt:5.13 repo
-RUN zypper --non-interactive addrepo --priority 50 --refresh obs://KDE:Qt:5.13/openSUSE_Tumbleweed KDE:Qt:5.13
-# Update container, import GPG key for KUQ
-RUN zypper --non-interactive --gpg-auto-import-keys -v dup
-# Install various other packages
-RUN zypper --non-interactive install java-1_8_0-openjdk-headless python3-lxml python3-paramiko python3-PyYAML python3-simplejson php-composer php7-iconv php7-ctype php7-tokenizer php7-intl php7-dom
-# Install build dependencies
-RUN zypper --non-interactive install --recommends -t pattern devel_qt5 devel_C_C++
-# The pattern is likely not enough, so just install all Qt devel packages from KUQ
-RUN zypper -q se --not-installed-only --repo KDE:Qt:5.13 libqt5*devel libQt5*devel | tail -n +4 | cut -d "|" -f 2 | grep -v "libqt5-creator" | grep -v "libqt5-qtvirtualkeyboard-private-headers" | grep -v "libQt5HunspellInputMethod-private-headers" | grep -vi "libqt5xdg" | grep -v "libQt5Pas" | xargs zypper --non-interactive in
-# And some other useful and base packages
-RUN zypper --non-interactive in git clang python3-Sphinx python3-qt5 xvfb-run AppStream python3-pip ruby-devel libffi-devel openbox sassc \
-    # temporarily: curl needed for appstreamcli, cmp. https://bugzilla.opensuse.org/show_bug.cgi?id=1080446
-    curl \
-    # abi tracking software and it's dependencies
-    abi-compliance-checker ctags \
-    # basic Qt5 packages, which have no -devel and should be manually installed
-    libqt5-qtquickcontrols libqt5-qtquickcontrols2 libqt5-qtgraphicaleffects \
-    # Other basic Qt based libraries
-    libqca-qt5-devel \
-    # For building documentation tarballs
-    bzip2 \
-    # For image thumbnails for the KDE.org/applications subsite
-    ImageMagick \
-    # Hidden dependency of appstream tools
-    gsettings-desktop-schemas \
-    # Useful tools for static analysis
-    clazy \
-    # Needed for API Documentation generation
-    graphviz-gd libqt5-qttools-qhelpgenerator
-RUN pip install gcovr reuse doxyqml
-RUN gem install atspi cucumber ftpd
-RUN ln -s /usr/bin/cucumber.ruby* /usr/bin/cucumber
-# KDE stuff also depends on the following
-RUN zypper --non-interactive in --allow-vendor-change \
-    # modemmanager-qt
-    ModemManager-devel \
-    # networkmanager-qt
-    NetworkManager-devel \
-    # kcoreaddons
-    lsof \
-    # kauth
-    polkit-devel \
-    # kwindowsystem
-    xcb-*-devel \
-    # prison
-    libdmtx-devel qrencode-devel \
-    # kwayland
-    wayland-devel \
-    # baloo/kfilemetadata (some for okular)
-    libattr-devel libexiv2-devel libtag-devel taglib-*-devel libepub-devel libpoppler-qt5-devel lmdb-devel \
-    # kdoctools
-    perl-URI docbook_4 docbook-xsl-stylesheets libxml2-devel libxslt-devel perl-URI \
-    # khtml
-    giflib-devel libopenssl-devel \
-    # kdelibs4support
-    libSM-devel \
-    # kdnssd
-    libavahi-devel libavahi-glib-devel libavahi-gobject-devel \
-    # khelpcenter (and pim for grantlee)
-    grantlee5-devel libxapian-devel \
-    # sonnet
-    aspell \
-    aspell-devel \
-    hunspell-devel \
-    libvoikko-devel \
-    # kio-extras and krdc
-    libssh-devel \
-    # plasma-pa
-    gconf2-devel libpulse-devel libcanberra-devel \
-    # user-manager
-    libpwquality-devel \
-    # sddm-kcm
-    libXcursor-devel \
-    # plasma-workspace
-    libXtst-devel \
-    # breeze-plymouth
-    plymouth-devel \
-    # kde-gtk-config/breeze-gtk
-    gtk3-devel gtk2-devel python3-cairo \
-    # plasma-desktop/discover
-    libAppStreamQt-devel fwupd-devel \
-    # plasma-desktop
-    xf86-input-synaptics-devel xf86-input-evdev-devel libxkbfile-devel xorg-x11-server-sdk \
-    # kimpanel
-    ibus-devel scim-devel \
-    # libksane
-    sane-backends-devel \
-    # pim
-    libical-devel libkolabxml-devel libxerces-c-devel \
-    # <misc>
-    alsa-devel libraw-devel fftw3-devel adobe-sourcecodepro-fonts \
-    # choqok
-    qoauth-qt5-devel qtkeychain-qt5-devel \
-    # krita
-    eigen3-devel OpenColorIO-devel dejavu-fonts gnu-free-fonts quazip-devel \
-    # kaccounts / telepathy
-    libaccounts-qt5-devel libaccounts-glib-devel libsignon-qt5-devel intltool \
-    # skrooge
-    sqlcipher sqlcipher-devel sqlite3-devel sqlite3 libofx-devel poppler-tools \
-    # kwin
-    libepoxy-devel Mesa-demo Mesa-demo-x xorg-x11-server-extra dmz-icon-theme-cursors libgbm-devel weston \
-    xorg-x11-server-wayland \
-    # kgamma5
-    libXxf86vm-devel \
-    # kgraphviewer
-    graphviz-devel \
-    # drkonqi
-    at-spi2-core which libgirepository-1_0-1 typelib-1_0-Atspi-2_0 gobject-introspection-devel \
-    # kcalc
-    mpfr-devel \
-    # kdevelop
-    gdb \
-    # labplot
-    gsl-devel \
-    # kuserfeedback
-    php7 \
-    # digikam
-    QtAV-devel opencv-devel \
-    # wacomtablet
-    libwacom-devel \
-    xf86-input-wacom-devel \
-    # rust-qt-binding-generator
-    rust rust-std \
-    cargo \
-    # kdevelop
-    clang \
-    clang-devel \
-    llvm-devel \
-    subversion-devel \
-    python3-devel \
-    # clazy
-    clang-devel-static \
-    # libkleo
-    libqgpgme-devel \
-    # akonadi
-    mariadb libQt5Sql5-mysql \
-    # libkdegames
-    openal-soft-devel \
-    libsndfile-devel \
-    # kscd
-    libmusicbrainz-devel \
-    libmusicbrainz5-devel \
-    # ktp-common-internals (also rest of KDE Telepathy)
-    telepathy-qt5-devel \
-    # audiocd-kio
-    cdparanoia-devel \
-    # ark
-    libarchive-devel libzip-devel \
-    # ffmpegthumbs
-    ffmpeg-4-libavcodec-devel ffmpeg-4-libavfilter-devel ffmpeg-4-libavformat-devel ffmpeg-4-libavdevice-devel ffmpeg-4-libavutil-devel ffmpeg-4-libswscale-devel ffmpeg-4-libpostproc-devel \
-    # k3b
-    flac-devel \
-    libmad-devel \
-    libmp3lame-devel \
-    libogg-devel libvorbis-devel \
-    libsamplerate-devel \
-    # kamera
-    libgphoto2-devel \
-    # signon-kwallet-extension
-    libsignon-glib-devel signond-libs-devel \
-    # kdenlive
-    libmlt-devel libmlt++-devel libmlt6-modules libmlt6-data rttr-devel \
-    # print-manager
-    cups-devel \
-    # krfb
-    LibVNCServer-devel \
-    # kscd
-    libdiscid-devel \
-    # minuet
-    fluidsynth-devel \
-    # kajongg
-    python3-Twisted \
-    # okular
-    texlive-latex \
-    # ksmtp tests
-    cyrus-sasl-plain \
-    # kdb
-    libmariadb-devel postgresql-devel \
-    # Gwenview
-    cfitsio-devel \
-    # Calligra, Krita and probably other things elsewhere too
-    libboost_*-devel \
-    # Amarok
-    gmock gtest libcurl-devel libofa-devel libgpod-devel libmtp-devel loudmouth-devel liblastfm-qt5-devel libmysqld-devel \
-    # Cantor
-    libspectre-devel python3-numpy python3-matplotlib octave maxima libqalculate-devel moonjit-devel julia-devel \
-    # KPat
-    freecell-solver-devel black-hole-solver-devel \
-    # RKWard
-    R-base-devel gcc-fortran \
-    # Kaffeine
-    libdvbv5-devel vlc-devel libXss-devel \
-    # Keysmith
-    libsodium-devel \
-    # Plasma Phone Components
-    libphonenumber-devel \
-    # kquickcharts
-    glslang-devel \
-    # xdg-desktop-portal-kde
-    pipewire-devel \
-    # Spectacle
-    kImageAnnotator-devel kColorPicker-devel \
-    # upnp-lib-qt
-    kdsoap-devel
-
-# For D-Bus to be willing to start it needs a Machine ID
-RUN dbus-uuidgen > /etc/machine-id
-
-# OpenSUSE has a different GID for the 'video' group compared to the Physical Ubuntu and Debian hosts
-# Therefore we create a group which matches the physical hosts 'video' group GID
-# This is necessary to allow us to grant Jenkins access to the vgem device
-RUN groupadd -g 44 docker-video
-# We need a user account to do things as, and SSHD needs keys
-RUN useradd -d /home/jenkins/ -u 1000 --user-group --create-home -G video,docker-video jenkins && /usr/sbin/sshd-gen-keys-start
-# We want to run SSHD so that Jenkins can remotely connect to this container
-EXPOSE 22
-CMD ["/usr/sbin/sshd", "-D"]


More information about the Kde-frameworks-devel mailing list