diff --git a/.woodpecker.yml b/.woodpecker.yml index 62c2002..c0a25f6 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,50 +1,52 @@ -# .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) - -skip_clone: true +# .woodpecker.yml – monorepo .NET z poprawną kolejnością budowania when: event: [push, tag, manual] branch: [master] steps: - clone-manual: - image: woodpeckerci/plugin-git - settings: - remote: http://gitea:3000/FA/FA_WEB.git - branch: master - depth: 1 - restore: image: mcr.microsoft.com/dotnet/sdk:latest commands: - dotnet restore - restore: - image: mcr.microsoft.com/dotnet/sdk:latest - environment: - BAGET_URL: - from_secret: baget_url # np. https://twoj-serwer.pl/baget/v3/index.json - BAGET_API_KEY: # opcjonalnie, jeśli BaGet wymaga klucza do pobierania - from_secret: baget_api_key - commands: - - | - # Dodaj BaGet jako dodatkowe źródło NuGet - dotnet nuget add source "$BAGET_URL" --name internal-baget - - # Jeśli BaGet wymaga autentykacji do pobierania (rzadkie, ale możliwe) - # dotnet nuget update source internal-baget --username anything --password "$BAGET_API_KEY" --store-password-in-clear-text - - dotnet restore - test: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet test --no-restore --configuration Release --logger "trx" --results-directory /tmp/test-results + - dotnet test --no-restore --configuration Release --logger "trx" - build: + build-and-pack-datamodels: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet build --no-restore --configuration Release + - | + 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 @@ -59,71 +61,73 @@ steps: - | set -euo pipefail - echo "=== Informacje o projekcie ===" + echo "=== Informacje o projekcie (monorepo) ===" echo "Repo: ${CI_REPO_NAME}" echo "Commit: ${CI_COMMIT_SHA:0:8}" echo "Branch/Tag: ${CI_COMMIT_REF}" - echo "SDK version: $(dotnet --version)" - PROJECT_TYPE=$(dotnet msbuild -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") - DEPLOY_TO_CENTRAL=$(dotnet msbuild -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") + # Publikujemy wszystkie projekty (oprócz DataModel – one już spakowane) + LOCAL_NUGET="/tmp/local-nuget" - echo "ProjectType: $PROJECT_TYPE" - echo "DeployToCentral: $DEPLOY_TO_CENTRAL" + for csproj in *.csproj; do + [ -f "$csproj" ] || continue - case "$PROJECT_TYPE" in - DataModel) - echo "→ Pakowanie i publikacja do BaGet" - dotnet pack --no-build --configuration Release -o /tmp/nupkg + 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") - for pkg in /tmp/nupkg/*.nupkg; do - dotnet nuget push "$pkg" \ - --api-key "${BAGET_API_KEY}" \ - --source "${BAGET_URL}" \ - --skip-duplicate - done - echo "Publikacja NuGet zakończona." - ;; + 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 "DeployToCentral=false – pomijam deploy." - exit 0 - fi + ConsoleApp|Api|Blazor) + if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then + echo "Projekt $PROJECT_TYPE: DeployToCentral=false – pomijam" + continue + fi - echo "→ Publikacja $PROJECT_TYPE" + echo "→ Publikacja $PROJECT_TYPE" - PUBLISH_ARGS="--no-build -c Release -o /tmp/publish" + PUBLISH_ARGS="-c Release -o /tmp/publish-$(basename "$csproj" .csproj)" - if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then - RID=$(dotnet msbuild -getProperty:RuntimeIdentifier -noLogo 2>/dev/null || echo "linux-x64") - SELF_CONTAINED=$(dotnet msbuild -getProperty:SelfContained -noLogo 2>/dev/null || echo "true") - SINGLE_FILE=$(dotnet msbuild -getProperty:PublishSingleFile -noLogo 2>/dev/null || echo "true") - PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE" - else - TRIMMED=$(dotnet msbuild -getProperty:PublishTrimmed -noLogo 2>/dev/null || echo "true") - PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED" - fi + 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 $PUBLISH_ARGS + dotnet publish "$csproj" --no-restore $PUBLISH_ARGS - echo "Przygotowanie SSH do deployu na localhost" - 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 + # 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}" - echo "Deploy via rsync do $TARGET_DIR" + TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}-$(basename "$csproj" .csproj)" + rsync -avz --delete "/tmp/publish-$(basename "$csproj" .csproj)/" " $(whoami)@localhost:$TARGET_DIR/" - rsync -avz --delete /tmp/publish/ "$(whoami)@localhost:$TARGET_DIR/" + ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; || true" - ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; 2>/dev/null || true" + echo "Deploy $PROJECT_TYPE zakończony → $TARGET_DIR" + ;; - echo "Deploy $PROJECT_TYPE zakończony pomyślnie → $TARGET_DIR" - ;; + *) + echo "Projekt $(basename "$csproj") – nieznany typ ($PROJECT_TYPE), pomijam" + ;; + esac + done - *) - echo "Nieznany ProjectType – brak akcji." - ;; - esac \ No newline at end of file + echo "Cały pipeline monorepo zakończony pomyślnie." \ No newline at end of file