Skip to main content
Hilfe/Dokumentationen
Wechsel zwischen Dunkel/Hell/Auto Modus Wechsel zwischen Dunkel/Hell/Auto Modus Wechsel zwischen Dunkel/Hell/Auto Modus Zurück zur Startseite

Signieren

📄 LogicNodes erstellen & signieren ohne $(SolutionDir)

1. Hintergrund

In der bisherigen Konfiguration wurde $(SolutionDir) verwendet, um auf das LogicNodesSDK zuzugreifen. Das bringt Nachteile:

Die .sln muss zwingend im Hauptverzeichnis liegen.

Bei mehreren .sln-Dateien oder unterschiedlichen Projektstrukturen treten Pfadprobleme auf.

Buildskripte sind nicht mehr portabel, wenn die Ordnerstruktur geändert wird.

Die folgenden Varianten lösen dieses Problem.


2. Ordnerstruktur (Beispiel)

D:\GitService\Gira-Logikbausteine\
│
├─ AlexaTextToSpeech_TTS\
│  ├─ src\
│  │  ├─ Alexa_TextToSpeech\
│  │  │  └─ Alexa_TextToSpeech.csproj
│  └─ AlexaTextToSpeechSolution.sln
│
├─ PushSaver\
├─ KnxGira-Log\
├─ Wetterstation\
├─ LogicNodesSDK\
│  ├─ LogicNodeTool.exe
│  ├─ SignLogicNodes.exe
│  └─ Torsten_Kaeker.p12

3. Variante 1 – Absolute Pfade (simpel, aber unflexibel)

Diese Methode nutzt feste Pfade – funktioniert nur, solange der Hauptordner immer gleich bleibt.

Post-Build-Event (in Visual Studio):

"D:\GitService\Gira-Logikbausteine\LogicNodesSDK\LogicNodeTool.exe" create "$(TargetDir)" "D:\GitService\Gira-Logikbausteine\Zip"

"D:\GitService\Gira-Logikbausteine\LogicNodesSDK\SignLogicNodes.exe" ^
  "D:\GitService\Gira-Logikbausteine\LogicNodesSDK\signieren.p12" gira ^
  "D:\GitService\Gira-Logikbausteine\Zip"

Vorteile:

Schnell eingerichtet Nachteile:

Unflexibel bei Umzügen des Repositories

Funktioniert nicht auf anderen Systemen ohne Anpassung


4. Variante 2 – Relative Pfade (flexibel, abhängig von Projektlage)

Hier gehen wir relativ vom Projektordner ($(ProjectDir)) bis ins SDK.

Beispiel: .csproj liegt unter D:\GitService\Gira-Logikbausteine\AlexaTextToSpeech_TTS\src\Alexa_TextToSpeech\

REM Von src\Alexa_TextToSpeech hoch bis Repo-Root
"..\..\..\LogicNodesSDK\LogicNodeTool.exe" create "$(TargetDir)" "..\..\..\Zip"

if exist "..\..\..\LogicNodesSDK\Torsten_Kaeker.p12" (
  "..\..\..\LogicNodesSDK\SignLogicNodes.exe" "..\..\..\LogicNodesSDK\Torsten_Kaeker.p12" gira "..\..\..\Zip"
) else (
  echo WARN: Zertifikat fehlt: ..\..\..\LogicNodesSDK\Torsten_Kaeker.p12
)

Vorteile:

  • Funktioniert unabhängig vom Speicherort der .sln

  • Keine Hardcoded absoluten Pfade Nachteile:

  • Muss angepasst werden, wenn sich die Ordner-Tiefe ändert


5. Variante 3 – Globale MSBuild-Integration (empfohlen)

Einmal im Repo-Root einrichten, dann für alle Projekte automatisch ausführen, ohne dass jedes Projekt eigene Post-Build-Events braucht.

5.1 Directory.Build.props

In D:\GitService\Gira-Logikbausteine\Directory.Build.props:

<Project>
  <PropertyGroup>
    <!-- Repo-Root automatisch -->
    <RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
    <!-- Aktivierungsschalter -->
    <EnableLogicNodePackaging>true</EnableLogicNodePackaging>
  </PropertyGroup>
</Project>

5.2 Directory.Build.targets

In D:\GitService\Gira-Logikbausteine\Directory.Build.targets:

<Project>
  <PropertyGroup>
    <!-- Verhindern, dass das SDK sich selbst packt -->
    <IsLogicNodesSdkProject>$(MSBuildProjectDirectory.Contains('LogicNodesSDK'))</IsLogicNodesSdkProject>
  </PropertyGroup>

  <Target Name="PackageAndSignLogicNodes"
          AfterTargets="Build"
          Condition="'$(EnableLogicNodePackaging)' == 'true' AND '$(IsLogicNodesSdkProject)' != 'True'">

    <PropertyGroup>
      <ZipOutDir>$(RepoRoot)Zip</ZipOutDir>
      <SdkDir>$(RepoRoot)LogicNodesSDK</SdkDir>
      <CertFile>$(SdkDir)\Torsten_Kaeker.p12</CertFile>
    </PropertyGroup>

    <MakeDir Directories="$(ZipOutDir)" />

    <Exec Command="&quot;$(SdkDir)\LogicNodeTool.exe&quot; create &quot;$(TargetDir)&quot; &quot;$(ZipOutDir)&quot;" />

    <Exec Condition="Exists('$(CertFile)')"
          Command="&quot;$(SdkDir)\SignLogicNodes.exe&quot; &quot;$(CertFile)&quot; gira &quot;$(ZipOutDir)&quot;" />

    <Message Condition="!Exists('$(CertFile)')" Importance="High"
             Text="WARN: Zertifikat nicht gefunden: $(CertFile) – Signatur wird übersprungen." />
  </Target>
</Project>

Vorteile:

Nur 1x einrichten, läuft für alle Projekte automatisch

Keine harten Pfade, keine Anpassung bei Ordneränderungen

Zertifikat optional


6. Testing lokal

Projekt bauen → im Zip-Ordner im Repo-Root sollte das fertige LogicNode-Paket erscheinen

Ohne Zertifikat → nur Packaging, kein Signieren

Mit Zertifikat → Packaging + Signieren


🛠 Woodpecker CI Pipeline mit MinIO-Upload

pipeline:
  build:
    image: mcr.microsoft.com/dotnet/sdk:8.0
    commands:
      - dotnet restore
      - dotnet build --configuration Release
      - dotnet publish --configuration Release

  package:
    image: mcr.microsoft.com/dotnet/sdk:8.0
    commands:
      # Zip-Ordner erstellen
      - mkdir -p Zip
      # LogicNodes bauen & signieren (wie im MSBuild-Target, aber hier direkt)
      - mono LogicNodesSDK/LogicNodeTool.exe create src/Alexa_TextToSpeech/bin/Release/net8.0 Zip
      - if [ -f LogicNodesSDK/Torsten_Kaeker.p12 ]; then \
          mono LogicNodesSDK/SignLogicNodes.exe LogicNodesSDK/Torsten_Kaeker.p12 gira Zip; \
        fi

  upload-minio:
    image: minio/mc
    environment:
      MINIO_ALIAS: minio
      MINIO_URL: https://minio.terranodes.de
      MINIO_ACCESS_KEY: your_access_key
      MINIO_SECRET_KEY: your_secret_key
    commands:
      - mc alias set $MINIO_ALIAS $MINIO_URL $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
      - mc cp --recursive Zip $MINIO_ALIAS/logicnodes/alexatexttospeech/

Funktionsweise:

build – Baut die .NET-Projekte

package – Führt LogicNodeTool.exe + SignLogicNodes.exe aus

upload-minio – Lädt fertige Dateien in einen definierten MinIO-Bucket