116 lines
3.7 KiB
Groovy
116 lines
3.7 KiB
Groovy
pipeline {
|
||
agent any
|
||
|
||
environment {
|
||
PIO_HOME_DIR = "${WORKSPACE}/.pio"
|
||
VENV_PATH = "${WORKSPACE}/Software/.venv"
|
||
}
|
||
stages {
|
||
|
||
stage('🧰 Setup PlatformIO') {
|
||
steps {
|
||
dir('Software') {
|
||
sh """
|
||
[ -d .venv ] || python3 -m venv .venv
|
||
${env.VENV_PATH}/bin/pip install --upgrade pip platformio
|
||
"""
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('📄 Dummy WiFi-Creds') {
|
||
steps {
|
||
dir('Software') {
|
||
writeFile file: 'wifi_credentials.ini', text: '''
|
||
[wifi_cred]
|
||
wifi_ssid_client = DummySSID
|
||
wifi_password_client = DummyPass
|
||
admin_password = Admin123
|
||
wifi_ap_password = DummyAP
|
||
'''.stripIndent()
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('🧱 Build Firmware for All Environments') {
|
||
steps {
|
||
dir('Software') {
|
||
script {
|
||
def allEnvironments = ['pcb_rev_1-2_serial', 'pcb_rev_1-3_serial', 'pcb_rev_1-4_serial']
|
||
for (envName in allEnvironments) {
|
||
echo "🔧 Baue Firmware für: ${envName}"
|
||
sh "${env.VENV_PATH}/bin/platformio run -e ${envName}"
|
||
}
|
||
env.REPRESENTATIVE_ENV = allEnvironments[0]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('📁 Build Filesystem') {
|
||
steps {
|
||
dir('Software') {
|
||
script {
|
||
echo "📁 Baue Filesystem für ${env.REPRESENTATIVE_ENV} (repräsentativ)"
|
||
sh "${env.VENV_PATH}/bin/platformio run -t buildfs -e ${env.REPRESENTATIVE_ENV}"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('📦 Find & Archive Firmware') {
|
||
steps {
|
||
dir('Software') {
|
||
script {
|
||
echo "🔍 Suche nach Firmware (.fw.bin) und Filesystem (.fs.gz) Artefakten..."
|
||
|
||
def firmwareFiles = findFiles(glob: '.pio/build/**/*.fw.bin')
|
||
def fsFiles = findFiles(glob: '.pio/build/**/*.fs.gz')
|
||
|
||
if (firmwareFiles.length == 0 && fsFiles.length == 0) {
|
||
echo "⚠️ Keine passenden Artefakte (.fw.bin / .fs.gz) gefunden – nichts zu archivieren."
|
||
} else {
|
||
firmwareFiles.each { echo "📦 Firmware: ${it.path}" }
|
||
fsFiles.each { echo "📦 Filesystem: ${it.path}" }
|
||
|
||
def allArtifacts = (firmwareFiles + fsFiles).collect { it.path }
|
||
archiveArtifacts artifacts: allArtifacts.join(', ')
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('🔌 Flash Hardware (Dummy)') {
|
||
steps {
|
||
echo "TODO: Flash-Script aufrufen, z. B.: python3 Hardware/flash.py /dev/ttyUSB0"
|
||
}
|
||
}
|
||
|
||
stage('🧠 Run Tests (Dummy)') {
|
||
steps {
|
||
dir('Testing') {
|
||
echo "TODO: Testing mit z. B.: python3 test_runner.py oder pytest starten"
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('🧹 Cleanup Build Output') {
|
||
steps {
|
||
dir('Software') {
|
||
sh "rm -rf .pio"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
post {
|
||
success {
|
||
echo "✅ CI abgeschlossen – Firmware gebaut, Dummy-Stages bereit"
|
||
}
|
||
failure {
|
||
echo "❌ Fehler im Build – Logs checken, Commander Seraphon"
|
||
}
|
||
}
|
||
}
|