From 375b0c298556c9a59f65eff5beb5c07ce3a04e5a Mon Sep 17 00:00:00 2001 From: thelamer Date: Sat, 8 Sep 2018 20:04:42 -0700 Subject: [PATCH 01/10] adding pipeline build logic and multi arch manifests --- Dockerfile | 10 +- Dockerfile.aarch64 | 41 ++++ Dockerfile.armhf | 42 ++++ Jenkinsfile | 484 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 575 insertions(+), 2 deletions(-) create mode 100644 Dockerfile.aarch64 create mode 100644 Dockerfile.armhf create mode 100644 Jenkinsfile diff --git a/Dockerfile b/Dockerfile index 92acf32..ed160fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,22 +3,28 @@ FROM lsiobase/mono:xenial # set version label ARG BUILD_DATE ARG VERSION +ARG SONARR_VERSION LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" LABEL maintainer="sparklyballs" # set environment variables ARG DEBIAN_FRONTEND="noninteractive" ENV XDG_CONFIG_HOME="/config/xdg" +ENV SONARR_BRANCH="master" RUN \ + if [ -z ${SONARR_VERSION+x} ]; then \ + SONARR_VERSION=$(curl -sX GET http://apt.sonarr.tv/dists/${SONARR_BRANCH}/main/binary-amd64/Packages \ + |grep -A 6 -m 1 "Package: nzbdrone" | awk -F ": " '/Version/{print $2;exit}'); \ + fi && \ echo "**** add sonarr repository ****" && \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC && \ - echo "deb http://apt.sonarr.tv/ master main" > \ + echo "deb http://apt.sonarr.tv/ ${SONARR_BRANCH} main" > \ /etc/apt/sources.list.d/sonarr.list && \ echo "**** install packages ****" && \ apt-get update && \ apt-get install -y \ - nzbdrone && \ + nzbdrone=${SONARR_VERSION} && \ echo "**** cleanup ****" && \ apt-get clean && \ rm -rf \ diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 new file mode 100644 index 0000000..5b6074b --- /dev/null +++ b/Dockerfile.aarch64 @@ -0,0 +1,41 @@ +FROM lsiobase/mono.arm64:xenial +# Add qemu to build on x86_64 systems +COPY qemu-aarch64-static /usr/bin + +# set version label +ARG BUILD_DATE +ARG VERSION +ARG SONARR_VERSION +LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" +LABEL maintainer="sparklyballs" + +# set environment variables +ENV XDG_CONFIG_HOME="/config/xdg" + +# package versions +ARG SONARR_BRANCH="master" + +RUN \ + if [ -z ${SONARR_VERSION+x} ]; then \ + SONARR_VERSION=$(curl -sX GET http://apt.sonarr.tv/dists/${SONARR_BRANCH}/main/binary-amd64/Packages \ + |grep -A 6 -m 1 "Package: nzbdrone" | awk -F ": " '/Version/{print $2;exit}'); \ + fi && \ + echo "**** install sonarr ****" && \ + mkdir -p \ + /opt/NzbDrone && \ + curl -o \ + /tmp/sonarr.tar.gz -L \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ + tar xf \ + /tmp/sonarr.tar.gz -C \ + /opt/NzbDrone --strip-components=1 && \ + echo "**** cleanup ****" && \ + rm -rf \ + /tmp/* + +# add local files +COPY root/ / + +# ports and volumes +EXPOSE 8989 +VOLUME /config /downloads /tv diff --git a/Dockerfile.armhf b/Dockerfile.armhf new file mode 100644 index 0000000..15dfb0d --- /dev/null +++ b/Dockerfile.armhf @@ -0,0 +1,42 @@ +FROM lsiobase/mono.armhf:xenial +# Add qemu to build on x86_64 systems +COPY qemu-arm-static /usr/bin + +# set version label +ARG BUILD_DATE +ARG VERSION +ARG SONARR_VERSION +LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" +LABEL maintainer="sparklyballs" + +# set environment variables +ARG DEBIAN_FRONTEND="noninteractive" +ENV XDG_CONFIG_HOME="/config/xdg" +ENV SONARR_BRANCH="master" + +RUN \ + if [ -z ${SONARR_VERSION+x} ]; then \ + SONARR_VERSION=$(curl -sX GET http://apt.sonarr.tv/dists/${SONARR_BRANCH}/main/binary-amd64/Packages \ + |grep -A 6 -m 1 "Package: nzbdrone" | awk -F ": " '/Version/{print $2;exit}'); \ + fi && \ + echo "**** add sonarr repository ****" && \ + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC && \ + echo "deb http://apt.sonarr.tv/ ${SONARR_BRANCH} main" > \ + /etc/apt/sources.list.d/sonarr.list && \ + echo "**** install packages ****" && \ + apt-get update && \ + apt-get install -y \ + nzbdrone=${SONARR_VERSION} && \ + echo "**** cleanup ****" && \ + apt-get clean && \ + rm -rf \ + /tmp/* \ + /var/lib/apt/lists/* \ + /var/tmp/* + +# add local files +COPY root/ / + +# ports and volumes +EXPOSE 8989 +VOLUME /config /downloads /tv diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..1e3c68f --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,484 @@ +pipeline { + agent { + label 'X86-64-MULTI' + } + // Configuraiton for the variables used for this specific repo + environment { + BUILD_VERSION_ARG = 'SONARR_VERSION' + LS_USER = 'linuxserver' + LS_REPO = 'docker-sonarr' + DOCKERHUB_IMAGE = 'linuxserver/sonarr' + DEV_DOCKERHUB_IMAGE = 'lsiodev/sonarr' + PR_DOCKERHUB_IMAGE = 'lspipepr/sonarr' + BUILDS_DISCORD = credentials('build_webhook_url') + GITHUB_TOKEN = credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') + DIST_IMAGE = 'ubuntu' + DIST_TAG = 'xenial' + DIST_PACKAGES = 'none' + DIST_REPO = 'http://apt.sonarr.tv/dists/master/main/binary-amd64/Packages' + DIST_REPO_PACKAGE = 'nzbdrone' + MULTIARCH='true' + CI='true' + CI_WEB='true' + CI_PORT='8989' + CI_SSL='false' + CI_DELAY='60' + CI_DOCKERENV='TZ=US/Pacific' + CI_AUTH='user:password' + CI_WEBPATH='' + } + stages { + // Setup all the basic environment variables needed for the build + stage("Set ENV Variables base"){ + steps{ + script{ + env.LS_RELEASE = sh( + script: '''curl -s https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases/latest | jq -r '. | .tag_name' ''', + returnStdout: true).trim() + env.LS_RELEASE_NOTES = sh( + script: '''git log -1 --pretty=%B | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''', + returnStdout: true).trim() + env.GITHUB_DATE = sh( + script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''', + returnStdout: true).trim() + env.COMMIT_SHA = sh( + script: '''git rev-parse HEAD''', + 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 + } + script{ + env.LS_RELEASE_NUMBER = sh( + script: '''echo ${LS_RELEASE} |sed 's/^.*-ls//g' ''', + returnStdout: true).trim() + } + script{ + env.LS_TAG_NUMBER = sh( + script: '''#! /bin/bash + tagsha=$(git rev-list -n 1 ${LS_RELEASE} 2>/dev/null) + if [ "${tagsha}" == "${COMMIT_SHA}" ]; then + echo ${LS_RELEASE_NUMBER} + elif [ -z "${GIT_COMMIT}" ]; then + echo ${LS_RELEASE_NUMBER} + else + echo $((${LS_RELEASE_NUMBER} + 1)) + fi''', + returnStdout: true).trim() + } + } + } + /* ####################### + Package Version Tagging + ####################### */ + // If this is an ubuntu base image determine the base package tag to use + stage("Set Package tag Ubuntu"){ + when { + environment name: 'DIST_IMAGE', value: 'ubuntu' + not {environment name: 'DIST_PACKAGES', value: 'none'} + } + steps{ + sh '''docker pull ubuntu:${DIST_TAG}''' + script{ + env.PACKAGE_TAG = sh( + script: '''docker run --rm ubuntu:${DIST_TAG} sh -c\ + 'apt-get --allow-unauthenticated update -qq >/dev/null 2>&1 &&\ + apt-cache --no-all-versions show '"${DIST_PACKAGES}"' | md5sum | cut -c1-8' ''', + returnStdout: true).trim() + } + } + } + /* ######################## + External Release Tagging + ######################## */ + // If this is a deb repo release pull the specific version from the packages file + stage("Set EXT tag deb repo"){ + steps{ + sh '''docker pull ${DIST_IMAGE}:${DIST_TAG}''' + script{ + env.EXT_RELEASE = sh( + script: '''curl -sX GET ${DIST_REPO} \ + |grep -A 6 -m 1 "Package: ${DIST_REPO_PACKAGE}" | awk -F ": " '/Version/{print $2;exit}' ''', + returnStdout: true).trim() + env.RELEASE_LINK = env.DIST_REPO + } + } + } + // If this is a master build use live docker endpoints + stage("Set ENV live build"){ + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + } + steps { + script{ + env.IMAGE = env.DOCKERHUB_IMAGE + if (env.MULTIARCH == 'true') { + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm32v6-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + } else { + env.CI_TAGS = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + } + env.META_TAG = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + } + } + } + // If this is a dev build use dev docker endpoints + stage("Set ENV dev build"){ + when { + not {branch "master"} + environment name: 'CHANGE_ID', value: '' + } + steps { + script{ + env.IMAGE = env.DEV_DOCKERHUB_IMAGE + if (env.MULTIARCH == 'true') { + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + } else { + env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + } + env.META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' + } + } + } + // If this is a pull request build use dev docker endpoints + stage("Set ENV PR build"){ + when { + not {environment name: 'CHANGE_ID', value: ''} + } + steps { + script{ + env.IMAGE = env.PR_DOCKERHUB_IMAGE + if (env.MULTIARCH == 'true') { + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + } else { + env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + } + env.META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' + } + } + } + // Use helper container to render a readme from the template if needed + stage('Update-README') { + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + expression { + env.CONTAINER_NAME != null + } + } + steps { + sh '''#! /bin/bash + TEMPDIR=$(mktemp -d) + docker pull linuxserver/doc-builder:latest + docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -v ${TEMPDIR}:/ansible/readme linuxserver/doc-builder:latest + if [ "$(md5sum ${TEMPDIR}/${CONTAINER_NAME}/README.md | awk '{ print $1 }')" != "$(md5sum README.md | awk '{ print $1 }')" ]; then + git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/${LS_REPO} + cp ${TEMPDIR}/${CONTAINER_NAME}/README.md ${TEMPDIR}/${LS_REPO}/ + cd ${TEMPDIR}/${LS_REPO}/ + git --git-dir ${TEMPDIR}/${LS_REPO}/.git add README.md + git --git-dir ${TEMPDIR}/${LS_REPO}/.git commit -m 'Bot Updating README from template' + git --git-dir ${TEMPDIR}/${LS_REPO}/.git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all + echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} + else + echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} + fi + rm -Rf ${TEMPDIR}''' + script{ + env.README_UPDATED = sh( + script: '''cat /tmp/${COMMIT_SHA}-${BUILD_NUMBER}''', + returnStdout: true).trim() + } + } + } + // Exit the build if the Readme was just updated + stage('README-exit') { + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + environment name: 'README_UPDATED', value: 'true' + expression { + env.CONTAINER_NAME != null + } + } + steps { + script{ + env.CI_URL = 'README_UPDATE' + env.RELEASE_LINK = 'README_UPDATE' + currentBuild.rawBuild.result = Result.ABORTED + throw new hudson.AbortException('ABORTED_README') + } + } + } + /* ############### + Build Container + ############### */ + // Build Docker container for push to LS Repo + stage('Build-Single') { + when { + environment name: 'MULTIARCH', value: 'false' + } + steps { + sh "docker build --no-cache -t ${IMAGE}:${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + } + } + // Build MultiArch Docker containers for push to LS Repo + stage('Build-Multi') { + when { + environment name: 'MULTIARCH', value: 'true' + } + parallel { + stage('Build X86') { + steps { + sh "docker build --no-cache -t ${IMAGE}:amd64-${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + } + } + stage('Build ARMHF') { + agent { + label 'ARMHF' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-arm-static -o qemu-arm-static" + sh "chmod +x qemu-*" + sh "docker build --no-cache -f Dockerfile.armhf -t ${IMAGE}:arm32v6-${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + sh "docker tag ${IMAGE}:arm32v6-${META_TAG} lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER}" + sh "docker push lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER}" + } + } + } + stage('Build ARM64') { + agent { + label 'ARM64' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-aarch64-static -o qemu-aarch64-static" + sh "chmod +x qemu-*" + sh "docker build --no-cache -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + sh "docker tag ${IMAGE}:arm64v8-${META_TAG} lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" + sh "docker push lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" + } + } + } + } + } + /* ####### + Testing + ####### */ + // Run Container tests + stage('Test') { + when { + environment name: 'CI', value: 'true' + } + steps { + withCredentials([ + string(credentialsId: 'spaces-key', variable: 'DO_KEY'), + string(credentialsId: 'spaces-secret', variable: 'DO_SECRET') + ]) { + sh '''#! /bin/bash + docker pull lsiodev/ci:latest + if [ "${MULTIARCH}" == "true" ]; then + docker pull lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER} + docker pull lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} + docker tag lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v6-${META_TAG} + docker tag lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} + fi + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -e IMAGE=\"${IMAGE}\" \ + -e DELAY_START=\"${CI_DELAY}\" \ + -e TAGS=\"${CI_TAGS}\" \ + -e META_TAG=\"${META_TAG}\" \ + -e PORT=\"${CI_PORT}\" \ + -e SSL=\"${CI_SSL}\" \ + -e BASE=\"${DIST_IMAGE}\" \ + -e SECRET_KEY=\"${DO_SECRET}\" \ + -e ACCESS_KEY=\"${DO_KEY}\" \ + -e DOCKER_ENV=\"DB_HOST=${TEST_MYSQL_HOST}|DB_DATABASE=bookstack|DB_USERNAME=root|DB_PASSWORD=${TEST_MYSQL_PASSWORD}\" \ + -e WEB_SCREENSHOT=\"${CI_WEB}\" \ + -e WEB_AUTH=\"${CI_AUTH}\" \ + -e WEB_PATH=\"${CI_WEBPATH}\" \ + -e DO_REGION="ams3" \ + -e DO_BUCKET="lsio-ci" \ + -t lsiodev/ci:latest \ + python /ci/ci.py''' + script{ + env.CI_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.IMAGE + '/' + env.META_TAG + '/index.html' + } + } + } + } + /* ################## + Release Logic + ################## */ + // If this is an amd64 only image only push a single image + stage('Docker-Push-Single') { + when { + environment name: 'MULTIARCH', value: 'false' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + sh "docker tag ${IMAGE}:${META_TAG} ${IMAGE}:latest" + sh "docker push ${IMAGE}:latest" + sh "docker push ${IMAGE}:${META_TAG}" + } + } + } + // If this is a multi arch release push all images and define the manifest + stage('Docker-Push-Multi') { + when { + environment name: 'MULTIARCH', value: 'true' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + sh '''#! /bin/bash + if [ "${CI}" == "false" ]; then + docker pull lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER} + docker pull lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} + docker tag lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v6-${META_TAG} + docker tag lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} + fi''' + sh "docker tag ${IMAGE}:amd64-${META_TAG} ${IMAGE}:amd64-latest" + sh "docker tag ${IMAGE}:arm32v6-${META_TAG} ${IMAGE}:arm32v6-latest" + sh "docker tag ${IMAGE}:arm64v8-${META_TAG} ${IMAGE}:arm64v8-latest" + sh "docker push ${IMAGE}:amd64-${META_TAG}" + sh "docker push ${IMAGE}:arm32v6-${META_TAG}" + sh "docker push ${IMAGE}:arm64v8-${META_TAG}" + sh "docker push ${IMAGE}:amd64-latest" + sh "docker push ${IMAGE}:arm32v6-latest" + sh "docker push ${IMAGE}:arm64v8-latest" + sh "docker manifest push --purge ${IMAGE}:latest || :" + sh "docker manifest create ${IMAGE}:latest ${IMAGE}:amd64-latest ${IMAGE}:arm32v6-latest ${IMAGE}:arm64v8-latest" + sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm32v6-latest --os linux --arch arm" + sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8" + sh "docker manifest push --purge ${IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} || :" + sh "docker manifest create ${IMAGE}:${META_TAG} ${IMAGE}:amd64-${META_TAG} ${IMAGE}:arm32v6-${META_TAG} ${IMAGE}:arm64v8-${META_TAG}" + sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm32v6-${META_TAG} --os linux --arch arm" + sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm64v8-${META_TAG} --os linux --arch arm64 --variant armv8" + sh "docker manifest push --purge ${IMAGE}:latest" + sh "docker manifest push --purge ${IMAGE}:${META_TAG}" + } + } + } + // If this is a public release tag it in the LS Github and push a changelog from external repo and our internal one + stage('Github-Tag-Push-Release') { + when { + branch "master" + expression { + env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER + } + environment name: 'CHANGE_ID', value: '' + } + steps { + echo "Pushing New tag for current commit ${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}" + sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \ + -d '{"tag":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + "object": "'${COMMIT_SHA}'",\ + "message": "Tagging Release '${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}' to master",\ + "type": "commit",\ + "tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' ''' + echo "Pushing New release for Tag" + sh '''#! /bin/bash + echo "Updating ${DIST_REPO_PACKAGE} to ${EXT_RELEASE}" > releasebody.json + echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + "target_commitish": "master",\ + "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Repo Changes:**\\n\\n' > start + printf '","draft": false,"prerelease": false}' >> releasebody.json + paste -d'\\0' start releasebody.json > releasebody.json.done + 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') { + when { + environment name: 'CHANGE_ID', value: '' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + sh '''#! /bin/bash + docker pull lsiodev/readme-sync + docker run --rm=true \ + -e DOCKERHUB_USERNAME=$DOCKERUSER \ + -e DOCKERHUB_PASSWORD=$DOCKERPASS \ + -e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \ + -e DOCKER_REPOSITORY=${DOCKERHUB_IMAGE} \ + -e GIT_BRANCH=master \ + lsiodev/readme-sync bash -c 'node sync' ''' + } + } + } + } + /* ###################### + Send status to Discord + ###################### */ + post { + success { + sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\ + "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ + "username": "Jenkins"}' ${BUILDS_DISCORD} ''' + } + failure { + sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\ + "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ + "username": "Jenkins"}' ${BUILDS_DISCORD} ''' + } + } +} From a2fbadb10798f94a0ddf10aa361eb66c0c564960 Mon Sep 17 00:00:00 2001 From: thelamer Date: Sat, 8 Sep 2018 20:17:21 -0700 Subject: [PATCH 02/10] need the none logic added for package tagging during the build --- Jenkinsfile | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1e3c68f..3cc5214 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -71,20 +71,11 @@ pipeline { /* ####################### Package Version Tagging ####################### */ - // If this is an ubuntu base image determine the base package tag to use - stage("Set Package tag Ubuntu"){ - when { - environment name: 'DIST_IMAGE', value: 'ubuntu' - not {environment name: 'DIST_PACKAGES', value: 'none'} - } + // If this does not track package tags + stage("Set Package tag None"){ steps{ - sh '''docker pull ubuntu:${DIST_TAG}''' script{ - env.PACKAGE_TAG = sh( - script: '''docker run --rm ubuntu:${DIST_TAG} sh -c\ - 'apt-get --allow-unauthenticated update -qq >/dev/null 2>&1 &&\ - apt-cache --no-all-versions show '"${DIST_PACKAGES}"' | md5sum | cut -c1-8' ''', - returnStdout: true).trim() + env.PACKAGE_TAG = 'none' } } } From 99f3213e1d426a435c970d44a22726f2f281d576 Mon Sep 17 00:00:00 2001 From: thelamer Date: Sat, 8 Sep 2018 21:26:28 -0700 Subject: [PATCH 03/10] adding dynamically generated readmes to build logic --- Jenkinsfile | 3 +- README.md | 190 ++++++++++++++++++++++++++++++------------------ readme-vars.yml | 63 ++++++++++++++++ 3 files changed, 185 insertions(+), 71 deletions(-) create mode 100644 readme-vars.yml diff --git a/Jenkinsfile b/Jenkinsfile index 3cc5214..3615f55 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,6 +7,7 @@ pipeline { BUILD_VERSION_ARG = 'SONARR_VERSION' LS_USER = 'linuxserver' LS_REPO = 'docker-sonarr' + CONTAINER_NAME = 'sonarr' DOCKERHUB_IMAGE = 'linuxserver/sonarr' DEV_DOCKERHUB_IMAGE = 'lsiodev/sonarr' PR_DOCKERHUB_IMAGE = 'lspipepr/sonarr' @@ -450,7 +451,7 @@ pipeline { -e DOCKERHUB_USERNAME=$DOCKERUSER \ -e DOCKERHUB_PASSWORD=$DOCKERPASS \ -e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \ - -e DOCKER_REPOSITORY=${DOCKERHUB_IMAGE} \ + -e DOCKER_REPOSITORY=${IMAGE} \ -e GIT_BRANCH=master \ lsiodev/readme-sync bash -c 'node sync' ''' } diff --git a/README.md b/README.md index 83d5e21..12bae97 100644 --- a/README.md +++ b/README.md @@ -1,107 +1,157 @@ -[linuxserverurl]: https://linuxserver.io -[forumurl]: https://forum.linuxserver.io -[ircurl]: https://www.linuxserver.io/irc/ -[podcasturl]: https://www.linuxserver.io/podcast/ -[appurl]: https://sonarr.tv/ -[hub]: https://hub.docker.com/r/linuxserver/sonarr/ +[![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io) -[![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)][linuxserverurl] +The [LinuxServer.io](https://linuxserver.io) team brings you another container release featuring :- -The [LinuxServer.io][linuxserverurl] team brings you another container release featuring easy user mapping and community support. Find us for support at: -* [forum.linuxserver.io][forumurl] -* [IRC][ircurl] on freenode at `#linuxserver.io` -* [Podcast][podcasturl] covers everything to do with getting the most from your Linux Server plus a focus on all things Docker and containerisation! + * regular and timely application updates + * easy user mappings (PGID, PUID) + * custom base image with s6 overlay + * weekly base OS updates with common layers across the entire LinuxServer.io ecosystem to minimise space usage, down time and bandwidth + * regular security updates -# linuxserver/sonarr -[![](https://images.microbadger.com/badges/version/linuxserver/sonarr.svg)](https://microbadger.com/images/linuxserver/sonarr "Get your own version badge on microbadger.com")[![](https://images.microbadger.com/badges/image/linuxserver/sonarr.svg)](https://microbadger.com/images/linuxserver/sonarr "Get your own image badge on microbadger.com")[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/sonarr.svg)][hub][![Docker Stars](https://img.shields.io/docker/stars/linuxserver/sonarr.svg)][hub][![Build Status](https://ci.linuxserver.io/buildStatus/icon?job=Docker-Builders/x86-64/x86-64-sonarr)](https://ci.linuxserver.io/job/Docker-Builders/job/x86-64/job/x86-64-sonarr/) +Find us at: +* [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team. +* [IRC](https://irc.linuxserver.io) - on freenode at `#linuxserver.io`. Our primary support channel is Discord. +* [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more! +* [Podcast](https://podcast.linuxserver.io) - on hiatus. Coming back soon (late 2018). + +# PSA: Changes are happening + +From August 2018 onwards, Linuxserver are in the midst of switching to a new CI platform which will enable us to build and release multiple architectures under a single repo. To this end, existing images for `arm64` and `armhf` builds are being deprecated. They are replaced by a manifest file in each container which automatically pulls the correct image for your architecture. You'll also be able to pull based on a specific architecture tag. + +TLDR: Multi-arch support is changing from multiple repos to one repo per container image. + +# [linuxserver/sonarr](https://github.com/linuxserver/docker-sonarr) +[![](https://images.microbadger.com/badges/version/linuxserver/sonarr.svg)](https://microbadger.com/images/linuxserver/sonarr "Get your own version badge on microbadger.com") +[![](https://images.microbadger.com/badges/image/linuxserver/sonarr.svg)](https://microbadger.com/images/linuxserver/sonarr "Get your own version badge on microbadger.com") +![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/sonarr.svg) +![Docker Stars](https://img.shields.io/docker/stars/linuxserver/sonarr.svg) [Sonarr](https://sonarr.tv/) (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. -[![sonarr](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/sonarr-banner.png)][appurl] + +[![sonarr](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/sonarr-banner.png)](https://sonarr.tv/) + +## Supported Architectures + +Our images support multiple architectures such as `X86-64`, `arm64` and `armhf`. 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). + +The architectures supported by this image are: + +| Architecture | Tag | +| :----: | --- | +| X86-64 | amd64-latest | +| arm64 | arm64v8-latest | +| armhf | arm32v6-latest | ## Usage +Here are some example snippets to help you get started creating a container. + +### docker + ``` docker create \ - --name sonarr \ - -p 8989:8989 \ - -e PUID= -e PGID= \ - -e TZ= \ - -v /etc/localtime:/etc/localtime:ro \ - -v :/config \ - -v :/tv \ - -v :/downloads \ - linuxserver/sonarr + --name=sonarr \ + -e PUID=1001 \ + -e PGID=1001 \ + -e TZ=Europe/London \ + -p 8989:8989 \ + -v :/config \ + -v :/tv \ + -v :/downloads \ + linuxserver/sonarr ``` You can choose between ,using tags, various branch versions of sonarr, no tag is required to remain on the main branch. Add one of the tags, if required, to the linuxserver/sonarr line of the run/create command in the following format, linuxserver/sonarr:develop - #### Tags + **develop** -## Parameters -`The parameters are split into two halves, separated by a colon, the left hand side representing the host and the right the container side. -For example with a port -p external:internal - what this shows is the port mapping from internal to external of the container. -So -p 8080:80 would expose port 80 from inside the container to be accessible from the host's IP on port 8080 -http://192.168.x.x:8080 would show you what's running INSIDE the container on port 80.` +-p 8989:8989 \ +### docker-compose -* `-p 8989` - the port sonarr webinterface -* `-v /config` - database and sonarr configs -* `-v /tv` - location of TV library on disk -* `-v /etc/localtime` for timesync - see [Localtime](#localtime) for important information -* `-e TZ` for timezone information, Europe/London - see [Localtime](#localtime) for important information -* `-e PGID` for for GroupID - see below for explanation -* `-e PUID` for for UserID - see below for explanation - -It is based on ubuntu xenial with S6 overlay, for shell access whilst the container is running do `docker exec -it sonarr /bin/bash`. - -## Localtime - -It is important that you either set `-v /etc/localtime:/etc/localtime:ro` or the TZ variable, mono will throw exceptions without one of them set. - -### User / Group Identifiers - -Sometimes when using data 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 the data volume directory on the host is owned by the same user you specify and it will "just work" TM. - -In this instance `PUID=1001` and `PGID=1001`. To find yours use `id user` as below: +Compatible with docker-compose v2 schemas. ``` - $ id +--- +version: "2" +services: + sonarr: + image: linuxserver/sonarr + container_name: sonarr + environment: + - PUID=1001 + - PGID=1001 + - TZ=Europe/London + volumes: + - :/config + - :/tv + - :/downloads + ports: + - 8989:8989 + mem_limit: 4096m + restart: unless-stopped +``` + +## 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. + +| Parameter | Function | +| :----: | --- | +| `-p 8989` | The port for the Sonarr webinterface | +| `-e PUID=1001` | for UserID - see below for explanation | +| `-e PGID=1001` | for GroupID - see below for explanation | +| `-e TZ=Europe/London` | Specify a timezone to use EG Europe/London, this is required for Sonarr | +| `-v /config` | Database and sonarr configs | +| `-v /tv` | Location of TV library on disk | +| `-v /downloads` | Location of download managers output directory | + +## 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`. + +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=1001` and `PGID=1001`, to find yours use `id user` as below: + +``` + $ id username uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup) ``` -## Setting up the application +  +## Application Setup + Access the webui at `:8989`, for more information check out [Sonarr](https://sonarr.tv/). -## Info -Monitor the logs of the container in realtime `docker logs -f sonarr`. +## Support Info + +* Shell access whilst the container is running: `docker exec -it sonarr /bin/bash` +* To monitor the logs of the container in realtime: `docker logs -f sonarr` * container version number - -`docker inspect -f '{{ index .Config.Labels "build_version" }}' sonarr` - + * `docker inspect -f '{{ index .Config.Labels "build_version" }}' sonarr` * image version number - -`docker inspect -f '{{ index .Config.Labels "build_version" }}' linuxserver/sonarr` + * `docker inspect -f '{{ index .Config.Labels "build_version" }}' linuxserver/sonarr` ## Versions -+ **15.12.17:** Fix continuation lines. -+ **12.07.17:** Add inspect commands to README, move to jenkins build and push. -+ **17.04.17:** Switch to using inhouse mono baseimage, adds python also. -+ **14.04.17:** Change to mount /etc/localtime in README, thanks cbgj. -+ **13.04.17:** Switch to official mono repository. -+ **30.09.16:** Fix umask -+ **23.09.16:** Add cd to /opt fixes redirects with althub (issue #25) -, make XDG config environment variable -+ **15.09.16:** Add libcurl3 package. -+ **09.09.16:** Add layer badges to README. -+ **27.08.16:** Add badges to README. -+ **20.07.16:** Rebase to xenial. -+ **31.08.15:** Cleanup, changed sources to fetch binarys from. also a new baseimage. +* **08.09.18:** - Adding Multi arch images and pipeline build logic +* **15.12.17:** - Fix continuation lines. +* **12.07.17:** - Add inspect commands to README, move to jenkins build and push. +* **17.04.17:** - Switch to using inhouse mono baseimage, adds python also. +* **14.04.17:** - Change to mount /etc/localtime in README, thanks cbgj. +* **13.04.17:** - Switch to official mono repository. +* **30.09.16:** - Fix umask +* **23.09.16:** - Add cd to /opt fixes redirects with althub (issue #25) , make XDG config environment variable +* **15.09.16:** - Add libcurl3 package. +* **09.09.16:** - Add layer badges to README. +* **27.08.16:** - Add badges to README. +* **20.07.16:** - Rebase to xenial. +* **31.08.15:** - Cleanup, changed sources to fetch binarys from. also a new baseimage. diff --git a/readme-vars.yml b/readme-vars.yml new file mode 100644 index 0000000..a06ee21 --- /dev/null +++ b/readme-vars.yml @@ -0,0 +1,63 @@ +--- + +# project information +project_name: sonarr +project_url: "https://sonarr.tv/" +project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/sonarr-banner.png" +project_blurb: | + [{{ project_name|capitalize }}]({{ project_url }}) (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. +project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}" + +# supported architectures +available_architectures: + - { arch: "{{ arch_x86_64 }}", tag: "amd64-latest"} + - { arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"} + - { arch: "{{ arch_armhf }}", tag: "arm32v6-latest"} + +# Optional Block +optional_block_1: true +optional_block_1_items: + - | + You can choose between ,using tags, various branch versions of sonarr, no tag is required to remain on the main branch. + + Add one of the tags, if required, to the linuxserver/sonarr line of the run/create command in the following format, linuxserver/sonarr:develop + #### Tags + + + **develop** + +# container parameters +param_container_name: "{{ project_name }}" +param_usage_include_vols: true +param_volumes: + - { vol_path: "/config", vol_host_path: "", desc: "Database and sonarr configs" } + - { vol_path: "/tv", vol_host_path: "", desc: "Location of TV library on disk" } + - { vol_path: "/downloads", vol_host_path: "", desc: "Location of download managers output directory" } + +param_usage_include_ports: true +param_ports: + - { external_port: "8989", internal_port: "8989", port_desc: "The port for the Sonarr webinterface" } +param_usage_include_env: true +param_env_vars: + - { env_var: "TZ", env_value: "Europe/London", desc: "Specify a timezone to use EG Europe/London, this is required for Sonarr"} + +# application setup block +app_setup_block_enabled: true +app_setup_block: | + Access the webui at `:8989`, for more information check out [Sonarr](https://sonarr.tv/). + +# changelog +changelogs: + - { date: "08.09.18:", desc: "Adding Multi arch images and pipeline build logic" } + - { date: "15.12.17:", desc: "Fix continuation lines." } + - { date: "12.07.17:", desc: "Add inspect commands to README, move to jenkins build and push." } + - { date: "17.04.17:", desc: "Switch to using inhouse mono baseimage, adds python also." } + - { date: "14.04.17:", desc: "Change to mount /etc/localtime in README, thanks cbgj." } + - { date: "13.04.17:", desc: "Switch to official mono repository." } + - { date: "30.09.16:", desc: "Fix umask" } + - { date: "23.09.16:", desc: "Add cd to /opt fixes redirects with althub (issue #25) +, make XDG config environment variable" } + - { date: "15.09.16:", desc: "Add libcurl3 package." } + - { date: "09.09.16:", desc: "Add layer badges to README." } + - { date: "27.08.16:", desc: "Add badges to README." } + - { date: "20.07.16:", desc: "Rebase to xenial." } + - { date: "31.08.15:", desc: "Cleanup, changed sources to fetch binarys from. also a new baseimage." } From 50c61cea84a240ccbf63780ee33d89888ed7039a Mon Sep 17 00:00:00 2001 From: thelamer Date: Sun, 20 Jan 2019 20:49:37 -0800 Subject: [PATCH 04/10] updating branch with current pipeline build logic in prep for PR --- Dockerfile.aarch64 | 1 + Dockerfile.armhf | 1 + Jenkinsfile | 427 +++++++++++++++++++++++++++++---------------- README.md | 10 +- jenkins-vars.yml | 27 +++ 5 files changed, 306 insertions(+), 160 deletions(-) create mode 100644 jenkins-vars.yml diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 5b6074b..051a83a 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -1,4 +1,5 @@ FROM lsiobase/mono.arm64:xenial + # Add qemu to build on x86_64 systems COPY qemu-aarch64-static /usr/bin diff --git a/Dockerfile.armhf b/Dockerfile.armhf index 15dfb0d..22ece36 100644 --- a/Dockerfile.armhf +++ b/Dockerfile.armhf @@ -1,4 +1,5 @@ FROM lsiobase/mono.armhf:xenial + # Add qemu to build on x86_64 systems COPY qemu-arm-static /usr/bin diff --git a/Jenkinsfile b/Jenkinsfile index 3615f55..6a8a41e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,8 +2,14 @@ pipeline { agent { label 'X86-64-MULTI' } - // Configuraiton for the variables used for this specific repo + // Input to determine if this is a package check + parameters { + string(defaultValue: 'false', description: 'package check run', name: 'PACKAGE_CHECK') + } + // Configuration for the variables used for this specific repo environment { + BUILDS_DISCORD=credentials('build_webhook_url') + GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') BUILD_VERSION_ARG = 'SONARR_VERSION' LS_USER = 'linuxserver' LS_REPO = 'docker-sonarr' @@ -11,19 +17,13 @@ pipeline { DOCKERHUB_IMAGE = 'linuxserver/sonarr' DEV_DOCKERHUB_IMAGE = 'lsiodev/sonarr' PR_DOCKERHUB_IMAGE = 'lspipepr/sonarr' - BUILDS_DISCORD = credentials('build_webhook_url') - GITHUB_TOKEN = credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') DIST_IMAGE = 'ubuntu' - DIST_TAG = 'xenial' - DIST_PACKAGES = 'none' - DIST_REPO = 'http://apt.sonarr.tv/dists/master/main/binary-amd64/Packages' - DIST_REPO_PACKAGE = 'nzbdrone' MULTIARCH='true' CI='true' CI_WEB='true' CI_PORT='8989' CI_SSL='false' - CI_DELAY='60' + CI_DELAY='120' CI_DOCKERENV='TZ=US/Pacific' CI_AUTH='user:password' CI_WEBPATH='' @@ -33,6 +33,7 @@ pipeline { stage("Set ENV Variables base"){ steps{ script{ + env.EXIT_STATUS = '' env.LS_RELEASE = sh( script: '''curl -s https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases/latest | jq -r '. | .tag_name' ''', returnStdout: true).trim() @@ -72,29 +73,44 @@ pipeline { /* ####################### Package Version Tagging ####################### */ - // If this does not track package tags - stage("Set Package tag None"){ - steps{ - script{ - env.PACKAGE_TAG = 'none' - } - } + // Grab the current package versions in Git to determine package tag + stage("Set Package tag"){ + steps{ + script{ + env.PACKAGE_TAG = sh( + script: '''#!/bin/bash + if [ -e package_versions.txt ] ; then + cat package_versions.txt | md5sum | cut -c1-8 + else + echo none + fi''', + returnStdout: true).trim() + } + } } /* ######################## External Release Tagging ######################## */ - // If this is a deb repo release pull the specific version from the packages file - stage("Set EXT tag deb repo"){ - steps{ - sh '''docker pull ${DIST_IMAGE}:${DIST_TAG}''' - script{ - env.EXT_RELEASE = sh( - script: '''curl -sX GET ${DIST_REPO} \ - |grep -A 6 -m 1 "Package: ${DIST_REPO_PACKAGE}" | awk -F ": " '/Version/{print $2;exit}' ''', - returnStdout: true).trim() - env.RELEASE_LINK = env.DIST_REPO - } - } + // If this is a custom command to determine version use that command + stage("Set tag custom bash"){ + steps{ + script{ + env.EXT_RELEASE = sh( + script: ''' curl -sX GET http://apt.sonarr.tv/dists/master/main/binary-amd64/Packages |grep -A 6 -m 1 'Package: nzbdrone' | awk -F ': ' '/Version/{print $2;exit}' ''', + returnStdout: true).trim() + env.RELEASE_LINK = 'custom_command' + } + } + } + // Sanitize the release tag and strip illegal docker or github characters + stage("Sanitize tag"){ + steps{ + script{ + env.EXT_RELEASE_CLEAN = sh( + script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g' ''', + returnStdout: true).trim() + } + } } // If this is a master build use live docker endpoints stage("Set ENV live build"){ @@ -106,11 +122,11 @@ pipeline { script{ env.IMAGE = env.DOCKERHUB_IMAGE if (env.MULTIARCH == 'true') { - env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm32v6-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm32v6-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER } else { - env.CI_TAGS = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER } - env.META_TAG = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER } } } @@ -124,11 +140,11 @@ pipeline { script{ env.IMAGE = env.DEV_DOCKERHUB_IMAGE if (env.MULTIARCH == 'true') { - env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v6-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA } else { - env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA } - env.META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' } } @@ -142,18 +158,18 @@ pipeline { script{ env.IMAGE = env.PR_DOCKERHUB_IMAGE if (env.MULTIARCH == 'true') { - env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v6-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST } else { - env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST } - env.META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' } } } - // Use helper container to render a readme from the template if needed - stage('Update-README') { + // Use helper containers to render templated files + stage('Update-Templates') { when { branch "master" environment name: 'CHANGE_ID', value: '' @@ -163,126 +179,214 @@ pipeline { } steps { sh '''#! /bin/bash + set -e TEMPDIR=$(mktemp -d) + docker pull linuxserver/jenkins-builder:latest + docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -e GITHUB_BRANCH=master -v ${TEMPDIR}:/ansible/jenkins linuxserver/jenkins-builder:latest docker pull linuxserver/doc-builder:latest - docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -v ${TEMPDIR}:/ansible/readme linuxserver/doc-builder:latest - if [ "$(md5sum ${TEMPDIR}/${CONTAINER_NAME}/README.md | awk '{ print $1 }')" != "$(md5sum README.md | awk '{ print $1 }')" ]; then - git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/${LS_REPO} - cp ${TEMPDIR}/${CONTAINER_NAME}/README.md ${TEMPDIR}/${LS_REPO}/ - cd ${TEMPDIR}/${LS_REPO}/ - git --git-dir ${TEMPDIR}/${LS_REPO}/.git add README.md - git --git-dir ${TEMPDIR}/${LS_REPO}/.git commit -m 'Bot Updating README from template' - git --git-dir ${TEMPDIR}/${LS_REPO}/.git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all + docker run --rm -e CONTAINER_NAME=${CONTAINER_NAME} -e GITHUB_BRANCH=master -v ${TEMPDIR}:/ansible/readme linuxserver/doc-builder:latest + if [ "$(md5sum ${TEMPDIR}/${LS_REPO}/Jenkinsfile | awk '{ print $1 }')" != "$(md5sum Jenkinsfile | awk '{ print $1 }')" ] || [ "$(md5sum ${TEMPDIR}/${CONTAINER_NAME}/README.md | awk '{ print $1 }')" != "$(md5sum README.md | awk '{ print $1 }')" ]; then + mkdir -p ${TEMPDIR}/repo + git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO} + git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git checkout -f master + cp ${TEMPDIR}/${CONTAINER_NAME}/README.md ${TEMPDIR}/repo/${LS_REPO}/ + cp ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile ${TEMPDIR}/repo/${LS_REPO}/ + cd ${TEMPDIR}/repo/${LS_REPO}/ + git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git add Jenkinsfile README.md + git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git commit -m 'Bot Updating Templated Files' + git --git-dir ${TEMPDIR}/repo/${LS_REPO}/.git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} else echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} fi rm -Rf ${TEMPDIR}''' script{ - env.README_UPDATED = sh( + env.FILES_UPDATED = sh( script: '''cat /tmp/${COMMIT_SHA}-${BUILD_NUMBER}''', returnStdout: true).trim() } } } - // Exit the build if the Readme was just updated - stage('README-exit') { + // Exit the build if the Templated files were just updated + stage('Template-exit') { when { branch "master" environment name: 'CHANGE_ID', value: '' - environment name: 'README_UPDATED', value: 'true' + environment name: 'FILES_UPDATED', value: 'true' expression { env.CONTAINER_NAME != null } } steps { script{ - env.CI_URL = 'README_UPDATE' - env.RELEASE_LINK = 'README_UPDATE' - currentBuild.rawBuild.result = Result.ABORTED - throw new hudson.AbortException('ABORTED_README') + env.EXIT_STATUS = 'ABORTED' } } } /* ############### Build Container ############### */ - // Build Docker container for push to LS Repo - stage('Build-Single') { - when { - environment name: 'MULTIARCH', value: 'false' - } - steps { - sh "docker build --no-cache -t ${IMAGE}:${META_TAG} \ - --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." - } - } - // Build MultiArch Docker containers for push to LS Repo - stage('Build-Multi') { - when { - environment name: 'MULTIARCH', value: 'true' - } - parallel { - stage('Build X86') { - steps { - sh "docker build --no-cache -t ${IMAGE}:amd64-${META_TAG} \ - --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." - } - } - stage('Build ARMHF') { - agent { - label 'ARMHF' - } - steps { - withCredentials([ - [ - $class: 'UsernamePasswordMultiBinding', - credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', - usernameVariable: 'DOCKERUSER', - passwordVariable: 'DOCKERPASS' - ] - ]) { - echo 'Logging into DockerHub' - sh '''#! /bin/bash - echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin - ''' - sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-arm-static -o qemu-arm-static" - sh "chmod +x qemu-*" - sh "docker build --no-cache -f Dockerfile.armhf -t ${IMAGE}:arm32v6-${META_TAG} \ - --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." - sh "docker tag ${IMAGE}:arm32v6-${META_TAG} lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER}" - sh "docker push lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER}" - } - } - } - stage('Build ARM64') { - agent { - label 'ARM64' - } - steps { - withCredentials([ - [ - $class: 'UsernamePasswordMultiBinding', - credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', - usernameVariable: 'DOCKERUSER', - passwordVariable: 'DOCKERPASS' - ] - ]) { - echo 'Logging into DockerHub' - sh '''#! /bin/bash - echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin - ''' - sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-aarch64-static -o qemu-aarch64-static" - sh "chmod +x qemu-*" - sh "docker build --no-cache -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \ - --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." - sh "docker tag ${IMAGE}:arm64v8-${META_TAG} lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" - sh "docker push lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" - } - } - } - } - } + // Build Docker container for push to LS Repo + stage('Build-Single') { + when { + environment name: 'MULTIARCH', value: 'false' + environment name: 'EXIT_STATUS', value: '' + } + steps { + sh "docker build --no-cache -t ${IMAGE}:${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + } + } + // Build MultiArch Docker containers for push to LS Repo + stage('Build-Multi') { + when { + environment name: 'MULTIARCH', value: 'true' + environment name: 'EXIT_STATUS', value: '' + } + parallel { + stage('Build X86') { + steps { + sh "docker build --no-cache -t ${IMAGE}:amd64-${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + } + } + stage('Build ARMHF') { + agent { + label 'ARMHF' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-arm-static -o qemu-arm-static" + sh "chmod +x qemu-*" + sh "docker build --no-cache -f Dockerfile.armhf -t ${IMAGE}:arm32v6-${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + sh "docker tag ${IMAGE}:arm32v6-${META_TAG} lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER}" + sh "docker push lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER}" + } + } + } + stage('Build ARM64') { + agent { + label 'ARM64' + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + sh "curl https://lsio-ci.ams3.digitaloceanspaces.com/qemu-aarch64-static -o qemu-aarch64-static" + sh "chmod +x qemu-*" + sh "docker build --no-cache -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${META_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + sh "docker tag ${IMAGE}:arm64v8-${META_TAG} lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" + sh "docker push lsiodev/buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" + } + } + } + } + } + // Take the image we just built and dump package versions for comparison + stage('Update-packages') { + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + environment name: 'EXIT_STATUS', value: '' + } + steps { + sh '''#! /bin/bash + set -e + TEMPDIR=$(mktemp -d) + if [ "${MULTIARCH}" == "true" ]; then + LOCAL_CONTAINER=${IMAGE}:amd64-${META_TAG} + else + LOCAL_CONTAINER=${IMAGE}:${META_TAG} + fi + if [ "${DIST_IMAGE}" == "alpine" ]; then + docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\ + apk info > packages && \ + apk info -v > versions && \ + paste -d " " packages versions > /tmp/package_versions.txt && \ + chmod 777 /tmp/package_versions.txt' + elif [ "${DIST_IMAGE}" == "ubuntu" ]; then + docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\ + apt list -qq --installed > /tmp/package_versions.txt && \ + chmod 777 /tmp/package_versions.txt' + fi + NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 ) + echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github" + if [ "${NEW_PACKAGE_TAG}" != "${PACKAGE_TAG}" ]; then + git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/${LS_REPO} + git --git-dir ${TEMPDIR}/${LS_REPO}/.git checkout -f master + cp ${TEMPDIR}/package_versions.txt ${TEMPDIR}/${LS_REPO}/ + cd ${TEMPDIR}/${LS_REPO}/ + 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 + echo "true" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER} + echo "Package tag updated, stopping build process" + else + echo "false" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER} + echo "Package tag is same as previous continue with build process" + fi + rm -Rf ${TEMPDIR}''' + script{ + env.PACKAGE_UPDATED = sh( + script: '''cat /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER}''', + returnStdout: true).trim() + } + } + } + // Exit the build if the package file was just updated + stage('PACKAGE-exit') { + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + environment name: 'PACKAGE_UPDATED', value: 'true' + environment name: 'EXIT_STATUS', value: '' + } + steps { + script{ + env.EXIT_STATUS = 'ABORTED' + } + } + } + // Exit the build if this is just a package check and there are no changes to push + stage('PACKAGECHECK-exit') { + when { + branch "master" + environment name: 'CHANGE_ID', value: '' + environment name: 'PACKAGE_UPDATED', value: 'false' + environment name: 'EXIT_STATUS', value: '' + expression { + params.PACKAGE_CHECK == 'true' + } + } + steps { + script{ + env.EXIT_STATUS = 'ABORTED' + } + } + } /* ####### Testing ####### */ @@ -290,13 +394,18 @@ pipeline { stage('Test') { when { environment name: 'CI', value: 'true' + environment name: 'EXIT_STATUS', value: '' } steps { withCredentials([ string(credentialsId: 'spaces-key', variable: 'DO_KEY'), string(credentialsId: 'spaces-secret', variable: 'DO_SECRET') ]) { + script{ + env.CI_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.IMAGE + '/' + env.META_TAG + '/index.html' + } sh '''#! /bin/bash + set -e docker pull lsiodev/ci:latest if [ "${MULTIARCH}" == "true" ]; then docker pull lsiodev/buildcache:arm32v6-${COMMIT_SHA}-${BUILD_NUMBER} @@ -315,7 +424,7 @@ pipeline { -e BASE=\"${DIST_IMAGE}\" \ -e SECRET_KEY=\"${DO_SECRET}\" \ -e ACCESS_KEY=\"${DO_KEY}\" \ - -e DOCKER_ENV=\"DB_HOST=${TEST_MYSQL_HOST}|DB_DATABASE=bookstack|DB_USERNAME=root|DB_PASSWORD=${TEST_MYSQL_PASSWORD}\" \ + -e DOCKER_ENV=\"${CI_DOCKERENV}\" \ -e WEB_SCREENSHOT=\"${CI_WEB}\" \ -e WEB_AUTH=\"${CI_AUTH}\" \ -e WEB_PATH=\"${CI_WEBPATH}\" \ @@ -323,9 +432,6 @@ pipeline { -e DO_BUCKET="lsio-ci" \ -t lsiodev/ci:latest \ python /ci/ci.py''' - script{ - env.CI_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.IMAGE + '/' + env.META_TAG + '/index.html' - } } } } @@ -336,6 +442,7 @@ pipeline { stage('Docker-Push-Single') { when { environment name: 'MULTIARCH', value: 'false' + environment name: 'EXIT_STATUS', value: '' } steps { withCredentials([ @@ -360,6 +467,7 @@ pipeline { stage('Docker-Push-Multi') { when { environment name: 'MULTIARCH', value: 'true' + environment name: 'EXIT_STATUS', value: '' } steps { withCredentials([ @@ -392,40 +500,41 @@ pipeline { sh "docker manifest push --purge ${IMAGE}:latest || :" sh "docker manifest create ${IMAGE}:latest ${IMAGE}:amd64-latest ${IMAGE}:arm32v6-latest ${IMAGE}:arm64v8-latest" sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm32v6-latest --os linux --arch arm" - sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8" - sh "docker manifest push --purge ${IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} || :" + sh "docker manifest annotate ${IMAGE}:latest ${IMAGE}:arm64v8-latest --os linux --arch arm64 --variant v8" + sh "docker manifest push --purge ${IMAGE}:${META_TAG} || :" sh "docker manifest create ${IMAGE}:${META_TAG} ${IMAGE}:amd64-${META_TAG} ${IMAGE}:arm32v6-${META_TAG} ${IMAGE}:arm64v8-${META_TAG}" sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm32v6-${META_TAG} --os linux --arch arm" - sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm64v8-${META_TAG} --os linux --arch arm64 --variant armv8" + sh "docker manifest annotate ${IMAGE}:${META_TAG} ${IMAGE}:arm64v8-${META_TAG} --os linux --arch arm64 --variant v8" sh "docker manifest push --purge ${IMAGE}:latest" sh "docker manifest push --purge ${IMAGE}:${META_TAG}" } } } - // If this is a public release tag it in the LS Github and push a changelog from external repo and our internal one + // If this is a public release tag it in the LS Github stage('Github-Tag-Push-Release') { when { branch "master" expression { - env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER + env.LS_RELEASE != env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER } environment name: 'CHANGE_ID', value: '' + environment name: 'EXIT_STATUS', value: '' } steps { - echo "Pushing New tag for current commit ${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}" + echo "Pushing New tag for current commit ${EXT_RELEASE_CLEAN}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}" sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \ - -d '{"tag":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + -d '{"tag":"'${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ "object": "'${COMMIT_SHA}'",\ - "message": "Tagging Release '${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}' to master",\ + "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}' to master",\ "type": "commit",\ "tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' ''' echo "Pushing New release for Tag" sh '''#! /bin/bash - echo "Updating ${DIST_REPO_PACKAGE} to ${EXT_RELEASE}" > releasebody.json - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json + echo '{"tag_name":"'${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Repo Changes:**\\n\\n' > start + "name": "'${EXT_RELEASE_CLEAN}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Remote Changes:**\\n\\n' > start printf '","draft": false,"prerelease": false}' >> releasebody.json paste -d'\\0' start releasebody.json > releasebody.json.done curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' @@ -435,6 +544,7 @@ pipeline { stage('Sync-README') { when { environment name: 'CHANGE_ID', value: '' + environment name: 'EXIT_STATUS', value: '' } steps { withCredentials([ @@ -462,15 +572,22 @@ pipeline { Send status to Discord ###################### */ post { - success { - sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\ - "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ - "username": "Jenkins"}' ${BUILDS_DISCORD} ''' - } - failure { - sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\ - "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ - "username": "Jenkins"}' ${BUILDS_DISCORD} ''' + always { + script{ + if (env.EXIT_STATUS == "ABORTED"){ + sh 'echo "build aborted"' + } + else if (currentBuild.currentResult == "SUCCESS"){ + sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\ + "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ + "username": "Jenkins"}' ${BUILDS_DISCORD} ''' + } + else { + sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\ + "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ + "username": "Jenkins"}' ${BUILDS_DISCORD} ''' + } + } } } } diff --git a/README.md b/README.md index 12bae97..5f135d2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Find us at: * [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team. * [IRC](https://irc.linuxserver.io) - on freenode at `#linuxserver.io`. Our primary support channel is Discord. * [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more! -* [Podcast](https://podcast.linuxserver.io) - on hiatus. Coming back soon (late 2018). +* [Podcast](https://anchor.fm/linuxserverio) - on hiatus. Coming back soon (late 2018). # PSA: Changes are happening @@ -21,6 +21,7 @@ From August 2018 onwards, Linuxserver are in the midst of switching to a new CI TLDR: Multi-arch support is changing from multiple repos to one repo per container image. # [linuxserver/sonarr](https://github.com/linuxserver/docker-sonarr) +[![](https://img.shields.io/discord/354974912613449730.svg?logo=discord&label=LSIO%20Discord&style=flat-square)](https://discord.gg/YWrKVTn) [![](https://images.microbadger.com/badges/version/linuxserver/sonarr.svg)](https://microbadger.com/images/linuxserver/sonarr "Get your own version badge on microbadger.com") [![](https://images.microbadger.com/badges/image/linuxserver/sonarr.svg)](https://microbadger.com/images/linuxserver/sonarr "Get your own version badge on microbadger.com") ![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/sonarr.svg) @@ -33,13 +34,13 @@ TLDR: Multi-arch support is changing from multiple repos to one repo per contain ## Supported Architectures -Our images support multiple architectures such as `X86-64`, `arm64` and `armhf`. 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). +Our images support multiple architectures such as `x86-64`, `arm64` and `armhf`. 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). The architectures supported by this image are: | Architecture | Tag | | :----: | --- | -| X86-64 | amd64-latest | +| x86-64 | amd64-latest | | arm64 | arm64v8-latest | | armhf | arm32v6-latest | @@ -59,6 +60,7 @@ docker create \ -v :/config \ -v :/tv \ -v :/downloads \ + --restart unless-stopped \ linuxserver/sonarr ``` @@ -70,8 +72,6 @@ Add one of the tags, if required, to the linuxserver/sonarr line of the run/cr + **develop** --p 8989:8989 \ - ### docker-compose Compatible with docker-compose v2 schemas. diff --git a/jenkins-vars.yml b/jenkins-vars.yml new file mode 100644 index 0000000..7e4710c --- /dev/null +++ b/jenkins-vars.yml @@ -0,0 +1,27 @@ +--- + +# jenkins variables +project_name: docker-sonarr +external_type: na +custom_version_command: "curl -sX GET http://apt.sonarr.tv/dists/master/main/binary-amd64/Packages |grep -A 6 -m 1 'Package: nzbdrone' | awk -F ': ' '/Version/{print $2;exit}'" +release_type: stable +release_tag: latest +ls_branch: master +repo_vars: + - BUILD_VERSION_ARG = 'SONARR_VERSION' + - LS_USER = 'linuxserver' + - LS_REPO = 'docker-sonarr' + - CONTAINER_NAME = 'sonarr' + - DOCKERHUB_IMAGE = 'linuxserver/sonarr' + - DEV_DOCKERHUB_IMAGE = 'lsiodev/sonarr' + - PR_DOCKERHUB_IMAGE = 'lspipepr/sonarr' + - DIST_IMAGE = 'ubuntu' + - MULTIARCH='true' + - CI='true' + - CI_WEB='true' + - CI_PORT='8989' + - CI_SSL='false' + - CI_DELAY='120' + - CI_DOCKERENV='TZ=US/Pacific' + - CI_AUTH='user:password' + - CI_WEBPATH='' From a5a5a5c3945cda43afec5e05677643ef37c40ed0 Mon Sep 17 00:00:00 2001 From: aptalca Date: Mon, 28 Jan 2019 15:02:05 -0500 Subject: [PATCH 05/10] standardize the package download urls and simplify version retrieval --- Dockerfile | 23 +++++++++++++---------- Dockerfile.aarch64 | 25 +++++++++++++++---------- Dockerfile.armhf | 23 +++++++++++++---------- jenkins-vars.yml | 2 +- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Dockerfile b/Dockerfile index ed160fb..73f83e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,23 +13,26 @@ ENV XDG_CONFIG_HOME="/config/xdg" ENV SONARR_BRANCH="master" RUN \ - if [ -z ${SONARR_VERSION+x} ]; then \ - SONARR_VERSION=$(curl -sX GET http://apt.sonarr.tv/dists/${SONARR_BRANCH}/main/binary-amd64/Packages \ - |grep -A 6 -m 1 "Package: nzbdrone" | awk -F ": " '/Version/{print $2;exit}'); \ - fi && \ - echo "**** add sonarr repository ****" && \ - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC && \ - echo "deb http://apt.sonarr.tv/ ${SONARR_BRANCH} main" > \ - /etc/apt/sources.list.d/sonarr.list && \ echo "**** install packages ****" && \ apt-get update && \ apt-get install -y \ - nzbdrone=${SONARR_VERSION} && \ + jq && \ + echo "**** install sonarr ****" && \ + mkdir -p /opt/NzbDrone && \ + if [ -z ${SONARR_VERSION+x} ]; then \ + SONARR_VERSION=$(curl -sX GET http://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ + | jq -r '.version'); \ + fi && \ + curl -o \ + /tmp/sonarr.tar.gz -L \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.master.${SONARR_VERSION}.mono.tar.gz" && \ + tar xf \ + /tmp/sonarr.tar.gz -C \ + /opt/NzbDrone --strip-components=1 && \ echo "**** cleanup ****" && \ apt-get clean && \ rm -rf \ /tmp/* \ - /var/lib/apt/lists/* \ /var/tmp/* # add local files diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 051a83a..e34de77 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -17,22 +17,27 @@ ENV XDG_CONFIG_HOME="/config/xdg" ARG SONARR_BRANCH="master" RUN \ - if [ -z ${SONARR_VERSION+x} ]; then \ - SONARR_VERSION=$(curl -sX GET http://apt.sonarr.tv/dists/${SONARR_BRANCH}/main/binary-amd64/Packages \ - |grep -A 6 -m 1 "Package: nzbdrone" | awk -F ": " '/Version/{print $2;exit}'); \ - fi && \ + echo "**** install packages ****" && \ + apt-get update && \ + apt-get install -y \ + jq && \ echo "**** install sonarr ****" && \ - mkdir -p \ - /opt/NzbDrone && \ + mkdir -p /opt/NzbDrone && \ + if [ -z ${SONARR_VERSION+x} ]; then \ + SONARR_VERSION=$(curl -sX GET http://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ + | jq -r '.version'); \ + fi && \ curl -o \ - /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ + /tmp/sonarr.tar.gz -L \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.master.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ - /tmp/sonarr.tar.gz -C \ + /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ echo "**** cleanup ****" && \ + apt-get clean && \ rm -rf \ - /tmp/* + /tmp/* \ + /var/tmp/* # add local files COPY root/ / diff --git a/Dockerfile.armhf b/Dockerfile.armhf index 22ece36..52a0c5c 100644 --- a/Dockerfile.armhf +++ b/Dockerfile.armhf @@ -16,23 +16,26 @@ ENV XDG_CONFIG_HOME="/config/xdg" ENV SONARR_BRANCH="master" RUN \ - if [ -z ${SONARR_VERSION+x} ]; then \ - SONARR_VERSION=$(curl -sX GET http://apt.sonarr.tv/dists/${SONARR_BRANCH}/main/binary-amd64/Packages \ - |grep -A 6 -m 1 "Package: nzbdrone" | awk -F ": " '/Version/{print $2;exit}'); \ - fi && \ - echo "**** add sonarr repository ****" && \ - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC && \ - echo "deb http://apt.sonarr.tv/ ${SONARR_BRANCH} main" > \ - /etc/apt/sources.list.d/sonarr.list && \ echo "**** install packages ****" && \ apt-get update && \ apt-get install -y \ - nzbdrone=${SONARR_VERSION} && \ + jq && \ + echo "**** install sonarr ****" && \ + mkdir -p /opt/NzbDrone && \ + if [ -z ${SONARR_VERSION+x} ]; then \ + SONARR_VERSION=$(curl -sX GET http://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ + | jq -r '.version'); \ + fi && \ + curl -o \ + /tmp/sonarr.tar.gz -L \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.master.${SONARR_VERSION}.mono.tar.gz" && \ + tar xf \ + /tmp/sonarr.tar.gz -C \ + /opt/NzbDrone --strip-components=1 && \ echo "**** cleanup ****" && \ apt-get clean && \ rm -rf \ /tmp/* \ - /var/lib/apt/lists/* \ /var/tmp/* # add local files diff --git a/jenkins-vars.yml b/jenkins-vars.yml index 7e4710c..08178ce 100644 --- a/jenkins-vars.yml +++ b/jenkins-vars.yml @@ -3,7 +3,7 @@ # jenkins variables project_name: docker-sonarr external_type: na -custom_version_command: "curl -sX GET http://apt.sonarr.tv/dists/master/main/binary-amd64/Packages |grep -A 6 -m 1 'Package: nzbdrone' | awk -F ': ' '/Version/{print $2;exit}'" +custom_version_command: "curl -sX GET http://services.sonarr.tv/v1/download/master | jq -r '.version'" release_type: stable release_tag: latest ls_branch: master From 24999c695f81f44a4f5440a5266cb2dfd66c1534 Mon Sep 17 00:00:00 2001 From: aptalca Date: Mon, 28 Jan 2019 15:36:29 -0500 Subject: [PATCH 06/10] update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6a8a41e..679bf9c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -96,7 +96,7 @@ pipeline { steps{ script{ env.EXT_RELEASE = sh( - script: ''' curl -sX GET http://apt.sonarr.tv/dists/master/main/binary-amd64/Packages |grep -A 6 -m 1 'Package: nzbdrone' | awk -F ': ' '/Version/{print $2;exit}' ''', + script: ''' curl -sX GET http://services.sonarr.tv/v1/download/master | jq -r '.version' ''', returnStdout: true).trim() env.RELEASE_LINK = 'custom_command' } From 1631542801d6e9974f1d5a0f487a76c00564eefa Mon Sep 17 00:00:00 2001 From: aptalca Date: Mon, 28 Jan 2019 15:42:38 -0500 Subject: [PATCH 07/10] fix download url --- Dockerfile | 2 +- Dockerfile.aarch64 | 2 +- Dockerfile.armhf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 73f83e4..a05b952 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ RUN \ fi && \ curl -o \ /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.master.${SONARR_VERSION}.mono.tar.gz" && \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index e34de77..5934c5b 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -29,7 +29,7 @@ RUN \ fi && \ curl -o \ /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.master.${SONARR_VERSION}.mono.tar.gz" && \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ diff --git a/Dockerfile.armhf b/Dockerfile.armhf index 52a0c5c..2800e72 100644 --- a/Dockerfile.armhf +++ b/Dockerfile.armhf @@ -28,7 +28,7 @@ RUN \ fi && \ curl -o \ /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.master.${SONARR_VERSION}.mono.tar.gz" && \ + "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ From 15d0d6719d235f3853e0f46b8817514d07eb045a Mon Sep 17 00:00:00 2001 From: aptalca Date: Mon, 28 Jan 2019 16:07:32 -0500 Subject: [PATCH 08/10] standardize Dockerfiles --- Dockerfile.aarch64 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 5934c5b..66ec4a1 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -11,10 +11,9 @@ LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DA LABEL maintainer="sparklyballs" # set environment variables +ARG DEBIAN_FRONTEND="noninteractive" ENV XDG_CONFIG_HOME="/config/xdg" - -# package versions -ARG SONARR_BRANCH="master" +ENV SONARR_BRANCH="master" RUN \ echo "**** install packages ****" && \ From de14fc3ab3934d06791d80176e888a9d9c4f0752 Mon Sep 17 00:00:00 2001 From: aptalca Date: Mon, 28 Jan 2019 16:41:29 -0500 Subject: [PATCH 09/10] use https for api endpoints --- Dockerfile | 4 ++-- Dockerfile.aarch64 | 4 ++-- Dockerfile.armhf | 4 ++-- Jenkinsfile | 2 +- jenkins-vars.yml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index a05b952..302c143 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,12 +20,12 @@ RUN \ echo "**** install sonarr ****" && \ mkdir -p /opt/NzbDrone && \ if [ -z ${SONARR_VERSION+x} ]; then \ - SONARR_VERSION=$(curl -sX GET http://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ + SONARR_VERSION=$(curl -sX GET https://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ | jq -r '.version'); \ fi && \ curl -o \ /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ + "https://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 66ec4a1..7bf7402 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -23,12 +23,12 @@ RUN \ echo "**** install sonarr ****" && \ mkdir -p /opt/NzbDrone && \ if [ -z ${SONARR_VERSION+x} ]; then \ - SONARR_VERSION=$(curl -sX GET http://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ + SONARR_VERSION=$(curl -sX GET https://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ | jq -r '.version'); \ fi && \ curl -o \ /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ + "https://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ diff --git a/Dockerfile.armhf b/Dockerfile.armhf index 2800e72..8c322c5 100644 --- a/Dockerfile.armhf +++ b/Dockerfile.armhf @@ -23,12 +23,12 @@ RUN \ echo "**** install sonarr ****" && \ mkdir -p /opt/NzbDrone && \ if [ -z ${SONARR_VERSION+x} ]; then \ - SONARR_VERSION=$(curl -sX GET http://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ + SONARR_VERSION=$(curl -sX GET https://services.sonarr.tv/v1/download/${SONARR_BRANCH} \ | jq -r '.version'); \ fi && \ curl -o \ /tmp/sonarr.tar.gz -L \ - "http://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ + "https://download.sonarr.tv/v2/${SONARR_BRANCH}/mono/NzbDrone.${SONARR_BRANCH}.${SONARR_VERSION}.mono.tar.gz" && \ tar xf \ /tmp/sonarr.tar.gz -C \ /opt/NzbDrone --strip-components=1 && \ diff --git a/Jenkinsfile b/Jenkinsfile index 679bf9c..9958585 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -96,7 +96,7 @@ pipeline { steps{ script{ env.EXT_RELEASE = sh( - script: ''' curl -sX GET http://services.sonarr.tv/v1/download/master | jq -r '.version' ''', + script: ''' curl -sX GET https://services.sonarr.tv/v1/download/master | jq -r '.version' ''', returnStdout: true).trim() env.RELEASE_LINK = 'custom_command' } diff --git a/jenkins-vars.yml b/jenkins-vars.yml index 08178ce..fde9bf4 100644 --- a/jenkins-vars.yml +++ b/jenkins-vars.yml @@ -3,7 +3,7 @@ # jenkins variables project_name: docker-sonarr external_type: na -custom_version_command: "curl -sX GET http://services.sonarr.tv/v1/download/master | jq -r '.version'" +custom_version_command: "curl -sX GET https://services.sonarr.tv/v1/download/master | jq -r '.version'" release_type: stable release_tag: latest ls_branch: master From 3ba471125133e9319158a8a768e17c6e407d084a Mon Sep 17 00:00:00 2001 From: aptalca Date: Fri, 1 Feb 2019 13:06:35 -0500 Subject: [PATCH 10/10] update readme, add tag info --- README.md | 13 ++++++++----- readme-vars.yml | 18 +++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5f135d2..c5c0af7 100644 --- a/README.md +++ b/README.md @@ -64,12 +64,15 @@ docker create \ linuxserver/sonarr ``` -You can choose between ,using tags, various branch versions of sonarr, no tag is required to remain on the main branch. +### Version Tags -Add one of the tags, if required, to the linuxserver/sonarr line of the run/create command in the following format, linuxserver/sonarr:develop -#### Tags +This image provides various versions that are available via tags. `latest` tag usually provides the latest stable version. Others are considered under development and caution must be exercised when using them. -+ **develop** +| Tag | Description | +| :----: | --- | +| latest | stable builds from the master branch of sonarr (currently v2) | +| develop | development builds from the develop branch of sonarr (currently v2) | +| preview | preview builds from the phantom-develop branch of sonarr (currently v3) | ### docker-compose @@ -142,7 +145,7 @@ Access the webui at `:8989`, for more information check out [Sonarr](ht ## Versions -* **08.09.18:** - Adding Multi arch images and pipeline build logic +* **01.02.19:** - Multi arch images and pipeline build logic * **15.12.17:** - Fix continuation lines. * **12.07.17:** - Add inspect commands to README, move to jenkins build and push. * **17.04.17:** - Switch to using inhouse mono baseimage, adds python also. diff --git a/readme-vars.yml b/readme-vars.yml index a06ee21..4ad03d1 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -18,12 +18,16 @@ available_architectures: optional_block_1: true optional_block_1_items: - | - You can choose between ,using tags, various branch versions of sonarr, no tag is required to remain on the main branch. - - Add one of the tags, if required, to the linuxserver/sonarr line of the run/create command in the following format, linuxserver/sonarr:develop - #### Tags - - + **develop** + ### Version Tags + + This image provides various versions that are available via tags. `latest` tag usually provides the latest stable version. Others are considered under development and caution must be exercised when using them. + + | Tag | Description | + | :----: | --- | + | latest | stable builds from the master branch of sonarr (currently v2) | + | develop | development builds from the develop branch of sonarr (currently v2) | + | preview | preview builds from the phantom-develop branch of sonarr (currently v3) | + # container parameters param_container_name: "{{ project_name }}" @@ -47,7 +51,7 @@ app_setup_block: | # changelog changelogs: - - { date: "08.09.18:", desc: "Adding Multi arch images and pipeline build logic" } + - { date: "01.02.19:", desc: "Multi arch images and pipeline build logic" } - { date: "15.12.17:", desc: "Fix continuation lines." } - { date: "12.07.17:", desc: "Add inspect commands to README, move to jenkins build and push." } - { date: "17.04.17:", desc: "Switch to using inhouse mono baseimage, adds python also." }