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
+34
View File
@@ -0,0 +1,34 @@
---
name: Bug Report
about: Report a bug in OwnCord
title: "bug: "
labels: bug
---
## Description
<!-- Clear description of the bug -->
## Steps to Reproduce
1.
2.
3.
## Expected Behavior
<!-- What should happen -->
## Actual Behavior
<!-- What actually happens -->
## Environment
- **OS**: Windows 11 (version)
- **OwnCord Version**:
- **Component**: Server / Client / Both
## Screenshots / Logs
<!-- Paste relevant logs or screenshots -->
+22
View File
@@ -0,0 +1,22 @@
---
name: Feature Request
about: Suggest a new feature for OwnCord
title: "feat: "
labels: enhancement
---
## Problem
<!-- What problem does this solve? -->
## Proposed Solution
<!-- How should it work? -->
## Alternatives Considered
<!-- Other approaches you thought about -->
## Additional Context
<!-- Mockups, links, or related issues -->
+27
View File
@@ -0,0 +1,27 @@
# Pull Request
## Summary
<!-- What does this PR do? 1-3 bullet points -->
-
## Changes
<!-- List the key changes made -->
-
## Test Plan
- [ ] Unit tests pass (`npm test` / `go test ./...`)
- [ ] TypeScript check passes (`npx tsc --noEmit`)
- [ ] Manual testing done (describe below)
## Screenshots
<!-- If UI changes, add before/after screenshots -->
## Related Issues
<!-- Link any related issues: Fixes #123, Relates to #456 -->
+54
View File
@@ -0,0 +1,54 @@
version: 2
updates:
# Go server dependencies
- package-ecosystem: gomod
directory: /Server
schedule:
interval: weekly
day: monday
commit-message:
prefix: "chore(deps):"
labels:
- dependencies
- go
open-pull-requests-limit: 10
# Tauri client npm dependencies
- package-ecosystem: npm
directory: /Client/tauri-client
schedule:
interval: weekly
day: monday
commit-message:
prefix: "chore(deps):"
labels:
- dependencies
- npm
open-pull-requests-limit: 10
# Tauri Rust/Cargo dependencies
- package-ecosystem: cargo
directory: /Client/tauri-client/src-tauri
schedule:
interval: weekly
day: monday
commit-message:
prefix: "chore(deps):"
labels:
- dependencies
- rust
open-pull-requests-limit: 5
# GitHub Actions
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
commit-message:
prefix: "ci(deps):"
labels:
- dependencies
- ci
open-pull-requests-limit: 5
+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