From f1d56e3e9e91e2cdb2bfd7a1a1f25ac37c0b1366 Mon Sep 17 00:00:00 2001 From: trent Date: Thu, 15 Jan 2026 20:53:33 +0000 Subject: [PATCH] Update .woodpecker.yml --- .woodpecker.yml | 267 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 212 insertions(+), 55 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index e06c5ec..921b25f 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,9 +1,4 @@ skip_clone: true -when: - event: pull_request - action: - - merge - branch: master steps: debug-location: image: alpine @@ -14,8 +9,8 @@ steps: clone-manual: image: woodpeckerci/plugin-git settings: - remote: http://gitea:3000/FA/FA_WEB.git - branch: master + remote: http://gitea:3000/${CI_REPO}.git + branch: ${CI_COMMIT_BRANCH} depth: 1 restore: image: mcr.microsoft.com/dotnet/sdk:latest @@ -78,6 +73,42 @@ steps: echo "=== Spakowane pakiety ===" ls -la nupkg/ || echo "Brak spakowanych pakietów!" depends_on: [test] + + # NOWY KROK: Publish LinuxLocal apps + publish-linux-local: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - | + set -euf + cd "${CI_WORKSPACE}" + mkdir -p linux-apps + + echo "=== Publikacja aplikacji LinuxLocal ===" + find . -name "*.csproj" -type f | while read csproj; do + PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") + + if [ "$PROJECT_TYPE" = "LinuxLocal" ]; then + PROJECT_NAME=$(basename "$csproj" .csproj) + echo "→ Publishing $PROJECT_NAME" + + dotnet publish "$csproj" \ + --configuration Release \ + --output "./linux-apps/$PROJECT_NAME" \ + --runtime linux-x64 \ + --self-contained false \ + --no-restore + fi + done + + echo "" + if [ -d "./linux-apps" ] && [ "$(ls -A ./linux-apps)" ]; then + echo "Opublikowane aplikacje:" + ls -la linux-apps/ + else + echo "Brak aplikacji LinuxLocal do publikacji" + fi + depends_on: [restore] + publish-datamodels-to-baget: image: mcr.microsoft.com/dotnet/sdk:latest environment: @@ -108,8 +139,41 @@ steps: --skip-duplicate done depends_on: [pack-datamodels] - containerize-apps: + + select-projects-for-container: image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - | + set -euf + cd "${CI_WORKSPACE}" + > projects-to-build.txt + + echo "=== Selekcja projektów do konteneryzacji ===" + find . -name "*.csproj" -type f | while read csproj; do + PROJECT_NAME=$(basename "$csproj" .csproj) + PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown") + + if [ "$PROJECT_TYPE" = "Linux" ] || [ "$PROJECT_TYPE" = "Api" ] || [ "$PROJECT_TYPE" = "ServerProcess" ] || [ "$PROJECT_TYPE" = "Blazor" ] || [ "$PROJECT_TYPE" = "LinuxLocal" ]; then + PROJECT_DIR=$(dirname "$csproj") + echo "→ Dodaję $PROJECT_NAME (typ: $PROJECT_TYPE)" + echo "$PROJECT_DIR|$PROJECT_NAME" >> projects-to-build.txt + else + echo "→ Pomijam $PROJECT_NAME (typ: $PROJECT_TYPE)" + fi + done + + echo "" + if [ -s projects-to-build.txt ]; then + echo "Znalezione projekty:" + cat projects-to-build.txt + echo "Łącznie: $(wc -l < projects-to-build.txt)" + else + echo "BRAK PROJEKTÓW DO BUDOWY!" + fi + depends_on: [publish-datamodels-to-baget] + + containerize-apps: + image: docker:27-cli environment: GITEA_USER: from_secret: gitea_registry_user @@ -119,52 +183,145 @@ steps: - | set -euf cd "${CI_WORKSPACE}" - - # Instalacja narzędzi Docker w obrazie .NET (Alpine) - apk update && apk add --no-cache docker docker-cli-buildx - - echo "DEBUG: Użytkownik = '$GITEA_USER'" - echo "DEBUG: Token (pierwsze 4 znaki) = $GITEA_TOKEN..." - + + REGISTRY_ORG="fa" + echo "$GITEA_TOKEN" | docker login git.modwad.pl -u "$GITEA_USER" --password-stdin - - dotnet restore - - find . -name "*.csproj" -type f | while read csproj; do - PROJECT_DIR=$(dirname "$csproj") - PROJECT_NAME=$(basename "$csproj" .csproj) - 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") - if [ "$DEPLOY_TO_CENTRAL" != "true" ] || [[ "$PROJECT_TYPE" == "Unknown" || "$PROJECT_TYPE" == "DataModel" || "$PROJECT_TYPE" == "LinuxLocal" ]]; then - echo "Pomijam $PROJECT_NAME ($PROJECT_TYPE)" - continue - fi - IMAGE_NAME="trent/${PROJECT_NAME,,}" - FULL_IMAGE="git.modwad.pl/${IMAGE_NAME}" - cat > "${PROJECT_DIR}/Dockerfile.temp" <<-EOF - FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base - WORKDIR /app - EXPOSE 8080 - FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build - WORKDIR /src - COPY . . - RUN dotnet restore "${PROJECT_NAME}.csproj" - RUN dotnet publish "${PROJECT_NAME}.csproj" -c Release -o /app/publish /p:UseAppHost=false - FROM base AS final - WORKDIR /app - COPY --from=build /app/publish . - ENV ASPNETCORE_URLS=http://+:8080 - ENTRYPOINT ["dotnet", "${PROJECT_NAME}.dll"] - EOF - echo "Buduję → ${FULL_IMAGE}:${CI_COMMIT_SHA}" - docker buildx build --platform linux/amd64 \ - -t "${FULL_IMAGE}:${CI_COMMIT_SHA}" \ - -t "${FULL_IMAGE}:latest" \ - -f "${PROJECT_DIR}/Dockerfile.temp" \ - "${PROJECT_DIR}" - docker push "${FULL_IMAGE}:${CI_COMMIT_SHA}" - docker push "${FULL_IMAGE}:latest" - rm -f "${PROJECT_DIR}/Dockerfile.temp" - echo "Opublikowano: ${FULL_IMAGE}:latest" + + if [ ! -s projects-to-build.txt ]; then + echo "Brak projektow" + exit 0 + fi + + rm -f NuGet.Config + + cat > NuGet.Config < + + + + + + + + EOF + + cat projects-to-build.txt | while IFS='|' read -r PDIR PNAME; do + PDIR=$(echo "$PDIR" | xargs) + PNAME=$(echo "$PNAME" | xargs) + + test -z "$PNAME" && continue + test ! -d "$PDIR" && continue + + echo -n "git.modwad.pl/${REGISTRY_ORG}/" > /tmp/tag.txt + echo "$PNAME" | tr 'A-Z' 'a-z' | tr -d '\n' >> /tmp/tag.txt + + echo "$PNAME" > /tmp/pname.txt + echo "$PDIR" | sed 's|^\./||' > /tmp/pdir.txt + + cat > "Dockerfile.temp" <<'ENDOFDOCKERFILE' + FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base + WORKDIR /app + EXPOSE 8080 + FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build + WORKDIR /src + COPY . . + RUN dotnet restore "%%PROJECTDIR%%/%%PROJECTNAME%%.csproj" + RUN dotnet publish "%%PROJECTDIR%%/%%PROJECTNAME%%.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore + FROM base AS final + WORKDIR /app + COPY --from=build /app/publish . + ENV ASPNETCORE_URLS=http://+:8080 + ENTRYPOINT ["dotnet", "%%PROJECTNAME%%.dll"] + ENDOFDOCKERFILE + + REAL_PNAME=$(cat /tmp/pname.txt) + REAL_PDIR=$(cat /tmp/pdir.txt) + sed "s|%%PROJECTNAME%%|$REAL_PNAME|g; s|%%PROJECTDIR%%|$REAL_PDIR|g" "Dockerfile.temp" > "Dockerfile.final" + + echo "=== Budowanie obrazu ===" + DOCKER_BUILDKIT=0 docker build \ + --network=host \ + -t "$(cat /tmp/tag.txt):${CI_COMMIT_SHA}" \ + -t "$(cat /tmp/tag.txt):latest" \ + -f "Dockerfile.final" \ + . + + echo "=== Pushing SHA tag ===" + docker push "$(cat /tmp/tag.txt):${CI_COMMIT_SHA}" + + echo "=== Pushing latest tag ===" + docker push "$(cat /tmp/tag.txt):latest" + + echo "=== SUCCESS: $(cat /tmp/tag.txt) ===" + + rm -f "Dockerfile.temp" "Dockerfile.final" done - depends_on: [publish-datamodels-to-baget] \ No newline at end of file + + echo "=== WSZYSTKIE PROJEKTY ZAKONCZONE ===" + depends_on: [select-projects-for-container] + + # NOWY KROK: Deploy LinuxLocal na serwer + deploy-linux-local: + image: alpine:latest + commands: + - | + set -euf + cd "${CI_WORKSPACE}" + + if [ ! -d "./linux-apps" ] || [ ! "$(ls -A ./linux-apps)" ]; then + echo "Brak aplikacji LinuxLocal do wdrożenia" + exit 0 + fi + + echo "=== Wdrażanie aplikacji LinuxLocal do /opt/fa-apps/ ===" + mkdir -p /opt/fa-apps + + for app in ./linux-apps/*; do + APP_NAME=$(basename "$app") + echo "→ Kopiuję $APP_NAME" + + rm -rf "/opt/fa-apps/$APP_NAME" + cp -r "$app" "/opt/fa-apps/$APP_NAME" + + # Nadaj uprawnienia wykonywania + chmod +x "/opt/fa-apps/$APP_NAME/$APP_NAME" + done + + echo "" + echo "=== Wdrożone aplikacje ===" + ls -la /opt/fa-apps/ + depends_on: [publish-linux-local, containerize-apps] + + cleanup-docker: + image: docker:27-cli + commands: + - | + echo "=== Status przed czyszczeniem ===" + docker system df + + echo "" + echo "=== Usuwanie dangling images ===" + docker image prune -f + + echo "" + echo "=== Usuwanie starych wersji aplikacji ===" + docker images --format "{{.Repository}}:{{.Tag}}" | grep "git.modwad.pl/" | grep -v ":latest" | grep -v ":${CI_COMMIT_SHA}" | while read img; do + echo "Usuwam: $img" + docker rmi "$img" || true + done + + echo "" + echo "=== Usuwanie kontenerów ===" + docker container prune -f + + echo "" + echo "=== Usuwanie build cache ===" + docker builder prune -af + + echo "" + echo "=== Status po czyszczeniu ===" + docker system df + depends_on: [deploy-linux-local] + when: + status: [success, failure]