diff --git a/.woodpecker.yml b/.woodpecker.yml index 43dde5f..e7502c9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -14,8 +14,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 @@ -23,7 +23,7 @@ steps: - | set -euf cd "${CI_WORKSPACE}" - echo "Aktualna ścieżka: $(pwd)" + echo "Aktualna ścieżka do pliku: $(pwd)" echo "=== Restore wszystkich projektów ===" find . -name "*.csproj" -type f -exec dotnet restore "{}" \; test: @@ -78,6 +78,52 @@ steps: echo "=== Spakowane pakiety ===" ls -la nupkg/ || echo "Brak spakowanych pakietów!" depends_on: [test] + + publish-linux-local: + image: mcr.microsoft.com/dotnet/sdk:latest + commands: + - | + set -euf + cd "${CI_WORKSPACE}" + mkdir -p linux-apps + + echo "=== Konfiguracja NuGet sources ===" + cat < NuGet.Config + + + + + + + + + EOF + + 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 + 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,11 +154,41 @@ steps: --skip-duplicate done depends_on: [pack-datamodels] - containerize-apps: + + select-projects-for-container: image: mcr.microsoft.com/dotnet/sdk:latest - privileged: true - volumes: - - /var/run/docker.sock:/var/run/docker.sock + 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 @@ -122,52 +198,168 @@ steps: - | set -euf cd "${CI_WORKSPACE}" - - # Instalacja narzędzi Docker w kontenerze .NET (Alpine-based) - 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 "=== DEBUG: Zawartość projects-to-build.txt ===" + cat projects-to-build.txt || echo "Plik nie istnieje!" + echo "=== DEBUG: REGISTRY_ORG = '$REGISTRY_ORG' ===" + 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)" + + 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) + + echo "=== DEBUG: PDIR='$PDIR' PNAME='$PNAME' ===" + + test -z "$PNAME" && continue + test ! -d "$PDIR" && continue + + echo -n "git.modwad.pl/fa/" > /tmp/tag.txt + echo "$PNAME" | tr 'A-Z' 'a-z' | tr -d '\n' >> /tmp/tag.txt + + echo "=== DEBUG: Generated tag: $(cat /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 + + echo "=== WSZYSTKIE PROJEKTY ZAKONCZONE ===" + depends_on: [select-projects-for-container] + + deploy-linux-local: + image: alpine:latest + commands: + - | + cd "${CI_WORKSPACE}" + + echo "=== Sprawdzanie aplikacji LinuxLocal ===" + if [ ! -d "./linux-apps" ]; then + echo "Folder ./linux-apps nie istnieje" + exit 0 + fi + + echo "=== DEBUG: Zawartość ./linux-apps/ ===" + ls -la ./linux-apps/ + + echo "=== Wdrażanie aplikacji LinuxLocal do /opt/fa-apps/ ===" + mkdir -p /opt/fa-apps + + cd ./linux-apps + + for app in *; do + echo "→ DEBUG: Sprawdzam $app" + + if [ ! -d "$app" ]; then + echo " → $app nie jest folderem, pomijam" 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" + + echo " → Kopiuję $app" + echo " → Zawartość:" + ls -la "$app/" + + rm -rf "/opt/fa-apps/$app" + cp -r "$app" "/opt/fa-apps/$app" + + find "/opt/fa-apps/$app" -type f -executable -exec chmod +x {} \; + + echo " → Skopiowano!" done - depends_on: [publish-datamodels-to-baget] \ No newline at end of file + + cd "${CI_WORKSPACE}" + + echo "" + echo "=== Wdrożone aplikacje ===" + ls -laR /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] \ No newline at end of file