feat: implement Live/Remix filtering and add CI/CD pipeline
Some checks failed
Build and Push Docker Image / build (pull_request) Failing after 38s

This commit includes:

1. Live/Remix Filtering Feature:
   - Added ignore_live and ignore_remix columns to artist_settings table (migration 010)
   - Updated ArtistSettings struct with IgnoreLive and IgnoreRemix fields
   - Modified SaveArtistSettings and UpdateArtistSettings to handle new fields
   - Extended FilterOptions struct with IgnoreLive and IgnoreRemix
   - Updated ApplyTypeToggles and ApplyTypeTogglesToReleaseGroups to filter Live/Remix types
   - Added toggleIgnoreLive and toggleIgnoreRemix handlers in web layer
   - Updated ArtistData view model and artist.html template with new toggle UI
   - Comprehensive test coverage for all new functionality

2. CI/CD Pipeline with Gitea Actions:
   - Added .gitea/workflows/docker-build.yml for automated Docker builds
   - Workflow triggers on pushes to main/master and tags, plus PRs
   - Runs Go tests before building
   - Builds and pushes multi-architecture Docker images to gitea.mrixs.me
   - Includes caching for faster subsequent builds
   - Proper tagging strategy (branch, semver, SHA)
   - CI-CD-GUIDE.md documentation

3. Cleanup:
   - Removed temporary build artifacts and coverage files
This commit is contained in:
2026-08-05 22:55:40 +03:00
parent ca8d503c50
commit e73b17673e
14 changed files with 237 additions and 100 deletions

View File

@@ -364,10 +364,10 @@ func TestFilterConsistency_AcrossCacheStates(t *testing.T) {
// Seed artist settings with IgnoreSingles enabled
if err := database.SaveArtistSettings(db, &database.ArtistSettings{
ID: "artist-1",
Name: "Test Artist",
Monitored: true,
IgnoreSingles: true, // This is the key toggle we're testing
ID: "artist-1",
Name: "Test Artist",
Monitored: true,
IgnoreSingles: true, // This is the key toggle we're testing
IgnoreCompilations: false,
}); err != nil {
t.Fatalf("SaveArtistSettings error: %v", err)
@@ -427,7 +427,7 @@ func TestFilterConsistency_AcrossCacheStates(t *testing.T) {
if err != nil {
t.Fatalf("GetArtistSettings error: %v", err)
}
filter := TypeFilter{
filter := musicbrainz.FilterOptions{
IgnoreSingles: settings.IgnoreSingles,
IgnoreCompilations: settings.IgnoreCompilations,
}
@@ -436,7 +436,7 @@ func TestFilterConsistency_AcrossCacheStates(t *testing.T) {
var isSuppressed bool
for _, ext := range externalReleases {
if ext.RGID == "rg-ep-release" {
isSuppressed = filter.suppressed(ext)
isSuppressed = FilterIsSuppressed(filter, ext)
break
}
}
@@ -455,4 +455,4 @@ func TestFilterConsistency_AcrossCacheStates(t *testing.T) {
//
// Since all three paths ultimately use the same filtering function with the same
// inputs, they must produce identical results.
}
}