ci: add GitHub best practices config (templates, dependabot, CI optimization)

- Add PR template, bug report and feature request issue templates
- Add Dependabot for Go, npm, Cargo, and GitHub Actions dependencies
- Update CI: narrow triggers to main push + PRs only, add concurrency
  groups, split client into fast check + gated Tauri build (PRs to main),
  add coverage artifacts with 7-day retention
- Update release workflow: replace legacy WPF build with Tauri NSIS
  installer build
- Remove legacy WPF client-build-test job from CI
- All optimized for GitHub Free plan (no CodeQL, conserve minutes)
This commit is contained in:
jevb
2026-03-17 02:45:44 +01:00
parent ff6f61cd38
commit 73576cd27c
6 changed files with 214 additions and 38 deletions
+45 -25
View File
@@ -2,15 +2,14 @@ name: CI
on:
push:
branches:
- main
- dev
- tauri-migration
- "feature/*"
branches: [main]
pull_request:
branches:
- main
- dev
branches: [main, dev]
# Cancel in-progress runs for the same branch/PR
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
server-build-test:
@@ -30,31 +29,58 @@ jobs:
run: go build -o chatserver.exe -ldflags "-s -w" .
- name: Run tests with coverage
run: go test ./... -cover
run: go test ./... -coverprofile=coverage.out -cover
- name: Upload Go coverage
if: always()
uses: actions/upload-artifact@v4
with:
name: go-coverage
path: Server/coverage.out
retention-days: 7
- name: Lint
uses: golangci/golangci-lint-action@v6
with:
working-directory: Server/
client-build-test:
name: Client Build & Test
client-check:
name: Client Typecheck & Test
runs-on: windows-latest
defaults:
run:
working-directory: Client/tauri-client/
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
- uses: actions/setup-node@v4
with:
dotnet-version: 8.0.x
node-version: 20
cache: npm
cache-dependency-path: Client/tauri-client/package-lock.json
- name: Build client
run: dotnet build Client/OwnCord.Client.sln
- name: Install npm dependencies
run: npm ci
- name: Run client tests
run: dotnet test Client/OwnCord.Client.Tests/
- name: TypeScript check
run: npx tsc --noEmit
tauri-client:
name: Tauri Client Build & Test
- name: Run unit tests with coverage
run: npx vitest run --coverage --reporter=default
- name: Upload client coverage
if: always()
uses: actions/upload-artifact@v4
with:
name: client-coverage
path: Client/tauri-client/coverage/
retention-days: 7
# Full Tauri build only on PRs to main (expensive: ~15 min x2 multiplier)
tauri-build:
name: Tauri Full Build
needs: client-check
if: github.event_name == 'pull_request' && github.base_ref == 'main'
runs-on: windows-latest
defaults:
run:
@@ -79,11 +105,5 @@ jobs:
- name: Install npm dependencies
run: npm ci
- name: TypeScript check
run: npx tsc --noEmit
- name: Run unit tests
run: npm test
- name: Build Tauri app
run: npm run tauri build
+32 -13
View File
@@ -18,9 +18,19 @@ jobs:
with:
go-version: "1.25"
- uses: actions/setup-dotnet@v4
- uses: actions/setup-node@v4
with:
dotnet-version: 8.0.x
node-version: 20
cache: npm
cache-dependency-path: Client/tauri-client/package-lock.json
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: Client/tauri-client/src-tauri
- name: Extract version from tag
shell: bash
@@ -32,21 +42,30 @@ jobs:
shell: bash
run: cd Server && go build -o chatserver.exe -ldflags "-s -w -X main.version=$VERSION" .
- name: Build client single-file
run: >-
dotnet publish Client/OwnCord.Client/OwnCord.Client.csproj
-c Release -r win-x64 --self-contained
-p:PublishSingleFile=true
-p:IncludeNativeLibrariesForSelfExtract=true
-o dist/client
- name: Install npm dependencies
working-directory: Client/tauri-client
run: npm ci
- name: Build Tauri app
working-directory: Client/tauri-client
run: npm run tauri build
- name: Locate installer
id: installer
shell: bash
run: |
INSTALLER=$(find Client/tauri-client/src-tauri/target/release/bundle/nsis -name "*.exe" | head -1)
echo "path=$INSTALLER" >> "$GITHUB_OUTPUT"
echo "name=$(basename $INSTALLER)" >> "$GITHUB_OUTPUT"
- name: Generate SHA256 checksums
shell: pwsh
run: |
$serverHash = (Get-FileHash -Path Server/chatserver.exe -Algorithm SHA256).Hash.ToLower()
$clientHash = (Get-FileHash -Path dist/client/OwnCord.Client.exe -Algorithm SHA256).Hash.ToLower()
"$serverHash chatserver.exe" | Out-File -FilePath checksums.sha256 -Encoding utf8 -NoNewline
"`n$clientHash OwnCord.Client.exe" | Out-File -FilePath checksums.sha256 -Encoding utf8 -Append -NoNewline
$installerPath = "${{ steps.installer.outputs.path }}"
$installerName = "${{ steps.installer.outputs.name }}"
$clientHash = (Get-FileHash -Path $installerPath -Algorithm SHA256).Hash.ToLower()
"$serverHash chatserver.exe`n$clientHash $installerName" | Out-File -FilePath checksums.sha256 -Encoding utf8 -NoNewline
- name: Create GitHub Release
env:
@@ -55,5 +74,5 @@ jobs:
gh release create ${{ github.ref_name }}
--generate-notes
Server/chatserver.exe
dist/client/OwnCord.Client.exe
"${{ steps.installer.outputs.path }}"
checksums.sha256