diff --git a/.github/ISSUE_TEMPLATE/issue.bug.yml b/.github/ISSUE_TEMPLATE/issue.bug.yml index ce3d19a..2fd9a0a 100755 --- a/.github/ISSUE_TEMPLATE/issue.bug.yml +++ b/.github/ISSUE_TEMPLATE/issue.bug.yml @@ -67,10 +67,10 @@ body: - type: textarea attributes: description: | - Provide a full docker log, output of "docker logs linuxserver.io" + Provide a full docker log, output of "docker logs daapd" label: Container logs placeholder: | - Output of `docker logs linuxserver.io` + Output of `docker logs daapd` render: bash validations: required: true diff --git a/.github/workflows/external_trigger.yml b/.github/workflows/external_trigger.yml index 461baaf..0b9aaaa 100755 --- a/.github/workflows/external_trigger.yml +++ b/.github/workflows/external_trigger.yml @@ -7,7 +7,7 @@ jobs: external-trigger-master: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4.1.1 - name: External Trigger if: github.ref == 'refs/heads/master' diff --git a/.github/workflows/external_trigger_scheduler.yml b/.github/workflows/external_trigger_scheduler.yml index 2bbd21b..f6f1b9e 100755 --- a/.github/workflows/external_trigger_scheduler.yml +++ b/.github/workflows/external_trigger_scheduler.yml @@ -9,7 +9,7 @@ jobs: external-trigger-scheduler: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4.1.1 with: fetch-depth: '0' diff --git a/.github/workflows/package_trigger.yml b/.github/workflows/package_trigger.yml index 0711fbf..659dccc 100755 --- a/.github/workflows/package_trigger.yml +++ b/.github/workflows/package_trigger.yml @@ -7,7 +7,7 @@ jobs: package-trigger-master: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4.1.1 - name: Package Trigger if: github.ref == 'refs/heads/master' diff --git a/.github/workflows/package_trigger_scheduler.yml b/.github/workflows/package_trigger_scheduler.yml index 2e4cd1a..07a988d 100755 --- a/.github/workflows/package_trigger_scheduler.yml +++ b/.github/workflows/package_trigger_scheduler.yml @@ -9,7 +9,7 @@ jobs: package-trigger-scheduler: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4.1.1 with: fetch-depth: '0' diff --git a/Dockerfile b/Dockerfile index d1434a5..1806095 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,7 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:3.17 as buildstage +FROM ghcr.io/linuxserver/baseimage-alpine:3.19 as buildstage ############## build stage ############## ARG DAAPD_RELEASE -ARG LIBSPOTIFY_VERSION=12.1.51 -ARG ARCH=x86_64 RUN \ echo "**** install build packages ****" && \ @@ -41,40 +39,13 @@ RUN \ protobuf-c-dev \ sqlite-dev \ taglib-dev && \ - echo "**** make antlr wrapper ****" && \ mkdir -p \ /tmp/source/owntone && \ - echo \ - "#!/bin/bash" > /tmp/source/antlr3 && \ - echo \ - "exec java -cp /tmp/source/antlr-3.4-complete.jar org.antlr.Tool \"\$@\"" >> /tmp/source/antlr3 && \ - chmod a+x /tmp/source/antlr3 && \ - curl -o \ - /tmp/source/antlr-3.4-complete.jar -L \ - http://www.antlr3.org/download/antlr-3.4-complete.jar && \ - echo "**** compile and install antlr3c ****" && \ - curl -o \ - /tmp/libantlr3c-3.4.tar.gz -L \ - https://github.com/antlr/website-antlr3/raw/gh-pages/download/C/libantlr3c-3.4.tar.gz && \ - tar xf /tmp/libantlr3c-3.4.tar.gz -C /tmp && \ - cd /tmp/libantlr3c-3.4 && \ - ./configure --enable-64bit --prefix=/usr && \ - make && \ - make DESTDIR=/tmp/antlr3c-build install && \ - export LDFLAGS="-L/tmp/antlr3c-build/usr/lib" && \ - export CFLAGS="-I/tmp/antlr3c-build/usr/include" && \ echo "**** compile owntone-server ****" && \ if [ -z ${DAAPD_RELEASE+x} ]; then \ DAAPD_RELEASE=$(curl -sX GET "https://api.github.com/repos/owntone/owntone-server/releases/latest" \ | awk '/tag_name/{print $4;exit}' FS='[""]'); \ fi && \ - curl -L https://github.com/mopidy/libspotify-archive/blob/master/libspotify-${LIBSPOTIFY_VERSION}-Linux-${ARCH}-release.tar.gz?raw=true | tar -xzf- -C /tmp/source/ && \ - mv /tmp/source/libspotify* /tmp/source/libspotify && \ - sed -i 's/ldconfig//' /tmp/source/libspotify/Makefile && \ - make -C /tmp/source/libspotify prefix=/tmp/libspotify-build install && \ - rm -rf /tmp/source/libspotify && \ - export LIBSPOTIFY_CFLAGS="-I/tmp/libspotify-build/include" && \ - export LIBSPOTIFY_LIBS="/tmp/libspotify-build/lib/libspotify.so" && \ curl -o \ /tmp/source/owntone.tar.gz -L \ "https://github.com/owntone/owntone-server/archive/${DAAPD_RELEASE}.tar.gz" && \ @@ -86,10 +57,8 @@ RUN \ ./configure \ --build=$CBUILD \ --enable-chromecast \ - --enable-itunes \ --enable-lastfm \ --enable-mpd \ - --enable-spotify \ --host=$CHOST \ --infodir=/usr/share/info \ --localstatedir=/var \ @@ -101,7 +70,7 @@ RUN \ mv /tmp/daapd-build/etc/owntone.conf /tmp/daapd-build/etc/owntone.conf.orig && \ rm -rf /tmp/daapd-build/var ############## runtime stage ############## -FROM ghcr.io/linuxserver/baseimage-alpine:3.17 +FROM ghcr.io/linuxserver/baseimage-alpine:3.19 # set version label ARG BUILD_DATE @@ -116,6 +85,7 @@ RUN \ confuse \ dbus \ ffmpeg \ + gnutls \ json-c \ libevent \ libgcrypt \ @@ -134,8 +104,6 @@ RUN \ # copy buildstage and local files COPY --from=buildstage /tmp/daapd-build/ / -COPY --from=buildstage /tmp/antlr3c-build/ / -COPY --from=buildstage /tmp/libspotify-build/ / COPY root/ / # ports and volumes diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index b6dfd17..0ce8696 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -1,4 +1,4 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.17 as buildstage +FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.19 as buildstage ############## build stage ############## ARG DAAPD_RELEASE @@ -39,28 +39,8 @@ RUN \ protobuf-c-dev \ sqlite-dev \ taglib-dev && \ - echo "**** make antlr wrapper ****" && \ mkdir -p \ /tmp/source/owntone && \ - echo \ - "#!/bin/bash" > /tmp/source/antlr3 && \ - echo \ - "exec java -cp /tmp/source/antlr-3.4-complete.jar org.antlr.Tool \"\$@\"" >> /tmp/source/antlr3 && \ - chmod a+x /tmp/source/antlr3 && \ - curl -o \ - /tmp/source/antlr-3.4-complete.jar -L \ - http://www.antlr3.org/download/antlr-3.4-complete.jar && \ - echo "**** compile and install antlr3c ****" && \ - curl -o \ - /tmp/libantlr3c-3.4.tar.gz -L \ - https://github.com/antlr/website-antlr3/raw/gh-pages/download/C/libantlr3c-3.4.tar.gz && \ - tar xf /tmp/libantlr3c-3.4.tar.gz -C /tmp && \ - cd /tmp/libantlr3c-3.4 && \ - ./configure --build arm-unknown-linux-gnueabi --disable-abiflags --disable-antlrdebug --enable-64bit --prefix=/usr && \ - make && \ - make DESTDIR=/tmp/antlr3c-build install && \ - export LDFLAGS="-L/tmp/antlr3c-build/usr/lib" && \ - export CFLAGS="-I/tmp/antlr3c-build/usr/include" && \ echo "**** compile owntone-server ****" && \ if [ -z ${DAAPD_RELEASE+x} ]; then \ DAAPD_RELEASE=$(curl -sX GET "https://api.github.com/repos/owntone/owntone-server/releases/latest" \ @@ -76,9 +56,7 @@ RUN \ autoreconf -i -v && \ ./configure \ --build=$CBUILD \ - --disable-avcodecsend \ --enable-chromecast \ - --enable-itunes \ --enable-lastfm \ --enable-mpd \ --host=$CHOST \ @@ -92,7 +70,7 @@ RUN \ mv /tmp/daapd-build/etc/owntone.conf /tmp/daapd-build/etc/owntone.conf.orig && \ rm -rf /tmp/daapd-build/var ############## runtime stage ############## -FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.17 +FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.19 # set version label ARG BUILD_DATE @@ -107,6 +85,7 @@ RUN \ confuse \ dbus \ ffmpeg \ + gnutls \ json-c \ libevent \ libgcrypt \ @@ -125,7 +104,6 @@ RUN \ # copy buildstage and local files COPY --from=buildstage /tmp/daapd-build/ / -COPY --from=buildstage /tmp/antlr3c-build/ / COPY root/ / # ports and volumes diff --git a/Jenkinsfile b/Jenkinsfile index 8ae8513..07a1e14 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,7 +16,7 @@ pipeline { GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0') GITLAB_NAMESPACE=credentials('gitlab-namespace-id') - SCARF_TOKEN=credentials('scarf_api_key') + DOCKERHUB_TOKEN=credentials('docker-hub-ci-pat') EXT_GIT_BRANCH = 'master' EXT_USER = 'owntone' EXT_REPO = 'owntone-server' @@ -62,11 +62,16 @@ pipeline { env.COMMIT_SHA = sh( script: '''git rev-parse HEAD''', returnStdout: true).trim() + env.GH_DEFAULT_BRANCH = sh( + script: '''git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||' ''', + returnStdout: true).trim() env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/' env.PULL_REQUEST = env.CHANGE_ID env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml' } + sh '''#! /bin/bash + echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" ''' script{ env.LS_RELEASE_NUMBER = sh( script: '''echo ${LS_RELEASE} |sed 's/^.*-ls//g' ''', @@ -131,7 +136,7 @@ pipeline { steps{ script{ env.EXT_RELEASE_CLEAN = sh( - script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g' ''', + script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/ ]//g' ''', returnStdout: true).trim() def semver = env.EXT_RELEASE_CLEAN =~ /(\d+)\.(\d+)\.(\d+)/ @@ -149,7 +154,7 @@ pipeline { } if (env.SEMVER != null) { - if (BRANCH_NAME != "master" && BRANCH_NAME != "main") { + if (BRANCH_NAME != "${env.GH_DEFAULT_BRANCH}") { env.SEMVER = "${env.SEMVER}-${BRANCH_NAME}" } println("SEMVER: ${env.SEMVER}") @@ -250,9 +255,11 @@ pipeline { -v ${WORKSPACE}:/mnt \ -e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \ -e AWS_SECRET_ACCESS_KEY=\"${S3_SECRET}\" \ - ghcr.io/linuxserver/baseimage-alpine:3.17 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ - apk add --no-cache py3-pip && \ - pip install s3cmd && \ + ghcr.io/linuxserver/baseimage-alpine:3.19 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ + apk add --no-cache python3 && \ + python3 -m venv /lsiopy && \ + pip install --no-cache-dir -U pip && \ + pip install --no-cache-dir s3cmd && \ s3cmd put --no-preserve --acl-public -m text/xml /mnt/shellcheck-result.xml s3://ci-tests.linuxserver.io/${IMAGE}/${META_TAG}/shellcheck-result.xml" || :''' } } @@ -271,8 +278,15 @@ pipeline { set -e TEMPDIR=$(mktemp -d) docker pull ghcr.io/linuxserver/jenkins-builder:latest - docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -e GITHUB_BRANCH=master -v ${TEMPDIR}:/ansible/jenkins ghcr.io/linuxserver/jenkins-builder:latest - # Stage 1 - Jenkinsfile update + # Cloned repo paths for templating: + # ${TEMPDIR}/docker-${CONTAINER_NAME}: Cloned branch master of ${LS_USER}/${LS_REPO} for running the jenkins builder on + # ${TEMPDIR}/repo/${LS_REPO}: Cloned branch master of ${LS_USER}/${LS_REPO} for commiting various templated file changes and pushing back to Github + # ${TEMPDIR}/docs/docker-documentation: Cloned docs repo for pushing docs updates to Github + # ${TEMPDIR}/unraid/docker-templates: Cloned docker-templates repo to check for logos + # ${TEMPDIR}/unraid/templates: Cloned templates repo for commiting unraid template changes and pushing back to Github + git clone --branch master --depth 1 https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/docker-${CONTAINER_NAME} + docker run --rm -v ${TEMPDIR}/docker-${CONTAINER_NAME}:/tmp -e LOCAL=true ghcr.io/linuxserver/jenkins-builder:latest + echo "Starting Stage 1 - Jenkinsfile update" if [[ "$(md5sum Jenkinsfile | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile | awk '{ print $1 }')" ]]; then mkdir -p ${TEMPDIR}/repo git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO} @@ -281,15 +295,16 @@ pipeline { cp ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile ${TEMPDIR}/repo/${LS_REPO}/ git add Jenkinsfile git commit -m 'Bot Updating Templated Files' - git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} - echo "Updating Jenkinsfile" + echo "Updating Jenkinsfile and exiting build, new one will trigger based on commit" rm -Rf ${TEMPDIR} exit 0 else echo "Jenkinsfile is up to date." fi - # Stage 2 - Delete old templates + echo "Starting Stage 2 - Delete old templates" OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md .github/ISSUE_TEMPLATE/issue.bug.md .github/ISSUE_TEMPLATE/issue.feature.md .github/workflows/call_invalid_helper.yml .github/workflows/stale.yml Dockerfile.armhf" for i in ${OLD_TEMPLATES}; do if [[ -f "${i}" ]]; then @@ -305,15 +320,16 @@ pipeline { git rm "${i}" done git commit -m 'Bot Updating Templated Files' - git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} - echo "Deleting old and deprecated templates" + echo "Deleting old/deprecated templates and exiting build, new one will trigger based on commit" rm -Rf ${TEMPDIR} exit 0 else echo "No templates to delete" fi - # Stage 3 - Update templates + echo "Starting Stage 3 - Update templates" CURRENTHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8) cd ${TEMPDIR}/docker-${CONTAINER_NAME} NEWHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8) @@ -334,19 +350,34 @@ pipeline { fi git add readme-vars.yml ${TEMPLATED_FILES} git commit -m 'Bot Updating Templated Files' - git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} + echo "Updating templates and exiting build, new one will trigger based on commit" + rm -Rf ${TEMPDIR} + exit 0 else echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} + echo "No templates to update" fi - mkdir -p ${TEMPDIR}/gitbook - git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/gitbook/docker-documentation - if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then - cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/gitbook/docker-documentation/images/ - cd ${TEMPDIR}/gitbook/docker-documentation/ - git add images/docker-${CONTAINER_NAME}.md + echo "Starting Stage 4 - External repo updates: Docs, Unraid Template and Readme Sync to Docker Hub" + mkdir -p ${TEMPDIR}/docs + git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/docs/docker-documentation + if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]] && [[ (! -f ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then + cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/docs/docker-documentation/docs/images/ + cd ${TEMPDIR}/docs/docker-documentation + GH_DOCS_DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||') + git add docs/images/docker-${CONTAINER_NAME}.md + echo "Updating docs repo" git commit -m 'Bot Updating Documentation' - git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH} --rebase + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH} || \ + (MAXWAIT="10" && echo "Push to docs failed, trying again in ${MAXWAIT} seconds" && \ + sleep $((RANDOM % MAXWAIT)) && \ + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH} --rebase && \ + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH}) + else + echo "Docs update not needed, skipping" fi mkdir -p ${TEMPDIR}/unraid git clone https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-templates @@ -356,8 +387,10 @@ pipeline { elif [[ -f ${TEMPDIR}/unraid/docker-templates/linuxserver.io/img/${CONTAINER_NAME}-icon.png ]]; then sed -i "s|master/linuxserver.io/img/linuxserver-ls-logo.png|master/linuxserver.io/img/${CONTAINER_NAME}-icon.png|" ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml fi - if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml) || ("$(md5sum ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml | awk '{ print $1 }')") ]]; then + if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]] && [[ (! -f ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml) || ("$(md5sum ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml | awk '{ print $1 }')") ]]; then + echo "Updating Unraid template" cd ${TEMPDIR}/unraid/templates/ + GH_TEMPLATES_DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||') if grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list; then echo "Image is on the ignore list, marking Unraid template as deprecated" cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml ${TEMPDIR}/unraid/templates/unraid/ @@ -369,7 +402,42 @@ pipeline { git add unraid/${CONTAINER_NAME}.xml git commit -m 'Bot Updating Unraid Template' fi - git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git --all + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH} --rebase + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH} || \ + (MAXWAIT="10" && echo "Push to unraid templates failed, trying again in ${MAXWAIT} seconds" && \ + sleep $((RANDOM % MAXWAIT)) && \ + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH} --rebase && \ + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH}) + else + echo "No updates to Unraid template needed, skipping" + fi + if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]]; then + if [[ $(cat ${TEMPDIR}/docker-${CONTAINER_NAME}/README.md | wc -m) -gt 25000 ]]; then + echo "Readme is longer than 25,000 characters. Syncing the lite version to Docker Hub" + DH_README_SYNC_PATH="${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/README.lite" + else + echo "Syncing readme to Docker Hub" + DH_README_SYNC_PATH="${TEMPDIR}/docker-${CONTAINER_NAME}/README.md" + fi + if curl -s https://hub.docker.com/v2/namespaces/${DOCKERHUB_IMAGE%%/*}/repositories/${DOCKERHUB_IMAGE##*/}/tags | jq -r '.message' | grep -q 404; then + echo "Docker Hub endpoint doesn't exist. Creating endpoint first." + DH_TOKEN=$(curl -d '{"username":"linuxserverci", "password":"'${DOCKERHUB_TOKEN}'"}' -H "Content-Type: application/json" -X POST https://hub.docker.com/v2/users/login | jq -r '.token') + curl -s \ + -H "Authorization: JWT ${DH_TOKEN}" \ + -H "Content-Type: application/json" \ + -X POST \ + -d '{"name":"'${DOCKERHUB_IMAGE##*/}'", "namespace":"'${DOCKERHUB_IMAGE%%/*}'"}' \ + https://hub.docker.com/v2/repositories/ || : + fi + DH_TOKEN=$(curl -d '{"username":"linuxserverci", "password":"'${DOCKERHUB_TOKEN}'"}' -H "Content-Type: application/json" -X POST https://hub.docker.com/v2/users/login | jq -r '.token') + curl -s \ + -H "Authorization: JWT ${DH_TOKEN}" \ + -H "Content-Type: application/json" \ + -X PATCH \ + -d "{\\"full_description\\":$(jq -Rsa . ${DH_README_SYNC_PATH})}" \ + https://hub.docker.com/v2/repositories/${DOCKERHUB_IMAGE} || : + else + echo "Not the default Github branch. Skipping readme sync to Docker Hub." fi rm -Rf ${TEMPDIR}''' script{ @@ -425,43 +493,16 @@ pipeline { } steps{ sh '''curl -H "Content-Type: application/json" -H "Private-Token: ${GITLAB_TOKEN}" -X POST https://gitlab.com/api/v4/projects \ - -d '{"namespace_id":'${GITLAB_NAMESPACE}',\ - "name":"'${LS_REPO}'", - "mirror":true,\ - "import_url":"https://github.com/linuxserver/'${LS_REPO}'.git",\ - "issues_access_level":"disabled",\ - "merge_requests_access_level":"disabled",\ - "repository_access_level":"enabled",\ - "visibility":"public"}' ''' - } - } - /* ####################### - Scarf.sh package registry - ####################### */ - // Add package to Scarf.sh and set permissions - stage("Scarf.sh package registry"){ - when { - branch "master" - environment name: 'EXIT_STATUS', value: '' - } - steps{ - sh '''#! /bin/bash - PACKAGE_UUID=$(curl -X GET -H "Authorization: Bearer ${SCARF_TOKEN}" https://scarf.sh/api/v1/organizations/linuxserver-ci/packages | jq -r '.[] | select(.name=="linuxserver/daapd") | .uuid' || :) - if [ -z "${PACKAGE_UUID}" ]; then - echo "Adding package to Scarf.sh" - curl -sX POST https://scarf.sh/api/v1/organizations/linuxserver-ci/packages \ - -H "Authorization: Bearer ${SCARF_TOKEN}" \ - -H "Content-Type: application/json" \ - -d '{"name":"linuxserver/daapd",\ - "shortDescription":"example description",\ - "libraryType":"docker",\ - "website":"https://github.com/linuxserver/docker-daapd",\ - "backendUrl":"https://ghcr.io/linuxserver/daapd",\ - "publicUrl":"https://lscr.io/linuxserver/daapd"}' || : - else - echo "Package already exists on Scarf.sh" - fi - ''' + -d '{"namespace_id":'${GITLAB_NAMESPACE}',\ + "name":"'${LS_REPO}'", + "mirror":true,\ + "import_url":"https://github.com/linuxserver/'${LS_REPO}'.git",\ + "issues_access_level":"disabled",\ + "merge_requests_access_level":"disabled",\ + "repository_access_level":"enabled",\ + "visibility":"public"}' ''' + sh '''curl -H "Private-Token: ${GITLAB_TOKEN}" -X PUT "https://gitlab.com/api/v4/projects/Linuxserver.io%2F${LS_REPO}" \ + -d "mirror=true&import_url=https://github.com/linuxserver/${LS_REPO}.git" ''' } } /* ############### @@ -598,7 +639,8 @@ pipeline { wait git add package_versions.txt git commit -m 'Bot Updating Package Versions' - git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all + git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master + git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git master echo "true" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER} echo "Package tag updated, stopping build process" else @@ -701,12 +743,6 @@ pipeline { } steps { withCredentials([ - [ - $class: 'UsernamePasswordMultiBinding', - credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', - usernameVariable: 'DOCKERUSER', - passwordVariable: 'DOCKERPASS' - ], [ $class: 'UsernamePasswordMultiBinding', credentialsId: 'Quay.io-Robot', @@ -717,7 +753,7 @@ pipeline { retry(5) { sh '''#! /bin/bash set -e - echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin @@ -748,12 +784,6 @@ pipeline { } steps { withCredentials([ - [ - $class: 'UsernamePasswordMultiBinding', - credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', - usernameVariable: 'DOCKERUSER', - passwordVariable: 'DOCKERPASS' - ], [ $class: 'UsernamePasswordMultiBinding', credentialsId: 'Quay.io-Robot', @@ -764,7 +794,7 @@ pipeline { retry(5) { sh '''#! /bin/bash set -e - echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin @@ -859,37 +889,39 @@ pipeline { curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' } } - // Use helper container to sync the current README on master to the dockerhub endpoint - stage('Sync-README') { + // Add protection to the release branch + stage('Github-Release-Branch-Protection') { when { + branch "master" environment name: 'CHANGE_ID', value: '' environment name: 'EXIT_STATUS', value: '' } steps { - withCredentials([ - [ - $class: 'UsernamePasswordMultiBinding', - credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', - usernameVariable: 'DOCKERUSER', - passwordVariable: 'DOCKERPASS' - ] - ]) { - sh '''#! /bin/bash - set -e - TEMPDIR=$(mktemp -d) - docker pull ghcr.io/linuxserver/jenkins-builder:latest - docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -e GITHUB_BRANCH="${BRANCH_NAME}" -v ${TEMPDIR}:/ansible/jenkins ghcr.io/linuxserver/jenkins-builder:latest - docker pull ghcr.io/linuxserver/readme-sync - docker run --rm=true \ - -e DOCKERHUB_USERNAME=$DOCKERUSER \ - -e DOCKERHUB_PASSWORD=$DOCKERPASS \ - -e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \ - -e DOCKER_REPOSITORY=${IMAGE} \ - -e GIT_BRANCH=master \ - -v ${TEMPDIR}/docker-${CONTAINER_NAME}:/mnt \ - ghcr.io/linuxserver/readme-sync bash -c 'node sync' - rm -Rf ${TEMPDIR} ''' - } + echo "Setting up protection for release branch master" + sh '''#! /bin/bash + curl -H "Authorization: token ${GITHUB_TOKEN}" -X PUT https://api.github.com/repos/${LS_USER}/${LS_REPO}/branches/master/protection \ + -d $(jq -c . << EOF + { + "required_status_checks": null, + "enforce_admins": false, + "required_pull_request_reviews": { + "dismiss_stale_reviews": false, + "require_code_owner_reviews": false, + "require_last_push_approval": false, + "required_approving_review_count": 1 + }, + "restrictions": null, + "required_linear_history": false, + "allow_force_pushes": false, + "allow_deletions": false, + "block_creations": false, + "required_conversation_resolution": true, + "lock_branch": false, + "allow_fork_syncing": false, + "required_signatures": false + } +EOF + ) ''' } } // If this is a Pull request send the CI link as a comment on it diff --git a/README.md b/README.md index b63f931..1a556f1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ - - - + + [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io) [![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!") @@ -46,7 +45,7 @@ Find us at: ## Supported Architectures -We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/). +We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://distribution.github.io/distribution/spec/manifest-v2-2/#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/). Simply pulling `lscr.io/linuxserver/daapd:latest` should retrieve the correct image for your arch, but you can also pull specific arch images via tags. @@ -60,7 +59,7 @@ The architectures supported by this image are: ## Application Setup -Map your music folder, open up itunes on the same LAN to see your music there. +Map your music folder, open up iTunes on the same LAN to see your music there. The web interface is available at `http://:3689` @@ -80,13 +79,12 @@ It is recommended to set the `pipe_autostart` option to `true` in your forked-da ## Usage -Here are some example snippets to help you get started creating a container. +To help you get started creating a container from this image you can either use docker-compose or the docker cli. ### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose)) ```yaml --- -version: "2.1" services: daapd: image: lscr.io/linuxserver/daapd:latest @@ -97,7 +95,7 @@ services: - PGID=1000 - TZ=Etc/UTC volumes: - - /path/to/data:/config + - /path/to/daapd/data:/config - /path/to/music:/music restart: unless-stopped ``` @@ -111,16 +109,15 @@ docker run -d \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Etc/UTC \ - -v /path/to/data:/config \ + -v /path/to/daapd/data:/config \ -v /path/to/music:/music \ --restart unless-stopped \ lscr.io/linuxserver/daapd:latest - ``` ## Parameters -Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `:` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container. +Containers are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `:` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container. | Parameter | Function | | :----: | --- | @@ -139,10 +136,10 @@ You can set any environment variable from a file by using a special prepend `FIL As an example: ```bash --e FILE__PASSWORD=/run/secrets/mysecretpassword +-e FILE__MYVAR=/run/secrets/mysecretvariable ``` -Will set the environment variable `PASSWORD` based on the contents of the `/run/secrets/mysecretpassword` file. +Will set the environment variable `MYVAR` based on the contents of the `/run/secrets/mysecretvariable` file. ## Umask for running applications @@ -151,15 +148,20 @@ Keep in mind umask is not chmod it subtracts from permissions based on it's valu ## User / Group Identifiers -When using volumes (`-v` flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`. +When using volumes (`-v` flags), permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`. Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic. -In this instance `PUID=1000` and `PGID=1000`, to find yours use `id user` as below: +In this instance `PUID=1000` and `PGID=1000`, to find yours use `id your_user` as below: ```bash - $ id username - uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup) +id your_user +``` + +Example output: + +```text +uid=1000(your_user) gid=1000(your_user) groups=1000(your_user) ``` ## Docker Mods @@ -170,53 +172,100 @@ We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to ## Support Info -* Shell access whilst the container is running: `docker exec -it daapd /bin/bash` -* To monitor the logs of the container in realtime: `docker logs -f daapd` -* container version number - * `docker inspect -f '{{ index .Config.Labels "build_version" }}' daapd` -* image version number - * `docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/daapd:latest` +* Shell access whilst the container is running: + + ```bash + docker exec -it daapd /bin/bash + ``` + +* To monitor the logs of the container in realtime: + + ```bash + docker logs -f daapd + ``` + +* Container version number: + + ```bash + docker inspect -f '{{ index .Config.Labels "build_version" }}' daapd + ``` + +* Image version number: + + ```bash + docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/daapd:latest + ``` ## Updating Info -Most of our images are static, versioned, and require an image update and container recreation to update the app inside. With some exceptions (ie. nextcloud, plex), we do not recommend or support updating apps inside the container. Please consult the [Application Setup](#application-setup) section above to see if it is recommended for the image. +Most of our images are static, versioned, and require an image update and container recreation to update the app inside. With some exceptions (noted in the relevant readme.md), we do not recommend or support updating apps inside the container. Please consult the [Application Setup](#application-setup) section above to see if it is recommended for the image. Below are the instructions for updating containers: ### Via Docker Compose -* Update all images: `docker-compose pull` - * or update a single image: `docker-compose pull daapd` -* Let compose update all containers as necessary: `docker-compose up -d` - * or update a single container: `docker-compose up -d daapd` -* You can also remove the old dangling images: `docker image prune` +* Update images: + * All images: + + ```bash + docker-compose pull + ``` + + * Single image: + + ```bash + docker-compose pull daapd + ``` + +* Update containers: + * All containers: + + ```bash + docker-compose up -d + ``` + + * Single container: + + ```bash + docker-compose up -d daapd + ``` + +* You can also remove the old dangling images: + + ```bash + docker image prune + ``` ### Via Docker Run -* Update the image: `docker pull lscr.io/linuxserver/daapd:latest` -* Stop the running container: `docker stop daapd` -* Delete the container: `docker rm daapd` -* Recreate a new container with the same docker run parameters as instructed above (if mapped correctly to a host folder, your `/config` folder and settings will be preserved) -* You can also remove the old dangling images: `docker image prune` +* Update the image: -### Via Watchtower auto-updater (only use if you don't remember the original parameters) + ```bash + docker pull lscr.io/linuxserver/daapd:latest + ``` -* Pull the latest image at its tag and replace it with the same env variables in one run: +* Stop the running container: - ```bash - docker run --rm \ - -v /var/run/docker.sock:/var/run/docker.sock \ - containrrr/watchtower \ - --run-once daapd - ``` + ```bash + docker stop daapd + ``` -* You can also remove the old dangling images: `docker image prune` +* Delete the container: + + ```bash + docker rm daapd + ``` + +* Recreate a new container with the same docker run parameters as instructed above (if mapped correctly to a host folder, your `/config` folder and settings will be preserved) +* You can also remove the old dangling images: -**Note:** We do not endorse the use of Watchtower as a solution to automated updates of existing Docker containers. In fact we generally discourage automated updates. However, this is a useful tool for one-time manual updates of containers where you have forgotten the original parameters. In the long term, we highly recommend using [Docker Compose](https://docs.linuxserver.io/general/docker-compose). + ```bash + docker image prune + ``` ### Image Update Notifications - Diun (Docker Image Update Notifier) -* We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported. +**tip**: We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported. ## Building locally @@ -241,6 +290,8 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64 ## Versions +* **20.03.24:** - Rebase to Alpine 3.19. +* **25.08.23:** - Rebase to Alpine 3.18, remove abandoned libspotify libs. * **05.07.23:** - Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf) * **23.02.23:** - Rebase to Alpine 3.17, migrate to s6v3. * **31.05.22:** - Make sure the user has access to the audio device. diff --git a/package_versions.txt b/package_versions.txt index 32b5aa4..b5834e2 100755 --- a/package_versions.txt +++ b/package_versions.txt @@ -1,136 +1,413 @@ -NAME VERSION TYPE -alpine-baselayout 3.4.0-r0 apk -alpine-baselayout-data 3.4.0-r0 apk -alpine-keys 2.4-r1 apk -alpine-release 3.17.4-r0 apk -alsa-lib 1.2.8-r0 apk -aom-libs 3.5.0-r0 apk -apk-tools 2.12.10-r1 apk -avahi 0.8-r6 apk -avahi-libs 0.8-r6 apk -bash 5.2.15-r0 apk -brotli-libs 1.0.9-r9 apk -busybox 1.35.0 binary -busybox 1.35.0-r29 apk -busybox-binsh 1.35.0-r29 apk -ca-certificates 20230506-r0 apk -ca-certificates-bundle 20230506-r0 apk -cjson 1.7.15-r3 apk -confuse 3.3-r1 apk -coreutils 9.1-r0 apk -curl 8.1.2-r0 apk -dbus 1.14.8-r0 apk -dbus-libs 1.14.8-r0 apk -ffmpeg 5.1.3-r0 apk -ffmpeg-libs 5.1.3-r0 apk -flac-libs 1.4.2-r0 apk -fontconfig 2.14.1-r0 apk -freetype 2.12.1-r0 apk -fribidi 1.0.12-r0 apk -glib 2.74.7-r0 apk -gmp 6.2.1-r2 apk -gnutls 3.7.8-r3 apk -graphite2 1.3.14-r2 apk -harfbuzz 5.3.1-r1 apk -hwdata-pci 0.364-r0 apk -jq 1.6-r2 apk -json-c 0.16-r2 apk -lame 3.100-r2 apk -libacl 2.3.1-r1 apk -libass 0.16.0-r1 apk -libasyncns 0.8-r1 apk -libattr 2.5.1-r2 apk -libblkid 2.38.1-r1 apk -libbsd 0.11.7-r0 apk -libbz2 1.0.8-r4 apk -libc-utils 0.7.2-r3 apk -libcap2 2.66-r1 apk -libcrypto3 3.0.9-r1 apk -libcurl 8.1.2-r0 apk -libdaemon 0.14-r3 apk -libdav1d 1.0.0-r2 apk -libdrm 2.4.114-r0 apk -libevent 2.1.12-r5 apk -libexpat 2.5.0-r0 apk -libffi 3.4.4-r0 apk -libgcc 12.2.1_git20220924-r4 apk -libgcrypt 1.10.1-r0 apk -libgomp 12.2.1_git20220924-r4 apk -libgpg-error 1.46-r1 apk -libintl 0.21.1-r1 apk -libjpeg-turbo 2.1.4-r0 apk -libltdl 2.4.7-r1 apk -libmd 1.0.4-r0 apk -libmount 2.38.1-r1 apk -libogg 1.3.5-r2 apk -libpciaccess 0.17-r0 apk -libplist 2.2.0-r2 apk -libpng 1.6.38-r0 apk -libproc 3.3.17-r2 apk -libpulse 16.1-r6 apk -librespot 0.4.2-r3 apk -librist 0.2.7-r0 apk -libsndfile 1.1.0-r2 apk -libsodium 1.0.18-r2 apk -libsrt 1.5.1-r0 apk -libssh 0.10.5-r0 apk -libssl3 3.0.9-r1 apk -libstdc++ 12.2.1_git20220924-r4 apk -libtasn1 4.19.0-r0 apk -libtheora 1.1.1-r16 apk -libunistring 1.1-r0 apk -libuuid 2.38.1-r1 apk -libva 2.16.0-r0 apk -libvdpau 1.5-r0 apk -libvorbis 1.3.7-r0 apk -libvpx 1.12.0-r1 apk -libwebp 1.2.4-r2 apk -libwebsockets 4.3.2-r1 apk -libx11 1.8.4-r1 apk -libxau 1.0.10-r0 apk -libxcb 1.15-r0 apk -libxdmcp 1.1.4-r0 apk -libxext 1.3.5-r0 apk -libxfixes 6.0.0-r0 apk -libzmq 4.3.4-r1 apk -linux-pam 1.5.2-r1 apk -mbedtls 2.28.3-r0 apk -musl 1.2.3-r5 apk -musl-utils 1.2.3-r5 apk -mxml 3.3.1-r0 apk -ncurses-libs 6.3_p20221119-r1 apk -ncurses-terminfo-base 6.3_p20221119-r1 apk -netcat-openbsd 1.130-r4 apk -nettle 3.8.1-r0 apk -nghttp2-libs 1.51.0-r0 apk -numactl 2.0.16-r1 apk -oniguruma 6.9.8-r0 apk -opus 1.3.1-r1 apk -orc 0.4.33-r0 apk -p11-kit 0.24.1-r1 apk -pcre2 10.42-r0 apk -procps 3.3.17-r2 apk -protobuf-c 1.4.1-r1 apk -readline 8.2.0-r0 apk -scanelf 1.3.5-r1 apk -sdl2 2.26.5-r0 apk -shadow 4.13-r0 apk -skalibs 2.12.0.1-r0 apk -soxr 0.1.3-r3 apk -speexdsp 1.2.1-r0 apk -sqlite 3.40.1-r0 apk -sqlite-libs 3.40.1-r0 apk -ssl_client 1.35.0-r29 apk -svt-av1-libs 1.3.0-r0 apk -tdb-libs 1.4.6-r0 apk -tzdata 2023c-r0 apk -utmps-libs 0.1.2.0-r1 apk -v4l-utils-libs 1.22.1-r2 apk -vidstab 1.1.0-r2 apk -wayland-libs-client 1.21.0-r1 apk -x264-libs 0.164_git20220602-r0 apk -x265-libs 3.5-r3 apk -xvidcore 1.3.7-r1 apk -xz 5.2.9-r0 apk -xz-libs 5.2.9-r0 apk -zlib 1.2.13-r0 apk +NAME VERSION TYPE +addr2line 0.17.0 rust-crate +adler 1.0.2 rust-crate +aes 0.6.0 rust-crate +aes-ctr 0.6.0 rust-crate +aes-soft 0.6.4 rust-crate +aho-corasick 0.7.18 rust-crate +alpine-baselayout 3.4.3-r2 apk +alpine-baselayout-data 3.4.3-r2 apk +alpine-keys 2.4-r1 apk +alpine-release 3.19.1-r0 apk +alsa 0.6.0 rust-crate +alsa-lib 1.2.10-r0 apk +alsa-sys 0.3.1 rust-crate +anyhow 1.0.71 rust-crate +anyhow 1.0.75 rust-crate +aom-libs 3.7.1-r0 apk +apk-tools 2.14.0-r5 apk +arg_enum_proc_macro 0.3.2 rust-crate +arrayvec 0.7.2 rust-crate +async-trait 0.1.56 rust-crate +atty 0.2.14 rust-crate +av-metrics 0.9.0 rust-crate +av1-grain 0.2.2 rust-crate +avahi 0.8-r16 apk +avahi-libs 0.8-r16 apk +backtrace 0.3.66 rust-crate +base64 0.13.0 rust-crate +bash 5.2.21-r0 apk +bitflags 1.3.2 rust-crate (+1 duplicate) +bitstream-io 1.6.0 rust-crate +bitstream-io 1.7.0 rust-crate +bitvec 1.0.1 rust-crate +bitvec_helpers 3.1.2 rust-crate +block-buffer 0.10.2 rust-crate +block-buffer 0.9.0 rust-crate +brotli-libs 1.1.0-r1 apk +busybox 1.36.1-r15 apk +busybox-binsh 1.36.1-r15 apk +byteorder 1.4.3 rust-crate +bytes 1.2.0 rust-crate +c-ares 1.27.0-r0 apk +ca-certificates 20240226-r0 apk +ca-certificates-bundle 20240226-r0 apk +cfg-if 1.0.0 rust-crate (+1 duplicate) +cipher 0.2.5 rust-crate +cjson 1.7.17-r0 apk +clap 4.0.32 rust-crate +clap_complete 4.0.7 rust-crate +clap_derive 4.0.21 rust-crate +clap_lex 0.3.0 rust-crate +confuse 3.3-r4 apk +console 0.15.5 rust-crate +coreutils 9.4-r2 apk +coreutils-env 9.4-r2 apk +coreutils-fmt 9.4-r2 apk +coreutils-sha512sum 9.4-r2 apk +cpal 0.13.5 rust-crate +cpufeatures 0.2.2 rust-crate +crc 3.0.1 rust-crate +crc-catalog 2.2.0 rust-crate +crossbeam 0.8.2 rust-crate +crossbeam-channel 0.5.8 rust-crate +crossbeam-deque 0.8.3 rust-crate +crossbeam-epoch 0.9.14 rust-crate +crossbeam-queue 0.3.8 rust-crate +crossbeam-utils 0.8.15 rust-crate +crypto-common 0.1.6 rust-crate +crypto-mac 0.11.1 rust-crate +ctr 0.6.0 rust-crate +curl 8.5.0-r0 apk +dbus 1.14.10-r0 apk +dbus-daemon-launch-helper 1.14.10-r0 apk +dbus-libs 1.14.10-r0 apk +digest 0.10.3 rust-crate +digest 0.9.0 rust-crate +dolby_vision 3.2.0 rust-crate +either 1.8.1 rust-crate +env_logger 0.9.0 rust-crate +fastrand 1.8.0 rust-crate +fern 0.6.2 rust-crate +ffmpeg 6.1.1-r0 apk +ffmpeg-libavcodec 6.1.1-r0 apk +ffmpeg-libavdevice 6.1.1-r0 apk +ffmpeg-libavfilter 6.1.1-r0 apk +ffmpeg-libavformat 6.1.1-r0 apk +ffmpeg-libavutil 6.1.1-r0 apk +ffmpeg-libpostproc 6.1.1-r0 apk +ffmpeg-libswresample 6.1.1-r0 apk +ffmpeg-libswscale 6.1.1-r0 apk +fixedbitset 0.4.2 rust-crate +fnv 1.0.7 rust-crate +fontconfig 2.14.2-r4 apk +form_urlencoded 1.0.1 rust-crate +freetype 2.13.2-r0 apk +fribidi 1.0.13-r0 apk +funty 2.0.0 rust-crate +futures 0.3.21 rust-crate +futures-channel 0.3.21 rust-crate +futures-core 0.3.21 rust-crate +futures-executor 0.3.21 rust-crate +futures-io 0.3.21 rust-crate +futures-macro 0.3.21 rust-crate +futures-sink 0.3.21 rust-crate +futures-task 0.3.21 rust-crate +futures-util 0.3.21 rust-crate +generic-array 0.14.5 rust-crate +getopts 0.2.21 rust-crate +getrandom 0.2.7 rust-crate +getrandom 0.2.9 rust-crate +gimli 0.26.2 rust-crate +glib 2.78.4-r0 apk +glslang-libs 1.3.261.1-r0 apk +gmp 6.3.0-r0 apk +gnutls 3.8.4-r0 apk +graphite2 1.3.14-r6 apk +harfbuzz 8.3.0-r0 apk +hashbrown 0.12.3 rust-crate +headers 0.3.7 rust-crate +headers-core 0.2.0 rust-crate +heck 0.4.1 rust-crate +hex 0.4.3 rust-crate +hmac 0.11.0 rust-crate +hostname 0.3.1 rust-crate +http 0.2.8 rust-crate +http-body 0.4.5 rust-crate +httparse 1.7.1 rust-crate +httpdate 1.0.2 rust-crate +humantime 2.1.0 rust-crate +hwdata-pci 0.377.2-r0 apk +hyper 0.14.20 rust-crate +hyper-proxy 0.9.1 rust-crate +idna 0.2.3 rust-crate +if-addrs 0.7.0 rust-crate +indexmap 1.9.1 rust-crate +instant 0.1.12 rust-crate +interpolate_name 0.2.3 rust-crate +io-lifetimes 1.0.10 rust-crate +is-terminal 0.4.7 rust-crate +itertools 0.10.5 rust-crate +itoa 1.0.2 rust-crate +ivf 0.1.2 rust-crate +jq 1.7.1-r0 apk +json-c 0.17-r0 apk +lab 0.11.0 rust-crate +lame-libs 3.100-r5 apk +lazy_static 1.4.0 rust-crate +lcms2 2.15-r4 apk +lewton 0.10.2 rust-crate +libSvtAv1Enc 1.7.0-r0 apk +libacl 2.3.1-r4 apk +libass 0.17.1-r1 apk +libasyncns 0.8-r2 apk +libattr 2.5.1-r5 apk +libblkid 2.39.3-r0 apk +libbluray 1.3.4-r1 apk +libbsd 0.11.7-r3 apk +libbz2 1.0.8-r6 apk +libc 0.2.144 rust-crate +libc 0.2.147 rust-crate +libc 0.2.149 rust-crate +libc-utils 0.7.2-r5 apk +libcap2 2.69-r1 apk +libcrypto3 3.1.4-r5 apk +libcurl 8.5.0-r0 apk +libdaemon 0.14-r4 apk +libdav1d 1.3.0-r1 apk +libdovi 3.2.0-r1 apk +libdrm 2.4.118-r0 apk +libevent 2.1.12-r7 apk +libexpat 2.6.2-r0 apk +libffi 3.4.4-r3 apk +libflac 1.4.3-r1 apk +libgcc 13.2.1_git20231014-r0 apk +libgcrypt 1.10.3-r0 apk +libgomp 13.2.1_git20231014-r0 apk +libgpg-error 1.47-r2 apk +libhwy 1.0.7-r0 apk +libidn2 2.3.4-r4 apk +libintl 0.22.3-r0 apk +libjpeg-turbo 3.0.1-r0 apk +libjxl 0.8.2-r0 apk +libltdl 2.4.7-r3 apk +libm 0.2.2 rust-crate +libmd 1.1.0-r0 apk +libmdns 0.7.0 rust-crate +libmount 2.39.3-r0 apk +libncursesw 6.4_p20231125-r0 apk +libogg 1.3.5-r5 apk +libopenmpt 0.7.3-r1 apk +libpciaccess 0.17-r2 apk +libplacebo 6.338.1-r0 apk +libplist 2.3.0-r1 apk +libpng 1.6.40-r0 apk +libproc2 4.0.4-r0 apk +libpulse 16.1-r11 apk +librespot 0.4.2 rust-crate +librespot 0.4.2-r4 apk +librespot-audio 0.4.2 rust-crate +librespot-connect 0.4.2 rust-crate +librespot-core 0.4.2 rust-crate +librespot-discovery 0.4.2 rust-crate +librespot-metadata 0.4.2 rust-crate +librespot-playback 0.4.2 rust-crate +librespot-protocol 0.4.2 rust-crate +librist 0.2.10-r0 apk +libsharpyuv 1.3.2-r0 apk +libsndfile 1.2.2-r0 apk +libsodium 1.0.19-r0 apk +libsrt 1.5.3-r0 apk +libssh 0.10.6-r0 apk +libssl3 3.1.4-r5 apk +libstdc++ 13.2.1_git20231014-r0 apk +libtasn1 4.19.0-r2 apk +libtheora 1.1.1-r18 apk +libunibreak 5.1-r3 apk +libunistring 1.1-r2 apk +libuuid 2.39.3-r0 apk +libva 2.20.0-r0 apk +libvdpau 1.5-r2 apk +libvorbis 1.3.7-r2 apk +libvpx 1.13.1-r0 apk +libwebp 1.3.2-r0 apk +libwebpmux 1.3.2-r0 apk +libwebsockets 4.3.3-r0 apk +libx11 1.8.7-r0 apk +libxau 1.0.11-r3 apk +libxcb 1.16-r0 apk +libxdmcp 1.1.4-r3 apk +libxext 1.3.5-r3 apk +libxfixes 6.0.1-r3 apk +libxml2 2.11.7-r0 apk +libzmq 4.3.5-r2 apk +lilv-libs 0.24.22-r0 apk +linux-pam 1.5.3-r7 apk +linux-raw-sys 0.3.7 rust-crate +lock_api 0.4.7 rust-crate +log 0.4.17 rust-crate (+1 duplicate) +match_cfg 0.1.0 rust-crate +matches 0.1.9 rust-crate +maybe-rayon 0.1.1 rust-crate +mbedtls 2.28.8-r0 apk +memchr 2.5.0 rust-crate (+1 duplicate) +memoffset 0.6.5 rust-crate +memoffset 0.8.0 rust-crate +mime 0.3.16 rust-crate +minimal-lexical 0.2.1 rust-crate +miniz_oxide 0.5.3 rust-crate +mio 0.8.4 rust-crate +mpg123-libs 1.32.3-r0 apk +multimap 0.8.3 rust-crate +musl 1.2.4_git20230717-r4 apk +musl-utils 1.2.4_git20230717-r4 apk +mxml 3.3.1-r0 apk +ncurses-terminfo-base 6.4_p20231125-r0 apk +netcat-openbsd 1.226-r0 apk +nettle 3.9.1-r0 apk +new_debug_unreachable 1.0.4 rust-crate +nghttp2-libs 1.58.0-r0 apk +nix 0.23.1 rust-crate +nom 7.1.3 rust-crate +noop_proc_macro 0.3.0 rust-crate +num-bigint 0.4.3 rust-crate (+1 duplicate) +num-derive 0.3.3 rust-crate +num-integer 0.1.45 rust-crate (+1 duplicate) +num-rational 0.4.1 rust-crate +num-traits 0.2.15 rust-crate (+1 duplicate) +num_cpus 1.13.1 rust-crate +num_cpus 1.15.0 rust-crate +numactl 2.0.16-r4 apk +object 0.29.0 rust-crate +ogg 0.8.0 rust-crate +once_cell 1.13.0 rust-crate +once_cell 1.17.1 rust-crate +onevpl-libs 2023.3.1-r2 apk +oniguruma 6.9.9-r0 apk +opaque-debug 0.3.0 rust-crate +opus 1.4-r0 apk +orc 0.4.34-r0 apk +os_str_bytes 6.5.0 rust-crate +p11-kit 0.25.3-r0 apk +parking_lot 0.11.2 rust-crate +parking_lot 0.12.1 rust-crate +parking_lot_core 0.8.5 rust-crate +parking_lot_core 0.9.3 rust-crate +paste 1.0.12 rust-crate +pbkdf2 0.8.0 rust-crate +pcre2 10.42-r2 apk +percent-encoding 2.1.0 rust-crate +petgraph 0.6.2 rust-crate +pin-project-lite 0.2.9 rust-crate +pin-utils 0.1.0 rust-crate +ppv-lite86 0.2.16 rust-crate +ppv-lite86 0.2.17 rust-crate +priority-queue 1.2.3 rust-crate +proc-macro-error 1.0.4 rust-crate +proc-macro-error-attr 1.0.4 rust-crate +proc-macro2 1.0.42 rust-crate +proc-macro2 1.0.57 rust-crate +procps-ng 4.0.4-r0 apk +protobuf 2.27.1 rust-crate +protobuf-c 1.4.1-r7 apk +quote 1.0.20 rust-crate +quote 1.0.27 rust-crate +radium 0.7.0 rust-crate +rand 0.8.5 rust-crate (+1 duplicate) +rand_chacha 0.3.1 rust-crate (+1 duplicate) +rand_core 0.6.3 rust-crate +rand_core 0.6.4 rust-crate +rand_distr 0.4.3 rust-crate +rav1e 0.6.6 rust-crate +rav1e-libs 0.6.6-r2 apk +rayon 1.7.0 rust-crate +rayon-core 1.11.0 rust-crate +readline 8.2.1-r2 apk +regex 1.6.0 rust-crate +regex-syntax 0.6.27 rust-crate +remove_dir_all 0.5.3 rust-crate +rodio 0.15.0 rust-crate +rpassword 6.0.1 rust-crate +rust_hawktracer 0.7.0 rust-crate +rust_hawktracer_normal_macro 0.4.1 rust-crate +rust_hawktracer_proc_macro 0.4.1 rust-crate +rustc-demangle 0.1.21 rust-crate +rustix 0.37.19 rust-crate +ryu 1.0.10 rust-crate +scan_fmt 0.2.6 rust-crate +scanelf 1.3.7-r2 apk +scopeguard 1.1.0 rust-crate (+1 duplicate) +sdl2 2.28.5-r0 apk +serd-libs 0.32.0-r0 apk +serde 1.0.140 rust-crate +serde 1.0.163 rust-crate +serde_derive 1.0.140 rust-crate +serde_derive 1.0.163 rust-crate +serde_json 1.0.82 rust-crate +sha-1 0.10.0 rust-crate +sha-1 0.9.8 rust-crate +shaderc 2023.7-r0 apk +shadow 4.14.2-r0 apk +shannon 0.2.0 rust-crate +shell-words 1.1.0 rust-crate +signal-hook 0.3.15 rust-crate +signal-hook-registry 1.4.0 rust-crate +signal-hook-registry 1.4.1 rust-crate +simd_helpers 0.1.0 rust-crate +skalibs 2.14.0.1-r0 apk +slab 0.4.7 rust-crate +smallvec 1.9.0 rust-crate +socket2 0.4.4 rust-crate +sord-libs 0.16.16-r0 apk +soxr 0.1.3-r7 apk +speexdsp 1.2.1-r2 apk +spirv-tools 1.3.261.1-r0 apk +sqlite 3.44.2-r0 apk +sqlite-libs 3.44.2-r0 apk +sratom 0.6.16-r0 apk +ssl_client 1.36.1-r15 apk +subtle 2.4.1 rust-crate +syn 1.0.109 rust-crate +syn 1.0.98 rust-crate +syn 2.0.16 rust-crate +synstructure 0.12.6 rust-crate +tap 1.0.1 rust-crate +tdb-libs 1.4.9-r0 apk +tempfile 3.3.0 rust-crate +termcolor 1.1.3 rust-crate +termcolor 1.2.0 rust-crate +terminal_size 0.2.6 rust-crate +thiserror 1.0.31 rust-crate +thiserror 1.0.40 rust-crate +thiserror-impl 1.0.31 rust-crate +thiserror-impl 1.0.40 rust-crate +thread-id 4.0.0 rust-crate +tinyvec 1.6.0 rust-crate +tinyvec_macros 0.1.0 rust-crate +tokio 1.20.1 rust-crate +tokio-macros 1.8.0 rust-crate +tokio-stream 0.1.9 rust-crate +tokio-util 0.7.3 rust-crate +tower-service 0.3.2 rust-crate +tracing 0.1.35 rust-crate +tracing-core 0.1.28 rust-crate +try-lock 0.2.3 rust-crate +typenum 1.15.0 rust-crate +tzdata 2024a-r0 apk +unicode-bidi 0.3.8 rust-crate +unicode-ident 1.0.2 rust-crate +unicode-ident 1.0.8 rust-crate +unicode-normalization 0.1.21 rust-crate +unicode-width 0.1.10 rust-crate +unicode-width 0.1.9 rust-crate +unicode-xid 0.2.3 rust-crate +url 2.2.2 rust-crate +utmps-libs 0.1.2.2-r0 apk +uuid 1.1.2 rust-crate +v4l-utils-libs 1.24.1-r1 apk +v_frame 0.3.3 rust-crate +vidstab 1.1.1-r0 apk +vulkan-loader 1.3.261.1-r0 apk +want 0.3.0 rust-crate +wayland-libs-client 1.22.0-r4 apk +wyz 0.5.1 rust-crate +x264-libs 0.164_git20231001-r0 apk +x265-libs 3.5-r4 apk +xvidcore 1.3.7-r2 apk +xz-libs 5.4.5-r0 apk +y4m 0.8.0 rust-crate +zerocopy 0.6.1 rust-crate +zerocopy-derive 0.3.1 rust-crate +zimg 3.0.5-r2 apk +zix-libs 0.4.2-r0 apk +zlib 1.3.1-r0 apk diff --git a/readme-vars.yml b/readme-vars.yml index ba7dd9d..cee5484 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -25,22 +25,13 @@ param_env_vars: - {env_var: "LIBRESPOT_ARGS", env_value: "-n OwnTone -b 320", desc: "Optionally specify additional arguments to pass to librespot"} param_usage_include_vols: true param_volumes: - - {vol_path: "/config", vol_host_path: "/path/to/data", desc: "Where daapd server stores its config and dbase files."} + - {vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/data", desc: "Where daapd server stores its config and dbase files."} - {vol_path: "/music", vol_host_path: "/path/to/music", desc: "Map to your music folder."} -param_usage_include_ports: false -param_device_map: false -cap_add_param: false -# optional container parameters -opt_param_usage_include_env: false -opt_param_usage_include_vols: false -opt_param_usage_include_ports: false -opt_param_device_map: false -opt_cap_add_param: false -optional_block_1: false + # application setup block app_setup_block_enabled: true app_setup_block: | - Map your music folder, open up itunes on the same LAN to see your music there. + Map your music folder, open up iTunes on the same LAN to see your music there. The web interface is available at `http://:3689` @@ -57,8 +48,12 @@ app_setup_block: | The spotify connect server should show up as the 'forked-daapd' device in your Spotify application. It is recommended to set the `pipe_autostart` option to `true` in your forked-daapd config. + + To change the name presented to Spotify, set the `LIBRESPOT_ARGS` variable with the -n argument e.g. `-n Playername` # changelog changelogs: + - {date: "20.03.24:", desc: "Rebase to Alpine 3.19."} + - {date: "25.08.23:", desc: "Rebase to Alpine 3.18, remove abandoned libspotify libs."} - {date: "05.07.23:", desc: "Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf)"} - {date: "23.02.23:", desc: "Rebase to Alpine 3.17, migrate to s6v3."} - {date: "31.05.22:", desc: "Make sure the user has access to the audio device."}