-
-
Notifications
You must be signed in to change notification settings - Fork 23
Upgrade .NET 10 / Node 24 + clean architecture migration #524
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
21 commits
Select commit
Hold shift + click to select a range
8c54c37
Upgrade .NET/Node, refactor repos & update CI
therobbiedavis 90127e1
Use repository interfaces instead of DbContext
therobbiedavis d54e579
Add targeted download queries to repositories
therobbiedavis 92ab409
Add cancellation token, queue stats, map fields
therobbiedavis f8ac781
Optimize queries, preserve settings, adjust tests
therobbiedavis ba0803d
Use latestMinor rollForward in global.json
therobbiedavis 308d1a0
Rename nightly workflow to beta and update CI/docs
therobbiedavis f03f894
Add CODEOWNERS; update WARP and SECURITY docs
therobbiedavis 4a4c38e
Making repo AGPLv3.0 compliant
therobbiedavis fec466b
Replace block license headers with HTML comments
therobbiedavis 1b344d5
PR review changes
therobbiedavis 78ed9a7
PR Review #2
therobbiedavis 017863c
CI: label-driven canary, beta include short SHA
therobbiedavis 11d188d
Add post-release PR to forward hotfixes to canary
therobbiedavis a020ec8
Add read permissions to PR label workflow
therobbiedavis f4b0658
Clarify 409 error comment in libraryImport
therobbiedavis 4087376
Add project .editorconfig and mark fe root
therobbiedavis 024eb65
Merge branch 'canary' into chore/dependencies-and-workflow
therobbiedavis 63140d7
Introduce reusable build-and-publish workflow
therobbiedavis 25ff557
Update editorconfig and logging overrides
therobbiedavis 641e277
Rename *_repo fields to *_repository
therobbiedavis File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| root = true | ||
|
|
||
| # ─── Defaults ──────────────────────────────────────────────────────────────── | ||
| [*] | ||
| charset = utf-8 | ||
| end_of_line = lf | ||
| insert_final_newline = true | ||
| trim_trailing_whitespace = true | ||
| indent_style = space | ||
| indent_size = 4 | ||
|
|
||
| # ─── C# ─────────────────────────────────────────────────────────────────────── | ||
| [*.cs] | ||
| indent_style = space | ||
| indent_size = 4 | ||
|
|
||
| # ─── XML / project files ────────────────────────────────────────────────────── | ||
| [*.{csproj,props,targets,slnx,xml,config,resx}] | ||
| indent_style = space | ||
| indent_size = 2 | ||
|
|
||
| # ─── Web / frontend (deferred to fe/.editorconfig) ──────────────────────────── | ||
| # fe/.editorconfig is root = true and owns all JS/TS/Vue/CSS files under fe/ | ||
|
|
||
| # ─── YAML ───────────────────────────────────────────────────────────────────── | ||
| [*.{yml,yaml}] | ||
| indent_style = space | ||
| indent_size = 2 | ||
|
|
||
| # ─── JSON ───────────────────────────────────────────────────────────────────── | ||
| [*.json] | ||
| indent_style = space | ||
| indent_size = 2 | ||
|
|
||
| # ─── Markdown ───────────────────────────────────────────────────────────────── | ||
| [*.md] | ||
| trim_trailing_whitespace = true | ||
|
|
||
| # ─── Shell scripts ──────────────────────────────────────────────────────────── | ||
| [*.sh] | ||
| end_of_line = lf | ||
|
|
||
| # ─── Windows batch / PowerShell ─────────────────────────────────────────────── | ||
| [*.{bat,cmd,ps1}] | ||
| end_of_line = crlf |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| # All PRs require review from a maintainer. | ||
| # Maintainers are org members of the listenarrs/maintainers team. | ||
| * @listenarrs/maintainers | ||
|
|
||
| # CI/CD workflows — any change requires maintainer sign-off | ||
| .github/workflows/ @listenarrs/maintainers | ||
| .github/CODEOWNERS @listenarrs/maintainers | ||
| .github/dependabot.yml @listenarrs/maintainers | ||
|
|
||
| # Security and legal | ||
| SECURITY.md @listenarrs/maintainers | ||
| LICENSE @listenarrs/maintainers | ||
|
|
||
| # Docker and deployment | ||
| Dockerfile @listenarrs/maintainers | ||
| docker-entrypoint.sh @listenarrs/maintainers | ||
| docker-compose.yml @listenarrs/maintainers | ||
| listenarr.api/Dockerfile.runtime @listenarrs/maintainers | ||
|
|
||
| # .NET project and build configuration — controls SDK, versions, global deps | ||
| global.json @listenarrs/maintainers | ||
| Directory.Build.props @listenarrs/maintainers | ||
| Directory.Packages.props @listenarrs/maintainers | ||
| listenarr.api/Listenarr.Api.csproj @listenarrs/maintainers | ||
|
|
||
| # Database migrations — schema changes are hard to reverse | ||
| listenarr.infrastructure/Migrations/ @listenarrs/maintainers | ||
|
|
||
| # Application entry point and DI wiring | ||
| listenarr.api/Program.cs @listenarrs/maintainers | ||
|
|
||
| # Default configuration shipped with the app | ||
| listenarr.api/config/appsettings/ @listenarrs/maintainers | ||
|
|
||
| # Dependency manifests — watch for supply-chain changes | ||
| package.json @listenarrs/maintainers | ||
| package-lock.json @listenarrs/maintainers | ||
| fe/package.json @listenarrs/maintainers | ||
| fe/package-lock.json @listenarrs/maintainers | ||
| listenarr.api/tools/discord-bot/package.json @listenarrs/maintainers |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,143 @@ | ||
| name: Beta — build executables & Docker (beta) | ||
|
|
||
| concurrency: | ||
| group: beta-build-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| permissions: | ||
| contents: write | ||
| pull-requests: write | ||
| packages: write | ||
|
|
||
| on: | ||
| push: | ||
| branches: [ beta ] | ||
|
|
||
| jobs: | ||
| beta-build: | ||
| if: github.actor != 'github-actions[bot]' | ||
| runs-on: ubuntu-latest | ||
| outputs: | ||
| version: ${{ steps.resolve-version.outputs.VERSION }} | ||
| short_sha: ${{ steps.short-sha.outputs.SHORT_SHA }} | ||
| pr_number: ${{ steps.find_triggering_pr.outputs.PR_NUMBER }} | ||
| pr_title: ${{ steps.find_triggering_pr.outputs.PR_TITLE }} | ||
| pr_body_raw: ${{ steps.find_triggering_pr.outputs.PR_BODY_RAW }} | ||
| env: | ||
| API_PROJECT: listenarr.api/Listenarr.Api.csproj | ||
|
|
||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: Setup Node | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: 24 | ||
|
|
||
| - name: Resolve target version | ||
| id: resolve-version | ||
| run: | | ||
| set -euo pipefail | ||
| # Beta is a stabilisation snapshot — version is whatever canary last set. | ||
| VERSION=$(sed -n "s:.*<Version>\(.*\)</Version>.*:\1:p" "${{ env.API_PROJECT }}" 2>/dev/null | head -n1) | ||
| if [ -z "${VERSION}" ]; then | ||
| VERSION=$(node -p "require('./fe/package.json').version" 2>/dev/null || echo "0.0.0") | ||
| fi | ||
| echo "Beta version (from canary): ${VERSION}" | ||
| echo "VERSION=${VERSION}" >> "$GITHUB_OUTPUT" | ||
|
|
||
| - name: Compute short SHA | ||
| id: short-sha | ||
| run: echo "SHORT_SHA=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" | ||
|
|
||
| - name: Find triggering Pull Request | ||
| id: find_triggering_pr | ||
| run: | | ||
| PR_DATA=$(gh api graphql -f query=' | ||
| query($owner: String!, $repo: String!) { | ||
| repository(owner: $owner, name: $repo) { | ||
| pullRequests(first: 20, states: MERGED, baseRefName: "beta", orderBy: {field: UPDATED_AT, direction: DESC}) { | ||
| edges { | ||
| node { | ||
| number | ||
| title | ||
| body | ||
| baseRefName | ||
| mergeCommit { oid } | ||
| labels(first: 10) { nodes { name } } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| }' -f owner='${{ github.repository_owner }}' -f repo='${{ github.event.repository.name }}') | ||
|
|
||
| FILTERED_PR=$(echo "$PR_DATA" | jq -r ' | ||
| [.data.repository.pullRequests.edges[] | | ||
| select( | ||
| (.node.title | test("[Bb]ump version|[Vv]ersion bump|\\[skip ci\\]"; "i") | not) and | ||
| (.node.labels.nodes | map(.name) | any(. == "version-bump" or . == "automated") | not) | ||
| ) | | ||
| .node | | ||
| {number, title, body, baseRefName}][0] // null | ||
| ') | ||
|
|
||
| echo "Recent PRs found:" | ||
| echo "$PR_DATA" | jq -r '.data.repository.pullRequests.edges[:5][] | "PR #\(.node.number): \(.node.title)"' | ||
|
|
||
| if [ "$FILTERED_PR" != "" ] && [ "$FILTERED_PR" != "null" ]; then | ||
| PR_NUMBER=$(echo "$FILTERED_PR" | jq -r '.number // ""') | ||
| PR_TITLE=$(echo "$FILTERED_PR" | jq -r '.title // ""') | ||
| PR_BODY_RAW=$(echo "$FILTERED_PR" | jq -r '.body // ""') | ||
| echo "✅ Found non-version-bump PR #$PR_NUMBER: $PR_TITLE" | ||
| else | ||
| echo "⚠️ No non-version-bump PR found, using fallback" | ||
| PR_NUMBER="" | ||
| PR_TITLE="Beta changes" | ||
| PR_BODY_RAW="Recent beta changes merged to beta branch." | ||
| fi | ||
|
|
||
| echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT | ||
| echo "PR_TITLE=$PR_TITLE" >> $GITHUB_OUTPUT | ||
| echo "PR_BODY_RAW<<EOF_PR_BODY" >> $GITHUB_OUTPUT | ||
| echo "$PR_BODY_RAW" >> $GITHUB_OUTPUT | ||
| echo "EOF_PR_BODY" >> $GITHUB_OUTPUT | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
|
||
| beta-publish: | ||
| needs: beta-build | ||
| uses: ./.github/workflows/build-and-publish.yml | ||
| with: | ||
| version: ${{ needs.beta-build.outputs.version }} | ||
| short_sha: ${{ needs.beta-build.outputs.short_sha }} | ||
| channel: beta | ||
| artifact_prefix: beta-artifacts | ||
| include_osx: false | ||
| release_tag: v${{ needs.beta-build.outputs.version }}-beta-${{ needs.beta-build.outputs.short_sha }} | ||
| release_name: Beta ${{ needs.beta-build.outputs.version }} (${{ needs.beta-build.outputs.short_sha }}) | ||
| prerelease: true | ||
| pr_number: ${{ needs.beta-build.outputs.pr_number }} | ||
| pr_title: ${{ needs.beta-build.outputs.pr_title }} | ||
| pr_body_raw: ${{ needs.beta-build.outputs.pr_body_raw }} | ||
| discord_text: A new beta build has been released for docker. | ||
| docker_tags: | | ||
| docker.io/therobbiedavis/listenarr:beta | ||
| docker.io/therobbiedavis/listenarr:beta-${{ needs.beta-build.outputs.version }} | ||
| docker.io/therobbiedavis/listenarr:beta-${{ needs.beta-build.outputs.version }}-${{ needs.beta-build.outputs.short_sha }} | ||
| ghcr.io/listenarrs/listenarr:beta | ||
| ghcr.io/listenarrs/listenarr:beta-${{ needs.beta-build.outputs.version }} | ||
| ghcr.io/listenarrs/listenarr:beta-${{ needs.beta-build.outputs.version }}-${{ needs.beta-build.outputs.short_sha }} | ||
| atcr.io/therobbiedavis.com/listenarr:beta | ||
| atcr.io/therobbiedavis.com/listenarr:beta-${{ needs.beta-build.outputs.version }} | ||
| atcr.io/therobbiedavis.com/listenarr:beta-${{ needs.beta-build.outputs.version }}-${{ needs.beta-build.outputs.short_sha }} | ||
| secrets: | ||
| DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} | ||
| DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} | ||
| ATCR_USERNAME: ${{ secrets.ATCR_USERNAME }} | ||
| ATCR_TOKEN: ${{ secrets.ATCR_TOKEN }} | ||
| LISTENARR_DISCORD_WEBHOOK_URL: ${{ secrets.LISTENARR_DISCORD_WEBHOOK_URL }} | ||
|
|
||
| # Skipped: separate Web image. The API image contains the frontend in wwwroot. | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.