Merge branch 'master' into Warehouses

This commit is contained in:
2026-01-02 22:05:07 +01:00

View File

@@ -1,50 +1,133 @@
# .woodpecker.yml monorepo .NET z poprawną kolejnością budowania
when:
event: [push, tag, manual]
branch: [master]
steps:
restore:
image: mcr.microsoft.com/dotnet/sdk:8.0
image: mcr.microsoft.com/dotnet/sdk:latest
commands:
- dotnet restore --no-cache --force
build:
image: mcr.microsoft.com/dotnet/sdk:8.0
commands:
- dotnet build --no-restore -c Release
depends_on:
- restore
- dotnet restore
test:
image: mcr.microsoft.com/dotnet/sdk:8.0
image: mcr.microsoft.com/dotnet/sdk:latest
commands:
- dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results
depends_on:
- build
- dotnet test --no-restore --configuration Release --logger "trx"
pack-nuget:
image: mcr.microsoft.com/dotnet/sdk:8.0
build-and-pack-datamodels:
image: mcr.microsoft.com/dotnet/sdk:latest
commands:
- |
for proj in $(find . -name "*DataModel.csproj"); do
echo "Packaging $proj"
dotnet pack "$proj" --no-build -c Release -o ./nuget-packages
done
when:
branch: ${CI_REPO_DEFAULT_BRANCH}
event: push
path:
include:
- "**/*DataModel.csproj"
set -euo pipefail
publish-api:
image: mcr.microsoft.com/dotnet/sdk:8.0
# Odczytujemy typy projektów w solution (zakładamy, że każdy ma <ProjectType> 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:
- |
for proj in $(find . -name "*API.csproj"); do
proj_name=$(basename "$proj" .csproj)
echo "Publishing $proj"
dotnet publish "$$ proj" --no-build -c Release -o ./publish/ $${proj_name}
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
when:
branch: ${CI_REPO_DEFAULT_BRANCH}
event: push
path:
include:
- "**/*API.csproj"
echo "Cały pipeline monorepo zakończony pomyślnie."