316 lines
18 KiB
Groovy
316 lines
18 KiB
Groovy
pipeline {
|
|
agent {
|
|
label 'pyDABFActory-CIAgent'
|
|
}
|
|
|
|
parameters {
|
|
booleanParam(name: 'BUILD_ALL_PROFILES', defaultValue: true, description: 'Build all profiles one by one')
|
|
string(name: 'PROFILE', defaultValue: 'demo', description: 'Profile to build when BUILD_ALL_PROFILES is false')
|
|
}
|
|
|
|
environment {
|
|
PYTHON_DOCKERFILE = 'builder/docker/builder-alpine/Dockerfile'
|
|
ETCH_DOCKERFILE = 'builder/docker/packages-builder-etch/Dockerfile'
|
|
LENNY_DOCKERFILE = 'builder/docker/live-helper/Dockerfile'
|
|
}
|
|
|
|
stages {
|
|
stage('Validate builder') {
|
|
steps {
|
|
script {
|
|
def pythonImage = docker.build(
|
|
"retrodebian/builder-alpine:${env.BUILD_TAG}",
|
|
"-f ${env.PYTHON_DOCKERFILE} ."
|
|
).imageName()
|
|
|
|
docker.image(pythonImage).inside {
|
|
sh 'python3 builder/py/build.py validate'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('Build common features and profiles') {
|
|
steps {
|
|
script {
|
|
def resolveDefaultRuntimeImage = { String runtimeName, String imageName, String dockerfilePath ->
|
|
if (dockerfilePath?.trim()) {
|
|
return docker.build(
|
|
"retrodebian/${runtimeName}:${env.BUILD_TAG}",
|
|
"-f ${dockerfilePath} ."
|
|
).imageName()
|
|
}
|
|
if (!imageName?.trim()) {
|
|
error("Missing default image for runtime ${runtimeName}")
|
|
}
|
|
return imageName.trim()
|
|
}
|
|
|
|
def resolveModuleRuntimeImage = { String runtimeName, String kind, String name, String phase, String defaultImage, String pythonControlImage ->
|
|
def overrideImage = ''
|
|
def overrideDockerfile = ''
|
|
def overrideContext = ''
|
|
|
|
docker.image(pythonControlImage).inside {
|
|
overrideImage = sh(
|
|
script: "python3 builder/py/build.py module-docker --kind ${kind} --name ${name} --phase ${phase} image",
|
|
returnStdout: true
|
|
).trim()
|
|
|
|
overrideDockerfile = sh(
|
|
script: "python3 builder/py/build.py module-docker --kind ${kind} --name ${name} --phase ${phase} dockerfile",
|
|
returnStdout: true
|
|
).trim()
|
|
|
|
overrideContext = sh(
|
|
script: "python3 builder/py/build.py module-docker --kind ${kind} --name ${name} --phase ${phase} docker_context",
|
|
returnStdout: true
|
|
).trim()
|
|
}
|
|
|
|
if (overrideDockerfile) {
|
|
def tag = overrideImage ? overrideImage : "retrodebian/${runtimeName}-${kind}-${name}-${phase}:${env.BUILD_TAG}"
|
|
def contextPath = overrideContext ? overrideContext : '.'
|
|
return docker.build(tag, "-f ${overrideDockerfile} ${contextPath}").imageName()
|
|
}
|
|
|
|
if (overrideImage) {
|
|
return overrideImage
|
|
}
|
|
|
|
return defaultImage
|
|
}
|
|
|
|
def pythonDefaultImage = resolveDefaultRuntimeImage(
|
|
'builder-alpine',
|
|
'',
|
|
env.PYTHON_DOCKERFILE
|
|
)
|
|
|
|
def etchDefaultImage = resolveDefaultRuntimeImage(
|
|
'package-builder-etch',
|
|
'',
|
|
env.ETCH_DOCKERFILE
|
|
)
|
|
|
|
def lennyDefaultImage = resolveDefaultRuntimeImage(
|
|
'live-helper',
|
|
'',
|
|
env.LENNY_DOCKERFILE
|
|
)
|
|
|
|
def featureNames = []
|
|
docker.image(pythonDefaultImage).inside {
|
|
def raw = sh(script: 'python3 builder/py/build.py list features', returnStdout: true).trim()
|
|
featureNames = raw ? raw.split('\n').findAll { it?.trim() } : []
|
|
}
|
|
|
|
for (featureName in featureNames) {
|
|
stage("Feature ${featureName}") {
|
|
def pythonImagePre = resolveModuleRuntimeImage(
|
|
'python', 'feature', featureName, 'pre-gen',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(pythonImagePre).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind feature --phase pre-gen --profile ${params.PROFILE} --feature ${featureName}"
|
|
sh "python3 builder/py/build.py export-env --kind feature --phase pre-gen --profile ${params.PROFILE} --feature ${featureName} --output artifacts/features/${featureName}/runtime.env"
|
|
}
|
|
|
|
def etchImage = resolveModuleRuntimeImage(
|
|
'etch', 'feature', featureName, 'generate',
|
|
etchDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(etchImage).inside {
|
|
sh "builder/bash/run_generate.sh features/${featureName} artifacts/features/${featureName}/runtime.env"
|
|
}
|
|
|
|
def pythonImagePost = resolveModuleRuntimeImage(
|
|
'python', 'feature', featureName, 'post-gen',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(pythonImagePost).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind feature --phase post-gen --profile ${params.PROFILE} --feature ${featureName}"
|
|
}
|
|
}
|
|
}
|
|
|
|
def profileNames = []
|
|
docker.image(pythonDefaultImage).inside {
|
|
if (params.BUILD_ALL_PROFILES) {
|
|
def raw = sh(script: 'python3 builder/py/build.py list profiles', returnStdout: true).trim()
|
|
profileNames = raw ? raw.split('\n').findAll { it?.trim() } : []
|
|
} else {
|
|
profileNames = [params.PROFILE]
|
|
}
|
|
}
|
|
|
|
for (profileName in profileNames) {
|
|
stage("Profile ${profileName}") {
|
|
def baseName = ''
|
|
def baseChain = []
|
|
def featureList = []
|
|
|
|
docker.image(pythonDefaultImage).inside {
|
|
baseName = sh(
|
|
script: "python3 builder/py/build.py profile-info --profile ${profileName} base",
|
|
returnStdout: true
|
|
).trim()
|
|
|
|
def chainRaw = sh(
|
|
script: "python3 builder/py/build.py profile-info --profile ${profileName} base-chain",
|
|
returnStdout: true
|
|
).trim()
|
|
baseChain = chainRaw ? chainRaw.split('\n').findAll { it?.trim() } : []
|
|
|
|
def featuresRaw = sh(
|
|
script: "python3 builder/py/build.py profile-info --profile ${profileName} features",
|
|
returnStdout: true
|
|
).trim()
|
|
featureList = featuresRaw ? featuresRaw.split('\n').findAll { it?.trim() } : []
|
|
}
|
|
|
|
for (baseItem in baseChain) {
|
|
stage("Base ${profileName} / ${baseItem}") {
|
|
def pythonImagePre = resolveModuleRuntimeImage(
|
|
'python', 'base', baseItem, 'pre-gen',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(pythonImagePre).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind base --phase pre-gen --profile ${profileName} --base ${baseItem}"
|
|
sh "python3 builder/py/build.py export-env --kind base --phase pre-gen --profile ${profileName} --base ${baseItem} --output artifacts/bases/${baseItem}/runtime.env"
|
|
}
|
|
|
|
def etchImage = resolveModuleRuntimeImage(
|
|
'etch', 'base', baseItem, 'generate',
|
|
etchDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(etchImage).inside {
|
|
sh "builder/bash/run_generate.sh bases/${baseItem} artifacts/bases/${baseItem}/runtime.env"
|
|
}
|
|
|
|
def pythonImagePost = resolveModuleRuntimeImage(
|
|
'python', 'base', baseItem, 'post-gen',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(pythonImagePost).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind base --phase post-gen --profile ${profileName} --base ${baseItem}"
|
|
}
|
|
}
|
|
}
|
|
|
|
docker.image(pythonDefaultImage).inside {
|
|
sh "python3 builder/py/build.py prepare-profile --profile ${profileName}"
|
|
sh "python3 builder/py/build.py export-env --kind profile --phase config --profile ${profileName} --output artifacts/profiles/${profileName}/profile-config.env"
|
|
}
|
|
|
|
docker.image(lennyDefaultImage).inside {
|
|
sh "builder/bash/run_profile_config.sh artifacts/profiles/${profileName}/profile-config.env"
|
|
}
|
|
|
|
docker.image(pythonDefaultImage).inside {
|
|
sh "python3 builder/py/build.py inject-resources --kind base --name ${baseName}"
|
|
}
|
|
|
|
def basePreFeaturePythonImage = resolveModuleRuntimeImage(
|
|
'python', 'base', baseName, 'pre-feature',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(basePreFeaturePythonImage).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind base --phase pre-feature --profile ${profileName} --base ${baseName}"
|
|
sh "python3 builder/py/build.py export-env --kind base --phase pre-feature --profile ${profileName} --base ${baseName} --output artifacts/bases/${baseName}/pre-feature.env"
|
|
}
|
|
|
|
def basePreFeatureLennyImage = resolveModuleRuntimeImage(
|
|
'lenny', 'base', baseName, 'pre-feature',
|
|
lennyDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(basePreFeatureLennyImage).inside {
|
|
sh "builder/bash/run_entry.sh bases/${baseName} artifacts/bases/${baseName}/pre-feature.env pre-feature"
|
|
}
|
|
|
|
for (featureName in featureList) {
|
|
stage("Inject ${profileName} / ${featureName}") {
|
|
docker.image(pythonDefaultImage).inside {
|
|
sh "python3 builder/py/build.py save-feature-metadata --profile ${profileName} --feature ${featureName}"
|
|
}
|
|
|
|
def featurePreInjPythonImage = resolveModuleRuntimeImage(
|
|
'python', 'feature', featureName, 'pre-inj',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(featurePreInjPythonImage).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind feature --phase pre-inj --profile ${profileName} --feature ${featureName}"
|
|
sh "python3 builder/py/build.py export-env --kind feature --phase pre-inj --profile ${profileName} --feature ${featureName} --output artifacts/features/${featureName}/pre-inj.env"
|
|
}
|
|
|
|
def featurePreInjLennyImage = resolveModuleRuntimeImage(
|
|
'lenny', 'feature', featureName, 'pre-inj',
|
|
lennyDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(featurePreInjLennyImage).inside {
|
|
sh "builder/bash/run_entry.sh features/${featureName} artifacts/features/${featureName}/pre-inj.env pre-inj"
|
|
}
|
|
|
|
docker.image(pythonDefaultImage).inside {
|
|
sh "python3 builder/py/build.py inject-resources --kind feature --name ${featureName}"
|
|
sh "python3 builder/py/build.py export-env --kind feature --phase post-inj --profile ${profileName} --feature ${featureName} --output artifacts/features/${featureName}/post-inj.env"
|
|
}
|
|
|
|
def featurePostInjLennyImage = resolveModuleRuntimeImage(
|
|
'lenny', 'feature', featureName, 'post-inj',
|
|
lennyDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(featurePostInjLennyImage).inside {
|
|
sh "builder/bash/run_entry.sh features/${featureName} artifacts/features/${featureName}/post-inj.env post-inj"
|
|
}
|
|
|
|
def featurePostInjPythonImage = resolveModuleRuntimeImage(
|
|
'python', 'feature', featureName, 'post-inj',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(featurePostInjPythonImage).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind feature --phase post-inj --profile ${profileName} --feature ${featureName}"
|
|
}
|
|
}
|
|
}
|
|
|
|
def basePostFeaturePythonImage = resolveModuleRuntimeImage(
|
|
'python', 'base', baseName, 'post-feature',
|
|
pythonDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(basePostFeaturePythonImage).inside {
|
|
sh "python3 builder/py/build.py run-python-phase --kind base --phase post-feature --profile ${profileName} --base ${baseName}"
|
|
sh "python3 builder/py/build.py export-env --kind base --phase post-feature --profile ${profileName} --base ${baseName} --output artifacts/bases/${baseName}/post-feature.env"
|
|
sh "python3 builder/py/build.py profile-pre-build --profile ${profileName}"
|
|
sh "python3 builder/py/build.py export-env --kind profile --phase build --profile ${profileName} --output artifacts/profiles/${profileName}/profile-build.env"
|
|
}
|
|
|
|
def basePostFeatureLennyImage = resolveModuleRuntimeImage(
|
|
'lenny', 'base', baseName, 'post-feature',
|
|
lennyDefaultImage, pythonDefaultImage
|
|
)
|
|
docker.image(basePostFeatureLennyImage).inside {
|
|
sh "builder/bash/run_entry.sh bases/${baseName} artifacts/bases/${baseName}/post-feature.env post-feature"
|
|
}
|
|
|
|
docker.image(lennyDefaultImage).inside {
|
|
sh "builder/bash/run_profile_build.sh artifacts/profiles/${profileName}/profile-build.env"
|
|
}
|
|
|
|
docker.image(pythonDefaultImage).inside {
|
|
sh "python3 builder/py/build.py profile-finalize --profile ${profileName}"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
always {
|
|
archiveArtifacts artifacts: 'artifacts/**/*', allowEmptyArchive: true
|
|
archiveArtifacts artifacts: 'live/**/*', allowEmptyArchive: true
|
|
}
|
|
}
|
|
} |