diff --git a/.woodpecker.yml b/.woodpecker.yml index c0a25f6..2b5c959 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,133 +1,134 @@ -# .woodpecker.yml – monorepo .NET z poprawną kolejnością budowania +skip_clone: true 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 + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Restore wszystkich projektów ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; test: image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet test --no-restore --configuration Release --logger "trx" + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Uruchamianie testów ===" + dotnet test --no-restore --configuration Release --logger "trx" + depends_on: [restore] - build-and-pack-datamodels: + 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 + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Diagnostyka projektów ===" + find . -name "*.csproj" -type f | sort + mkdir -p nupkg + echo "=== Pakowanie projektów DataModel (wykrywane po obecności ) ===" + find . -name "*.csproj" -type f | while read csproj; do + if grep -q '' "$csproj"; 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" + echo "→ Pakuję $PROJECT_NAME ($csproj)" + dotnet pack "$csproj" --configuration Release -o "$CODE_DIR/nupkg" + else + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Pomijam $PROJECT_NAME – brak (nie jest to biblioteka NuGet)" fi done + echo "=== Spakowane pakiety (.nupkg) ===" + ls -la nupkg/ || echo "Brak spakowanych pakietów!" + depends_on: [test] - # 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: + publish-datamodels-to-baget: image: mcr.microsoft.com/dotnet/sdk:latest environment: - BAGET_API_KEY: + BAGETTER_API_KEY: from_secret: baget_api_key - BAGET_URL: - from_secret: baget_url + commands: + - | + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + + echo "=== Test połączenia z BaGetter ===" + curl -f http://baget:80/v3/index.json || echo "Nie można połączyć się z BaGetter!" + + # Tworzymy minimalny NuGet.Config tylko po to, żeby odblokować HTTP dla nazwanego źródła + cat < NuGet.Config + + + + + + + + + EOF + + echo "=== Użyty NuGet.Config (tylko do odblokowania HTTP) ===" + cat NuGet.Config + + echo "=== Publikacja pakietów do BaGetter ===" + find ./nupkg -name "*.nupkg" -type f | while read pkg; do + echo "→ Push $(basename "$pkg")" + dotnet nuget push "$pkg" \ + --source "BaGet" \ + --api-key "hfsa853nc9vfap53285ybndfahi58325hie242dsafa954" \ + --skip-duplicate + done + + echo "Wszystkie pakiety DataModel opublikowane w BaGetter!" + depends_on: [pack-datamodels] + + build-and-publish-apps: + image: mcr.microsoft.com/dotnet/sdk:latest + environment: 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 + set -euf + CODE_DIR="/woodpecker/src/srv51.mikr.us/git/FA/FA_WEB" + cd "$CODE_DIR" + echo "=== Ponowny restore aplikacji (z najnowszymi pakietami z BaGetter) ===" + find . -name "*.csproj" -type f -exec dotnet restore "{}" \; + echo "=== Publish aplikacji ===" + find . -name "*.csproj" -type f | while read csproj; do + PROJECT_NAME=$(basename "$csproj" .csproj) + PROJECT_DIR=$(dirname "$csproj") + if [[ "$PROJECT_NAME" == *"Api"* ]] || [[ "$PROJECT_NAME" == *"Blazor"* ]] || [[ "$PROJECT_DIR" == *"/Api/"* ]] || [[ "$PROJECT_DIR" == *"/Blazor/"* ]]; then + DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false") + if [ "$DEPLOY_TO_CENTRAL" != "true" ]; then + echo "Pomijam $PROJECT_NAME (DeployToCentral ≠ true)" + continue + fi + echo "→ Publish $PROJECT_NAME ($csproj)" + dotnet publish "$csproj" --no-restore -c Release -o "$CODE_DIR/publish-$PROJECT_NAME" + # ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← + # Tu wstaw swój kod deployu (rsync/ssh itp.) + # ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← + else + echo "Pomijam $PROJECT_NAME (nie jest to Api ani Blazor)" + fi done - - echo "Cały pipeline monorepo zakończony pomyślnie." \ No newline at end of file + echo "Pipeline zakończony pomyślnie!" + depends_on: [publish-datamodels-to-baget] \ No newline at end of file