Parasoft-Logo
Titelbild des Whitepapers

Whitepaper

Der ultimative Leitfaden zu CI/CD für eingebettete Softwaresysteme

Neugierig, was der Leitfaden beinhaltet? Beginnen Sie mit der Vorschau unten.

Zum Abschnitt springen

Übersicht

Kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) bilden die Grundlage der kontinuierlichen Softwareentwicklung. CI führt kleinere Build-Einheiten häufig zu Anwendungen zusammen, während CD umfangreiche Tests erfordert und vor der Markteinführung eine Softwarezertifizierung beinhalten kann.

Dieses Whitepaper bietet Best Practices für die Integration von automatisierten Tests in CI-Workflows, um Fehler frühzeitig zu erkennen und durch Continuous Testing (CT) qualitativ hochwertigen Code zu liefern – wobei die Softwareentwicklung mit dem Testen als Teil des Build-Prozesses kombiniert wird.

„Continuous Integration ist eine Softwareentwicklungsmethode, bei der Teammitglieder ihre Arbeit häufig integrieren, in der Regel integriert jede Person mindestens täglich – was zu mehreren Integrationen pro Tag führt. Jede Integration wird durch einen automatisierten Build (einschließlich Tests) überprüft, um Integrationsfehler so schnell wie möglich zu erkennen.“

—Martin Fowler

Automatisierung in Continuous Integration und Continuous Delivery

Ohne die Automatisierung des Build-Prozesses und der Prozesse im Zusammenhang mit der Erstellung von Bereitstellungsartefakten und der Build-Verifizierung wäre CI/CD mühsam und zeitaufwändig – das genaue Gegenteil von kontinuierlich.

Kontinuierliche Integration basiert auf einem gemeinsamen Repository und automatisierten Software-Build-Tools. Es ist wichtig, Integrationsprobleme und fehlerhafte Builds umgehend zu erkennen. Der wichtigste Schritt ist die Integration von kontinuierlichen Tests in die CI/CD-Pipeline, um sicherzustellen, dass Codeänderungen während des gesamten Entwicklungszyklus automatisch und kontinuierlich getestet werden.

Wenn Entwickler Änderungen am Quellcode vornehmen, wird der Build-Prozess ausgelöst, einschließlich der Kompilierung des Codes und der Vorbereitung der Testumgebung. Entwickler können statische Analysen, Unit-Tests, Codeabdeckungstests und andere Testmethoden schnell durchführen und erhalten sofortiges Feedback.

Fehlgeschlagene Tests erzwingen frühzeitige Codekorrekturen im Entwicklungszyklus. Sobald alle Tests erfolgreich sind, erfolgt die Bereitstellung im Hauptzweig. Dieser kontinuierliche Workflow gewährleistet, dass Codeänderungen fortlaufend durch automatisierte Tests überprüft werden. Dies ermöglicht schnelles Feedback und sichert die allgemeine Stabilität und Qualität der Software während ihres gesamten Lebenszyklus.

Kontinuierliche Integration und Bereitstellung für eingebettete Systeme

CI/CD ist in der Entwicklung eingebetteter Software, die mit besonderen Einschränkungen konfrontiert ist, weit verbreitet und gilt als Best Practice. Lösungen wie Parasoft C/C++Test CT Kontinuierliche Tests können durch die Integration mit gängigen Systemen ermöglicht werden. Open-Source-Unit-Testing-Frameworks wie GoogleTest, Boost.Test, CppUnit und kundenspezifische Lösungen, erweitert um Codeabdeckung, Anforderungsrückverfolgbarkeit und Berichtsfunktionen.

Neben den physikalischen und rechnerischen Beschränkungen der Zielhardwareplattformen stellen Märkte für eingebettete Software besondere Anforderungen an Sicherheit, Datenschutz und extrem lange Lebenszyklen. Produkte können jahrzehntelang auf dem Markt bleiben.

Unendlichkeitsdiagramm zur Veranschaulichung von kontinuierlichem Feedback und kontinuierlicher Integration als Teil eines kontinuierlichen Entwicklungszyklus
Kontinuierliche Integration als Teil eines kontinuierlichen Entwicklungszyklus.

Auf der Entwicklungsebene benötigt eingebettete Software IDEs, Compiler, statische und dynamische Analysetools sowie Build-Tools – ähnlich wie die typische Anwendungsentwicklung. Allerdings zielen die Tools oft auf unterschiedliche Architekturen ab (Host- vs. Zielumgebung), was homogene Entwicklungsumgebungen für alle Teams erforderlich macht.

Automatisiertes Testen für eingebettete Software Die Durchführung von Tests auf eingebetteten Systemen stellt aufgrund der Komplexität der Initiierung und Überwachung sowie des eingeschränkten Zugriffs auf die Zielhardware eine Herausforderung dar. Software-Testautomatisierung ist unerlässlich, um kontinuierliches Testen eingebetteter Systeme vom Host- zum Zielsystem zu ermöglichen.

Architektur für Testautomatisierung

Durchführung von Unit-Tests und Codeabdeckung auf der Zielhardware

Ein Überblick über die Bereitstellung, Ausführung und Beobachtung von Tests vom Host bis zum Zielsystem.

Testen eingebetteter Software ist besonders zeitaufwändig. Die Automatisierung der Regressionstestsuite bietet erhebliche Zeit- und Kosteneinsparungen. Die Erfassung von Testergebnissen und Codeabdeckungsdaten aus Zielsystemen ist für die Validierung und die Einhaltung von Standards unerlässlich. Die Rückverfolgbarkeit zwischen Testfällen, Testergebnissen, Quellcode und Anforderungen muss dokumentiert und aufrechterhalten werden, weshalb die Datenerfassung von entscheidender Bedeutung ist.

C- und C++-Testlösungen wie die von Parasoft bieten Testumgebungen, die für einen minimalen Binärspeicherbedarf optimiert sind und bei Bedarf als Quellcode zur plattformspezifischen Anpassung bereitgestellt werden.

Ein wesentlicher Vorteil von Parasoft C/C++test ist die nahtlose Integration mit eingebetteten IDEs und Debuggern, die eine reibungslose und automatisierte Testfallausführung ermöglicht. Zu den unterstützten IDE-Umgebungen gehören Eclipse, VS-CodeGreen Hills Multi, Wind River Workbench, IAR EW, ARM MDK, ARM DS-5, TI CCS, Visual Studio und viele andere.

C/C++test unterstützt die Erstellung von Regressionstest-Baselines als organisierte Testsammlungen mit automatischer Ergebnisüberprüfung. Teams können Tests regelmäßig automatisch ausführen, um zu überprüfen, ob Codeänderungen die durch Regressionstests erfasste Funktionalität verändern oder beeinträchtigen. Bei fehlgeschlagenen Testfällen erhalten sie Benachrichtigungen.

Containerisierte Entwicklungsplattform auf dem Desktop jedes Entwicklers

Bei der Verwaltung komplexer Entwicklungsumgebungen in der sicherheitskritischen Softwareentwicklung haben Teams typischerweise mit folgenden Problemen zu kämpfen:

  • Synchronisierung von Upgrades für das gesamte Team auf neue Compiler- oder Build-Toolchain-Versionen.
  • Dynamische Reaktion auf Sicherheitspatches für Bibliotheken oder Software Development Kits (SDK).
  • Sicherstellung der Toolchain-Konsistenz für alle Teammitglieder und der automatisierten Infrastruktur (CI/CD).
  • Versionierung der Entwicklungsumgebung zur Unterstützung älterer zertifizierter Produktversionen.
  • Onboarding und Einrichtung neuer Entwickler.

All diese Probleme lassen sich mit Containern leicht lösen.

Eine Infografik, die ein Beispiel für die Bereitstellung von Parasoft C/C++test mit Docker-Build- und Run-Containern zeigt.

Ein Beispiel für die Bereitstellung von Parasoft C/C++test mit Docker-Build- und Run-Containern

Parasoft C/C++test Professional arbeitet mit Kompilierungs-Toolchains und Ausführungsumgebungen, die in Containern bereitgestellt werden, und unterstützt Bereitstellungen auf Basis von Linux- und Docker-Containern.

Vorteile von Continuous Integration und Continuous Delivery

Der größte Vorteil von CI/CD liegt in der Reduzierung des Projektrisikos. In der Vergangenheit setzten zu viele Projekte auf „Big-Bang“-Softwareintegrationsbemühungen, bei denen Teams versuchten, die Software zu kurz vor Abschluss der Produktentwicklung zu integrieren, was unter enormem Zeitdruck zu massiven Integrationsproblemen führte.

Die Tests werden bis zum Projektende verschoben, wo sie dann zu spät und unzureichend sind. kontinuierliche integrationDie Teams verfügen stets über vollständige Produktversionen, die für Tests, Auslieferung und Veröffentlichung bereit sind. Anstatt eines großen Schritts arbeiten die Teams kontinuierlich in kleineren Integrationsschritten, wodurch Probleme frühzeitig erkannt und das Integrationsrisiko in der späten Phase reduziert wird.

Weitere Vorteile sind:

  • Integrationstests werden früh und oft durchgeführtDadurch werden Fehler frühzeitig aufgedeckt, sodass sie einfacher und kostengünstiger behoben werden können.
  • Regressionstests beginnen früher Neue Funktionen werden daher auf ihre Auswirkungen auf bestehenden Code getestet, wobei nach jeder Iteration neue Tests zu den Regressionstests hinzugefügt werden.
  • Schrittweise Verbesserung Produkte durch Hinzufügen und Testen neuer Funktionen, Beheben von Fehlern – Qualität und Sicherheit schrittweise verbessern
  • Ermöglicht kontinuierliches Testen und Bereitstellen als gleichwertige Bestandteile der kontinuierlichen Entwicklung. Kontinuierliche Integration allein ist ohne kontinuierliches Testen und Ausliefern nicht effektiv.

CI/CD & Kontinuierliches Testen: Die Grundlage für DevSecOps

DevOps und DevSecOps-Methoden Beide Ansätze nutzen Automatisierung und kontinuierliche Prozesse, um kollaborative Entwicklungszyklen zu etablieren. Während DevOps die Liefergeschwindigkeit priorisiert, rückt DevSecOps die Sicherheit frühzeitig in den Entwicklungsprozess, was insbesondere bei sicherheitskritischer Software, die als eingebettete Systeme eingestuft wird, von Bedeutung ist.

Die Automatisierung von Softwaretests spielt eine wichtige Rolle, ist aber nur ein Teil des DevSecOps-Puzzles. Tests stellen oft eine der größten Herausforderungen im Softwareentwicklungszyklus (SDLC) dar. Daher hat die Optimierung von Sicherheitsprozessen, die einen früheren Testbeginn ermöglichen und den Testaufwand reduzieren, einen signifikanten Einfluss auf die Softwaresicherheit und die Entwicklungseffizienz.

Einführung eines kontinuierlichen Testprozesses hilft dabei, die 6 Säulen von DevSecOps zu fördern: kollektive Verantwortung, Zusammenarbeit und Integration, pragmatische Implementierung, Compliance und Entwicklung, Automatisierung und Messung sowie Überwachung und Berichterstattung.

Shift-Left-Sicherheit in DevSecOps

Der Trend zu frühzeitigerer Integration von Sicherheit in den Softwareentwicklungszyklus (SDLC) entspringt dem Wunsch, Fehler und Sicherheitslücken so früh wie möglich zu finden und zu beheben. Probleme lassen sich deutlich einfacher, kostengünstiger und mit geringerem Risiko frühzeitig beheben.

Wesentliche Voraussetzungen für die „Shift-Left“-Sicherheitsarchitektur sind die Integration von Sicherheitsmaßnahmen in alle Anwendungen von Anfang an. Sicherheit lässt sich nicht nachträglich hinzufügen, sondern muss von vornherein integriert werden.

Automatisierte bidirektionale Rückverfolgbarkeit

Die Rückverfolgbarkeit von Anforderungen wird definiert als „die Fähigkeit, den Lebenszyklus einer Anforderung sowohl vorwärts als auch rückwärts zu beschreiben und zu verfolgen (d. h. von ihrem Ursprung über ihre Entwicklung und Spezifikation bis hin zu ihrer anschließenden Bereitstellung und Nutzung sowie über Phasen der fortlaufenden Verfeinerung und Iteration in jeder dieser Phasen).“

Im einfachsten Sinne ist die Rückverfolgbarkeit von Anforderungen notwendig, um beim Entwickeln von Software genau nachvollziehen zu können, was man erstellt. Das bedeutet, sicherzustellen, dass die Software das tut, was sie soll, und dass man nur das entwickelt, was wirklich benötigt wird.

Die Rückverfolgbarkeit dient sowohl dazu, zu beweisen, dass Sie die Anforderungen erfüllt haben, als auch zu identifizieren, was nicht. Wenn es Architekturelemente oder Quellcode gibt, die nicht auf eine Anforderung zurückgeführt werden können, ist dies ein Risiko und sollte nicht vorhanden sein. Die Vorteile gehen über den Nachweis der Implementierung hinaus. Die disziplinierte Rückverfolgbarkeit ist ein wichtiger Einblick in den Entwicklungsfortschritt.

Es ist wichtig zu verstehen, dass viele Anforderungen an eingebettete Software auf Sicherheitsanalysen und Risikomanagement basieren. Das System muss selbstverständlich seine vorgesehenen Funktionen erfüllen, aber auch Risiken minimieren, um die Verletzungsgefahr deutlich zu reduzieren. Um zu dokumentieren und nachzuweisen, dass diese Sicherheitsfunktionen vollständig und korrekt implementiert und getestet wurden, ist die Rückverfolgbarkeit unerlässlich.

Die Pflege von Rückverfolgbarkeitsdaten in jeglichem Umfang erfordert Automatisierung. Dies ist insbesondere in einer CI/CD-Pipeline wichtig, da die manuelle Pflege der Rückverfolgbarkeit jeden Iterationsprozess verlangsamen würde.

Integrierte Softwaretest-Tools können die Verifizierung und Validierung von Anforderungen abschließen, indem sie eine automatisierte bidirektionale Rückverfolgbarkeit zum ausführbaren Testfall bereitstellen, der das Ergebnis (bestanden/nicht bestanden) sowie Rückverfolgbarkeit bis zum Quellcode, der die Anforderung implementiert, umfasst.

Parasoft integriert sich in marktführende Anforderungsmanagement- und Agile-Planungssysteme wie IBM DOORS Next, Intland, Codebeamer, Polarion von Siemens, Jama Connect, Atlassian Jira, CollabNet, VersionOne und TeamForge. Die Rückverfolgbarkeit wird über ein zentrales Reporting- und Analyse-Dashboard, Parasoft DTP, verwaltet.

Parasoft bietet eine bidirektionale Rückverfolgbarkeit von Arbeitselementen zu Testfällen und Testergebnissen – sowohl die Anzeige von Rückverfolgbarkeitsberichten mit Parasoft DTP als auch die Rückmeldung der Ergebnisse an das Anforderungsmanagementsystem.

Bidirektionale Rückverfolgbarkeit von Arbeitselementen zu Testfällen und Testergebnissen. Rückverfolgbarkeitsberichte werden angezeigt und die Ergebnisse an das Anforderungsmanagementsystem zurückgesendet.

Die bidirektionale Korrelation zwischen Testergebnissen und Arbeitselementen bildet die Grundlage für die Rückverfolgbarkeit der Anforderungen. Parasoft DTP fügt eine Test- und Codeabdeckungsanalyse hinzu, um die Vollständigkeit des Tests zu bewerten. Die Aufrechterhaltung dieser bidirektionalen Korrelation zwischen Anforderungen, Tests und den Artefakten, die diese implementieren, ist ein wesentlicher Bestandteil der Rückverfolgbarkeit.

Zusammenfassung

Kontinuierliche Integration und Bereitstellung (CI/CD) sind in der Embedded-Entwicklung zum Standard geworden und unterstützen Teams bei der Migration von traditionellen Wasserfallmodellen zu agileren und effizienteren Arbeitsabläufen. Dieser Übergang reduziert Risiken und verbessert Qualität und Sicherheit. Da Sicherheit weiterhin höchste Priorität hat, bildet CI/CD die Grundlage für DevSecOps, indem Sicherheitsanforderungen und -kontrollen in die gesamte Pipeline integriert werden. Containerisierte Entwicklungsumgebungen verstärken diesen Ansatz zusätzlich, indem sie Portabilität, Versionsverwaltung und zentrale Steuerung unterstützen und gleichzeitig reproduzierbare, sichere Anwendungsumgebungen ermöglichen.

Kontinuierliches Testen spielt eine entscheidende Rolle für einen reibungslosen CI/CD-Workflow, insbesondere da Tests in der Embedded-Entwicklung oft den größten Zeit- und Ressourcenaufwand bedeuten. Durch die strategische Automatisierung von Tests und die Fokussierung auf risikoreiche Bereiche können Teams Feedbackschleifen beschleunigen und Verzögerungen reduzieren. Die Effektivität kontinuierlichen Testens steigt mit Tools, die die Automatisierung verbessern, die Codeabdeckung erhöhen, eine intelligente Testausführung ermöglichen und die vollständige bidirektionale Rückverfolgbarkeit über den gesamten Softwarelebenszyklus hinweg gewährleisten.

Bereit, tiefer einzutauchen?

Vollständiges Whitepaper anfordern