Continuous Integration (CI) erstellt, testet und validiert den Forschungscode automatisch bei jedem Commit. Für wissenschaftliche Software ist CI für die Reproduzierbarkeit, die frühzeitige Fehlererkennung und die Aufrechterhaltung der Qualität im Laufe der Zeit unerlässlich. Implementieren Sie CI durch: (1) Schreiben automatisierter Tests mit PyTest, (2) Einrichten einer CI-Pipeline mit GitHub-Aktionen oder GitLab CI, (3) Verwenden von Docker / Conda für die Umgebungskonsistenz, (4) Hinzufügen von Berichterstellungsberichterstattung und (5) Integration von Leistungs-Benchmarks. Behandeln Sie numerische Tests mit pytest.approx, verwenden Sie Matrixstrategien, um Python-Versionen zu testen, und Cache-Abhängigkeiten, um die Laufzeit zu reduzieren. CI wandelt Forschungscode von fragilen Skripten in vertrauenswürdige, wartbare Software um.
Einleitung: Warum Continuous Integration für die Forschung wichtig ist
Forschungssoftware ist dafür berüchtigt, lautlos zu brechen. Eine kleine Änderung in einem Teil des Codes kann subtil unterschiedliche Ergebnisse im Folgenden erzeugen, was veröffentlichte Ergebnisse ungültig macht oder monatelange Rechenzeit verschwendet. Herkömmliche manuelle Tests – von Hand einige Beispiele ausführen – skalieren nicht auf komplexe Simulationscodes mit Dutzenden von voneinander abhängigen Modulen.
Continuous Integration (CI) behebt dies, indem es automatisch eine umfassende Testsuite ausführt, wenn Code festgeschrieben wird. Aber CI ist mehr als nur Automatisierung; Es ist eine Qualitätsdisziplin, die die Reproduzierbarkeit durchsetzt und die Korrektheit kontinuierlich bestätigt. Als Best Practices for Scientific Computing Papiernotizen: „Automatisiertes Testen ist Nicht verhandelbar für vertrauenswürdige wissenschaftliche Software „(Wilson et al., 2012).
Für Forschungsteams bietet CI konkrete Vorteile:
- Reproduzierbarkeit: CI überprüft, ob der Code konsistente Ergebnisse in Umgebungen und im Laufe der Zeit liefert.
- Early Defekterkennung: Fehler werden Minuten nach ihrer Einführung abgefangen, nicht Wochen später während der Erstellung der Manuskripte.
- Zuversicht in Refactor: Mit einem Sicherheitsnetz von Tests können Sie die Codestruktur verbessern, ohne Angst zu haben, etwas zu brechen.
- Collaboration Enablement: Mehrere Mitwirkende können auf derselben Codebasis arbeiten, indem sie automatische Überprüfungen verhindern.
- Erwartungsdokumentation: Tests dienen als ausführbare Spezifikationen, die dokumentieren, wie sich der Code verhalten soll.
Trotz dieser Vorteile fehlt vielen Forschungsprojekten CI immer noch. Häufige Ausreden sind „Unser Code ist zu komplex, um zu testen“, „Tests dauern zu lange“ oder „Wir haben keine Zeit, CI einzurichten.“ Dieser Leitfaden löst diese Einwände und bietet einen praktischen, schrittweisen Ansatz für CI, der auf wissenschaftliche Software zugeschnitten ist.
Was ist wirklich kontinuierliche Integration?
Kontinuierliche Integration ist das Zusammenführen von Codeänderungen in einem gemeinsamen Repository häufig – idealerweise mehrmals pro Tag – und die automatische Überprüfung jeder Zusammenführung mit einer automatisierten Build- und Test-Pipeline. Der „kontinuierliche“ Teil bedeutet, dass das Feedback schnell ist; Entwickler wissen innerhalb weniger Minuten, ob ihre Änderung etwas kaputt gemacht hat.
Eine CI-Pipeline enthält typischerweise:
- Checkout: Das CI-System ruft den neuesten Code ab.
- Umgebungs-Setup: Abhängigkeiten werden installiert (häufig innerhalb eines Containers).
- Statische Analyse: Der Code ist für Stilprobleme und potenzielle Fehler furchtbar.
- Einheitstests: Einzelne Funktionen und Module werden isoliert getestet.
- Integrationstests: Mehrere Komponenten werden zusammen getestet.
- Coverage-Reporting: Der Anteil des Codes, der durch Tests ausgeübt wird, wird gemessen.
- Artefact Building: Dokumentation, Pakete oder Binärdateien werden generiert.
- Performance-Benchmarks (optional): Ausführungsgeschwindigkeit und Speichernutzung werden verfolgt.
Für Forschungssoftware fügen wir hinzu:
- Numerische Validierung: Tests, die Gleitkommatoleranzen und stochastische Variationen berücksichtigen.
- Überprüfungen der Reproduzierbarkeit: Überprüfung, dass die Ergebnisse innerhalb akzeptabler Grenzen übereinstimmen.
- Datenvalidierung: Gewährleistung der Integrität der Eingabe- und Ausgabedaten.
Kernkomponenten: Aufbau einer forschungsbereiten CI-Pipeline
Eine robuste CI-Pipeline für wissenschaftliche Python-Projekte sollte diese Komponenten enthalten, die jeweils einen bestimmten Qualitätsaspekt ansprechen.
Automatisiertes Testen mit PyTest
Die Stiftung ist eine umfassende Testsuite mit pytest. PyTest ist der De-facto-Standard für Python-Tests aufgrund seiner Einfachheit, leistungsstarken Geräte und reichhaltigen Ökosystems.
Für den wissenschaftlichen Kodex konzentrieren Sie sich auf:
- Einheitstests für einzelne Funktionen (z. B. berechnet ein Diffusionslöser korrekt auf einem einfachen Netz?).
- Regressionstests, die die Ergebnisse mit bekannten guten Ergebnissen vergleichen (wesentlich für PDE-Solver).
- Eigenschaftsbasierte Tests mit Hypothese, um zufällige Eingaben zu generieren und Invarianten zu überprüfen.
Der Einheitentest für den wissenschaftlichen Codeentwurf (in Bearbeitung) behandelt PYTest-Strategien in der Tiefe, einschließlich der numerischen Präzision.
Umgang mit numerischen Vergleichen
Der wissenschaftliche Code befasst sich mit Gleitkomma-Arithmetik, bei der eine exakte Gleichheit aufgrund von Rundungsfehlern oft nicht möglich ist. PYTEST bietet pytest.approx für ungefähre Vergleiche:
def test_diffusion_result():
result = run_simulation()
expected = 0.123456
assert result == pytest.approx(expected, rel=1e-6) # 0.1% tolerance
Verwenden Sie für Arrays numpy.testing.assert_allclose:
import numpy.testing as npt
def test_field_solution():
computed = solve_pde()
reference = load_reference_solution()
npt.assert_allclose(computed, reference, rtol=1e-5, atol=1e-10)
Wählen Sie Toleranzen basierend auf der Physik und der Diskretisierungsgenauigkeit. Dokumentieren Sie, warum bestimmte Toleranzen ausgewählt wurden.
Codeabdeckungsmessung
Die Codeabdeckung misst, wie viel von Ihrer Codebasis während der Tests ausgeführt wird. Während eine 100% ige Abdeckung nicht immer erforderlich (oder erreichbar) ist, hilft die Verfolgung, ungetestete Codepfade zu identifizieren.
Verwenden Sie pytest-cov, um Berichterstattungsberichte zu erstellen:
pytest --cov=src/ --cov-report=xml --cov-report=html
Integrieren Sie Codecov oder coveralls, um die Abdeckung im Laufe der Zeit zu verfolgen und die Mindestgrenzwerte in CI zu erzwingen.
Das Wissenschaftliches Python-Entwicklungshandbuch enthält detaillierte Beispiele für die Konfiguration der Abdeckung.
Statische Analyse und Fusseln
Statische Analysetools fangen Fehler ab und erzwingen die Stilkonsistenz, bevor der Code zusammengeführt wird:
- Flake8: PEP 8 Style Guide Durchsetzung und grundlegende Fehlerprüfung.
- MyPy: statische Typprüfung (graduelle Eingabe ist auch im Forschungscode wertvoll).
- Schwarz: Automatische Codeformatierung (eliminiert Stildebatten).
- Pylint: Eine tiefere Analyse der Codequalität (vorsichtig anwenden; einige Regeln sind möglicherweise zu streng für den Forschungscode).
Führen Sie diese als separate CI-Jobs aus, damit Fehler nicht blockieren.
Umgebungskonsistenz mit Docker oder Conda
Eine der größten Herausforderungen für die Reproduzierbarkeit ist die Hölle der Abhängigkeit – verschiedene Versionen von Bibliotheken führen zu unterschiedlichen Ergebnissen. CI beseitigt dies durch die Installation von Abhängigkeiten in einer sauberen, kontrollierten Umgebung.
Option A: Docker (empfohlen für CI)
Docker bietet vollständige Containerisierung auf Systemebene. a Dockerfile definiert die genaue Umgebung:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
BOETTIGER. (2015) argumentiert, dass Docker „das Beste ist, was jemals mit wissenschaftlicher Reproduzierbarkeit passiert“ ist, da es den gesamten Software-Stack vom Betriebssystem zu Bibliotheken sperrt.
Option B: Conda-Umgebungen
Wenn Ihr Projekt auf Nicht-Python-Abhängigkeiten (z. B. HDF5, MPI) angewiesen ist, verwenden Sie Conda:
# environment.yml
name: research-ci
dependencies:
- python=3.11
- numpy>=1.24
- scipy
- pip:
- pytest
- pytest-cov
CI-Systeme können diese Umgebung mit conda env create -f environment.yml erstellen und aktivieren.
Wichtig: Docker garantiert Reproduzierbarkeit nicht warnt davor, dass selbst Container subtile Unterschiede haben können (Zeitstempel, zufällig Samen). Fixieren Sie für maximale Reproduzierbarkeit auch Bibliotheksversionen und Seeds.
Dokumentationsaufbau
Fügen Sie einen Schritt zum Erstellen von Dokumentationen (Sphinx, Mkdocs) hinzu und stellen Sie diese optional bereit. Documentation-as-Code stellt sicher, dass die Dokumente mit dem Code synchron bleiben. Der Entwurf der Dokumentation Best Practices für wissenschaftliche Python-Pakete erläutert dies im Detail.
Leistungs-Benchmarks
Überwachen Sie für rechnerisch intensive Forschungssoftware die Leistung, um Regressionen abzufangen. Tools wie ASV (Airspeed Velocity) führen Benchmarks automatisch durch und vergleichen sie mit früheren Läufen.
Waller et al. (2015) beschreiben einschließlich Leistungs-Benchmarks in CI , um Leistungseinbußen frühzeitig zu erkennen. Dies ist besonders wichtig für PDE-Solver, bei denen algorithmische Änderungen die Laufzeit drastisch beeinflussen können.
Plattformvergleich: GitHub-Aktionen gegen GitLab CI
Es gibt zwei dominante CI-Plattformen: GitHub-Aktionen und GitLab CI. Beide sind ausgereift und produktionsbereit. Die Wahl hängt häufig davon ab, wo Ihr Code gehostet wird.
GitHub-Aktionen
Stärken:
- Tiefe Integration mit GitHub (Pull Request Checks, Marktplatz der Aktionen).
- Einfachere Konfigurationssyntax für gängige Workflows.
- Größere Community und mehr Aktionen von Drittanbietern.
- Kostenlos für öffentliche Repositories; Großzügige kostenlose Stufe für private Repos.
Schwächen:
- Weniger leistungsfähig für komplexe Workflows als GitLab.
- Eingeschränkte integrierte Funktionen für das Abhängigkeits-Caching in frühen Versionen (jetzt verbessert).
- an das GitHub-Ökosystem gebunden.
Adoption: 33% der Organisationen nutzen GitHub-Aktionen (JetBrains, 2026).
Gitlab CI
Stärken:
- Mehr funktionsreiche Out of the Box (alles in einer Plattform).
- Leistungsstarke Matrixstrategien und Eltern-Kind-Pipelines.
- Bessere Unterstützung für Monorepos.
- Selbst-Hosting-Option für luftübergreifende Forschungsumgebungen.
Schwächen:
- steilere Lernkurve.
- Kleinere Community als GitHub-Aktionen.
- Die Benutzeroberfläche kann sich weniger poliert anfühlen.
Adoption: 19% der Organisationen (JetBrains, 2026).
Empfehlung
Wenn sich Ihr Code auf GitHub befindet, verwenden Sie GitHub-Aktionen, um die Einfachheit und die Integration des Ökosystems zu gewährleisten. Wenn Sie GitLab sind oder erweiterte Pipeline-Funktionen benötigen, wählen Sie GitLab CI. Betrachten Sie in luftgegappten HPC-Umgebungen selbst gehostetes GitLab.
Beide Plattformen können die gleichen Ergebnisse erzielen; Unterschiede sind meistens Workflow-Präferenz. Die folgenden Beispiele verwenden GitHub-Aktionen aufgrund ihrer Popularität, aber GitLab CI-Äquivalente sind einfach zu konstruieren.
CI einrichten: Ein vollständiger GitHub-Aktions-Workflow
Dieser Abschnitt bietet einen produktionsbereiten GitHub-Aktions-Workflow für ein wissenschaftliches Python-Paket. Passen Sie es an Ihre Projektstruktur an.
Voraussetzungen
- Tests existieren (
tests/Verzeichnis). - Anforderungen werden angeheftet (
requirements.txtoderenvironment.yml). - Optional, aber empfohlen:
Dockerfilefür die Reproduzierbarkeit der Umgebung. - Das Code-Repository befindet sich auf GitHub.
Grundlegender Workflow
.github/workflows/ci.yml erstellen:
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
cache-dependency-path: 'requirements.txt'
- name: Install dependencies
run: |
pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-cov
- name: Run tests with coverage
run: |
pytest --cov=src/ --cov-report=xml --cov-report=term-missing --junitxml=test-results.xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
file: ./coverage.xml
flags: unittests
name: codecov-umbrella
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-${{ matrix.python-version }}
path: test-results.xml
Schlüsselfunktionen:
- Matrix-Strategie: Die Tests werden auf Python 3.9–3.12 parallel ausgeführt, wodurch Kompatibilitätsprobleme frühzeitig auftreten.
- Caching:
actions/setup-pythonZwischenspeichert PIP-Pakete, wodurch die Installationszeit drastisch verkürzt wird. - Coverage: Terminalausgabe und XML für CodeCov.
- Artefakte: Testergebnisse werden hochgeladen, auch wenn die Tests fehlschlagen, wodurch Beweise erhalten bleiben.
Docker in CI verwenden
Wenn Sie eine Dockerfile haben, verwenden Sie diese, um die Konsistenz der Umgebung sicherzustellen:
- name: Build Docker image
run: docker build -t myproject-ci -f Dockerfile.ci .
- name: Run tests in Docker
run: |
docker run --rm
-v ${{ github.workspace }}:/app
myproject-ci
pytest --cov=src/ --cov-report=xml
Umgang mit langjährigen Tests
Wissenschaftliche Simulationen können Stunden dauern. CI-Läufer haben Zeitlimits (oft 6 Stunden). Strategien:
- Separate schnelle und langsame Tests: Verwenden Sie PYTest-Marker.
# In test file
import pytest
@pytest.mark.slow
def test_large_simulation():
# Takes >5 minutes
pass
in ci:
- name: Run quick tests
run: pytest -m "not slow"
- name: Run slow tests (optional, separate job)
if: github.event_name == 'schedule' # Only on schedule, not on every PR
run: pytest -m slow
- Testauswahl: Führen Sie nur Tests durch, die von der Codeänderung betroffen sind, indem
pytest --last-failedoderpytest -k "test_name". - Parallelize: Aufteilen von Tests auf mehrere CI-Jobs mit
pytest-xdist.
Caching-Abhängigkeiten
Über das Caching von Python-Paketen hinaus, kompilierte Erweiterungen im Cache und große Datendateien:
- name: Cache pip packages
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Cache pytest
uses: actions/cache@v4
with:
path: .pytest_cache
key: ${{ runner.os }}-pytest-${{ hashFiles('**/*.py') }}
Fusseln hinzufügen
Fügen Sie einen separaten Job hinzu, damit Stilprobleme die Testausführung nicht blockieren:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: pip install flake8 black mypy
- run: flake8 src/ tests/
- run: black --check src/ tests/
- run: mypy src/
Häufige Fallstricke und wie man sie vermeidet
Basierend auf den Herausforderungen von CI / CD, die in der Forschungssoftware identifiziert wurden ( testmu AI, 2026 ), finden Sie hier häufige Fehler und Lösungen.
Fallfall 1: Tests, die abblättern
Flaky-Tests bestehen manchmal und scheitern andere und untergraben das Vertrauen in CI. Sie sind besonders häufig mit:
- Rennbedingungen in parallelen Tests.
- Timing-Annahmen (z. B. „Warte 1 Sekunde“).
- Zufälligkeit ohne feste Samen.
Lösung: Alles bestimmen. Verwenden Sie pytest Fixtures mit scope="session" für gemeinsam genutzte Ressourcen. Setzen Sie zu Beginn jedes Tests zufällige Samen:
import random
import numpy as np
def setup_function():
random.seed(42)
np.random.seed(42)
Fallfall 2: CI das dauert zu lange
Wenn Ihre Pipeline Stunden dauert, werden die Entwickler sie umgehen.
Lösung:
- Geteilt in schnelle (bei jedem Commit) und langsame (nächtliche) Jobs.
- Cache aggressiv (PIP, Docker-Layer, Testdaten).
- Parallelisieren Sie mithilfe von Matrixstrategien.
- Markieren Sie bekannte langsame Tests mit
@pytest.mark.slowund führen Sie sie separat aus.
Fallfall 3: Umgebungsabweichung zwischen CI und Entwicklung
Tests bestehen in CI, scheitern jedoch lokal, da sich die Umgebungen unterscheiden.
Lösung: Verwenden Sie überall dieselbe Umgebungsdefinition. Docker ist ideal: Entwickler führen docker-compose run test lokal aus und CI verwendet das gleiche Dockerfile. Alternativ können Sie tox verwenden, um mehrere Umgebungen konsistent zu verwalten.
Fallfall 4: Fehlende oder veraltete Abhängigkeiten
CI schlägt fehl, weil eine Abhängigkeit Upstream aktualisiert wurde und die Kompatibilität unterbrochen wurde.
Lösung: PIN-Abhängigkeiten exakt in requirements.txt (package==1.2.3), nicht mit Bereichen (>=1.0). Verwenden Sie eine Abhängigkeitssperrdatei (pip freeze > requirements.txt). Aktualisieren Sie regelmäßig Abhängigkeiten kontrolliert (z. B. wöchentlich dependabot PRS).
Fallfall 5: Keine Leistungsüberwachung
Der Code wird mit der Zeit langsamer, aber Sie bemerken nur, wenn er katastrophal ist.
Lösung: Fügen Sie CI mit ASV Benchmarks hinzu. Konfigurieren Sie es so, dass es fehlschlägt, wenn die Leistung über einen Schwellenwert hinausgeht (z. B. 5% langsamer). Die Implementierung finden Sie unter Python Speed’s Guide.
Fallfall 6: Ignorieren der numerischen Validierung
Tests verwenden == bei Floats und fehlen intermittierend oder schlimmer noch, nicht korrekt.
Lösung: Verwenden Sie überall pytest.approx und numpy.testing.assert_allclose. Wählen Sie Toleranzen basierend auf der numerischen Analyse (z. B. Diskretisierungsfehler sollte O (H²) für Methoden zweiter Ordnung sein). Begründung der Dokumenttoleranz in Test-DocStrings.
Entscheidungsleitfaden: Wann verwenden Sie was?
Plattformauswahl
| Lage | Empfohlene Plattform |
|---|---|
| Code auf GitHub gehostet | GitHub-Aktionen |
| Code auf GitLab gehostet | Gitlab CI |
| Brauchen Sie selbst gehostete Läufer (Luft Gapped) | Gitlab CI (selbsthosted) |
| will einfachste Einrichtung | GitHub-Aktionen |
| Komplexe Multiprojekt-Pipelines | GitLab CI (Parent-Child-Pipelines) |
Teststrategie
| Codetyp | Empfohlener Ansatz |
|---|---|
| Reine Python-Funktionen | Unit-Tests mit Pytest, Ziel mit hoher Abdeckung (> 90%) |
| PDE-Solver | Regressionstests gegen Referenzlösungen, eigenschaftsbasierte Tests |
| Stochastische Algorithmen | Zufälliger Samen + statistische Tests (Mittelwert, Varianz) |
| Große Simulationen (> 5 min) | Trennen Sie langsame Tests, laufen Sie jede Nacht; Verwenden Sie @pytest.mark.slow |
| Mehrkomponentenkopplung | Integrationstests mit kleinen Testfällen, Kopplungskorrektheit validieren |
Containerwahl
| Notwendigkeit | Empfehlung |
|---|---|
| Maximale Reproduzierbarkeit, einschließlich DEPs auf Betriebssystemebene | Docking |
| Nur Python, einfacheres Management | Conda-Umgebung |
| HPC mit MPI-Bibliotheken | Conda (oder Docker mit --network=host und --ipc=host) |
| luftgedeckte Umgebung | Conda Pack oder Docker speichern / laden |
Integration von CI in Forschungs-Workflows
CI existiert nicht isoliert. Es verbindet sich mit anderen Tools und Praktiken.
Integration von Issue-Tracking
Der CI-Status wird bei GitHub/GitLab Pull-Anforderungen automatisch angezeigt. Configure branch protection rules to require CI passing before merge. Dadurch wird sichergestellt, dass nur validierter Code in den Hauptzweig eintritt.
Die bestehenden Beiträge von Matforge auf Issue-Tracking und Technische Schulden ergänzen CI, indem sie die Art und Weise der Verwaltung von Problemen definieren. CI bietet eine automatische Überprüfung, dass Probleme ordnungsgemäß behoben werden.
Reproduzierbarkeitsverbindung
Wie in Reproduzierbarkeit und seiner Rolle beim Debuggen erläutert, ist CI ein Eckpfeiler der reproduzierbaren Forschung. Jeder Commit, die CI übergibt, kann darauf vertrauen, dass auf jeder Maschine mit derselben Umgebung dieselben Ergebnisse erzielt werden. Dies ist unerlässlich für:
- Papierreproduzierbarkeit: Wenn Rezensenten nach Code fragen, können Sie auf ein bestimmtes Commit verweisen, das CI bestanden und die Zahlen erstellt hat.
- Kollaboration: Externe Mitwirkende können die gleichen Tests lokal durchführen.
- Long-Term Maintenance: Jahre später können Sie die Ergebnisse eines CI-validierten Commits immer noch neu erstellen.
Code-Review-Workflow
CI mit obligatorischer Code-Überprüfung paaren:
- Entwickler pusht Branch, CI läuft.
- Wenn CI übergeht, öffnen Sie eine Pull-Anforderung.
- Prüfer überprüfen die Codelogik und stellen sicher, dass die Tests angemessen sind.
- Nur nach CI-Pässen zusammenführen und Überprüfung genehmigt.
Dieser Workflow ist in der Industrie Standard, in der Forschung jedoch immer noch selten. Die Implementierung erhöht die Softwarequalität dramatisch.
Fortgeschrittene Themen
Matrixtest für mehrere Abhängigkeiten
Wissenschaftliche Pakete hängen oft von numpy/scipy mit versionsspezifischem Verhalten ab. Testen Sie über eine Matrix von Python- und Abhängigkeitsversionen:
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11"]
numpy-version: ["1.24", "1.25", "1.26"]
Installieren Sie die spezifische Numpy-Version im Schritt Install dependencies:
- run: |
pip install "numpy==${{ matrix.numpy-version }}" scipy
Damit werden Kompatibilitätsprobleme frühzeitig behoben.
Leistungsregressionserkennung
Verwenden Sie ASV, um die Leistung im Laufe der Zeit zu verfolgen:
- name: Run benchmarks
run: |
asv run --quick --show-stderr
# asv compares against previous commits and reports regressions
Konfigurieren Sie ASV so, dass der CI-Job fehlschlägt, wenn ein Benchmark >10% langsamer als der vorherige Lauf ist. Weitere Informationen finden Sie in Pythonspeeds Artikel.
Kontinuierliche Bereitstellung der Dokumentation
CI kann die Dokumentation automatisch auf GitHub-Seiten bereitstellen:
deploy-docs:
needs: test # Only run after tests pass
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install -r requirements-docs.txt
- run: sphinx-build -b html docs/ public/
- uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
Dadurch wird die Dokumentation mit Codeänderungen synchronisiert.
Verwandte Anleitungen
- Reproduzierbarkeit und ihre Rolle beim Debuggen – Wie Reproduzierbarkeitspraktiken die Debugging-Effizienz verbessern.
- Nachverfolgung langfristiger technischer Schulden in Forschungssoftware – Verwaltung der Codequalität im Laufe der Zeit; CI hilft, neue Schulden zu verhindern.
- Verwalten von Forschungssoftware durch Tickets – Integration von CI in Issue-Tracking-Workflows.
- Warum das Issue-Tracking in wissenschaftlichen Projekten von entscheidender Bedeutung ist – Verständnis der Bedeutung der Issue-Tracking in wissenschaftlicher Software Entwicklung.
- Kollaboration zwischen Entwicklern und Forschern – Innovation durch effektive Teamarbeit in skalierbare Wirkung umwandeln.
Zusammenfassung und nächste Schritte
Continuous Integration verwandelt Forschungssoftware aus fragilen, undokumentierten Skripten in zuverlässige, wartbare Assets. Die Kernschritte sind:
- Schreiben Sie mit PyTest automatisierte Tests mit
pytest.approxfür numerische Vergleiche. - Richten Sie eine CI-Pipeline (GitHub-Aktionen oder GitLab CI) ein, die bei jeder Push- und Pull-Anforderung ausgeführt wird.
- Verwenden Sie Docker oder Conda, um die Konsistenz der Umgebung zwischen CI und Entwicklung sicherzustellen.
- Fügen Sie Berichterstattungsberichterstattung, Fusting und Dokumentationserstellung hinzu.
- Überwachen Sie die Leistung mit Benchmarks, um Regressionen abzufangen.
- Integrieren Sie CI in Ihre bestehenden Prozesse zur Problemverfolgung und Codeüberprüfung.
Sofortaktionen:
- Wenn Sie keine Tests haben, schreiben Sie zunächst einige für die kritischsten Funktionen. Sogar 20% Deckung ist besser als keine.
- Erstellen Sie eine grundlegende CI-Konfigurationsdatei (
.github/workflows/ci.ymlwie oben gezeigt) und iterieren Sie. - Beheben Sie flockige Tests sofort – sie untergraben das Vertrauen.
- Fügen Sie Ihrer Readme ein „Badge“ hinzu, das den CI-Status anzeigt (z. B.
).
Wann sucht Beratung: Wenn es sich bei Ihrem Projekt um komplexe Abhängigkeiten (MPI, GPU-Code, proprietäre Bibliotheken) oder um 10.000 Codezeilen handelt, sollten Sie eine professionelle Überprüfung Ihres CI-Setups in Betracht ziehen. Wir bieten benutzerdefinierte CI / CD-Implementierungsdienste für Forschungsteams an.
Referenzen und Weiterlesen
- Wilson, G. et al. (2012). Best Practices for Scientific Computing . PLOS-Biologie .
- Boettiger, C. (2015). Eine Einführung in Docker für Reproduzierbare Forschung . ACM Sigops .
- Waller, J. et al. (2015). Einschließlich Leistungs-Benchmarks in die kontinuierliche Integration. Sean .
- Kontinuierliche Integration für Forschungssoftware – Best Practices-Leitfaden für Imperial College London.
- GitHub-Aktionen: Erstellen und Testen von Python – Offizielle Dokumentation.
- Gut genug Praktiken im wissenschaftlichen Rechnen – Software-Schreinerarbeiten.
Wortanzahl: ~2,200
Lesezeit: ~10 Minuten
Zielpublikum: Forscher, Doktoranden und Entwickler, die an wissenschaftlichen Python-Projekten arbeiten, die eine zuverlässige, automatisierte Qualität etablieren müssen Zusicherung