From 49240026b030e72f766adaaab747e09233676647 Mon Sep 17 00:00:00 2001 From: HueByte Date: Thu, 19 Feb 2026 07:01:22 +0100 Subject: [PATCH] feat: Enhance CI workflows to check for source and documentation changes, and cache NuGet packages feat: Embed appsettings.json as a resource and update configuration loading logic --- .github/workflows/ci-release.yml | 50 +++++++++++++++++++----- .github/workflows/pr-check.yml | 16 ++++++-- src/EchoHub.Client/EchoHub.Client.csproj | 3 ++ src/EchoHub.Client/Program.cs | 15 ++++++- 4 files changed, 69 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 66379e6..2474e71 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -30,25 +30,28 @@ jobs: runs-on: ubuntu-latest outputs: src_changed: ${{ steps.check.outputs.src_changed }} + docs_changed: ${{ steps.check.outputs.docs_changed }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Check for src/ changes + - name: Check for changes id: check + env: + BEFORE: ${{ github.event.before }} run: | - BEFORE=${{ github.event.before }} if [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then # Initial push — treat everything as changed echo "src_changed=true" >> "$GITHUB_OUTPUT" + echo "docs_changed=true" >> "$GITHUB_OUTPUT" else - CHANGED=$(git diff --name-only "$BEFORE" HEAD -- 'src/' | wc -l) - if [ "$CHANGED" -gt 0 ]; then - echo "src_changed=true" >> "$GITHUB_OUTPUT" - else - echo "src_changed=false" >> "$GITHUB_OUTPUT" - fi + SRC_CHANGED=$(git diff --name-only "$BEFORE" HEAD -- 'src/' | wc -l) + DOCS_CHANGED=$(git diff --name-only "$BEFORE" HEAD -- 'docs/' | wc -l) + + [ "$SRC_CHANGED" -gt 0 ] && echo "src_changed=true" >> "$GITHUB_OUTPUT" || echo "src_changed=false" >> "$GITHUB_OUTPUT" + # Docs rebuild on docs/ OR src/ changes (docfx reads XML comments from assemblies) + [ "$DOCS_CHANGED" -gt 0 ] || [ "$SRC_CHANGED" -gt 0 ] && echo "docs_changed=true" >> "$GITHUB_OUTPUT" || echo "docs_changed=false" >> "$GITHUB_OUTPUT" fi test: @@ -64,6 +67,13 @@ jobs: with: dotnet-version: '10.0.x' + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('src/**/*.csproj') }} + restore-keys: nuget-${{ runner.os }}- + - name: Restore dependencies run: dotnet restore src/EchoHub.slnx @@ -118,6 +128,10 @@ jobs: # if: steps.check_release.outputs.exists == 'false' # run: dotnet publish src/EchoHub.Server/EchoHub.Server.csproj -c Release -r osx-x64 --self-contained true -o publish/server-osx-x64 # + # - name: Publish Server osx-arm64 + # if: steps.check_release.outputs.exists == 'false' + # run: dotnet publish src/EchoHub.Server/EchoHub.Server.csproj -c Release -r osx-arm64 --self-contained true -o publish/server-osx-arm64 + # # - name: Publish Client win-x64 # if: steps.check_release.outputs.exists == 'false' # run: dotnet publish src/EchoHub.Client/EchoHub.Client.csproj -c Release -r win-x64 --self-contained true -o publish/client-win-x64 @@ -130,6 +144,10 @@ jobs: # if: steps.check_release.outputs.exists == 'false' # run: dotnet publish src/EchoHub.Client/EchoHub.Client.csproj -c Release -r osx-x64 --self-contained true -o publish/client-osx-x64 # + # - name: Publish Client osx-arm64 + # if: steps.check_release.outputs.exists == 'false' + # run: dotnet publish src/EchoHub.Client/EchoHub.Client.csproj -c Release -r osx-arm64 --self-contained true -o publish/client-osx-arm64 + # # - name: Zip artifacts # if: steps.check_release.outputs.exists == 'false' # run: | @@ -137,9 +155,11 @@ jobs: # zip -r ../EchoHub-Server-win-x64.zip server-win-x64/ # zip -r ../EchoHub-Server-linux-x64.zip server-linux-x64/ # zip -r ../EchoHub-Server-osx-x64.zip server-osx-x64/ + # zip -r ../EchoHub-Server-osx-arm64.zip server-osx-arm64/ # zip -r ../EchoHub-Client-win-x64.zip client-win-x64/ # zip -r ../EchoHub-Client-linux-x64.zip client-linux-x64/ # zip -r ../EchoHub-Client-osx-x64.zip client-osx-x64/ + # zip -r ../EchoHub-Client-osx-arm64.zip client-osx-arm64/ # # - name: Create GitHub Release # if: steps.check_release.outputs.exists == 'false' @@ -150,15 +170,18 @@ jobs: # EchoHub-Server-win-x64.zip \ # EchoHub-Server-linux-x64.zip \ # EchoHub-Server-osx-x64.zip \ + # EchoHub-Server-osx-arm64.zip \ # EchoHub-Client-win-x64.zip \ # EchoHub-Client-linux-x64.zip \ - # EchoHub-Client-osx-x64.zip + # EchoHub-Client-osx-x64.zip \ + # EchoHub-Client-osx-arm64.zip # env: # GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} docs: name: Build & Deploy Docs - needs: lint-markdown + needs: [lint-markdown, detect-changes] + if: needs.detect-changes.outputs.docs_changed == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -168,6 +191,13 @@ jobs: with: dotnet-version: '10.0.x' + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('src/**/*.csproj') }} + restore-keys: nuget-${{ runner.os }}- + - name: Restore .NET tools run: dotnet tool restore diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 94ae104..c1a4b93 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Check for src/ changes id: changes + env: + BASE_REF: ${{ github.base_ref }} run: | - git fetch origin ${{ github.base_ref }} --depth=1 - CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD -- 'src/' | wc -l) + git fetch origin "$BASE_REF" --depth=1 + CHANGED=$(git diff --name-only "origin/$BASE_REF"...HEAD -- 'src/' | wc -l) if [ "$CHANGED" -gt 0 ]; then echo "src_changed=true" >> "$GITHUB_OUTPUT" else @@ -48,6 +48,14 @@ jobs: with: dotnet-version: '10.0.x' + - name: Cache NuGet packages + if: steps.changes.outputs.src_changed == 'true' + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('src/**/*.csproj') }} + restore-keys: nuget-${{ runner.os }}- + - name: Restore dependencies if: steps.changes.outputs.src_changed == 'true' run: dotnet restore src/EchoHub.slnx diff --git a/src/EchoHub.Client/EchoHub.Client.csproj b/src/EchoHub.Client/EchoHub.Client.csproj index 01a3034..b81b1dd 100644 --- a/src/EchoHub.Client/EchoHub.Client.csproj +++ b/src/EchoHub.Client/EchoHub.Client.csproj @@ -17,6 +17,9 @@ PreserveNewest + + EchoHub.Client.appsettings.json + diff --git a/src/EchoHub.Client/Program.cs b/src/EchoHub.Client/Program.cs index 30f5f20..608f310 100644 --- a/src/EchoHub.Client/Program.cs +++ b/src/EchoHub.Client/Program.cs @@ -5,9 +5,22 @@ using Microsoft.Extensions.Configuration; using Serilog; using Terminal.Gui.App; +var appSettingsPath = Path.Combine(AppContext.BaseDirectory, "appsettings.json"); +if (!File.Exists(appSettingsPath)) +{ + using var stream = typeof(AppOrchestrator).Assembly + .GetManifestResourceStream("EchoHub.Client.appsettings.json"); + + if (stream is not null) + { + using var file = File.Create(appSettingsPath); + stream.CopyTo(file); + } +} + var configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) - .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) .Build(); Log.Logger = new LoggerConfiguration()