From 2d2f5046b85bbe3cad17eca2e5d971d1ee056132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 15:05:28 -0500 Subject: [PATCH 1/9] feat(tests): use FakeTimeProvider for deterministic CircuitBreaker tests Bump lidarr.plugin.common submodule (includes TimeProvider injection). Add testkit project reference to Brainarr.Tests. Update CircuitBreaker to accept optional TimeProvider parameter. Refactor state transition tests to use FakeTimeProvider.Advance() instead of flaky Task.Delay() calls. Benefits: CircuitBreaker_transitions_to_half_open_after_duration runs in 1ms (was 1500ms+). Eliminates timing-based test flakiness. Co-Authored-By: Claude Opus 4.5 --- Brainarr.Plugin/Resilience/CircuitBreaker.cs | 8 +- Brainarr.Tests/Brainarr.Tests.csproj | 1 + .../Resilience/CircuitBreakerTests.cs | 20 +++-- Brainarr.Tests/packages.lock.json | 75 +++++++++++-------- ext-common-sha.txt | 2 +- ext/lidarr.plugin.common | 2 +- 6 files changed, 65 insertions(+), 43 deletions(-) diff --git a/Brainarr.Plugin/Resilience/CircuitBreaker.cs b/Brainarr.Plugin/Resilience/CircuitBreaker.cs index f2e687b8..79d77f44 100644 --- a/Brainarr.Plugin/Resilience/CircuitBreaker.cs +++ b/Brainarr.Plugin/Resilience/CircuitBreaker.cs @@ -79,7 +79,8 @@ public CircuitBreaker( int failureThreshold = 3, int openDurationSeconds = 60, int timeoutSeconds = 30, - Logger logger = null) + Logger logger = null, + TimeProvider timeProvider = null) { _timeout = TimeSpan.FromSeconds(timeoutSeconds); _logger = logger ?? LogManager.GetCurrentClassLogger(); @@ -92,11 +93,12 @@ public CircuitBreaker( SuccessThresholdInHalfOpen = 1 }; - // Create inner circuit breaker with NLog adapter + // Create inner circuit breaker with NLog adapter and optional TimeProvider _inner = new CommonResilience.CircuitBreaker( $"brainarr-{Guid.NewGuid():N}", options, - new NLogAdapter(_logger)); + new NLogAdapter(_logger), + timeProvider); } /// diff --git a/Brainarr.Tests/Brainarr.Tests.csproj b/Brainarr.Tests/Brainarr.Tests.csproj index 0e74384a..20d1569e 100644 --- a/Brainarr.Tests/Brainarr.Tests.csproj +++ b/Brainarr.Tests/Brainarr.Tests.csproj @@ -49,6 +49,7 @@ PluginPackagingDisable=true + diff --git a/Brainarr.Tests/Resilience/CircuitBreakerTests.cs b/Brainarr.Tests/Resilience/CircuitBreakerTests.cs index 1055d34f..be1c1768 100644 --- a/Brainarr.Tests/Resilience/CircuitBreakerTests.cs +++ b/Brainarr.Tests/Resilience/CircuitBreakerTests.cs @@ -4,6 +4,7 @@ using System.Threading; using System.Threading.Tasks; using FluentAssertions; +using Lidarr.Plugin.Common.TestKit.Testing; using NLog; using NzbDrone.Core.ImportLists.Brainarr.Resilience; using Xunit; @@ -159,11 +160,14 @@ await cb.ExecuteAsync( [Fact] public async Task CircuitBreaker_transitions_to_half_open_after_duration() { + // Use FakeTimeProvider for deterministic time control (no flaky Task.Delay) + var fakeTime = new FakeTimeProvider(); var cb = new CircuitBreaker( failureThreshold: 1, openDurationSeconds: 1, // 1 second for test timeoutSeconds: 30, - logger: L); + logger: L, + timeProvider: fakeTime); // Open the circuit try @@ -176,8 +180,8 @@ await cb.ExecuteAsync( cb.State.Should().Be(CircuitState.Open); - // Wait for open duration to pass - await Task.Delay(1500); // Wait 1.5 seconds + // Advance fake time past open duration (deterministic, instant) + fakeTime.Advance(TimeSpan.FromSeconds(1.5)); // Next call should find circuit in half-open and succeed var result = await cb.ExecuteAsync( @@ -215,16 +219,18 @@ await Assert.ThrowsAsync(async () => [Fact] public async Task Half_open_failure_reopens_circuit() { - var cb = new CircuitBreaker(failureThreshold: 1, openDurationSeconds: 1, timeoutSeconds: 1, logger: L); + // Use FakeTimeProvider for open duration transitions (deterministic) + var fakeTime = new FakeTimeProvider(); + var cb = new CircuitBreaker(failureThreshold: 1, openDurationSeconds: 1, timeoutSeconds: 1, logger: L, timeProvider: fakeTime); - // Open + // Open circuit via timeout (operation delay is real time for timeout trigger) await Assert.ThrowsAsync(async () => await cb.ExecuteAsync(async () => { await Task.Delay(2000); return 1; }, "slow") ); cb.State.Should().Be(CircuitState.Open); - // Wait for open duration to pass so circuit transitions to half-open - await Task.Delay(1100); + // Advance fake time past open duration (instant, deterministic) + fakeTime.Advance(TimeSpan.FromSeconds(1.1)); // Half-open attempt fails with timeout -> should re-open await Assert.ThrowsAsync(async () => diff --git a/Brainarr.Tests/packages.lock.json b/Brainarr.Tests/packages.lock.json index cf5bd1ba..6d545bf3 100644 --- a/Brainarr.Tests/packages.lock.json +++ b/Brainarr.Tests/packages.lock.json @@ -317,12 +317,12 @@ }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "resolved": "9.0.0", + "contentHash": "crjWyORoug0kK7RSNJBTeSE6VX8IQgLf3nUpTB9m62bPXp/tzbnOsnbe8TXEG0AASNaKZddnpHKw7fET8E++Pg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" + "Microsoft.Extensions.DependencyInjection": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0" } }, "Microsoft.Extensions.Logging.Configuration": { @@ -414,6 +414,14 @@ "resolved": "6.0.0", "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" }, + "NSubstitute": { + "type": "Transitive", + "resolved": "5.3.0", + "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "System.ClientModel": { "type": "Transitive", "resolved": "1.4.2", @@ -451,11 +459,6 @@ "resolved": "1.6.0", "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, "System.Security.AccessControl": { "type": "Transitive", "resolved": "6.0.0", @@ -563,7 +566,7 @@ "Lidarr.Plugin.Brainarr": { "type": "Project", "dependencies": { - "Lidarr.Plugin.Common": "[1.4.0, )", + "Lidarr.Plugin.Common": "[1.5.0, )", "Microsoft.Extensions.Caching.Memory": "[8.0.1, )", "Microsoft.Extensions.DependencyInjection": "[8.0.1, )", "Newtonsoft.Json": "[13.0.4, )", @@ -576,7 +579,7 @@ "Azure.Extensions.AspNetCore.DataProtection.Keys": "[1.6.1, )", "Azure.Identity": "[1.12.0, )", "FluentValidation": "[9.5.4, )", - "Lidarr.Plugin.Abstractions": "[1.4.0, )", + "Lidarr.Plugin.Abstractions": "[1.5.0, )", "Microsoft.AspNetCore.DataProtection": "[8.0.16, )", "Microsoft.AspNetCore.DataProtection.Extensions": "[8.0.16, )", "Microsoft.Extensions.Caching.Memory": "[8.0.1, )", @@ -592,6 +595,18 @@ "TagLibSharp": "[2.3.0, )" } }, + "lidarr.plugin.common.testkit": { + "type": "Project", + "dependencies": { + "Lidarr.Plugin.Abstractions": "[1.5.0, )", + "Lidarr.Plugin.Common": "[1.5.0, )", + "Microsoft.Extensions.DependencyInjection": "[9.0.0, )", + "Microsoft.Extensions.Logging": "[9.0.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.0, )", + "Moq": "[4.20.72, )", + "NSubstitute": "[5.3.0, )" + } + }, "FluentValidation": { "type": "CentralTransitive", "requested": "[11.11.0, )", @@ -623,51 +638,49 @@ "Microsoft.Extensions.DependencyInjection": { "type": "CentralTransitive", "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "resolved": "9.0.0", + "contentHash": "MCPrg7v3QgNMr0vX4vzRXvkNGgLg8vKWX0nKCWUxu2uPyMsaRgiRc1tHBnbTcfJMhMKj2slE/j2M9oGkd25DNw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "CentralTransitive", "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + "resolved": "9.0.0", + "contentHash": "+6f2qv2a3dLwd5w6JanPIPs47CxRbnk+ZocMJUhv9NxP88VlOcJYZs9jY+MYSjxvady08bUZn6qgiNh7DadGgg==" }, "Microsoft.Extensions.Logging.Abstractions": { "type": "CentralTransitive", "requested": "[7.0.0, )", - "resolved": "8.0.3", - "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", + "resolved": "9.0.0", + "contentHash": "g0UfujELzlLbHoVG8kPKVBaW470Ewi+jnptGS9KUi6jcb+k2StujtK3m26DFSGGwQ/+bVgZfsWqNzlP6YOejvw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "System.Diagnostics.DiagnosticSource": "9.0.0" } }, "Microsoft.Extensions.Options": { "type": "CentralTransitive", "requested": "[7.0.0, )", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "resolved": "9.0.0", + "contentHash": "y2146b3jrPI3Q0lokKXdKLpmXqakYbDIPDV6r3M8SqvSf45WwOTzkyfDpxnZXJsJQEpAsAqjUq5Pu8RCJMjubg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "CentralTransitive", "requested": "[7.0.0, )", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + "resolved": "9.0.0", + "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg==" }, "System.Diagnostics.DiagnosticSource": { "type": "CentralTransitive", "requested": "[7.0.2, )", - "resolved": "6.0.1", - "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "9.0.0", + "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==" }, "System.Security.Cryptography.ProtectedData": { "type": "CentralTransitive", diff --git a/ext-common-sha.txt b/ext-common-sha.txt index 239bfe6f..6f1f9921 100644 --- a/ext-common-sha.txt +++ b/ext-common-sha.txt @@ -1 +1 @@ -9ea7dcd9006006dbafc856493cd98b25f3dd986b +2021517 diff --git a/ext/lidarr.plugin.common b/ext/lidarr.plugin.common index 9ea7dcd9..20215171 160000 --- a/ext/lidarr.plugin.common +++ b/ext/lidarr.plugin.common @@ -1 +1 @@ -Subproject commit 9ea7dcd9006006dbafc856493cd98b25f3dd986b +Subproject commit 2021517173ba5aaefaa1f0193c6308c1f8c412b6 From 69300ebe38d86c97a7a384e8a00b2a207d322545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 15:35:53 -0500 Subject: [PATCH 2/9] test: stabilize CircuitBreaker tests (no delay, align properties) --- Brainarr.Tests/Brainarr.Tests.csproj | 4 +++- Brainarr.Tests/Resilience/CircuitBreakerTests.cs | 12 ++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Brainarr.Tests/Brainarr.Tests.csproj b/Brainarr.Tests/Brainarr.Tests.csproj index 20d1569e..d606baf4 100644 --- a/Brainarr.Tests/Brainarr.Tests.csproj +++ b/Brainarr.Tests/Brainarr.Tests.csproj @@ -49,7 +49,9 @@ PluginPackagingDisable=true - + + PluginPackagingDisable=true + diff --git a/Brainarr.Tests/Resilience/CircuitBreakerTests.cs b/Brainarr.Tests/Resilience/CircuitBreakerTests.cs index be1c1768..f3bf78f3 100644 --- a/Brainarr.Tests/Resilience/CircuitBreakerTests.cs +++ b/Brainarr.Tests/Resilience/CircuitBreakerTests.cs @@ -202,9 +202,9 @@ public async Task Timeout_opens_circuit_and_reset_allows_success() // Immediate timeout and open var cb = new CircuitBreaker(failureThreshold: 1, openDurationSeconds: 1, timeoutSeconds: 3, logger: L); - // First call times out -> opens + // First call times out -> opens (simulated timeout; no real delay required) await Assert.ThrowsAsync(async () => - await cb.ExecuteAsync(async () => { await Task.Delay(4000); return 1; }, "slow") + await cb.ExecuteAsync(() => Task.FromException(new TimeoutException("Simulated timeout")), "slow") ); cb.State.Should().Be(CircuitState.Open); cb.FailureCount.Should().BeGreaterThan(0); @@ -223,18 +223,18 @@ public async Task Half_open_failure_reopens_circuit() var fakeTime = new FakeTimeProvider(); var cb = new CircuitBreaker(failureThreshold: 1, openDurationSeconds: 1, timeoutSeconds: 1, logger: L, timeProvider: fakeTime); - // Open circuit via timeout (operation delay is real time for timeout trigger) + // Open circuit via timeout (simulated timeout; no real delay required) await Assert.ThrowsAsync(async () => - await cb.ExecuteAsync(async () => { await Task.Delay(2000); return 1; }, "slow") + await cb.ExecuteAsync(() => Task.FromException(new TimeoutException("Simulated timeout")), "slow") ); cb.State.Should().Be(CircuitState.Open); // Advance fake time past open duration (instant, deterministic) fakeTime.Advance(TimeSpan.FromSeconds(1.1)); - // Half-open attempt fails with timeout -> should re-open + // Half-open attempt fails with timeout -> should re-open (simulated timeout; no real delay required) await Assert.ThrowsAsync(async () => - await cb.ExecuteAsync(async () => { await Task.Delay(2000); return 1; }, "still-slow") + await cb.ExecuteAsync(() => Task.FromException(new TimeoutException("Simulated timeout")), "still-slow") ); cb.State.Should().Be(CircuitState.Open); } From e60626e6959281974bac3a972d032414860a2460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 15:45:32 -0500 Subject: [PATCH 3/9] fix(nuget): add NSubstitute to package source mapping TestKit.csproj uses NSubstitute, which must be allowed in NuGet.config package source mapping. Co-Authored-By: Claude Opus 4.5 --- NuGet.config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.config b/NuGet.config index e888f23a..7a3e6e4a 100644 --- a/NuGet.config +++ b/NuGet.config @@ -27,6 +27,7 @@ + From 5348e5602b7be62cf17f43d31232f9dcd07a544d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 16:03:29 -0500 Subject: [PATCH 4/9] chore: bump Lidarr.Plugin.Common to ab9c045 --- ext/lidarr.plugin.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/lidarr.plugin.common b/ext/lidarr.plugin.common index 20215171..ab9c045c 160000 --- a/ext/lidarr.plugin.common +++ b/ext/lidarr.plugin.common @@ -1 +1 @@ -Subproject commit 2021517173ba5aaefaa1f0193c6308c1f8c412b6 +Subproject commit ab9c045cec6669610f2f72eba66e61d017ba9cc1 From 658a7ec9aad051b84dba3cbf084536f2bfd2de88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 16:04:13 -0500 Subject: [PATCH 5/9] chore: update ext-common-sha.txt for ab9c045 --- ext-common-sha.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext-common-sha.txt b/ext-common-sha.txt index 6f1f9921..6e2d76f6 100644 --- a/ext-common-sha.txt +++ b/ext-common-sha.txt @@ -1 +1 @@ -2021517 +ab9c045 \ No newline at end of file From dc0bf2db81c37e1f02b9e6125cc39f0e053729df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 16:37:09 -0500 Subject: [PATCH 6/9] fix(ci): update multi-plugin-smoke-test to use reusable workflow correctly Use workflow_call inputs from Common PR #269: test_plugins, lidarr_tag. Use secrets: inherit for cross-repo access. Co-Authored-By: Claude Opus 4.5 --- .github/workflows/multi-plugin-smoke-test.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/multi-plugin-smoke-test.yml b/.github/workflows/multi-plugin-smoke-test.yml index f20b19de..630a0460 100644 --- a/.github/workflows/multi-plugin-smoke-test.yml +++ b/.github/workflows/multi-plugin-smoke-test.yml @@ -24,8 +24,6 @@ jobs: name: 🔥 Plugin Co-existence uses: RicherTunes/Lidarr.Plugin.Common/.github/workflows/multi-plugin-smoke-test.yml@main with: - caller_plugin: brainarr test_plugins: 'brainarr,qobuzarr,tidalarr' - lidarr_docker_version: 'pr-plugins-2.14.2.4786' - secrets: - SUBMODULES_TOKEN: ${{ secrets.SUBMODULES_TOKEN }} + lidarr_tag: 'pr-plugins-2.14.2.4786' + secrets: inherit From acdc1ee76f7e352232ee0c4c6a8814b74e694244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 17:05:46 -0500 Subject: [PATCH 7/9] chore: bump Common submodule to latest main (e1fd02e) Includes: - #268: fix(testkit): add AdditionalProperties to prevent CS2012 file locks - #270: fix(auth): make StreamingTokenManager deterministically testable with TimeProvider - #269: feat(ci): reusable multi-plugin smoke test + Brainarr schema assertions Co-Authored-By: Claude Opus 4.5 --- ext/lidarr.plugin.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/lidarr.plugin.common b/ext/lidarr.plugin.common index ab9c045c..e1fd02e1 160000 --- a/ext/lidarr.plugin.common +++ b/ext/lidarr.plugin.common @@ -1 +1 @@ -Subproject commit ab9c045cec6669610f2f72eba66e61d017ba9cc1 +Subproject commit e1fd02e15f7e94bdc8d83c245691a1f8ae07cb65 From c069308ea2e0ec0db1b371094ba7c7ce9fb11d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 17:08:23 -0500 Subject: [PATCH 8/9] chore: update ext-common-sha.txt to match submodule Co-Authored-By: Claude Opus 4.5 --- ext-common-sha.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext-common-sha.txt b/ext-common-sha.txt index 6e2d76f6..4214b801 100644 --- a/ext-common-sha.txt +++ b/ext-common-sha.txt @@ -1 +1 @@ -ab9c045 \ No newline at end of file +e1fd02e15f7e94bdc8d83c245691a1f8ae07cb65 From e92b6eb78bd0a28f28c0f580273636610d8ad349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8E=A7=20RicherTunes=20=F0=9F=8E=A7?= Date: Tue, 13 Jan 2026 17:12:39 -0500 Subject: [PATCH 9/9] fix(ci): use GITHUB_TOKEN for repo checkout --- .github/workflows/nightly.yml | 2 +- .github/workflows/packaging-closure.yml | 2 +- .github/workflows/plugin-package.yml | 4 ++-- .github/workflows/release.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 37e51c81..edd50132 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -29,7 +29,7 @@ jobs: with: fetch-depth: 0 submodules: false - token: ${{ secrets.SUBMODULES_TOKEN || github.token }} + token: ${{ github.token }} - name: Init Common submodule uses: ./.github/actions/init-common-submodule diff --git a/.github/workflows/packaging-closure.yml b/.github/workflows/packaging-closure.yml index 4baa2a06..e00c14c2 100644 --- a/.github/workflows/packaging-closure.yml +++ b/.github/workflows/packaging-closure.yml @@ -29,7 +29,7 @@ jobs: with: fetch-depth: 0 submodules: false - token: ${{ secrets.SUBMODULES_TOKEN || github.token }} + token: ${{ github.token }} - name: Init Common submodule uses: ./.github/actions/init-common-submodule diff --git a/.github/workflows/plugin-package.yml b/.github/workflows/plugin-package.yml index 072f12fe..74162707 100644 --- a/.github/workflows/plugin-package.yml +++ b/.github/workflows/plugin-package.yml @@ -27,7 +27,7 @@ jobs: with: fetch-depth: 0 submodules: false - token: ${{ secrets.SUBMODULES_TOKEN || github.token }} + token: ${{ github.token }} - name: Init Common submodule uses: ./.github/actions/init-common-submodule @@ -198,7 +198,7 @@ jobs: with: fetch-depth: 0 submodules: false - token: ${{ secrets.SUBMODULES_TOKEN || github.token }} + token: ${{ github.token }} - name: Download packaged artifact uses: actions/download-artifact@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d4712ba6..98d77855 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: with: fetch-depth: 0 submodules: false - token: ${{ secrets.SUBMODULES_TOKEN || github.token }} + token: ${{ github.token }} - name: Init Common submodule