# .woodpecker.yml – monorepo .NET z poprawną kolejnością budowania when: event: [push, tag, manual] branch: [master] steps: restore: image: mcr.microsoft.com/dotnet/sdk:latest commands: - dotnet restore test: image: mcr.microsoft.com/dotnet/sdk:latest commands: - dotnet test --no-restore --configuration Release --logger "trx" build-and-pack-datamodels: image: mcr.microsoft.com/dotnet/sdk:latest commands: - | set -euo pipefail # Odczytujemy typy projektów w solution (zakładamy, że każdy ma w csproj) echo "=== Wykrywanie projektów DataModel ===" LOCAL_NUGET="/tmp/local-nuget" mkdir -p "$LOCAL_NUGET" for csproj in *.csproj; do [ -f "$csproj" ] || continue PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") if [[ "$PROJECT_TYPE" == "DataModel" ]]; then PROJECT_NAME=$(basename "$csproj" .csproj) echo "→ Pakuję DataModel: $PROJECT_NAME" dotnet pack "$csproj" --no-build --configuration Release -o "$LOCAL_NUGET" echo " Pakiet zapisany w $LOCAL_NUGET" fi done # Dodajemy lokalny folder jako źródło NuGet dla kolejnych kroków dotnet nuget add source "$LOCAL_NUGET" --name local-temp-nuget echo "Lokalne źródło NuGet dodane: $LOCAL_NUGET" ls -la "$LOCAL_NUGET" deploy: image: mcr.microsoft.com/dotnet/sdk:latest environment: BAGET_API_KEY: from_secret: baget_api_key BAGET_URL: from_secret: baget_url DEPLOY_SSH_KEY: from_secret: deploy_ssh_key commands: - | set -euo pipefail echo "=== Informacje o projekcie (monorepo) ===" echo "Repo: ${CI_REPO_NAME}" echo "Commit: ${CI_COMMIT_SHA:0:8}" echo "Branch/Tag: ${CI_COMMIT_REF}" # Publikujemy wszystkie projekty (oprócz DataModel – one już spakowane) LOCAL_NUGET="/tmp/local-nuget" for csproj in *.csproj; do [ -f "$csproj" ] || continue PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") case "$PROJECT_TYPE" in DataModel) # Opcjonalnie: publikuj do BaGet na koniec (po udanym buildzie całego solution) if [[ -n "${BAGET_URL:-}" ]]; then echo "→ Publikacja $PROJECT_TYPE do BaGet" for pkg in "$LOCAL_NUGET"/*.nupkg; do if [[ "$pkg" == *$(basename "$csproj" .csproj)* ]]; then dotnet nuget push "$pkg" --api-key "$BAGET_API_KEY" --source "$BAGET_URL" --skip-duplicate fi done fi ;; ConsoleApp|Api|Blazor) if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then echo "Projekt $PROJECT_TYPE: DeployToCentral=false – pomijam" continue fi echo "→ Publikacja $PROJECT_TYPE" PUBLISH_ARGS="-c Release -o /tmp/publish-$(basename "$csproj" .csproj)" if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then RID=$(dotnet msbuild "$csproj" -getProperty:RuntimeIdentifier -noLogo || echo "linux-x64") SELF_CONTAINED=$(dotnet msbuild "$csproj" -getProperty:SelfContained -noLogo || echo "true") SINGLE_FILE=$(dotnet msbuild "$csproj" -getProperty:PublishSingleFile -noLogo || echo "true") PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE" else TRIMMED=$(dotnet msbuild "$csproj" -getProperty:PublishTrimmed -noLogo || echo "true") PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED" fi dotnet publish "$csproj" --no-restore $PUBLISH_ARGS # Deploy via SSH mkdir -p ~/.ssh echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H localhost >> ~/.ssh/known_hosts 2>/dev/null TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}-$(basename "$csproj" .csproj)" rsync -avz --delete "/tmp/publish-$(basename "$csproj" .csproj)/" " $(whoami)@localhost:$TARGET_DIR/" ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; || true" echo "Deploy $PROJECT_TYPE zakończony → $TARGET_DIR" ;; *) echo "Projekt $(basename "$csproj") – nieznany typ ($PROJECT_TYPE), pomijam" ;; esac done echo "Cały pipeline monorepo zakończony pomyślnie."