From 2955cd7bfd086bd470b6173dca82ec55e8d87195 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 13 Jan 2026 20:44:52 -0800 Subject: [PATCH 01/28] wip --- .github/workflows/build-docker-task.yml | 9 +++++---- .github/workflows/date-badge-task.yml | 5 ----- ...ub-release.yml => publish-build-release.yml} | 6 +++++- .github/workflows/publish-docker-release.yml | 1 + .github/workflows/test-build-pr.yml | 2 +- .github/workflows/test-docker-pr.yml | 6 ++---- .github/workflows/test-pr.yml | 17 ----------------- 7 files changed, 14 insertions(+), 32 deletions(-) rename .github/workflows/{publish-github-release.yml => publish-build-release.yml} (71%) delete mode 100644 .github/workflows/test-pr.yml diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index 48199863..8dd4ef96 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -3,6 +3,7 @@ name: Build docker image task env: DOCKER_REGISTRY: docker.io DOCKER_IMAGE: ptr727/projecttemplate + DOCKER_TAG_PREFIX: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }} on: workflow_call: @@ -30,8 +31,8 @@ jobs: - file: ./Docker/Ubuntu.Rolling.Dockerfile platforms: linux/amd64,linux/arm64 tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }}:${{ endsWith(github.ref, 'refs/heads/main') && 'latest' || 'develop' }} - ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }}:${{ needs.get-version.outputs.SemVer2 }} + ${{ env.DOCKER_TAG_PREFIX }}:${{ endsWith(github.ref, 'refs/heads/main') && 'latest' || 'develop' }} + ${{ env.DOCKER_TAG_PREFIX }}:${{ needs.get-version.outputs.SemVer2 }} steps: @@ -63,8 +64,8 @@ jobs: file: ${{ matrix.file }} tags: ${{ matrix.tags }} platforms: ${{ matrix.platforms }} - cache-from: type=registry,ref=${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }}:buildcache - cache-to: type=registry,ref=${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }}:buildcache,mode=max + cache-from: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache + cache-to: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache,mode=max build-args: | LABEL_VERSION=${{ needs.get-version.outputs.SemVer2 }} BUILD_CONFIGURATION=${{ endsWith(github.ref, 'refs/heads/main') && 'Release' || 'Debug' }} diff --git a/.github/workflows/date-badge-task.yml b/.github/workflows/date-badge-task.yml index d17f63c2..f507efdf 100644 --- a/.github/workflows/date-badge-task.yml +++ b/.github/workflows/date-badge-task.yml @@ -4,16 +4,11 @@ on: workflow_call: workflow_dispatch: -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - jobs: date-badge: name: Create date badge runs-on: ubuntu-latest - if: ${{ endsWith(github.ref, 'refs/heads/main') }} steps: diff --git a/.github/workflows/publish-github-release.yml b/.github/workflows/publish-build-release.yml similarity index 71% rename from .github/workflows/publish-github-release.yml rename to .github/workflows/publish-build-release.yml index 41566059..41d486cc 100644 --- a/.github/workflows/publish-github-release.yml +++ b/.github/workflows/publish-build-release.yml @@ -1,4 +1,4 @@ -name: Build and publish release +name: Build and publish project release on: push: @@ -15,8 +15,12 @@ jobs: name: Build project uses: ./.github/workflows/build-project-task.yml secrets: inherit + with: + github: true + nuget: true date-badge: + if: ${{ endsWith(github.ref, 'refs/heads/main') }} needs: build-project name: Create date badge uses: ./.github/workflows/date-badge-task.yml diff --git a/.github/workflows/publish-docker-release.yml b/.github/workflows/publish-docker-release.yml index 424ab522..63d4d209 100644 --- a/.github/workflows/publish-docker-release.yml +++ b/.github/workflows/publish-docker-release.yml @@ -21,6 +21,7 @@ jobs: push: true date-badge: + if: ${{ endsWith(github.ref, 'refs/heads/main') }} needs: build-docker name: Create date badge uses: ./.github/workflows/date-badge-task.yml diff --git a/.github/workflows/test-build-pr.yml b/.github/workflows/test-build-pr.yml index 43ef498d..f794190e 100644 --- a/.github/workflows/test-build-pr.yml +++ b/.github/workflows/test-build-pr.yml @@ -1,4 +1,4 @@ -name: Test build PRs +name: Test project build PRs on: pull_request: diff --git a/.github/workflows/test-docker-pr.yml b/.github/workflows/test-docker-pr.yml index 97c66ca0..36ecc859 100644 --- a/.github/workflows/test-docker-pr.yml +++ b/.github/workflows/test-docker-pr.yml @@ -1,12 +1,10 @@ -name: Test docker PRs +name: Test docker build PRs on: pull_request: branches: [ main, develop ] paths: - 'Docker/**' - - '.github/workflows/test-docker*.yml' - - '.github/workflows/build-docker*.yml' workflow_dispatch: concurrency: @@ -16,6 +14,6 @@ concurrency: jobs: test-docker: - name: Test docker images + name: Test docker build uses: ./.github/workflows/test-docker-task.yml secrets: inherit diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml deleted file mode 100644 index a524537f..00000000 --- a/.github/workflows/test-pr.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Test PRs - -on: - pull_request: - branches: [ main, develop ] - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - - test: - name: Run tests - uses: ./.github/workflows/test-build-task.yml - secrets: inherit From 317426585fa99f5e4708af3106ceb6959dbb0374 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 11:01:50 -0800 Subject: [PATCH 02/28] wip --- .github/workflows/build-docker-task.yml | 5 +- .github/workflows/build-executable-task.yml | 81 ++++++++++++++++++++ .github/workflows/build-library-task.yml | 72 +++++++++++++++++ .github/workflows/build-project-task.yml | 64 ++++++++-------- .github/workflows/date-badge-task.yml | 4 + .github/workflows/publish-build-release.yml | 4 +- .github/workflows/publish-docker-release.yml | 5 +- .github/workflows/test-build-pr.yml | 1 + .github/workflows/test-build-task.yml | 4 +- .github/workflows/test-docker-pr.yml | 1 + .github/workflows/test-docker-task.yml | 3 +- .gitignore | 1 + ProjectTemplate.code-workspace | 1 + ProjectTemplate.slnx | 19 ++++- README.md | 22 +++++- 15 files changed, 240 insertions(+), 47 deletions(-) create mode 100644 .github/workflows/build-executable-task.yml create mode 100644 .github/workflows/build-library-task.yml diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index 8dd4ef96..cad6eb37 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -1,6 +1,7 @@ name: Build docker image task env: + IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} DOCKER_REGISTRY: docker.io DOCKER_IMAGE: ptr727/projecttemplate DOCKER_TAG_PREFIX: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }} @@ -31,7 +32,7 @@ jobs: - file: ./Docker/Ubuntu.Rolling.Dockerfile platforms: linux/amd64,linux/arm64 tags: | - ${{ env.DOCKER_TAG_PREFIX }}:${{ endsWith(github.ref, 'refs/heads/main') && 'latest' || 'develop' }} + ${{ env.DOCKER_TAG_PREFIX }}:${{ env.IS_MAIN_BRANCH && 'latest' || 'develop' }} ${{ env.DOCKER_TAG_PREFIX }}:${{ needs.get-version.outputs.SemVer2 }} steps: @@ -68,7 +69,7 @@ jobs: cache-to: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache,mode=max build-args: | LABEL_VERSION=${{ needs.get-version.outputs.SemVer2 }} - BUILD_CONFIGURATION=${{ endsWith(github.ref, 'refs/heads/main') && 'Release' || 'Debug' }} + BUILD_CONFIGURATION=${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} BUILD_VERSION=${{ needs.get-version.outputs.AssemblyVersion }} BUILD_FILE_VERSION=${{ needs.get-version.outputs.AssemblyFileVersion }} BUILD_ASSEMBLY_VERSION=${{ needs.get-version.outputs.AssemblyFileVersion }} diff --git a/.github/workflows/build-executable-task.yml b/.github/workflows/build-executable-task.yml new file mode 100644 index 00000000..38db6245 --- /dev/null +++ b/.github/workflows/build-executable-task.yml @@ -0,0 +1,81 @@ +name: Build executable task + +env: + IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} + +on: + workflow_call: + outputs: + artifact-id: + value: ${{ jobs.upload-build-artifacts.outputs.artifact-id }} + workflow_dispatch: + +jobs: + + get-version: + name: Get version information + uses: ./.github/workflows/get-version-task.yml + secrets: inherit + + build-executable-matrix: + name: Build executable project matrix + runs-on: ubuntu-latest + needs: [get-version] + strategy: + matrix: + runtime: [ win-x64, linux-x64, linux-musl-x64, linux-arm, linux-arm64, osx-x64, osx-arm64 ] + + steps: + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.x + + - name: Checkout code + uses: actions/checkout@v6 + + - name: Build executable project + run: >- + dotnet publish ./Console/Console.csproj + --runtime ${{ matrix.runtime }} + --output ${{ runner.temp }}/publish/${{ matrix.runtime }} + --configuration ${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} + -property:PublishAot=false + -property:Version=${{ needs.get-version.outputs.AssemblyVersion }} + -property:FileVersion=${{ needs.get-version.outputs.AssemblyFileVersion }} + -property:AssemblyVersion=${{ needs.get-version.outputs.AssemblyVersion }} + -property:InformationalVersion=${{ needs.get-version.outputs.AssemblyInformationalVersion }} + -property:PackageVersion=${{ needs.get-version.outputs.SemVer2 }} + + - name: Upload matrix build artifacts + uses: actions/upload-artifact@v6 + with: + name: publish-${{ matrix.runtime }} + path: ${{ runner.temp }}/publish + + upload-build-artifacts: + name: Upload matrix build artifacts + outputs: + artifact-id: ${{ steps.artifact-upload-step.outputs.artifact-id }} + runs-on: ubuntu-latest + needs: [ build-executable-matrix ] + + steps: + + - name: Download matrix build artifacts + uses: actions/download-artifact@v7 + with: + pattern: publish-* + merge-multiple: true + path: ${{ runner.temp }}/publish + + - name: Zip build output + run: 7z a -t7z ${{ runner.temp }}/publish/Console.7z ${{ runner.temp }}/publish/* + + - name: Upload build artifacts + id: artifact-upload-step + uses: actions/upload-artifact@v6 + with: + name: executable-build + path: ${{ runner.temp }}/publish/Console.7z diff --git a/.github/workflows/build-library-task.yml b/.github/workflows/build-library-task.yml new file mode 100644 index 00000000..b14900b1 --- /dev/null +++ b/.github/workflows/build-library-task.yml @@ -0,0 +1,72 @@ +name: Build library task + +env: + IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} + +on: + workflow_call: + inputs: + nuget: + required: false + type: boolean + default: false + outputs: + artifact-id: + value: ${{ jobs.build-library.outputs.artifact-id }} + workflow_dispatch: + +jobs: + + get-version: + name: Get version information + uses: ./.github/workflows/get-version-task.yml + secrets: inherit + + build-library: + name: Build library project + runs-on: ubuntu-latest + outputs: + artifact-id: ${{ steps.artifact-upload-step.outputs.artifact-id }} + needs: [get-version] + permissions: + contents: write + + steps: + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.x + + - name: Checkout code + uses: actions/checkout@v6 + + - name: Build library project + run: >- + dotnet build ./Library/Library.csproj + --output ${{ runner.temp }}/publish + --configuration ${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} + -property:Version=${{ needs.get-version.outputs.AssemblyVersion }} + -property:FileVersion=${{ needs.get-version.outputs.AssemblyFileVersion }} + -property:AssemblyVersion=${{ needs.get-version.outputs.AssemblyVersion }} + -property:InformationalVersion=${{ needs.get-version.outputs.AssemblyInformationalVersion }} + -property:PackageVersion=${{ needs.get-version.outputs.SemVer2 }} + + - name: Publish to NuGet.org + if: ${{ inputs.nuget }} + run: >- + dotnet nuget push ${{ runner.temp }}/publish/*.nupkg + --source https://api.nuget.org/v3/index.json + --api-key ${{ secrets.NUGET_API_KEY }} + --skip-duplicate + + - name: Zip output + run: | + 7z a -t7z ${{ runner.temp }}/publish/Library.7z ${{ runner.temp }}/publish/* + + - name: Upload build artifacts + id: artifact-upload-step + uses: actions/upload-artifact@v6 + with: + name: library-build + path: ${{ runner.temp }}/publish/Library.7z diff --git a/.github/workflows/build-project-task.yml b/.github/workflows/build-project-task.yml index 625fdc17..98463dd0 100644 --- a/.github/workflows/build-project-task.yml +++ b/.github/workflows/build-project-task.yml @@ -1,5 +1,8 @@ name: Build project task +env: + IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} + on: workflow_call: inputs: @@ -20,54 +23,47 @@ jobs: uses: ./.github/workflows/get-version-task.yml secrets: inherit - build-project: - name: Build project + build-library: + name: Build library project + uses: ./.github/workflows/build-library-task.yml + secrets: inherit + with: + nuget: ${{ inputs.nuget }} + + build-executable: + name: Build executable project + uses: ./.github/workflows/build-executable-task.yml + secrets: inherit + + github-release: + name: Publish GitHub release + if: ${{ inputs.github }} runs-on: ubuntu-latest - needs: get-version + needs: [get-version, build-library, build-executable] permissions: contents: write steps: - - name: Setup .NET SDK - uses: actions/setup-dotnet@v5 + - name: Download library build artifacts + uses: actions/download-artifact@v7 with: - dotnet-version: 10.x + artifact-ids: ${{ needs.build-library.outputs.artifact-id }} + path: ./Publish - - name: Checkout code - uses: actions/checkout@v6 - - - name: Build project - run: >- - dotnet build ./Library/Library.csproj - --output ./Publish/ - --configuration ${{ endsWith(github.ref, 'refs/heads/main') && 'Release' || 'Debug' }} - -property:Version=${{ needs.get-version.outputs.AssemblyVersion }} - -property:FileVersion=${{ needs.get-version.outputs.AssemblyFileVersion }} - -property:AssemblyVersion=${{ needs.get-version.outputs.AssemblyVersion }} - -property:InformationalVersion=${{ needs.get-version.outputs.AssemblyInformationalVersion }} - -property:PackageVersion=${{ needs.get-version.outputs.SemVer2 }} - - - name: Publish to NuGet.org - if: ${{ inputs.nuget }} - run: >- - dotnet nuget push ${{ github.workspace }}/Publish/*.nupkg - --source https://api.nuget.org/v3/index.json - --api-key ${{ secrets.NUGET_API_KEY }} - --skip-duplicate - - - name: Zip output - run: | - 7z a -t7z ./Publish/Library.7z ./Publish/* + - name: Download executable build artifacts + uses: actions/download-artifact@v7 + with: + artifact-ids: ${{ needs.build-executable.outputs.artifact-id }} + path: ./Publish - name: Create GitHub release uses: softprops/action-gh-release@v2 - if: ${{ inputs.github }} with: generate_release_notes: true tag_name: ${{ needs.get-version.outputs.SemVer2 }} - prerelease: ${{ !endsWith(github.ref, 'refs/heads/main') }} + prerelease: ${{ !env.IS_MAIN_BRANCH }} files: | LICENSE README.md - ./Publish/Library.7z + ./Publish/* diff --git a/.github/workflows/date-badge-task.yml b/.github/workflows/date-badge-task.yml index f507efdf..9b0ee9e2 100644 --- a/.github/workflows/date-badge-task.yml +++ b/.github/workflows/date-badge-task.yml @@ -1,5 +1,8 @@ name: Create date badge task +env: + IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} + on: workflow_call: workflow_dispatch: @@ -17,6 +20,7 @@ jobs: echo "date=$(date)" >> $GITHUB_OUTPUT - name: Build date badge + if: ${{ env.IS_MAIN_BRANCH }} uses: RubbaBoy/BYOB@v1 with: name: lastbuild diff --git a/.github/workflows/publish-build-release.yml b/.github/workflows/publish-build-release.yml index 41d486cc..7b6f9730 100644 --- a/.github/workflows/publish-build-release.yml +++ b/.github/workflows/publish-build-release.yml @@ -16,12 +16,12 @@ jobs: uses: ./.github/workflows/build-project-task.yml secrets: inherit with: + # Push to GitHub and NuGet github: true nuget: true date-badge: - if: ${{ endsWith(github.ref, 'refs/heads/main') }} - needs: build-project + needs: [build-project] name: Create date badge uses: ./.github/workflows/date-badge-task.yml secrets: inherit diff --git a/.github/workflows/publish-docker-release.yml b/.github/workflows/publish-docker-release.yml index 63d4d209..644b246e 100644 --- a/.github/workflows/publish-docker-release.yml +++ b/.github/workflows/publish-docker-release.yml @@ -5,6 +5,7 @@ on: branches: [ main, develop ] workflow_dispatch: schedule: + # Rebuild docker images weekly on Mondays at 02:00 UTC - cron: '0 2 * * MON' concurrency: @@ -18,11 +19,11 @@ jobs: uses: ./.github/workflows/build-docker-task.yml secrets: inherit with: + # Push to registry push: true date-badge: - if: ${{ endsWith(github.ref, 'refs/heads/main') }} - needs: build-docker + needs: [build-docker] name: Create date badge uses: ./.github/workflows/date-badge-task.yml secrets: inherit diff --git a/.github/workflows/test-build-pr.yml b/.github/workflows/test-build-pr.yml index f794190e..d59f12fd 100644 --- a/.github/workflows/test-build-pr.yml +++ b/.github/workflows/test-build-pr.yml @@ -4,6 +4,7 @@ on: pull_request: branches: [ main, develop ] paths-ignore: + # Ignore Docker-related files - 'Docker/**' workflow_dispatch: diff --git a/.github/workflows/test-build-task.yml b/.github/workflows/test-build-task.yml index 3bcd51de..870fb9ca 100644 --- a/.github/workflows/test-build-task.yml +++ b/.github/workflows/test-build-task.yml @@ -23,8 +23,7 @@ jobs: - name: Check code style run: | dotnet tool restore - dotnet csharpier check --log-level=debug . - dotnet format style --verify-no-changes --severity=info --verbosity=detailed + dotnet husky run - name: Run unit tests run: dotnet test @@ -34,5 +33,6 @@ jobs: uses: ./.github/workflows/build-project-task.yml secrets: inherit with: + # Do not publish to GitHub or NuGet github: false nuget: false diff --git a/.github/workflows/test-docker-pr.yml b/.github/workflows/test-docker-pr.yml index 36ecc859..1fb823a0 100644 --- a/.github/workflows/test-docker-pr.yml +++ b/.github/workflows/test-docker-pr.yml @@ -4,6 +4,7 @@ on: pull_request: branches: [ main, develop ] paths: + # Only run on changes to Docker-related files - 'Docker/**' workflow_dispatch: diff --git a/.github/workflows/test-docker-task.yml b/.github/workflows/test-docker-task.yml index 8d97358e..680f4bbf 100644 --- a/.github/workflows/test-docker-task.yml +++ b/.github/workflows/test-docker-task.yml @@ -7,8 +7,9 @@ on: jobs: build-docker: - name: Build docker images without pushing + name: Build docker images without pushing to registry uses: ./.github/workflows/build-docker-task.yml secrets: inherit with: + # Do not push to registry push: false diff --git a/.gitignore b/.gitignore index 772ce156..c3dbf9d3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ .idea .vs +.artifacts diff --git a/ProjectTemplate.code-workspace b/ProjectTemplate.code-workspace index 298c5708..079b46e8 100644 --- a/ProjectTemplate.code-workspace +++ b/ProjectTemplate.code-workspace @@ -37,6 +37,7 @@ "editor.defaultFormatter": "csharpier.csharpier-vscode" }, "chat.agent.maxRequests": 100, + "githubLocalActions.actCommand": "act --artifact-server-path ./.artifacts", }, "extensions": { "recommendations": [ diff --git a/ProjectTemplate.slnx b/ProjectTemplate.slnx index 909839b8..30caf664 100644 --- a/ProjectTemplate.slnx +++ b/ProjectTemplate.slnx @@ -1,4 +1,17 @@ + + + + + + + + + + + + + @@ -7,13 +20,13 @@ - - + + - + diff --git a/README.md b/README.md index 979e5a2e..ad569f86 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl - v1.0: - Initial release. -## Dev Setup +## Developer Environment Setup New project: @@ -47,6 +47,26 @@ dotnet outdated --upgrade:prompt winget upgrade nektos.act ``` +## Secrets Setup + +- Create a [Nuget API Key](https://www.nuget.org/account/apikeys). + - Save the Key as `NUGET_API_KEY` in: + - GitHub project security Settings / Secrets / Actions. + - GitHub project security Settings / Secrets / Dependabot. + - GitHub Local Actions Settings / Secrets. +- Create a [Docker Hub Personal Access Token](https://app.docker.com/accounts/ptr727/settings/personal-access-tokens). + - Save the PAT as `DOCKER_HUB_ACCESS_TOKEN` and `DOCKER_HUB_USERNAME` in: + - GitHub project security Settings / Secrets / Actions. + - GitHub project security Settings / Secrets / Dependabot. + - GitHub Local Actions Settings / Secrets. +- Create a [GitHub Personal Access Token](https://github.com/settings/personal-access-tokens). + - Save the PAT as `GITHUB_TOKEN` in: + - GitHub Local Actions Settings / Secrets. + +## GitHub Local Actions Setup + +- Update [ACT settings](https://nektosact.com/usage/index.html#action-artifacts) to start the artifact server `act --artifact-server-path ./.artifacts`. + ## 3rd Party Tools - [AwesomeAssertions](https://awesomeassertions.org/) From ef5b5b8fa73b3fc96885f1402182d0b5bee55893 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 11:18:50 -0800 Subject: [PATCH 03/28] wip --- .github/workflows/build-library-task.yml | 4 +--- .github/workflows/build-project-task.yml | 2 -- .github/workflows/publish-build-release.yml | 6 +++++- .github/workflows/publish-docker-release.yml | 4 +++- .../workflows/{test-build-pr.yml => test-project-pr.yml} | 2 +- .../{test-build-task.yml => test-project-task.yml} | 0 6 files changed, 10 insertions(+), 8 deletions(-) rename .github/workflows/{test-build-pr.yml => test-project-pr.yml} (82%) rename .github/workflows/{test-build-task.yml => test-project-task.yml} (100%) diff --git a/.github/workflows/build-library-task.yml b/.github/workflows/build-library-task.yml index b14900b1..27c39ff0 100644 --- a/.github/workflows/build-library-task.yml +++ b/.github/workflows/build-library-task.yml @@ -28,8 +28,6 @@ jobs: outputs: artifact-id: ${{ steps.artifact-upload-step.outputs.artifact-id }} needs: [get-version] - permissions: - contents: write steps: @@ -63,7 +61,7 @@ jobs: - name: Zip output run: | 7z a -t7z ${{ runner.temp }}/publish/Library.7z ${{ runner.temp }}/publish/* - + - name: Upload build artifacts id: artifact-upload-step uses: actions/upload-artifact@v6 diff --git a/.github/workflows/build-project-task.yml b/.github/workflows/build-project-task.yml index 98463dd0..63db7514 100644 --- a/.github/workflows/build-project-task.yml +++ b/.github/workflows/build-project-task.yml @@ -40,8 +40,6 @@ jobs: if: ${{ inputs.github }} runs-on: ubuntu-latest needs: [get-version, build-library, build-executable] - permissions: - contents: write steps: diff --git a/.github/workflows/publish-build-release.yml b/.github/workflows/publish-build-release.yml index 7b6f9730..564f309f 100644 --- a/.github/workflows/publish-build-release.yml +++ b/.github/workflows/publish-build-release.yml @@ -13,6 +13,8 @@ jobs: build-project: name: Build project + permissions: + contents: write uses: ./.github/workflows/build-project-task.yml secrets: inherit with: @@ -21,7 +23,9 @@ jobs: nuget: true date-badge: - needs: [build-project] name: Create date badge + permissions: + contents: write + needs: [build-project] uses: ./.github/workflows/date-badge-task.yml secrets: inherit diff --git a/.github/workflows/publish-docker-release.yml b/.github/workflows/publish-docker-release.yml index 644b246e..e4a39c0f 100644 --- a/.github/workflows/publish-docker-release.yml +++ b/.github/workflows/publish-docker-release.yml @@ -23,7 +23,9 @@ jobs: push: true date-badge: - needs: [build-docker] name: Create date badge + permissions: + contents: write + needs: [build-docker] uses: ./.github/workflows/date-badge-task.yml secrets: inherit diff --git a/.github/workflows/test-build-pr.yml b/.github/workflows/test-project-pr.yml similarity index 82% rename from .github/workflows/test-build-pr.yml rename to .github/workflows/test-project-pr.yml index d59f12fd..5b3bc809 100644 --- a/.github/workflows/test-build-pr.yml +++ b/.github/workflows/test-project-pr.yml @@ -16,5 +16,5 @@ jobs: test-build: name: Run build tests - uses: ./.github/workflows/test-build-task.yml + uses: ./.github/workflows/test-project-task.yml secrets: inherit diff --git a/.github/workflows/test-build-task.yml b/.github/workflows/test-project-task.yml similarity index 100% rename from .github/workflows/test-build-task.yml rename to .github/workflows/test-project-task.yml From 9f3440b3b37db487c6968e9c93c1030ad877d6d8 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 11:27:52 -0800 Subject: [PATCH 04/28] wip --- .github/workflows/build-docker-task.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index cad6eb37..09e91ec7 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -4,7 +4,7 @@ env: IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} DOCKER_REGISTRY: docker.io DOCKER_IMAGE: ptr727/projecttemplate - DOCKER_TAG_PREFIX: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE }} + DOCKER_TAG_PREFIX: docker.io/ptr727/projecttemplate on: workflow_call: From 637ce5e9707e05e704e230087699e2b363973652 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 11:33:17 -0800 Subject: [PATCH 05/28] wip --- .github/workflows/build-docker-task.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index 09e91ec7..710a6213 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -1,9 +1,9 @@ name: Build docker image task +# env cannot be used in jobs or matrix evaluation, replace with inputs where needed env: IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} DOCKER_REGISTRY: docker.io - DOCKER_IMAGE: ptr727/projecttemplate DOCKER_TAG_PREFIX: docker.io/ptr727/projecttemplate on: @@ -32,8 +32,8 @@ jobs: - file: ./Docker/Ubuntu.Rolling.Dockerfile platforms: linux/amd64,linux/arm64 tags: | - ${{ env.DOCKER_TAG_PREFIX }}:${{ env.IS_MAIN_BRANCH && 'latest' || 'develop' }} - ${{ env.DOCKER_TAG_PREFIX }}:${{ needs.get-version.outputs.SemVer2 }} + docker.io/ptr727/projecttemplate:${{ endsWith(github.ref, 'refs/heads/main') && 'latest' || 'develop' }} + docker.io/ptr727/projecttemplate:${{ needs.get-version.outputs.SemVer2 }} steps: From d1229f02a55177b924bd6bf06977a953bfdba0b0 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 14:33:04 -0800 Subject: [PATCH 06/28] wip --- .github/workflows/build-docker-task.yml | 22 ++++++++------------- .github/workflows/build-executable-task.yml | 8 +++++--- .github/workflows/build-library-task.yml | 8 +++++--- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index 710a6213..8be3885d 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -1,10 +1,10 @@ name: Build docker image task -# env cannot be used in jobs or matrix evaluation, replace with inputs where needed env: IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} DOCKER_REGISTRY: docker.io DOCKER_TAG_PREFIX: docker.io/ptr727/projecttemplate + DOCKER_FILE: ./Docker/Ubuntu.Rolling.Dockerfile on: workflow_call: @@ -22,18 +22,10 @@ jobs: uses: ./.github/workflows/get-version-task.yml secrets: inherit - build-matrix: - name: Build docker matrix + build-docker: + name: Build docker project runs-on: ubuntu-latest needs: [get-version] - strategy: - matrix: - include: - - file: ./Docker/Ubuntu.Rolling.Dockerfile - platforms: linux/amd64,linux/arm64 - tags: | - docker.io/ptr727/projecttemplate:${{ endsWith(github.ref, 'refs/heads/main') && 'latest' || 'develop' }} - docker.io/ptr727/projecttemplate:${{ needs.get-version.outputs.SemVer2 }} steps: @@ -62,9 +54,11 @@ jobs: with: context: . push: ${{ inputs.push }} - file: ${{ matrix.file }} - tags: ${{ matrix.tags }} - platforms: ${{ matrix.platforms }} + file: ${{ env.DOCKER_FILE }} + tags: | + ${{env.DOCKER_TAG_PREFIX}}:${{ env.IS_MAIN_BRANCH && 'latest' || 'develop' }} + ${{env.DOCKER_TAG_PREFIX}}:${{ needs.get-version.outputs.SemVer2 }} + platforms: linux/amd64,linux/arm64 cache-from: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache cache-to: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache,mode=max build-args: | diff --git a/.github/workflows/build-executable-task.yml b/.github/workflows/build-executable-task.yml index 38db6245..df15f0b1 100644 --- a/.github/workflows/build-executable-task.yml +++ b/.github/workflows/build-executable-task.yml @@ -2,6 +2,8 @@ name: Build executable task env: IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} + PROJECT_FILE: ./Console/Console.csproj + PROJECT_ARTIFACT: Console.7z on: workflow_call: @@ -37,7 +39,7 @@ jobs: - name: Build executable project run: >- - dotnet publish ./Console/Console.csproj + dotnet publish ${{ env.PROJECT_FILE }} --runtime ${{ matrix.runtime }} --output ${{ runner.temp }}/publish/${{ matrix.runtime }} --configuration ${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} @@ -71,11 +73,11 @@ jobs: path: ${{ runner.temp }}/publish - name: Zip build output - run: 7z a -t7z ${{ runner.temp }}/publish/Console.7z ${{ runner.temp }}/publish/* + run: 7z a -t7z ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* - name: Upload build artifacts id: artifact-upload-step uses: actions/upload-artifact@v6 with: name: executable-build - path: ${{ runner.temp }}/publish/Console.7z + path: ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} diff --git a/.github/workflows/build-library-task.yml b/.github/workflows/build-library-task.yml index 27c39ff0..df196d05 100644 --- a/.github/workflows/build-library-task.yml +++ b/.github/workflows/build-library-task.yml @@ -2,6 +2,8 @@ name: Build library task env: IS_MAIN_BRANCH: ${{ endsWith(github.ref, 'refs/heads/main') }} + PROJECT_FILE: ./Library/Library.csproj + PROJECT_ARTIFACT: Library.7z on: workflow_call: @@ -41,7 +43,7 @@ jobs: - name: Build library project run: >- - dotnet build ./Library/Library.csproj + dotnet build ${{ env.PROJECT_FILE }} --output ${{ runner.temp }}/publish --configuration ${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} -property:Version=${{ needs.get-version.outputs.AssemblyVersion }} @@ -60,11 +62,11 @@ jobs: - name: Zip output run: | - 7z a -t7z ${{ runner.temp }}/publish/Library.7z ${{ runner.temp }}/publish/* + 7z a -t7z ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* - name: Upload build artifacts id: artifact-upload-step uses: actions/upload-artifact@v6 with: name: library-build - path: ${{ runner.temp }}/publish/Library.7z + path: ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} From dead8dd3e01f9bb543f67b80a620d604855752b6 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 14:59:31 -0800 Subject: [PATCH 07/28] wip --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index ad569f86..e28d850d 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,33 @@ winget upgrade nektos.act - Update [ACT settings](https://nektosact.com/usage/index.html#action-artifacts) to start the artifact server `act --artifact-server-path ./.artifacts`. +## GitHub Project Settings + +- General: + - Set the default branch to `main`. + - Enable `Always suggest updating pull request branches`. + - Enable `Allow auto-merge`. + - Enable `Automatically delete head branches`. +- Rules / Branch Ruleset: + - `main`: + - `Restrict deletions` + - `Require linear history` + - `Require signed commits` + - `Require a pull request before merging` + - `Require status checks to pass` + - `Block force pushes` + - `Require branches to be up to date before merging` + - Add checks: `Test project build PRs` + - `Block force pushes` + - `Automatically request Copilot code review` + - `develop`: + - `Restrict deletions` + - `Require linear history` + - `Require signed commits` + - `Automatically request Copilot code review` +- Actions / General: + - `Allow GitHub Actions to create and approve pull requests` + ## 3rd Party Tools - [AwesomeAssertions](https://awesomeassertions.org/) From bb92a34c79cc80745212ee1f8c14a21eed9d699d Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 15:21:29 -0800 Subject: [PATCH 08/28] chmod +x --- .husky/pre-commit | 0 Docker/Build.sh | 0 Docker/InstallDebugTools.sh | 0 Docker/Version.sh | 0 ProjectTemplate.code-workspace | 1 - README.md | 57 ++++++++++++++++++---------------- Tests/Tests.csproj | 2 +- 7 files changed, 32 insertions(+), 28 deletions(-) mode change 100644 => 100755 .husky/pre-commit mode change 100644 => 100755 Docker/Build.sh mode change 100644 => 100755 Docker/InstallDebugTools.sh mode change 100644 => 100755 Docker/Version.sh diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755 diff --git a/Docker/Build.sh b/Docker/Build.sh old mode 100644 new mode 100755 diff --git a/Docker/InstallDebugTools.sh b/Docker/InstallDebugTools.sh old mode 100644 new mode 100755 diff --git a/Docker/Version.sh b/Docker/Version.sh old mode 100644 new mode 100755 diff --git a/ProjectTemplate.code-workspace b/ProjectTemplate.code-workspace index 079b46e8..5713f6a7 100644 --- a/ProjectTemplate.code-workspace +++ b/ProjectTemplate.code-workspace @@ -49,7 +49,6 @@ "github.vscode-github-actions", "ms-azuretools.vscode-docker", "ms-dotnettools.csdevkit", - "sanjulaganepola.github-local-actions", "yzhang.markdown-all-in-one", ] } diff --git a/README.md b/README.md index e28d850d..924b4b16 100644 --- a/README.md +++ b/README.md @@ -20,32 +20,37 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ## Developer Environment Setup -New project: - -```shell -git init -dotnet new tool-manifest -dotnet tool install csharpier -dotnet tool install husky -dotnet tool install dotnet-outdated-tool -``` - -New pull: - -```shell -dotnet tool restore -dotnet husky install -dotnet husky add pre-commit -c "dotnet husky run" -winget install nektos.act -``` - -Update tools: - -```shell -dotnet tool update --all -dotnet outdated --upgrade:prompt -winget upgrade nektos.act -``` +- New project: + + ```shell + git init + dotnet new tool-manifest + dotnet tool install csharpier + dotnet tool install husky + dotnet tool install dotnet-outdated-tool + ``` + +- New deployment: + + ```shell + dotnet tool restore + dotnet husky install + dotnet husky add pre-commit -c "dotnet husky run" + chmod +x ./husky/pre-commit # Make sure file is executable in Linux + winget install nektos.act # Windows optional + ``` + +- Update tools: + + ```shell + dotnet tool update --all + dotnet outdated --upgrade:prompt + winget upgrade nektos.act # Windows optional + ``` + +- Linux file modes: + - `chmod +x [filename.sh]` + - All shell files are `LF` mode. ## Secrets Setup diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 68ebf0d0..01a552ea 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From 730bfdecbd5d4102285bfc394d91a17e567001a7 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 15:27:56 -0800 Subject: [PATCH 09/28] wip --- .github/workflows/test-project-task.yml | 1 + Console/Console.csproj | 19 +++++++++++++++++++ Library/Library.csproj | 1 + 3 files changed, 21 insertions(+) diff --git a/.github/workflows/test-project-task.yml b/.github/workflows/test-project-task.yml index 870fb9ca..2f88ee50 100644 --- a/.github/workflows/test-project-task.yml +++ b/.github/workflows/test-project-task.yml @@ -23,6 +23,7 @@ jobs: - name: Check code style run: | dotnet tool restore + dotnet husky install dotnet husky run - name: Run unit tests diff --git a/Console/Console.csproj b/Console/Console.csproj index 835729da..d2993723 100644 --- a/Console/Console.csproj +++ b/Console/Console.csproj @@ -35,4 +35,23 @@ + + + + + + + + diff --git a/Library/Library.csproj b/Library/Library.csproj index a5c4c1a3..7cba517e 100644 --- a/Library/Library.csproj +++ b/Library/Library.csproj @@ -51,6 +51,7 @@ + From 2b15ea10210b22c6d69937b9f666de748d05a0c4 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 16:16:42 -0800 Subject: [PATCH 10/28] Single PR Signed-off-by: Pieter Viljoen --- .github/workflows/test-project-pr.yml | 20 --------------- ...st-docker-pr.yml => test-pull-request.yml} | 10 +++++--- ProjectTemplate.code-workspace | 1 + README.md | 25 ++++++++++++++++++- 4 files changed, 31 insertions(+), 25 deletions(-) delete mode 100644 .github/workflows/test-project-pr.yml rename .github/workflows/{test-docker-pr.yml => test-pull-request.yml} (64%) diff --git a/.github/workflows/test-project-pr.yml b/.github/workflows/test-project-pr.yml deleted file mode 100644 index 5b3bc809..00000000 --- a/.github/workflows/test-project-pr.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Test project build PRs - -on: - pull_request: - branches: [ main, develop ] - paths-ignore: - # Ignore Docker-related files - - 'Docker/**' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - - test-build: - name: Run build tests - uses: ./.github/workflows/test-project-task.yml - secrets: inherit diff --git a/.github/workflows/test-docker-pr.yml b/.github/workflows/test-pull-request.yml similarity index 64% rename from .github/workflows/test-docker-pr.yml rename to .github/workflows/test-pull-request.yml index 1fb823a0..e52369cc 100644 --- a/.github/workflows/test-docker-pr.yml +++ b/.github/workflows/test-pull-request.yml @@ -1,11 +1,8 @@ -name: Test docker build PRs +name: Test pull request on: pull_request: branches: [ main, develop ] - paths: - # Only run on changes to Docker-related files - - 'Docker/**' workflow_dispatch: concurrency: @@ -14,6 +11,11 @@ concurrency: jobs: + test-build: + name: Run build tests + uses: ./.github/workflows/test-project-task.yml + secrets: inherit + test-docker: name: Test docker build uses: ./.github/workflows/test-docker-task.yml diff --git a/ProjectTemplate.code-workspace b/ProjectTemplate.code-workspace index 5713f6a7..d32e282b 100644 --- a/ProjectTemplate.code-workspace +++ b/ProjectTemplate.code-workspace @@ -38,6 +38,7 @@ }, "chat.agent.maxRequests": 100, "githubLocalActions.actCommand": "act --artifact-server-path ./.artifacts", + "git.alwaysSignOff": true, }, "extensions": { "recommendations": [ diff --git a/README.md b/README.md index 924b4b16..36fd269a 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,29 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ## Developer Environment Setup +- [Register](https://github.com/settings/keys) SSH Key on GitHub. + + ```shell + ssh-keygen -t ed25519 # If not already created + cat ~/.ssh/id_ed25519.pub + ssh-keyscan github.com >> ~/.ssh/known_hosts + ssh -T git@github.com + ``` + +- Configure Git global options, including [SSH signing](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key): + + ```shell + git config --global credential.helper "cache --timeout=3600" + git config --global user.name "Pieter Viljoen" + git config --global user.email "ptr727@users.noreply.github.com" + git config --global core.sharedRepository group + git config --global --add safe.directory '*' + git config --global gpg.format ssh + git config --global user.signingkey ~/.ssh/id_ed25519.pub + git config --global commit.gpgsign true + git config --list --show-origin + ``` + - New project: ```shell @@ -88,7 +111,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl - `Require status checks to pass` - `Block force pushes` - `Require branches to be up to date before merging` - - Add checks: `Test project build PRs` + - Add checks: `Test pull request` - `Block force pushes` - `Automatically request Copilot code review` - `develop`: From bbb0442ff7c3cd1d9092cf4b1fc6d580cfa43f36 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 18:19:20 -0800 Subject: [PATCH 11/28] signed? Signed-off-by: Pieter Viljoen --- README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 36fd269a..2ce94184 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ssh-keygen -t ed25519 # If not already created cat ~/.ssh/id_ed25519.pub ssh-keyscan github.com >> ~/.ssh/known_hosts - ssh -T git@github.com + ssh -v -T git@github.com ``` - Configure Git global options, including [SSH signing](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key): @@ -36,10 +36,22 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl git config --global user.name "Pieter Viljoen" git config --global user.email "ptr727@users.noreply.github.com" git config --global core.sharedRepository group - git config --global --add safe.directory '*' + git config --global --add safe.directory '*'git log + git config --global gpg.format ssh - git config --global user.signingkey ~/.ssh/id_ed25519.pub + cat ~/.ssh/id_ed25519.pub + git config --global user.signingkey "~/.ssh/id_ed25519.pub" git config --global commit.gpgsign true + git config --global tag.gpgsign true + + git show --show-signature # error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification + mkdir -p ~/.config/git + touch ~/.config/git/allowed_signers + git config --global gpg.ssh.allowedSignersFile "~/.config/git/allowed_signers" + echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_ed25519.pub)" >> ~/.config/git/allowed_signers + cat ~/.config/git/allowed_signers + git log --show-signature # Good "git" signature for ptr727@users.noreply.github.com with ED25519 key SHA256:XI0SwS++aVpnvgVM/OQ9q3BpfmIXcNT6AdiM0UnYMNs + git config --list --show-origin ``` From 67fb26fda22c42f1e9ceb7f14f728aefb45cb797 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 18:47:59 -0800 Subject: [PATCH 12/28] wip Signed-off-by: Pieter Viljoen --- .github/workflows/test-pull-request.yml | 23 +++++++++++++++++++++++ README.md | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-pull-request.yml b/.github/workflows/test-pull-request.yml index e52369cc..f70c0a43 100644 --- a/.github/workflows/test-pull-request.yml +++ b/.github/workflows/test-pull-request.yml @@ -20,3 +20,26 @@ jobs: name: Test docker build uses: ./.github/workflows/test-docker-task.yml secrets: inherit + + # TODO: Workaround for GitHub Actions not supporting status checks on conditional jobs + # https://github.com/orgs/community/discussions/12395#discussioncomment-12970019 + check-workflow-status: + name: Check workflow status job + runs-on: ubuntu-latest + needs: + [ + test-build, + test-docker, + ] + if: always() + steps: + - name: Check workflow status step + run: | + exit_on_result() { + if [[ "$2" == "failure" || "$2" == "cancelled" ]]; then + echo "Job '$1' failed or was cancelled." + exit 1 + fi + } + exit_on_result "test-build" "${{ needs.test-build.result }}" + exit_on_result "test-docker" "${{ needs.test-docker.result }}" diff --git a/README.md b/README.md index 2ce94184..477b6231 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,8 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ssh -v -T git@github.com ``` -- Configure Git global options, including [SSH signing](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key): +- Add [SSH keys to GitHub](https://github.com/settings/keys), add both an authentications and a signing key. +- Configure git for [SSH signing](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key): ```shell git config --global credential.helper "cache --timeout=3600" From 64e7b12d5dde4e4fb69b5d109e60de48dbd43cd5 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 19:02:27 -0800 Subject: [PATCH 13/28] wip Signed-off-by: Pieter Viljoen --- .github/workflows/build-executable-task.yml | 8 ++++---- .github/workflows/build-library-task.yml | 4 ++-- .github/workflows/test-pull-request.yml | 4 ++-- README.md | 5 ++--- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-executable-task.yml b/.github/workflows/build-executable-task.yml index df15f0b1..52ba4a20 100644 --- a/.github/workflows/build-executable-task.yml +++ b/.github/workflows/build-executable-task.yml @@ -24,8 +24,8 @@ jobs: runs-on: ubuntu-latest needs: [get-version] strategy: - matrix: - runtime: [ win-x64, linux-x64, linux-musl-x64, linux-arm, linux-arm64, osx-x64, osx-arm64 ] + matrix: + runtime: [ win-x64, linux-x64, linux-musl-x64, linux-arm, linux-arm64, osx-x64, osx-arm64 ] steps: @@ -73,11 +73,11 @@ jobs: path: ${{ runner.temp }}/publish - name: Zip build output - run: 7z a -t7z ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* + run: 7z a -t7z ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* - name: Upload build artifacts id: artifact-upload-step uses: actions/upload-artifact@v6 with: name: executable-build - path: ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} + path: ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} diff --git a/.github/workflows/build-library-task.yml b/.github/workflows/build-library-task.yml index df196d05..55930d04 100644 --- a/.github/workflows/build-library-task.yml +++ b/.github/workflows/build-library-task.yml @@ -62,11 +62,11 @@ jobs: - name: Zip output run: | - 7z a -t7z ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* + 7z a -t7z ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* - name: Upload build artifacts id: artifact-upload-step uses: actions/upload-artifact@v6 with: name: library-build - path: ${{ runner.temp }}/publish/${{ env.PROJECT_ARTIFACT }} + path: ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} diff --git a/.github/workflows/test-pull-request.yml b/.github/workflows/test-pull-request.yml index f70c0a43..326cc9c3 100644 --- a/.github/workflows/test-pull-request.yml +++ b/.github/workflows/test-pull-request.yml @@ -24,7 +24,7 @@ jobs: # TODO: Workaround for GitHub Actions not supporting status checks on conditional jobs # https://github.com/orgs/community/discussions/12395#discussioncomment-12970019 check-workflow-status: - name: Check workflow status job + name: Check pull request workflow status runs-on: ubuntu-latest needs: [ @@ -33,7 +33,7 @@ jobs: ] if: always() steps: - - name: Check workflow status step + - name: Check workflow results run: | exit_on_result() { if [[ "$2" == "failure" || "$2" == "cancelled" ]]; then diff --git a/README.md b/README.md index 477b6231..3cc065d1 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl git config --global user.name "Pieter Viljoen" git config --global user.email "ptr727@users.noreply.github.com" git config --global core.sharedRepository group - git config --global --add safe.directory '*'git log + git config --global --add safe.directory '*' git config --global gpg.format ssh cat ~/.ssh/id_ed25519.pub @@ -122,10 +122,9 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl - `Require signed commits` - `Require a pull request before merging` - `Require status checks to pass` + - Add checks: `Check pull request workflow status` - `Block force pushes` - `Require branches to be up to date before merging` - - Add checks: `Test pull request` - - `Block force pushes` - `Automatically request Copilot code review` - `develop`: - `Restrict deletions` From 6ec4a1b7e0eb323d8862a88bcd0b041fd7c60721 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 22:48:47 -0500 Subject: [PATCH 14/28] Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cc065d1..e8a7c1f2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ssh -v -T git@github.com ``` -- Add [SSH keys to GitHub](https://github.com/settings/keys), add both an authentications and a signing key. +- Add [SSH keys to GitHub](https://github.com/settings/keys), add both an authentication and a signing key. - Configure git for [SSH signing](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key): ```shell From 9ca68a192994a870c1927b1f622ace66140bb497 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 22:49:45 -0500 Subject: [PATCH 15/28] Update .github/workflows/build-docker-task.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build-docker-task.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index 8be3885d..be9edd9e 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -56,8 +56,8 @@ jobs: push: ${{ inputs.push }} file: ${{ env.DOCKER_FILE }} tags: | - ${{env.DOCKER_TAG_PREFIX}}:${{ env.IS_MAIN_BRANCH && 'latest' || 'develop' }} - ${{env.DOCKER_TAG_PREFIX}}:${{ needs.get-version.outputs.SemVer2 }} + ${{ env.DOCKER_TAG_PREFIX }}:${{ env.IS_MAIN_BRANCH && 'latest' || 'develop' }} + ${{ env.DOCKER_TAG_PREFIX }}:${{ needs.get-version.outputs.SemVer2 }} platforms: linux/amd64,linux/arm64 cache-from: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache cache-to: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache,mode=max From c1e7aa1c2e3e9cdff30032702fbdb471f47f7414 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 22:54:13 -0500 Subject: [PATCH 16/28] Update ProjectTemplate.slnx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ProjectTemplate.slnx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ProjectTemplate.slnx b/ProjectTemplate.slnx index 30caf664..0b8059c6 100644 --- a/ProjectTemplate.slnx +++ b/ProjectTemplate.slnx @@ -7,9 +7,7 @@ - - - + From 9d1e1a9d82dbbe316f5ab8e55a11a9a640b2989a Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 22:55:47 -0500 Subject: [PATCH 17/28] Update .github/workflows/build-project-task.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build-project-task.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-project-task.yml b/.github/workflows/build-project-task.yml index 63db7514..be39d87f 100644 --- a/.github/workflows/build-project-task.yml +++ b/.github/workflows/build-project-task.yml @@ -60,7 +60,7 @@ jobs: with: generate_release_notes: true tag_name: ${{ needs.get-version.outputs.SemVer2 }} - prerelease: ${{ !env.IS_MAIN_BRANCH }} + prerelease: ${{ env.IS_MAIN_BRANCH != 'true' }} files: | LICENSE README.md From 663ddee1c1318b3bd0c5622119df46d53297388e Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 22:58:27 -0500 Subject: [PATCH 18/28] Update .github/workflows/build-library-task.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build-library-task.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-library-task.yml b/.github/workflows/build-library-task.yml index 55930d04..3a32b65c 100644 --- a/.github/workflows/build-library-task.yml +++ b/.github/workflows/build-library-task.yml @@ -45,7 +45,7 @@ jobs: run: >- dotnet build ${{ env.PROJECT_FILE }} --output ${{ runner.temp }}/publish - --configuration ${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} + --configuration ${{ env.IS_MAIN_BRANCH == 'true' && 'Release' || 'Debug' }} -property:Version=${{ needs.get-version.outputs.AssemblyVersion }} -property:FileVersion=${{ needs.get-version.outputs.AssemblyFileVersion }} -property:AssemblyVersion=${{ needs.get-version.outputs.AssemblyVersion }} From 70022fa313d589012fcbd6ecda0359eea8a993ae Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 23:00:17 -0500 Subject: [PATCH 19/28] Update .github/workflows/build-executable-task.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build-executable-task.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-executable-task.yml b/.github/workflows/build-executable-task.yml index 52ba4a20..a7bd975a 100644 --- a/.github/workflows/build-executable-task.yml +++ b/.github/workflows/build-executable-task.yml @@ -42,7 +42,7 @@ jobs: dotnet publish ${{ env.PROJECT_FILE }} --runtime ${{ matrix.runtime }} --output ${{ runner.temp }}/publish/${{ matrix.runtime }} - --configuration ${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} + --configuration ${{ env.IS_MAIN_BRANCH == 'true' && 'Release' || 'Debug' }} -property:PublishAot=false -property:Version=${{ needs.get-version.outputs.AssemblyVersion }} -property:FileVersion=${{ needs.get-version.outputs.AssemblyFileVersion }} From f3ebba5d4d47fd5a78902b430cbbf03321f39b58 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 23:06:48 -0500 Subject: [PATCH 20/28] Refactor build-docker-task.yml workflow configuration --- .github/workflows/build-docker-task.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-task.yml b/.github/workflows/build-docker-task.yml index be9edd9e..9f0d5281 100644 --- a/.github/workflows/build-docker-task.yml +++ b/.github/workflows/build-docker-task.yml @@ -56,16 +56,17 @@ jobs: push: ${{ inputs.push }} file: ${{ env.DOCKER_FILE }} tags: | - ${{ env.DOCKER_TAG_PREFIX }}:${{ env.IS_MAIN_BRANCH && 'latest' || 'develop' }} + ${{ env.DOCKER_TAG_PREFIX }}:${{ env.IS_MAIN_BRANCH == 'true' && 'latest' || 'develop' }} ${{ env.DOCKER_TAG_PREFIX }}:${{ needs.get-version.outputs.SemVer2 }} platforms: linux/amd64,linux/arm64 cache-from: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache cache-to: type=registry,ref=${{ env.DOCKER_TAG_PREFIX }}:buildcache,mode=max build-args: | LABEL_VERSION=${{ needs.get-version.outputs.SemVer2 }} - BUILD_CONFIGURATION=${{ env.IS_MAIN_BRANCH && 'Release' || 'Debug' }} + BUILD_CONFIGURATION=${{ env.IS_MAIN_BRANCH == 'true' && 'Release' || 'Debug' }} BUILD_VERSION=${{ needs.get-version.outputs.AssemblyVersion }} BUILD_FILE_VERSION=${{ needs.get-version.outputs.AssemblyFileVersion }} BUILD_ASSEMBLY_VERSION=${{ needs.get-version.outputs.AssemblyFileVersion }} BUILD_INFORMATION_VERSION=${{ needs.get-version.outputs.AssemblyInformationalVersion }} BUILD_PACKAGE_VERSION=${{ needs.get-version.outputs.SemVer2 }} + From 76badda00f3d691a4804b3f6e11668b807c5522a Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 20:50:54 -0800 Subject: [PATCH 21/28] wip Signed-off-by: Pieter Viljoen --- ProjectTemplate.code-workspace | 6 +++++- README.md | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ProjectTemplate.code-workspace b/ProjectTemplate.code-workspace index d32e282b..51273e3b 100644 --- a/ProjectTemplate.code-workspace +++ b/ProjectTemplate.code-workspace @@ -6,6 +6,8 @@ ], "settings": { "cSpell.words": [ + "csdevkit", + "davidanson", "dotnettools", "dryrun", "gruntfuggly", @@ -14,8 +16,10 @@ "Nerdbank", "ProjectTemplate", "Serilog", + "slnx", "winget", - "xunit" + "xunit", + "yzhang" ], "dotnet.defaultSolution": "ProjectTemplate.slnx", "files.trimTrailingWhitespace": true, diff --git a/README.md b/README.md index e8a7c1f2..b9fc8739 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl git config --global gpg.ssh.allowedSignersFile "~/.config/git/allowed_signers" echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_ed25519.pub)" >> ~/.config/git/allowed_signers cat ~/.config/git/allowed_signers - git log --show-signature # Good "git" signature for ptr727@users.noreply.github.com with ED25519 key SHA256:XI0SwS++aVpnvgVM/OQ9q3BpfmIXcNT6AdiM0UnYMNs + git log --show-signature # Good "git" signature for ptr727@users.noreply.github.com with ED25519 key SHA256:[secret] git config --list --show-origin ``` @@ -64,6 +64,8 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl dotnet tool install csharpier dotnet tool install husky dotnet tool install dotnet-outdated-tool + dotnet husky install + dotnet husky add pre-commit -c "dotnet husky run" ``` - New deployment: @@ -71,7 +73,6 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ```shell dotnet tool restore dotnet husky install - dotnet husky add pre-commit -c "dotnet husky run" chmod +x ./husky/pre-commit # Make sure file is executable in Linux winget install nektos.act # Windows optional ``` From bdc74389300a08181823b1b708baf540dcf27968 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 21:13:30 -0800 Subject: [PATCH 22/28] wip Signed-off-by: Pieter Viljoen --- ProjectTemplate.slnx | 6 +++++- README.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ProjectTemplate.slnx b/ProjectTemplate.slnx index 0b8059c6..63afcf33 100644 --- a/ProjectTemplate.slnx +++ b/ProjectTemplate.slnx @@ -1,16 +1,20 @@ + + - + + + diff --git a/README.md b/README.md index b9fc8739..852bce1d 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl ```shell dotnet tool restore dotnet husky install - chmod +x ./husky/pre-commit # Make sure file is executable in Linux + chmod +x ./.husky/pre-commit # Make sure file is executable in Linux winget install nektos.act # Windows optional ``` From a4826789ac16ab54e09ee99b9300a9120740fec1 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 21:37:47 -0800 Subject: [PATCH 23/28] indentation Signed-off-by: Pieter Viljoen --- .github/workflows/build-executable-task.yml | 28 ++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-executable-task.yml b/.github/workflows/build-executable-task.yml index a7bd975a..6857fde7 100644 --- a/.github/workflows/build-executable-task.yml +++ b/.github/workflows/build-executable-task.yml @@ -65,19 +65,19 @@ jobs: steps: - - name: Download matrix build artifacts - uses: actions/download-artifact@v7 - with: - pattern: publish-* - merge-multiple: true - path: ${{ runner.temp }}/publish + - name: Download matrix build artifacts + uses: actions/download-artifact@v7 + with: + pattern: publish-* + merge-multiple: true + path: ${{ runner.temp }}/publish - - name: Zip build output - run: 7z a -t7z ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* + - name: Zip build output + run: 7z a -t7z ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} ${{ runner.temp }}/publish/* - - name: Upload build artifacts - id: artifact-upload-step - uses: actions/upload-artifact@v6 - with: - name: executable-build - path: ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} + - name: Upload build artifacts + id: artifact-upload-step + uses: actions/upload-artifact@v6 + with: + name: executable-build + path: ${{ runner.temp }}/${{ env.PROJECT_ARTIFACT }} From 7b43bc1c9b06927e9dd4458ad8d6521b6d46f6eb Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 14 Jan 2026 21:45:25 -0800 Subject: [PATCH 24/28] wip Signed-off-by: Pieter Viljoen --- .github/workflows/date-badge-task.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/date-badge-task.yml b/.github/workflows/date-badge-task.yml index 9b0ee9e2..b890d7af 100644 --- a/.github/workflows/date-badge-task.yml +++ b/.github/workflows/date-badge-task.yml @@ -20,7 +20,7 @@ jobs: echo "date=$(date)" >> $GITHUB_OUTPUT - name: Build date badge - if: ${{ env.IS_MAIN_BRANCH }} + if: ${{ env.IS_MAIN_BRANCH == 'true' }} uses: RubbaBoy/BYOB@v1 with: name: lastbuild From 97c7e9f7e5ccc73a7d9edf2397cfb934a0778f48 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Thu, 15 Jan 2026 06:37:01 -0800 Subject: [PATCH 25/28] rules Signed-off-by: Pieter Viljoen --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 852bce1d..ff6da4bd 100644 --- a/README.md +++ b/README.md @@ -122,10 +122,11 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl - `Require linear history` - `Require signed commits` - `Require a pull request before merging` + - `Dismiss stale pull request approvals when new commits are pushed` - `Require status checks to pass` + - `Require branches to be up to date before merging` - Add checks: `Check pull request workflow status` - - `Block force pushes` - - `Require branches to be up to date before merging` + - `Block force pushes` - `Automatically request Copilot code review` - `develop`: - `Restrict deletions` From d2056b48264cd9d816d2958d2448044c6ea27fb1 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Thu, 15 Jan 2026 07:47:50 -0800 Subject: [PATCH 26/28] indentation Signed-off-by: Pieter Viljoen --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ff6da4bd..ce5c0e35 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,11 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl - `Require linear history` - `Require signed commits` - `Require a pull request before merging` - - `Dismiss stale pull request approvals when new commits are pushed` + - `Dismiss stale pull request approvals when new commits are pushed` - `Require status checks to pass` - `Require branches to be up to date before merging` - Add checks: `Check pull request workflow status` - - `Block force pushes` + - `Block force pushes` - `Automatically request Copilot code review` - `develop`: - `Restrict deletions` From 2dff814c2d9645cffae1de59b01e56005742ab3a Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Thu, 15 Jan 2026 10:59:31 -0500 Subject: [PATCH 27/28] Develop (#7) (#8) * wip * wip * wip * wip * wip * wip * wip * chmod +x * wip * Single PR * signed? * wip * wip * Update README.md * Update .github/workflows/build-docker-task.yml * Update ProjectTemplate.slnx * Update .github/workflows/build-project-task.yml * Update .github/workflows/build-library-task.yml * Update .github/workflows/build-executable-task.yml * Refactor build-docker-task.yml workflow configuration * wip * wip * indentation * wip * rules * indentation --------- Signed-off-by: Pieter Viljoen Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> From aa3a79caf53ad8472d74b85e78129c14927ae49e Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Thu, 15 Jan 2026 08:01:03 -0800 Subject: [PATCH 28/28] remove duplicate line Signed-off-by: Pieter Viljoen --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 8e7d4a2f..ce5c0e35 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,6 @@ Packages published on [NuGet](https://www.nuget.org/packages/ptr727.ProjectTempl - `Require a pull request before merging` - `Dismiss stale pull request approvals when new commits are pushed` - `Require status checks to pass` - - `Require branches to be up to date before merging` - `Require branches to be up to date before merging` - Add checks: `Check pull request workflow status` - `Block force pushes`