diff --git a/.woodpecker.yml b/.woodpecker.yml index 5e3e097..c0a25f6 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -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 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" \ No newline at end of file + + echo "Cały pipeline monorepo zakończony pomyślnie." \ No newline at end of file