From 4fd16998d548280aa513bfce08faa6e8a6dfe7fa Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 17 Dec 2025 17:55:16 -0600 Subject: [PATCH] feat(ci): add GitHub Actions and Docker configuration --- .github/workflows/build.yml | 138 ++++++++++++++++++ docker/Dockerfile | 43 ++++++ .../dependencies.d/init-radarr-config | 0 .../dependencies.d/init-config | 0 .../s6-overlay/s6-rc.d/init-radarr-config/run | 9 ++ .../s6-rc.d/init-radarr-config/type | 1 + .../s6-overlay/s6-rc.d/init-radarr-config/up | 1 + .../dependencies.d/init-config-end | 0 .../s6-overlay/s6-rc.d/svc-radarr/data/check | 3 + .../svc-radarr/dependencies.d/init-services | 0 .../s6-rc.d/svc-radarr/notification-fd | 1 + .../etc/s6-overlay/s6-rc.d/svc-radarr/run | 13 ++ .../etc/s6-overlay/s6-rc.d/svc-radarr/type | 1 + .../user/contents.d/init-radarr-config | 0 .../s6-rc.d/user/contents.d/svc-radarr | 0 15 files changed, 210 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 docker/Dockerfile create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-config-end/dependencies.d/init-radarr-config create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/dependencies.d/init-config create mode 100755 docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/run create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/type create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/up create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-config-end create mode 100755 docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/data/check create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/dependencies.d/init-services create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/notification-fd create mode 100755 docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/run create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/type create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-radarr-config create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-radarr diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..b8385b4099 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,138 @@ +name: CI + +permissions: + packages: write + +on: + workflow_dispatch: + push: + branches: [develop, master] + paths-ignore: + - ".github/**" + - "src/Radarr.Api.*/openapi.json" + pull_request: + paths-ignore: + - ".github/**" + - "src/NzbDrone.Core/Localization/Core" + - "src/Radarr.Api.*/openapi.json" + +env: + DOTNET_VERSION: "8.0.405" + LOGARR_VERSION: 5.17.0 + OUTPUT_FOLDER: ./_output + ARTIFACTS_FOLDER: ./_artifacts + TESTS_FOLDER: ./_tests + BUILD_SOURCEBRANCHNAME: ${{ github.head_ref || github.ref_name }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - uses: jdx/mise-action@v3 + + - name: Setup Environment Variables + id: variables + shell: bash + run: | + echo "SDK_PATH=${{ env.DOTNET_ROOT }}/sdk/${DOTNET_VERSION}" >> "$GITHUB_ENV" + echo "DATE=$(date --rfc-3339=date)" >> "$GITHUB_ENV" + + - name: Cache NuGet packages + uses: actions/cache@v4 + with: + path: _cache/nuget + key: nuget-${{ runner.os }}-${{ hashFiles('src/Directory.Packages.props', 'src/**/*.csproj', 'global.json') }} + restore-keys: | + nuget-${{ runner.os }}- + + - name: Cache Node modules + uses: actions/cache@v4 + with: + path: | + _cache/node + node_modules + key: node-${{ runner.os }}-${{ hashFiles('package.json', 'yarn.lock') }} + restore-keys: | + node-${{ runner.os }}- + + - name: Cache MSBuild outputs + uses: actions/cache@v4 + with: + path: _cache/msbuild + key: msbuild-${{ runner.os }}-${{ hashFiles('src/**/*.cs', 'src/**/*.csproj', 'src/**/*.targets', 'src/**/*.props') }} + restore-keys: | + msbuild-${{ runner.os }}-${{ hashFiles('src/**/*.cs', 'src/**/*.csproj', 'src/**/*.targets', 'src/**/*.props') }} + msbuild-${{ runner.os }}- + + - name: Cache Webpack + uses: actions/cache@v4 + with: + path: _cache/webpack + key: webpack-${{ runner.os }}-${{ hashFiles('frontend/src/**/*', 'yarn.lock') }} + restore-keys: | + webpack-${{ runner.os }}-${{ hashFiles('frontend/src/**/*', 'yarn.lock') }} + webpack-${{ runner.os }}- + + - name: Build + shell: bash + run: ./build.sh --backend --frontend + env: + LOGARRVERSION: ${{ env.LOGARR_VERSION }}.${{ github.run_number }} + + - name: Prepare tests + run: | + mkdir -p _tests/bin + cp _output/net8.0/linux-x64/publish/Radarr _tests/bin/ + chmod +x _tests/bin/Radarr + find _tests -name "Radarr.Test.Dummy" -exec chmod a+x {} \; + + - name: Test + shell: bash + continue-on-error: true + run: ./test.sh Linux Unit Test + + - name: Report test results + uses: dorny/test-reporter@v2 + if: always() + with: + name: Unit Test Results + path: "**/TestResult.xml" + list-tests: "failed" + reporter: dotnet-nunit + fail-on-error: false + fail-on-empty: false + + - uses: docker/setup-buildx-action@v3 + + - uses: docker/metadata-action@v5 + id: meta + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=raw,value=latest + type=raw,value=v${{ env.LOGARR_VERSION }} + type=raw,value=v${{ env.LOGARR_VERSION }}.${{ github.run_number }} + + - uses: docker/login-action@v3 + if: ${{ github.event_name == 'push' }} + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: docker/build-push-action@v6 + with: + context: . + file: ./docker/Dockerfile + platforms: "linux/amd64,linux/arm64" + push: ${{ github.event_name == 'push' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + GIT_BRANCH=${{ env.BUILD_SOURCEBRANCHNAME }} + COMMIT_HASH=${{ github.event.pull_request.head.sha || github.sha }} + BUILD_DATE=${{ env.DATE }} diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000..882ee9e52d --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,43 @@ +FROM ghcr.io/linuxserver/baseimage-alpine:3.21 + +ARG TARGETPLATFORM + +ENV XDG_CONFIG_HOME="/config/xdg" \ + COMPlus_EnableDiagnostics=0 \ + TMPDIR=/run/radarr-temp + +RUN apk add -U --upgrade --no-cache \ + icu-libs \ + sqlite-libs \ + xmlstarlet + +ARG GIT_BRANCH +ARG COMMIT_HASH +ARG BUILD_DATE + +LABEL maintainer="cody-k" \ + org.opencontainers.image.title="Logarr" \ + org.opencontainers.image.description="All-in-one media manager (Radarr fork)" \ + org.opencontainers.image.source="https://github.com/Cody-k/logarr" + +RUN mkdir -p /app/radarr + +RUN --mount=type=bind,source=_output,target=_output \ + case "$TARGETPLATFORM" in \ + "linux/amd64") cp -r /_output/net8.0/linux-musl-x64 /app/radarr/bin ;; \ + "linux/arm64") cp -r /_output/net8.0/linux-musl-arm64 /app/radarr/bin ;; \ + "darwin/amd64") cp -r /_output/net8.0/osx-x64 /app/radarr/bin ;; \ + "darwin/arm64") cp -r /_output/net8.0/osx-arm64 /app/radarr/bin ;; \ + "windows/amd64") cp -r /_output/net8.0/win-x64 /app/radarr/bin ;; \ + *) echo "Unknown platform: $TARGETPLATFORM" && exit 1 ;; \ + esac; \ + cp -r /_output/UI /app/radarr/bin/UI + +RUN echo -e "UpdateMethod=docker\nBranch=${GIT_BRANCH}\nPackageVersion=${COMMIT_HASH}}\nPackageAuthor=cody-k" > /app/radarr/package_info && \ + printf "version: ${COMMIT_HASH}}\nBuild-date: ${BUILD_DATE}" > /build_version + +COPY docker/root/ / + +EXPOSE 7878 + +VOLUME /config diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-config-end/dependencies.d/init-radarr-config b/docker/root/etc/s6-overlay/s6-rc.d/init-config-end/dependencies.d/init-radarr-config new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/dependencies.d/init-config b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/dependencies.d/init-config new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/run b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/run new file mode 100755 index 0000000000..04f3613901 --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/run @@ -0,0 +1,9 @@ +#!/usr/bin/with-contenv bash + +mkdir -p /run/radarr-temp + +if [[ -z ${LSIO_NON_ROOT_USER} ]]; then + lsiown -R abc:abc \ + /config \ + /run/radarr-temp +fi diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/type b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/type new file mode 100644 index 0000000000..bdd22a1850 --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/type @@ -0,0 +1 @@ +oneshot diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/up b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/up new file mode 100644 index 0000000000..bb49764dd8 --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/init-radarr-config/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-radarr-config/run diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-config-end b/docker/root/etc/s6-overlay/s6-rc.d/init-services/dependencies.d/init-config-end new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/data/check b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/data/check new file mode 100755 index 0000000000..2e2399518c --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/data/check @@ -0,0 +1,3 @@ +#!/usr/bin/with-contenv bash + +curl -fsSL http://localhost:7878/ping > /dev/null 2>&1 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/dependencies.d/init-services b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/dependencies.d/init-services new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/notification-fd b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/notification-fd new file mode 100644 index 0000000000..00750edc07 --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/notification-fd @@ -0,0 +1 @@ +3 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/run b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/run new file mode 100755 index 0000000000..9aa4f60480 --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/run @@ -0,0 +1,13 @@ +#!/usr/bin/with-contenv bash + +if [[ -z ${LSIO_NON_ROOT_USER} ]]; then + exec \ + s6-notifyoncheck -d -n 300 -w 1000 \ + cd /app/radarr/bin s6-setuidgid abc /app/radarr/bin/Radarr \ + -nobrowser -data=/config +else + exec \ + s6-notifyoncheck -d -n 300 -w 1000 \ + cd /app/radarr/bin /app/radarr/bin/Radarr \ + -nobrowser -data=/config +fi diff --git a/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/type b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/type new file mode 100644 index 0000000000..5883cff0cd --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/svc-radarr/type @@ -0,0 +1 @@ +longrun diff --git a/docker/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-radarr-config b/docker/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-radarr-config new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docker/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-radarr b/docker/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-radarr new file mode 100644 index 0000000000..e69de29bb2