diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ebc552e9..0ee102cc 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,6 +5,7 @@ updates: # main - package-ecosystem: "nuget" directory: "/" + target-branch: "main" schedule: interval: "daily" - package-ecosystem: "github-actions" diff --git a/.github/workflows/BuildDockerPush.yml b/.github/workflows/BuildDockerPush.yml index 6c9f9475..4f9f29e3 100644 --- a/.github/workflows/BuildDockerPush.yml +++ b/.github/workflows/BuildDockerPush.yml @@ -15,31 +15,26 @@ concurrency: jobs: - # Test test: name: Test runs-on: ubuntu-latest steps: - # Install .NET SDK # https://github.com/marketplace/actions/setup-net-core-sdk - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: dotnet-version: "8.x" - # Checkout code # https://github.com/marketplace/actions/checkout - name: Checkout code uses: actions/checkout@v4 - # Run Unit Tests # https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test - name: Run unit tests run: dotnet test ./PlexCleanerTests/PlexCleanerTests.csproj - # Get version information version: name: Version runs-on: ubuntu-latest @@ -53,38 +48,30 @@ jobs: steps: - # Checkout code # https://github.com/marketplace/actions/checkout - name: Checkout uses: actions/checkout@v4 with: - # Get all history for version calculation fetch-depth: 0 - # Run Nerdbank.GitVersioning # https://github.com/marketplace/actions/nerdbank-gitversioning - name: Run Nerdbank.GitVersioning tool id: nbgv uses: dotnet/nbgv@master - # Build and push docker images buildpush: name: Build and push runs-on: ubuntu-latest needs: version strategy: - # Keep building even if one job fails, helps with troubleshooting when there are multiple errors fail-fast: false - # Limit number of concurrent builds - # Error: buildx failed with: ERROR: failed to solve: error writing layer blob: maximum timeout reached max-parallel: 4 - + # https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs matrix: include: - # Debian Stable: - file: ./Docker/Debian.Stable.Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 cache-scope: debian @@ -92,7 +79,6 @@ jobs: tags: | docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'debian' || 'debian-develop' }} - # Debian Testing: - file: ./Docker/Debian.Testing.Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 cache-scope: debian-testing @@ -100,7 +86,6 @@ jobs: tags: | docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'debian-testing' || 'debian-testing-develop' }} - # Alpine Stable: - file: ./Docker/Alpine.Stable.Dockerfile platforms: linux/amd64,linux/arm64 cache-scope: alpine @@ -108,15 +93,13 @@ jobs: tags: | docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'alpine' || 'alpine-develop' }} - # Alpine Edge: - file: ./Docker/Alpine.Edge.Dockerfile platforms: linux/amd64,linux/arm64 cache-scope: alpine-edge secrets: SAVOURY_PPA_AUTH tags: | docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'alpine-edge' || 'alpine-edge-develop' }} - - # Ubuntu Savoury: + - file: ./Docker/Ubuntu.Savoury.Dockerfile platforms: linux/amd64 cache-scope: savoury @@ -124,18 +107,15 @@ jobs: tags: | docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'savoury' || 'savoury-develop' }} - # Ubuntu Rolling: - file: ./Docker/Ubuntu.Rolling.Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 cache-scope: ubuntu secrets: SAVOURY_PPA_AUTH - # Also tag with latest and version number tags: | docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'ubuntu' || 'ubuntu-develop' }} docker.io/ptr727/plexcleaner:${{ endsWith(github.ref, 'refs/heads/main') && 'latest' || 'develop' }} docker.io/ptr727/plexcleaner:${{ needs.version.outputs.SemVer2 }} - # Ubuntu Devel: - file: ./Docker/Ubuntu.Devel.Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 cache-scope: ubuntu-devel @@ -145,29 +125,24 @@ jobs: steps: - # Checkout code # https://github.com/marketplace/actions/checkout - name: Checkout uses: actions/checkout@v4 - # Setup QEMU for multi architecture builds # https://github.com/marketplace/actions/docker-setup-qemu - name: Setup QEMU uses: docker/setup-qemu-action@v3 with: platforms: linux/amd64,linux/arm64,linux/arm/v7 - # Setup docker build # https://github.com/marketplace/actions/docker-setup-buildx - name: Setup Buildx uses: docker/setup-buildx-action@v3 with: platforms: linux/amd64,linux/arm64,linux/arm/v7 - # Login to Docker Hub # https://github.com/marketplace/actions/docker-login - name: Login to Docker Hub - # Skip pull requests if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v3 with: @@ -175,21 +150,12 @@ jobs: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - # Docker build and push # https://github.com/marketplace/actions/build-and-push-docker-images - # https://docs.docker.com/build/ci/github-actions/cache/ - # https://github.com/moby/buildkit#github-actions-cache-experimental - - # Matrix build - name: Docker build and push uses: docker/build-push-action@v6 with: context: . - # GitHub cache is as unreliable as posting to GHCR, broken pipe errors - # cache-from: type=gha,scope=${{ matrix.cache-scope }} - # cache-to: type=gha,mode=max,scope=${{ matrix.cache-scope }} file: ${{ matrix.file }} - # Do not push on pull requests push: ${{ (github.event_name != 'pull_request') }} # TODO: How to test for secret not null and avoid "null= is not a valid secret" secrets: ${{ matrix.secrets }}=${{ secrets[matrix.secrets] }} @@ -204,14 +170,12 @@ jobs: BUILD_INFORMATION_VERSION=${{ needs.version.outputs.AssemblyInformationalVersion }} BUILD_PACKAGE_VERSION=${{ needs.version.outputs.SemVer2 }} - # Get tool versions from image toolversions: name: Tool versions runs-on: ubuntu-latest needs: buildpush - # Skip pull requests if: ${{ github.event_name != 'pull_request' }} - + strategy: # https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs @@ -234,7 +198,6 @@ jobs: steps: - # Get image size - name: Get image size run: | mkdir -p ${{ runner.temp }}/versions @@ -242,7 +205,6 @@ jobs: echo Image: docker.io/ptr727/plexcleaner:${{ matrix.tag }} >> ${{ runner.temp }}/versions/${{ matrix.file }} echo Size: $(docker manifest inspect -v docker.io/ptr727/plexcleaner:${{ matrix.tag }} | jq '.[] | select(.Descriptor.platform.architecture=="amd64") | [.OCIManifest.layers[].size] | add' | numfmt --to=iec) >> ${{ runner.temp }}/versions/${{ matrix.file }} - # Get tool versions in container # https://github.com/marketplace/actions/docker-run-action - name: Write tool versions to file uses: addnab/docker-run-action@v3 @@ -258,7 +220,6 @@ jobs: echo MkvMerge: $(mkvmerge --version) >> /versions/${{ matrix.file }} echo FfMpeg: $(ffmpeg -version) >> /versions/${{ matrix.file }} - # Print version file contents - name: Print versions run: cat ${{ runner.temp }}/versions/${{ matrix.file }} @@ -269,18 +230,16 @@ jobs: name: versions-${{ matrix.file }} path: ${{ runner.temp }}/versions/${{ matrix.file }} - # Update Docker README.md updatereadme: name: Create Docker README.md runs-on: ubuntu-latest needs: toolversions - # Skip pull requests and only update on main branch if: ${{ (github.event_name != 'pull_request') && (endsWith(github.ref, 'refs/heads/main')) }} steps: # https://github.com/marketplace/actions/checkout - - name: Checkout + - name: Checkout uses: actions/checkout@v4 # https://github.com/marketplace/actions/download-a-build-artifact @@ -304,22 +263,18 @@ jobs: short-description: ${{ github.event.repository.description }} readme-filepath: ${{ runner.temp }}/README.md - # Create a custom badge to report the build date datebadge: name: Date badge runs-on: ubuntu-latest needs: buildpush - # Skip pull requests and only update on main branch if: ${{ (github.event_name != 'pull_request') && (endsWith(github.ref, 'refs/heads/main')) }} steps: - # Get date from environment as a variable - id: date run: | echo "date=$(date)" >> $GITHUB_OUTPUT - # Create badge # https://github.com/marketplace/actions/bring-your-own-badge - name: Build date badge uses: RubbaBoy/BYOB@v1 diff --git a/.github/workflows/BuildGitHubRelease.yml b/.github/workflows/BuildGitHubRelease.yml index b6b3e58f..5ca9d1e0 100644 --- a/.github/workflows/BuildGitHubRelease.yml +++ b/.github/workflows/BuildGitHubRelease.yml @@ -13,31 +13,26 @@ concurrency: jobs: - # Test test: name: Test runs-on: ubuntu-latest steps: - # Install .NET SDK # https://github.com/marketplace/actions/setup-net-core-sdk - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: dotnet-version: "8.x" - # Checkout code # https://github.com/marketplace/actions/checkout - name: Checkout code uses: actions/checkout@v4 - # Run Unit Tests # https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test - name: Run unit tests run: dotnet test ./PlexCleanerTests/PlexCleanerTests.csproj - # Get version information version: name: Version runs-on: ubuntu-latest @@ -51,21 +46,17 @@ jobs: steps: - # Checkout code # https://github.com/marketplace/actions/checkout - name: Checkout uses: actions/checkout@v4 with: - # Get all history for version calculation fetch-depth: 0 - # Run Nerdbank.GitVersioning # https://github.com/marketplace/actions/nerdbank-gitversioning - name: Run Nerdbank.GitVersioning tool id: nbgv uses: dotnet/nbgv@master - # Build artifacts build: name: Build runs-on: ubuntu-latest @@ -87,19 +78,16 @@ jobs: steps: - # Install .NET SDK # https://github.com/marketplace/actions/setup-net-core-sdk - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: dotnet-version: "8.x" - # Checkout code # https://github.com/marketplace/actions/checkout - name: Checkout code uses: actions/checkout@v4 - # Build and publish # https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish - name: Build run: >- @@ -123,12 +111,10 @@ jobs: name: publish-${{ matrix.runtime }} path: ${{ runner.temp }}/publish - # Publish publish: name: Publish runs-on: ubuntu-latest needs: [ build, version ] - # Skip pull requests if: ${{ github.event_name != 'pull_request' }} steps: @@ -141,19 +127,14 @@ jobs: merge-multiple: true path: ${{ runner.temp }}/publish - # Zip the output - name: Zip build output run: 7z a -t7z ${{ runner.temp }}/publish/PlexCleaner.7z ${{ runner.temp }}/publish/* - # Create GitHub release # https://github.com/marketplace/actions/gh-release - name: Create GitHub release uses: softprops/action-gh-release@v2 with: - # Generate changelog from commit messages generate_release_notes: true - # Create a tag with the version number tag_name: ${{ needs.version.outputs.SemVer2 }} - # Only main branch is not a pre-release prerelease: ${{ !endsWith(github.ref, 'refs/heads/main') }} files: ${{ runner.temp }}/publish/PlexCleaner.7z diff --git a/.github/workflows/DependabotAutoMerge.yml b/.github/workflows/DependabotAutoMerge.yml new file mode 100644 index 00000000..0ee51da7 --- /dev/null +++ b/.github/workflows/DependabotAutoMerge.yml @@ -0,0 +1,35 @@ +name: Dependabot auto-merge + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + + dependabot: + name: Dependabot auto-merge + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + if: github.actor == 'dependabot[bot]' + + steps: + + # https://github.com/marketplace/actions/fetch-metadata-from-dependabot-prs + # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#enable-auto-merge-on-a-pull-request + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v2 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + - name: Auto-merge dependabot non-major updates + if: steps.metadata.outputs.update-type != 'version-update:semver-major' + run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/Docker/README.m4 b/Docker/README.m4 index 4f7121cd..6830093f 100644 --- a/Docker/README.m4 +++ b/Docker/README.m4 @@ -51,10 +51,10 @@ Images are updated weekly with the latest upstream updates. | Tag | `linux/amd64` | `linux/arm64` | `linux/arm/v7` | Size | | --- | --- | --- | --- | --- | -| `ubuntu` | ☑ | ☑ | ☑ | ~402MB | -| `alpine` | ☑ | ☑ | ☐ | ~228MB | -| `debian` | ☑ | ☑ | ☑ | ~398MB | -| `savoury` | ☑ | ☐ | ☐ | ~462MB | +| `ubuntu` | ☑ | ☑ | ☑ | ~320MB | +| `alpine` | ☑ | ☑ | ☐ | ~160MB | +| `debian` | ☑ | ☑ | ☑ | ~330MB | +| `savoury` | ☑ | ☐ | ☐ | ~400MB | ## Media Tool Versions diff --git a/PlexCleaner/PlexCleaner.csproj b/PlexCleaner/PlexCleaner.csproj index 80595887..d6124ff3 100644 --- a/PlexCleaner/PlexCleaner.csproj +++ b/PlexCleaner/PlexCleaner.csproj @@ -39,7 +39,7 @@ - + diff --git a/PlexCleanerTests/PlexCleanerTests.csproj b/PlexCleanerTests/PlexCleanerTests.csproj index c7ff2d4c..d627f2fa 100644 --- a/PlexCleanerTests/PlexCleanerTests.csproj +++ b/PlexCleanerTests/PlexCleanerTests.csproj @@ -1,27 +1,27 @@ - - - - net8.0 - enable - true - false - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - + + + + net8.0 + enable + true + false + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/README.md b/README.md index 415804aa..a982df7f 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Docker images are published on [Docker Hub][docker-link]. - Settings JSON schema changed from v3 to v4. - `ProcessOptions:KeepExtensions` has been deprecated, existing values will be converted to `ProcessOptions:FileIgnoreMasks`. - E.g. `ProcessOptions:KeepExtensions` : `.nfo` will be converted to `ProcessOptions:FileIgnoreMasks` : `*.nfo`. - - `ConvertOptions:FfMpegOptions:Output` has been deprecated, no need to for user configurable values. + - `ConvertOptions:FfMpegOptions:Output` has been deprecated, no need for user configurable values. - `ConvertOptions:FfMpegOptions:Global` no longer requires defaults values and will only be used during encoding, only add custom values for e.g. hardware acceleration, existing values will be converted. - E.g. `-analyzeduration 2147483647 -probesize 2147483647 -hwaccel cuda -hwaccel_output_format cuda` will be converted to `-hwaccel cuda -hwaccel_output_format cuda`. - Changed JSON serialization from `Newtonsoft.Json` [to](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/migrate-from-newtonsoft) .NET native `Text.Json`.