diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 60c6976..94d7d7d 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -30,34 +30,30 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + fetch-depth: 0 # Necessario per MinVer: deve percorrere tutta la storia Git per trovare i tag - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '9.0.x' - - name: Generate version.json with MinVer + - name: Calcola versione e genera version.json run: | - # Fetch all tags for MinVer to work correctly + # Calcola versione tramite git describe (non richiede dotnet build) git fetch --tags --force - - # Build project to trigger MinVer (calcola versione automaticamente) - cd Data_Coupler - dotnet build -c Release /p:ContinuousIntegrationBuild=true - - # Extract version calculated by MinVer from build output - VERSION=$(dotnet msbuild -getProperty:Version -p:ContinuousIntegrationBuild=true 2>/dev/null | tail -1) - - # Fallback if MinVer fails (no tags) - if [ -z "$VERSION" ] || [ "$VERSION" = "0.0.0-alpha.0" ]; then - echo "Warning: No git tags found. MinVer returned default. Using fallback." - VERSION="2.1.0-alpha.0.$(git rev-list --count HEAD)" + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + if [ -z "$LATEST_TAG" ]; then + echo "Warning: Nessun tag Git trovato. Uso fallback." + VERSION="2.3.2" + else + VERSION="${LATEST_TAG#v}" fi - echo "MinVer calculated version: $VERSION" + echo "Versione calcolata: $VERSION (da tag: $LATEST_TAG)" - # Create version.json - cat > wwwroot/version.json < Data_Coupler/wwwroot/version.json <> "$GITHUB_ENV" shell: bash - name: Set up Docker Buildx @@ -136,6 +134,7 @@ jobs: platforms: linux/amd64 # Aumenta timeout per registry lenti build-args: | + APP_VERSION=${{ env.APP_VERSION }} BUILDKIT_STEP_LOG_MAX_SIZE=50000000 provenance: false sbom: false @@ -159,7 +158,7 @@ jobs: steps: - name: Checkout repository with Git run: | - git clone --depth 1 --branch ${{ github.ref_name }} https://alessio:%REGISTRY_TOKEN%@gitea.home-nas-ds.org/${{ github.repository }}.git . + git clone --branch ${{ github.ref_name }} https://alessio:%REGISTRY_TOKEN%@gitea.home-nas-ds.org/${{ github.repository }}.git . if not exist Dockerfile.windows ( echo ERROR: Dockerfile.windows not found exit /b 1 @@ -175,33 +174,26 @@ jobs: dotnet --version shell: pwsh - - name: Generate version.json with MinVer + - name: Calcola versione e genera version.json run: | - # Fetch all tags for MinVer to work correctly + # Calcola versione tramite git describe (non richiede dotnet build) git fetch --tags --force - - # Build project to trigger MinVer - cd Data_Coupler - dotnet build -c Release /p:ContinuousIntegrationBuild=true - - # Extract version calculated by MinVer - $VERSION = dotnet msbuild -getProperty:Version -p:ContinuousIntegrationBuild=true 2>$null | Select-Object -Last 1 - - # Fallback if MinVer fails (no tags) - if ([string]::IsNullOrWhiteSpace($VERSION) -or $VERSION -eq "0.0.0-alpha.0") { - Write-Host "Warning: No git tags found. MinVer returned default. Using fallback." - $commitCount = git rev-list --count HEAD - $VERSION = "2.1.0-alpha.0.$commitCount" + $LATEST_TAG = git describe --tags --abbrev=0 2>$null + if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($LATEST_TAG)) { + Write-Host "Warning: Nessun tag Git trovato. Uso fallback." + $VERSION = "2.3.2" + } else { + $VERSION = $LATEST_TAG -replace '^v', '' } - Write-Host "MinVer calculated version: $VERSION" + Write-Host "Versione calcolata: $VERSION (da tag: $LATEST_TAG)" $COMMIT_SHA = "${{ github.sha }}" $SHORT_SHA = $COMMIT_SHA.Substring(0, 7) $BRANCH = "${{ github.ref_name }}" $BUILD_DATE = (Get-Date).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss UTC") - # Create version.json + # Genera version.json $versionJson = @{ version = $VERSION commitSha = $SHORT_SHA @@ -210,11 +202,14 @@ jobs: buildEnvironment = "Gitea Actions" } | ConvertTo-Json - $versionJson | Out-File -FilePath "wwwroot\version.json" -Encoding UTF8 + $versionJson | Out-File -FilePath "Data_Coupler\wwwroot\version.json" -Encoding UTF8 Write-Host "Generated version.json:" - Get-Content "wwwroot\version.json" - cd .. + Get-Content "Data_Coupler\wwwroot\version.json" + + # Esporta la versione come variabile d'ambiente per il Docker build + "APP_VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + Write-Host "APP_VERSION=$VERSION esportata per Docker build" shell: pwsh - name: Debug - Verify files @@ -265,7 +260,7 @@ jobs: ) echo Building Windows Docker image... - docker build -t temp-windows -f Dockerfile.windows . + docker build --build-arg APP_VERSION=%APP_VERSION% -t temp-windows -f Dockerfile.windows . if errorlevel 1 ( echo Build failed! exit /b 1 diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index d6c2cd9..a3014cc 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -31,6 +31,42 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + fetch-depth: 0 # Necessario per MinVer: deve percorrere tutta la storia Git per trovare i tag + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.0.x' + + - name: Calcola versione e genera version.json + run: | + git fetch --tags --force + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + if [ -z "$LATEST_TAG" ]; then + echo "Warning: Nessun tag Git trovato su questo remote. Uso fallback." + VERSION="2.3.2" + else + VERSION="${LATEST_TAG#v}" + fi + echo "Versione calcolata: $VERSION (da tag: $LATEST_TAG)" + + # Genera version.json + cat > Data_Coupler/wwwroot/version.json <> "$GITHUB_ENV" + shell: bash - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -75,6 +111,8 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max platforms: linux/amd64 + build-args: | + APP_VERSION=${{ env.APP_VERSION }} - name: Generate artifact attestation if: github.event_name != 'pull_request' @@ -95,6 +133,42 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + fetch-depth: 0 # Necessario per MinVer: deve percorrere tutta la storia Git per trovare i tag + + - name: Calcola versione e genera version.json + run: | + git fetch --tags --force + $LATEST_TAG = git describe --tags --abbrev=0 2>$null + if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($LATEST_TAG)) { + Write-Host "Warning: Nessun tag Git trovato su questo remote. Uso fallback." + $VERSION = "2.3.2" + } else { + $VERSION = $LATEST_TAG -replace '^v', '' + } + Write-Host "Versione calcolata: $VERSION (da tag: $LATEST_TAG)" + + $COMMIT_SHA = "${{ github.sha }}" + $SHORT_SHA = $COMMIT_SHA.Substring(0, 7) + $BRANCH = "${{ github.ref_name }}" + $BUILD_DATE = (Get-Date).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss UTC") + + # Genera version.json + $versionJson = @{ + version = $VERSION + commitSha = $SHORT_SHA + branch = $BRANCH + buildDate = $BUILD_DATE + buildEnvironment = "GitHub Actions" + } | ConvertTo-Json + + $versionJson | Out-File -FilePath "Data_Coupler\wwwroot\version.json" -Encoding UTF8 + + Write-Host "Generated version.json:" + Get-Content "Data_Coupler\wwwroot\version.json" + + "APP_VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + shell: pwsh - name: Log in to GitHub Container Registry uses: docker/login-action@v3 @@ -128,7 +202,7 @@ jobs: $imageName = "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}".ToLower() # Build with temporary tag - docker build -t "${imageName}:temp-windows" -f Dockerfile.windows . + docker build --build-arg "APP_VERSION=$env:APP_VERSION" -t "${imageName}:temp-windows" -f Dockerfile.windows . # Parse and push all tags $tags = "${{ steps.meta.outputs.tags }}" -split "`n" diff --git a/Dockerfile b/Dockerfile index 6534981..eef2153 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,8 @@ # Stage 1: Build FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +# Versione calcolata da MinVer sul runner CI/CD e passata come build-arg +ARG APP_VERSION=0.0.0-alpha.0 WORKDIR /src # Copia i file di progetto e ripristina le dipendenze @@ -20,15 +22,18 @@ COPY . . # Build del progetto principale WORKDIR "/src/Data_Coupler" -RUN dotnet build "Data_Coupler.csproj" -c Release -o /app/build /p:ContinuousIntegrationBuild=true +RUN dotnet build "Data_Coupler.csproj" -c Release -o /app/build /p:ContinuousIntegrationBuild=true /p:MinVerVersionOverride=${APP_VERSION} # Stage 2: Publish FROM build AS publish +# Necessario ridichiarare ARG dopo FROM in multi-stage build +ARG APP_VERSION=0.0.0-alpha.0 RUN dotnet publish "Data_Coupler.csproj" -c Release -o /app/publish \ /p:SelfContained=false \ /p:PublishTrimmed=false \ /p:PublishSingleFile=false \ - /p:ContinuousIntegrationBuild=true + /p:ContinuousIntegrationBuild=true \ + /p:MinVerVersionOverride=${APP_VERSION} # Stage 3: Runtime FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final diff --git a/Dockerfile.windows b/Dockerfile.windows index 402475d..8a480d3 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -3,6 +3,8 @@ # Stage 1: Build FROM mcr.microsoft.com/dotnet/sdk:9.0-nanoserver-ltsc2022 AS build +# Versione calcolata da MinVer sul runner CI/CD e passata come build-arg +ARG APP_VERSION=0.0.0-alpha.0 WORKDIR /s # Copia i file di progetto e ripristina le dipendenze con nomi originali @@ -23,11 +25,13 @@ COPY ["Components/", "Components/"] # Build del progetto principale con output path corto WORKDIR "/s/Data_Coupler" -RUN dotnet build "Data_Coupler.csproj" -c Release -o /o --no-restore +RUN dotnet build "Data_Coupler.csproj" -c Release -o /o --no-restore /p:ContinuousIntegrationBuild=true /p:MinVerVersionOverride=%APP_VERSION% # Stage 2: Publish FROM build AS publish -RUN dotnet publish "Data_Coupler.csproj" -c Release -o /p --no-restore -r win-x64 --self-contained false +# Necessario ridichiarare ARG dopo FROM in multi-stage build +ARG APP_VERSION=0.0.0-alpha.0 +RUN dotnet publish "Data_Coupler.csproj" -c Release -o /p --no-restore -r win-x64 --self-contained false /p:ContinuousIntegrationBuild=true /p:MinVerVersionOverride=%APP_VERSION% # Stage 3: Runtime FROM mcr.microsoft.com/dotnet/aspnet:9.0-nanoserver-ltsc2022 AS final