Signieren
📄 LogicNodes erstellen & signieren ohne $(SolutionDir)
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.
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
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
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
Einmal im Repo-Root einrichten, dann für alle Projekte automatisch ausführen, ohne dass jedes Projekt eigene Post-Build-Events braucht.
In D:\GitService\Gira-Logikbausteine\Directory.Build.props
:
<Project>
<PropertyGroup>
<!-- Repo-Root automatisch -->
<RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
<!-- Aktivierungsschalter -->
<EnableLogicNodePackaging>true</EnableLogicNodePackaging>
</PropertyGroup>
</Project>
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=""$(SdkDir)\LogicNodeTool.exe" create "$(TargetDir)" "$(ZipOutDir)"" />
<Exec Condition="Exists('$(CertFile)')"
Command=""$(SdkDir)\SignLogicNodes.exe" "$(CertFile)" gira "$(ZipOutDir)"" />
<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
Projekt bauen → im Zip
-Ordner im Repo-Root sollte das fertige LogicNode-Paket erscheinen
Ohne Zertifikat → nur Packaging, kein Signieren
Mit Zertifikat → Packaging + Signieren
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