From 4e94cccc889a643b9b38ccf82546c1999ca5b41c Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 13:20:39 +0100 Subject: [PATCH 01/17] Update .woodpecker.yml --- .woodpecker.yml | 147 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 107 insertions(+), 40 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 5e3e097..4bcf387 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,50 +1,117 @@ +kind: template +name: dotnet-build-publish + +variables: + - DOTNET_VERSION: "8.0" + steps: - restore: - image: mcr.microsoft.com/dotnet/sdk:8.0 - 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 - - test: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results - depends_on: - - build - - pack-nuget: - image: mcr.microsoft.com/dotnet/sdk:8.0 + # Krok 1: Detekcja, które projekty zmieniły się w tym commicie + detect-changed-projects: + image: alpine/git:latest commands: + - echo "Pobieram listę zmienionych plików..." + - git fetch origin $CI_COMMIT_BEFORE $CI_COMMIT_SHA - | - for proj in $(find . -name "*DataModel.csproj"); do - echo "Packaging $proj" - dotnet pack "$proj" --no-build -c Release -o ./nuget-packages - done + CHANGED_FILES=$(git diff --name-only $CI_COMMIT_BEFORE $CI_COMMIT_SHA || echo "") + echo "Zmienione pliki:" + echo "$CHANGED_FILES" + + # Resetujemy env + > $CI_WORKSPACE/.env + + # Sprawdzamy po folderach / konwencjach + if echo "$CHANGED_FILES" | grep -Eq "^(DataModel|src/DataModel|Models)/"; then + echo "BUILD_DATAMODEL=true" >> $CI_WORKSPACE/.env + echo "Zmieniono projekt DataModel" + fi + + if echo "$CHANGED_FILES" | grep -Eq "^(Api|src/Api|Backend)/"; then + echo "BUILD_API=true" >> $CI_WORKSPACE/.env + echo "Zmieniono projekt API" + fi + + if echo "$CHANGED_FILES" | grep -Eq "^(Web|Blazor|Frontend|src/Blazor)/"; then + echo "BUILD_BLAZOR=true" >> $CI_WORKSPACE/.env + echo "Zmieniono projekt Blazor/Web" + fi + + # Jeśli nic nie zmieniono w projektach – kończymy szybko + if ! grep -q "BUILD_" $CI_WORKSPACE/.env; then + echo "Brak zmian w projektach .NET – pomijam build." + exit 0 + fi + + cat $CI_WORKSPACE/.env + + # Krok 2: Restore (wspólny) + restore: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - dotnet nuget add source "http://srv51.mikr.us:20120/v3/index.json" --name baget || true + - dotnet restore --locked-mode + + # Krok 3: Testy (zawsze jeśli coś się zmieniło) + test: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - dotnet test --no-restore -c Release when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*DataModel.csproj" + event: [push, pull_request, tag] + + # Krok 4: Build & Publish – osobne kroki dla każdego typu + publish-datamodel: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - source $CI_WORKSPACE/.env + - | + if [ "$BUILD_DATAMODEL" != "true" ]; then + echo "Pomijam publikację DataModel – brak zmian" + exit 0 + fi + - | + VERSION=${CI_COMMIT_TAG:-$(git rev-parse --short HEAD)} + # Zakładam, że projekt DataModel ma .csproj w folderze DataModel/ + dotnet pack DataModel/*.csproj --no-restore --no-build -c Release -o /workspace/nupkg /p:Version=$VERSION + for pkg in /workspace/nupkg/*.nupkg; do + dotnet nuget push "$pkg" --source baget --api-key ${BAGET_API_KEY} --skip-duplicate + done + secrets: [baget_api_key] + when: + event: [push, tag] + branch: main publish-api: - image: mcr.microsoft.com/dotnet/sdk:8.0 + image: docker:latest commands: + - source $CI_WORKSPACE/.env - | - 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} - done + if [ "$BUILD_API" != "true" ]; then + echo "Pomijam budowanie API – brak zmian" + exit 0 + fi + - | + cd Api # lub ścieżka do Dockerfile + docker build -t myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} . + echo ${DOCKER_PASSWORD} | docker login myregistry -u ${DOCKER_USERNAME} --password-stdin + docker push myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} + secrets: [docker_username, docker_password] when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*API.csproj" \ No newline at end of file + event: [push, tag] + branch: main + + publish-blazor: + image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} + commands: + - source $CI_WORKSPACE/.env + - | + if [ "$BUILD_BLAZOR" != "true" ]; then + echo "Pomijam publikację Blazor – brak zmian" + exit 0 + fi + - dotnet publish Web/*.csproj --no-restore -c Release -o /workspace/publish + - echo "Pliki Blazor gotowe do deployu w /workspace/publish" + # Tu później możesz dodać rsync, az copy, itp. + when: + event: [push, tag] + branch: main \ No newline at end of file From b336dfe483c5f23983f2964b46adbf234c504a61 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:07:09 +0100 Subject: [PATCH 02/17] Update .woodpecker.yml --- .woodpecker.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index 4bcf387..3670a56 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -3,9 +3,19 @@ name: dotnet-build-publish variables: - DOTNET_VERSION: "8.0" +clone: + disable: true steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! + branch: master + depth: 1 + + # Krok 1: Detekcja, które projekty zmieniły się w tym commicie detect-changed-projects: image: alpine/git:latest From 6770e41a6ee7b6b13238d7a4eab97c2f0e40fd56 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:11:52 +0100 Subject: [PATCH 03/17] Update .woodpecker.yml --- .woodpecker.yml | 175 ++++++++++++++---------------------------------- 1 file changed, 49 insertions(+), 126 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 3670a56..755159b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,127 +1,50 @@ -kind: template -name: dotnet-build-publish - -variables: - - DOTNET_VERSION: "8.0" -clone: - disable: true - steps: - - clone-manual: - image: woodpeckerci/plugin-git - settings: - remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! - branch: master - depth: 1 - - - # Krok 1: Detekcja, które projekty zmieniły się w tym commicie - detect-changed-projects: - image: alpine/git:latest - commands: - - echo "Pobieram listę zmienionych plików..." - - git fetch origin $CI_COMMIT_BEFORE $CI_COMMIT_SHA - - | - CHANGED_FILES=$(git diff --name-only $CI_COMMIT_BEFORE $CI_COMMIT_SHA || echo "") - echo "Zmienione pliki:" - echo "$CHANGED_FILES" - - # Resetujemy env - > $CI_WORKSPACE/.env - - # Sprawdzamy po folderach / konwencjach - if echo "$CHANGED_FILES" | grep -Eq "^(DataModel|src/DataModel|Models)/"; then - echo "BUILD_DATAMODEL=true" >> $CI_WORKSPACE/.env - echo "Zmieniono projekt DataModel" - fi - - if echo "$CHANGED_FILES" | grep -Eq "^(Api|src/Api|Backend)/"; then - echo "BUILD_API=true" >> $CI_WORKSPACE/.env - echo "Zmieniono projekt API" - fi - - if echo "$CHANGED_FILES" | grep -Eq "^(Web|Blazor|Frontend|src/Blazor)/"; then - echo "BUILD_BLAZOR=true" >> $CI_WORKSPACE/.env - echo "Zmieniono projekt Blazor/Web" - fi - - # Jeśli nic nie zmieniono w projektach – kończymy szybko - if ! grep -q "BUILD_" $CI_WORKSPACE/.env; then - echo "Brak zmian w projektach .NET – pomijam build." - exit 0 - fi - - cat $CI_WORKSPACE/.env - - # Krok 2: Restore (wspólny) - restore: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - dotnet nuget add source "http://srv51.mikr.us:20120/v3/index.json" --name baget || true - - dotnet restore --locked-mode - - # Krok 3: Testy (zawsze jeśli coś się zmieniło) - test: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - dotnet test --no-restore -c Release - when: - event: [push, pull_request, tag] - - # Krok 4: Build & Publish – osobne kroki dla każdego typu - publish-datamodel: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - source $CI_WORKSPACE/.env - - | - if [ "$BUILD_DATAMODEL" != "true" ]; then - echo "Pomijam publikację DataModel – brak zmian" - exit 0 - fi - - | - VERSION=${CI_COMMIT_TAG:-$(git rev-parse --short HEAD)} - # Zakładam, że projekt DataModel ma .csproj w folderze DataModel/ - dotnet pack DataModel/*.csproj --no-restore --no-build -c Release -o /workspace/nupkg /p:Version=$VERSION - for pkg in /workspace/nupkg/*.nupkg; do - dotnet nuget push "$pkg" --source baget --api-key ${BAGET_API_KEY} --skip-duplicate - done - secrets: [baget_api_key] - when: - event: [push, tag] - branch: main - - publish-api: - image: docker:latest - commands: - - source $CI_WORKSPACE/.env - - | - if [ "$BUILD_API" != "true" ]; then - echo "Pomijam budowanie API – brak zmian" - exit 0 - fi - - | - cd Api # lub ścieżka do Dockerfile - docker build -t myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} . - echo ${DOCKER_PASSWORD} | docker login myregistry -u ${DOCKER_USERNAME} --password-stdin - docker push myregistry/${CI_REPO_OWNER}/${CI_REPO_NAME}-api:${CI_COMMIT_TAG:-latest} - secrets: [docker_username, docker_password] - when: - event: [push, tag] - branch: main - - publish-blazor: - image: mcr.microsoft.com/dotnet/sdk:${DOTNET_VERSION} - commands: - - source $CI_WORKSPACE/.env - - | - if [ "$BUILD_BLAZOR" != "true" ]; then - echo "Pomijam publikację Blazor – brak zmian" - exit 0 - fi - - dotnet publish Web/*.csproj --no-restore -c Release -o /workspace/publish - - echo "Pliki Blazor gotowe do deployu w /workspace/publish" - # Tu później możesz dodać rsync, az copy, itp. - when: - event: [push, tag] - branch: main \ No newline at end of file + restore: + image: mcr.microsoft.com/dotnet/sdk:8.0 + 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 + + test: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results + depends_on: + - build + + pack-nuget: + image: mcr.microsoft.com/dotnet/sdk:8.0 + 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" + + publish-api: + image: mcr.microsoft.com/dotnet/sdk:8.0 + 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} + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*API.csproj" \ No newline at end of file From e04f133b49ee63e5318a423af234384f4ae118b3 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:13:40 +0100 Subject: [PATCH 04/17] Update .woodpecker.yml --- .woodpecker.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 755159b..d3f908a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,14 @@ -steps: + clone: + disable: true + + steps: + clone-manual: + image: woodpeckerci/plugin-git + settings: + remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! + branch: master + depth: 1 + restore: image: mcr.microsoft.com/dotnet/sdk:8.0 commands: From f3977428ef1ff2db784b16fede1c03693e90c069 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:14:57 +0100 Subject: [PATCH 05/17] Update .woodpecker.yml --- .woodpecker.yml | 108 ++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index d3f908a..1b2883b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,60 +1,62 @@ - clone: +# Wyłącz domyślne clone wykonywane przez Woodpecker +clone: disable: true - steps: - clone-manual: +# Główna pipeline – wszystko co chcesz wykonać +pipeline: + clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://gitea:3000/FA/FA_WEB.git # wewnętrzny URL, agent widzi gitea po nazwie serwisu! + remote: http://gitea:3000/FA/FA_WEB.git branch: master depth: 1 - restore: - image: mcr.microsoft.com/dotnet/sdk:8.0 - 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 - - test: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results - depends_on: - - build - - pack-nuget: - image: mcr.microsoft.com/dotnet/sdk:8.0 - 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" - - publish-api: - image: mcr.microsoft.com/dotnet/sdk:8.0 - 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} - done - when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*API.csproj" \ No newline at end of file + restore: + image: mcr.microsoft.com/dotnet/sdk:8.0 + 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 + + test: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet test --no-build -c Release --logger "trx" --results-directory ./test-results + depends_on: + - build + + pack-nuget: + image: mcr.microsoft.com/dotnet/sdk:8.0 + 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" + + publish-api: + image: mcr.microsoft.com/dotnet/sdk:8.0 + 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 + done + when: + branch: ${CI_REPO_DEFAULT_BRANCH} + event: push + path: + include: + - "**/*API.csproj" \ No newline at end of file From 4c3397f5c51a2b314f89341cf3db322ca96e18d9 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:15:55 +0100 Subject: [PATCH 06/17] Update .woodpecker.yml --- .woodpecker.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 1b2883b..a00d865 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,8 +1,7 @@ -# Wyłącz domyślne clone wykonywane przez Woodpecker clone: - disable: true + git: + disable: true -# Główna pipeline – wszystko co chcesz wykonać pipeline: clone-manual: image: woodpeckerci/plugin-git From a301ca1eccfe68cd61095db7cf57a9d0038e2cf6 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:16:54 +0100 Subject: [PATCH 07/17] Update .woodpecker.yml --- .woodpecker.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a00d865..0f18096 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,8 +1,6 @@ -clone: - git: - disable: true +skip_clone: true -pipeline: +steps: clone-manual: image: woodpeckerci/plugin-git settings: @@ -14,6 +12,8 @@ pipeline: image: mcr.microsoft.com/dotnet/sdk:8.0 commands: - dotnet restore --no-cache --force + depends_on: + - clone-manual build: image: mcr.microsoft.com/dotnet/sdk:8.0 @@ -43,6 +43,8 @@ pipeline: path: include: - "**/*DataModel.csproj" + depends_on: + - test # opcjonalnie, dodaj jeśli chcesz zależności publish-api: image: mcr.microsoft.com/dotnet/sdk:8.0 @@ -58,4 +60,6 @@ pipeline: event: push path: include: - - "**/*API.csproj" \ No newline at end of file + - "**/*API.csproj" + depends_on: + - test # opcjonalnie \ No newline at end of file From 568d2d3918d85e70420bbffb93d6137b65149855 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 14:26:40 +0100 Subject: [PATCH 08/17] Update .woodpecker.yml --- .woodpecker.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index 0f18096..13625a0 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,6 +1,11 @@ skip_clone: true steps: + add-local-nuget-source: + image: mcr.microsoft.com/dotnet/sdk:8.0 + commands: + - dotnet nuget add source http://srv51.mikr.us:20120/nuget/index.json --name local-baget + clone-manual: image: woodpeckerci/plugin-git settings: @@ -14,6 +19,7 @@ steps: - dotnet restore --no-cache --force depends_on: - clone-manual + - add-local-nuget-source build: image: mcr.microsoft.com/dotnet/sdk:8.0 From e7e5e7fbb081340633b652d5a89f43b39c3db3dc Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:13:19 +0100 Subject: [PATCH 09/17] Update .woodpecker.yml --- .woodpecker.yml | 148 ++++++++++++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 60 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 13625a0..aba41e9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,71 +1,99 @@ -skip_clone: true +# .woodpecker.yml – uniwersalny dla dowolnej wersji .NET (6.0+) + +when: + event: [push, tag] + branch: [main] steps: - add-local-nuget-source: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet nuget add source http://srv51.mikr.us:20120/nuget/index.json --name local-baget - - 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:8.0 + image: mcr.microsoft.com/dotnet/sdk:latest commands: - - dotnet restore --no-cache --force - depends_on: - - clone-manual - - add-local-nuget-source - - build: - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - dotnet build --no-restore -c Release - depends_on: - - restore + - dotnet restore + volumes: + - nuget-cache:/root/.nuget/packages 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" --results-directory /tmp/test-results - pack-nuget: - image: mcr.microsoft.com/dotnet/sdk:8.0 + build: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - dotnet build --no-restore --configuration Release + + deploy: + image: mcr.microsoft.com/dotnet/sdk:latest + secrets: [baget_api_key, baget_url] + volumes: + - /opt/deployment:/deploy-host + - nuget-cache:/root/.nuget/packages 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" - depends_on: - - test # opcjonalnie, dodaj jeśli chcesz zależności + set -euo pipefail - publish-api: - image: mcr.microsoft.com/dotnet/sdk:8.0 - 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 - done - when: - branch: ${CI_REPO_DEFAULT_BRANCH} - event: push - path: - include: - - "**/*API.csproj" - depends_on: - - test # opcjonalnie \ No newline at end of file + echo "=== Informacje o projekcie ===" + echo "Repo: ${CI_REPO_NAME}" + echo "Commit: ${CI_COMMIT_SHA:0:8}" + echo "Branch/Tag: ${CI_COMMIT_REF}" + echo "SDK version: $(dotnet --version)" + + # Odczytujemy tylko metadane typu projektu + 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") + + echo "ProjectType: $PROJECT_TYPE" + echo "DeployToCentral: $DEPLOY_TO_CENTRAL" + + case "$PROJECT_TYPE" in + DataModel) + echo "→ Pakowanie i publikacja do BaGet" + dotnet pack --no-build --configuration Release -o /tmp/nupkg + + 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." + ;; + + ConsoleApp|Api|Blazor) + if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then + echo "DeployToCentral=false – pomijam deploy." + exit 0 + fi + + echo "→ Publikacja $PROJECT_TYPE" + + PUBLISH_ARGS="--no-build -c Release -o /tmp/publish" + + 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 + + dotnet publish $PUBLISH_ARGS + + TARGET_DIR="/deploy-host/$PROJECT_TYPE/${CI_REPO_NAME}" + mkdir -p "$TARGET_DIR" + cp -r /tmp/publish/* "$TARGET_DIR/" + find "$TARGET_DIR" -type f \( -name "*.dll" -o -name "*.exe" -o -perm /111 \) -exec chmod +x {} \; 2>/dev/null || true + + echo "Deploy zakończony → $TARGET_DIR" + ;; + + *) + echo "Nieznany ProjectType – brak akcji." + ;; + esac + +volumes: + - name: nuget-cache + temp: {} \ No newline at end of file From bc968a1a0fca2e145b92db7306bf20681273f38f Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:30:13 +0100 Subject: [PATCH 10/17] Update .woodpecker.yml --- .woodpecker.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index aba41e9..2d0c1cc 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,4 @@ -# .woodpecker.yml – uniwersalny dla dowolnej wersji .NET (6.0+) +# .woodpecker.yml – aktualna wersja dla Woodpecker 3.x (2026) when: event: [push, tag] @@ -9,8 +9,6 @@ steps: image: mcr.microsoft.com/dotnet/sdk:latest commands: - dotnet restore - volumes: - - nuget-cache:/root/.nuget/packages test: image: mcr.microsoft.com/dotnet/sdk:latest @@ -24,10 +22,13 @@ steps: deploy: image: mcr.microsoft.com/dotnet/sdk:latest - secrets: [baget_api_key, baget_url] volumes: - - /opt/deployment:/deploy-host - - nuget-cache:/root/.nuget/packages + - /opt/deployment:/deploy-host # Host mount – wymaga "Trusted" repo! + environment: + BAGET_API_KEY: + from_secret: baget_api_key # Nowa składnia secrets + BAGET_URL: + from_secret: baget_url commands: - | set -euo pipefail @@ -38,7 +39,6 @@ steps: echo "Branch/Tag: ${CI_COMMIT_REF}" echo "SDK version: $(dotnet --version)" - # Odczytujemy tylko metadane typu projektu 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") @@ -92,8 +92,4 @@ steps: *) echo "Nieznany ProjectType – brak akcji." ;; - esac - -volumes: - - name: nuget-cache - temp: {} \ No newline at end of file + esac \ No newline at end of file From b290ff47f2f198be009fb7886f933b020e8b9ae4 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:42:50 +0100 Subject: [PATCH 11/17] Update .woodpecker.yml --- .woodpecker.yml | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 2d0c1cc..24e3932 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,4 @@ -# .woodpecker.yml – aktualna wersja dla Woodpecker 3.x (2026) +# .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) when: event: [push, tag] @@ -22,13 +22,13 @@ steps: deploy: image: mcr.microsoft.com/dotnet/sdk:latest - volumes: - - /opt/deployment:/deploy-host # Host mount – wymaga "Trusted" repo! environment: BAGET_API_KEY: - from_secret: baget_api_key # Nowa składnia secrets + from_secret: baget_api_key BAGET_URL: from_secret: baget_url + DEPLOY_SSH_KEY: + from_secret: deploy_ssh_key commands: - | set -euo pipefail @@ -81,12 +81,20 @@ steps: dotnet publish $PUBLISH_ARGS - TARGET_DIR="/deploy-host/$PROJECT_TYPE/${CI_REPO_NAME}" - mkdir -p "$TARGET_DIR" - cp -r /tmp/publish/* "$TARGET_DIR/" - find "$TARGET_DIR" -type f \( -name "*.dll" -o -name "*.exe" -o -perm /111 \) -exec chmod +x {} \; 2>/dev/null || true + 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 - echo "Deploy zakończony → $TARGET_DIR" + TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}" + echo "Deploy via rsync do $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 {} \\; 2>/dev/null || true" + + echo "Deploy $PROJECT_TYPE zakończony pomyślnie → $TARGET_DIR" ;; *) From ac8213ff04ad0cd913c8ada887cd6b5d28f6f3c1 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:44:51 +0100 Subject: [PATCH 12/17] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 24e3932..f7e367a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,7 +1,7 @@ # .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) when: - event: [push, tag] + event: [push, tag, manual] branch: [main] steps: From cfbaaf85ace783f11d0e6a0f390184fb537847fd Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:47:38 +0100 Subject: [PATCH 13/17] Update .woodpecker.yml --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index f7e367a..ab6d052 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -2,7 +2,7 @@ when: event: [push, tag, manual] - branch: [main] + branch: [master] steps: restore: From b87b574b7d6f2876972e4ac829d69626fc906533 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:50:12 +0100 Subject: [PATCH 14/17] Update .woodpecker.yml --- .woodpecker.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index ab6d052..fd40dc4 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,10 +1,19 @@ # .woodpecker.yml – deploy via SSH (bez volumes i bez Trusted) +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: From 21336e8dc672b877477c5328f752bb39aa9377a3 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:56:52 +0100 Subject: [PATCH 15/17] Update .woodpecker.yml --- .woodpecker.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index fd40dc4..c71017a 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -19,6 +19,23 @@ steps: commands: - dotnet restore + restore: + image: mcr.microsoft.com/dotnet/sdk:latest + environment: + BAGET_URL: + from_secret: http://srv51.mikr.us:20120/v3/index.json # np. https://twoj-serwer.pl/baget/v3/index.json + BAGET_API_KEY: # opcjonalnie, jeśli BaGet wymaga klucza do pobierania + from_secret: hfsa853nc9vfap53285ybndfahi58325hie242dsafa954 + 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: From 21d6c76f37f64f97020a8c2cd1bd095813889b53 Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 21:58:07 +0100 Subject: [PATCH 16/17] Update .woodpecker.yml --- .woodpecker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c71017a..62c2002 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -23,9 +23,9 @@ steps: image: mcr.microsoft.com/dotnet/sdk:latest environment: BAGET_URL: - from_secret: http://srv51.mikr.us:20120/v3/index.json # np. https://twoj-serwer.pl/baget/v3/index.json + 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: hfsa853nc9vfap53285ybndfahi58325hie242dsafa954 + from_secret: baget_api_key commands: - | # Dodaj BaGet jako dodatkowe źródło NuGet From 398e0d57969911ebe12dc0bcf2f188094396af0f Mon Sep 17 00:00:00 2001 From: trent Date: Fri, 2 Jan 2026 22:02:39 +0100 Subject: [PATCH 17/17] Update .woodpecker.yml --- .woodpecker.yml | 164 +++++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 80 deletions(-) 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