Compare commits

..

53 Commits

Author SHA1 Message Date
LinuxServer-CI
a11b08f48a Bot Updating Package Versions 2022-02-12 20:33:00 +01:00
LinuxServer-CI
5c95e3cd54 Bot Updating Package Versions 2022-02-06 16:07:38 +01:00
LinuxServer-CI
e518677c08 Bot Updating Package Versions 2022-01-23 16:11:11 +01:00
LinuxServer-CI
3e2ff2ec64 Bot Updating Package Versions 2022-01-09 16:08:09 +01:00
LinuxServer-CI
7bd9706a03 Bot Updating Package Versions 2022-01-07 04:27:55 +01:00
aptalca
730ae79c03 Merge pull request #187 from linuxserver/execinfo
Rebase to 3.15, disable execinfo, upgrade xmltv
2022-01-06 22:04:41 -05:00
aptalca
f3d20cc23e rebase to 3.15 2022-01-06 20:45:16 -05:00
aptalca
eb738d902c update xmltv 2022-01-06 13:33:50 -05:00
aptalca
63be7472e3 disable execinfo 2022-01-06 13:24:17 -05:00
LinuxServer-CI
935363eea3 Bot Updating Package Versions 2021-12-19 16:22:22 +01:00
LinuxServer-CI
fd1cf5ccb5 Bot Updating Templated Files 2021-12-19 15:59:48 +01:00
LinuxServer-CI
b05c0153a6 Bot Updating Templated Files 2021-12-19 15:58:37 +01:00
LinuxServer-CI
f35919e8d1 Bot Updating Package Versions 2021-11-21 16:07:33 +01:00
LinuxServer-CI
2621cbec21 Bot Updating Package Versions 2021-10-31 16:07:09 +01:00
LinuxServer-CI
9671978057 Bot Updating Package Versions 2021-10-24 17:07:05 +02:00
LinuxServer-CI
c255ddd316 Bot Updating Package Versions 2021-10-10 17:07:21 +02:00
LinuxServer-CI
8b48664ab1 Bot Updating Package Versions 2021-10-03 17:13:51 +02:00
LinuxServer-CI
bcc271c172 Bot Updating Templated Files 2021-10-03 16:59:46 +02:00
LinuxServer-CI
0f59a23e89 Bot Updating Templated Files 2021-10-03 16:58:37 +02:00
LinuxServer-CI
f93ea75fe8 Bot Updating Package Versions 2021-09-26 17:08:28 +02:00
LinuxServer-CI
266ec09930 Bot Updating Package Versions 2021-09-19 17:08:56 +02:00
LinuxServer-CI
f4088e7131 Bot Updating Package Versions 2021-09-05 17:09:19 +02:00
LinuxServer-CI
17c2043ab9 Bot Updating Package Versions 2021-08-29 17:18:32 +02:00
LinuxServer-CI
2bd50241a4 Bot Updating Templated Files 2021-08-29 16:58:34 +02:00
LinuxServer-CI
fabc111bf2 Bot Updating Package Versions 2021-08-15 17:11:35 +02:00
LinuxServer-CI
8b3aa0d0fb Bot Updating Package Versions 2021-08-08 12:55:50 +02:00
LinuxServer-CI
868e115a6c Bot Updating Templated Files 2021-08-08 12:43:42 +02:00
Roxedus
aa93ad951b Merge pull request #183 from linuxserver/readme-fix
Resolving typo in readme
2021-08-08 12:42:24 +02:00
homerr
fe3852826d Resolving typo in readme 2021-08-08 11:10:00 +01:00
LinuxServer-CI
92c2661783 Bot Updating Package Versions 2021-07-27 19:38:23 +02:00
LinuxServer-CI
fb9920c1b3 Bot Updating Templated Files 2021-07-27 19:26:47 +02:00
Martin Riedel
91358c7ba5 Add iHD driver for VAAPI support on newer hardware (#179)
* Add iHD driver for VAAPI support on newer hardware

* Updated Changelog.
2021-07-27 19:25:29 +02:00
LinuxServer-CI
ac859a0867 Bot Updating Package Versions 2021-07-25 00:28:40 +02:00
LinuxServer-CI
ef7477535d Bot Updating Templated Files 2021-07-21 19:31:15 +02:00
j0nnymoe
8cf0723418 Merge pull request #182 from linuxserver/picons
Picons link fix
2021-07-21 18:29:58 +01:00
Adam
9a3cdb5a7f Picons link fix 2021-07-21 18:28:04 +01:00
LinuxServer-CI
7f615b5cdb Bot Updating Package Versions 2021-07-04 11:23:56 -04:00
LinuxServer-CI
35df511806 Bot Updating Templated Files 2021-07-04 15:01:45 +00:00
LinuxServer-CI
f1c6b20cf3 Bot Updating Templated Files 2021-07-04 15:00:04 +00:00
LinuxServer-CI
6280ac31f4 Bot Updating Package Versions 2021-06-06 15:43:22 +00:00
LinuxServer-CI
da2bcad104 Bot Updating Package Versions 2021-05-31 18:14:05 -04:00
LinuxServer-CI
65db49bd17 Bot Updating Package Versions 2021-05-23 15:48:18 +00:00
LinuxServer-CI
04343674ae Bot Updating Package Versions 2021-05-09 15:38:52 +00:00
LinuxServer-CI
8fe6c7557c Bot Updating Package Versions 2021-04-25 11:33:07 -04:00
LinuxServer-CI
52f839b990 Bot Updating Package Versions 2021-04-18 16:31:33 +01:00
LinuxServer-CI
195eddaebc Bot Updating Templated Files 2021-04-18 10:57:39 -04:00
LinuxServer-CI
11271da1ca Bot Updating Templated Files 2021-04-18 15:56:16 +01:00
LinuxServer-CI
6d209a72c2 Bot Updating Package Versions 2021-04-11 11:32:46 -04:00
LinuxServer-CI
5e227aba40 Bot Updating Package Versions 2021-04-02 04:32:29 +01:00
LinuxServer-CI
760a747e6d Bot Updating Package Versions 2021-03-28 11:39:35 -04:00
LinuxServer-CI
2012883e33 Bot Updating Package Versions 2021-03-21 15:29:28 +00:00
LinuxServer-CI
8d82134222 Bot Updating Package Versions 2021-02-24 12:11:44 +00:00
LinuxServer-CI
44d4579a8c Bot Updating Package Versions 2021-02-21 15:35:12 +00:00
12 changed files with 626 additions and 426 deletions

20
.editorconfig Executable file
View File

@@ -0,0 +1,20 @@
# This file is globally distributed to all container image projects from
# https://github.com/linuxserver/docker-jenkins-builder/blob/master/.editorconfig
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
# trim_trailing_whitespace may cause unintended issues and should not be globally set true
trim_trailing_whitespace = false
[{Dockerfile*,**.yml}]
indent_style = space
indent_size = 2
[{**.sh,root/etc/cont-init.d/**,root/etc/services.d/**}]
indent_style = space
indent_size = 4

View File

@@ -4,7 +4,7 @@
* While contributing make sure to make all your changes before creating a Pull Request, as our pipeline builds each commit after the PR is open. * While contributing make sure to make all your changes before creating a Pull Request, as our pipeline builds each commit after the PR is open.
* Read, and fill the Pull Request template * Read, and fill the Pull Request template
* If this is a fix for a typo in code or documentation in the README please file an issue * If this is a fix for a typo (in code, documentation, or the README) please file an issue and let us sort it out. We do not need a PR
* If the PR is addressing an existing issue include, closes #\<issue number>, in the body of the PR commit message * If the PR is addressing an existing issue include, closes #\<issue number>, in the body of the PR commit message
* If you want to discuss changes, you can also bring it up in [#dev-talk](https://discordapp.com/channels/354974912613449730/757585807061155840) in our [Discord server](https://discord.gg/YWrKVTn) * If you want to discuss changes, you can also bring it up in [#dev-talk](https://discordapp.com/channels/354974912613449730/757585807061155840) in our [Discord server](https://discord.gg/YWrKVTn)
@@ -96,7 +96,7 @@ If you are proposing additional packages to be added, ensure that you added the
### Testing your changes ### Testing your changes
``` ```bash
git clone https://github.com/linuxserver/docker-tvheadend.git git clone https://github.com/linuxserver/docker-tvheadend.git
cd docker-tvheadend cd docker-tvheadend
docker build \ docker build \
@@ -106,13 +106,14 @@ docker build \
``` ```
The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static` The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
```
```bash
docker run --rm --privileged multiarch/qemu-user-static:register --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
``` ```
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`. Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
## Update the chagelog ## Update the changelog
If you are modifying the Dockerfiles or any of the startup scripts in [root](https://github.com/linuxserver/docker-tvheadend/tree/master/root), add an entry to the changelog If you are modifying the Dockerfiles or any of the startup scripts in [root](https://github.com/linuxserver/docker-tvheadend/tree/master/root), add an entry to the changelog

View File

@@ -6,7 +6,7 @@
<!--- Before submitting a pull request please check the following --> <!--- Before submitting a pull request please check the following -->
<!--- If this is a fix for a typo in code or documentation in the README please file an issue and let us sort it out we do not need a PR --> <!--- If this is a fix for a typo (in code, documentation, or the README) please file an issue and let us sort it out. We do not need a PR -->
<!--- Ask yourself if this modification is something the whole userbase will benefit from, if this is a specific change for corner case functionality or plugins please look at making a Docker Mod or local script https://blog.linuxserver.io/2019/09/14/customizing-our-containers/ --> <!--- Ask yourself if this modification is something the whole userbase will benefit from, if this is a specific change for corner case functionality or plugins please look at making a Docker Mod or local script https://blog.linuxserver.io/2019/09/14/customizing-our-containers/ -->
<!--- That if the PR is addressing an existing issue include, closes #<issue number> , in the body of the PR commit message --> <!--- That if the PR is addressing an existing issue include, closes #<issue number> , in the body of the PR commit message -->
<!--- You have included links to any files / patches etc your PR may be using in the body of the PR commit message --> <!--- You have included links to any files / patches etc your PR may be using in the body of the PR commit message -->

View File

@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v1 - uses: actions/stale@v3
with: with:
stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions." stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions."
stale-pr-message: "This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions." stale-pr-message: "This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions."

View File

@@ -1,9 +1,9 @@
FROM ghcr.io/linuxserver/baseimage-alpine:3.12 as buildstage FROM ghcr.io/linuxserver/baseimage-alpine:3.15 as buildstage
############## build stage ############## ############## build stage ##############
# package versions # package versions
ARG ARGTABLE_VER="2.13" ARG ARGTABLE_VER="2.13"
ARG XMLTV_VER="v0.6.3" ARG XMLTV_VER="v1.0.0"
# environment settings # environment settings
ARG TZ="Europe/Oslo" ARG TZ="Europe/Oslo"
@@ -52,7 +52,6 @@ RUN \
perl-capture-tiny \ perl-capture-tiny \
perl-cgi \ perl-cgi \
perl-compress-raw-zlib \ perl-compress-raw-zlib \
perl-data-dumper \
perl-date-manip \ perl-date-manip \
perl-datetime \ perl-datetime \
perl-datetime-format-strptime \ perl-datetime-format-strptime \
@@ -70,7 +69,6 @@ RUN \
perl-html-tree \ perl-html-tree \
perl-http-cookies \ perl-http-cookies \
perl-io \ perl-io \
perl-io-compress \
perl-io-html \ perl-io-html \
perl-io-socket-ssl \ perl-io-socket-ssl \
perl-io-stringy \ perl-io-stringy \
@@ -103,7 +101,7 @@ RUN \
perl-xml-writer \ perl-xml-writer \
pkgconf \ pkgconf \
pngquant \ pngquant \
python2 \ python3 \
sdl-dev \ sdl-dev \
tar \ tar \
uriparser-dev \ uriparser-dev \
@@ -172,6 +170,7 @@ RUN \
--disable-avahi \ --disable-avahi \
--disable-dbus_1 \ --disable-dbus_1 \
--disable-bintray_cache \ --disable-bintray_cache \
--disable-execinfo \
--disable-hdhomerun_static \ --disable-hdhomerun_static \
--enable-hdhomerun_client \ --enable-hdhomerun_client \
--enable-libav \ --enable-libav \
@@ -182,6 +181,7 @@ RUN \
--localstatedir=/var \ --localstatedir=/var \
--mandir=/usr/share/man \ --mandir=/usr/share/man \
--prefix=/usr \ --prefix=/usr \
--python=python3 \
--sysconfdir=/config && \ --sysconfdir=/config && \
make -j 2 && \ make -j 2 && \
make DESTDIR=/tmp/tvheadend-build install make DESTDIR=/tmp/tvheadend-build install
@@ -219,7 +219,7 @@ RUN \
make DESTDIR=/tmp/comskip-build install make DESTDIR=/tmp/comskip-build install
############## runtime stage ############## ############## runtime stage ##############
FROM ghcr.io/linuxserver/baseimage-alpine:3.12 FROM ghcr.io/linuxserver/baseimage-alpine:3.15
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -247,6 +247,7 @@ RUN \
libssl1.1 \ libssl1.1 \
libva \ libva \
libva-intel-driver \ libva-intel-driver \
intel-media-driver \
mesa-dri-ati \ mesa-dri-ati \
libvpx \ libvpx \
libxml2 \ libxml2 \
@@ -261,7 +262,6 @@ RUN \
perl-capture-tiny \ perl-capture-tiny \
perl-cgi \ perl-cgi \
perl-compress-raw-zlib \ perl-compress-raw-zlib \
perl-data-dumper \
perl-date-manip \ perl-date-manip \
perl-datetime \ perl-datetime \
perl-datetime-format-strptime \ perl-datetime-format-strptime \
@@ -278,7 +278,6 @@ RUN \
perl-html-tree \ perl-html-tree \
perl-http-cookies \ perl-http-cookies \
perl-io \ perl-io \
perl-io-compress \
perl-io-html \ perl-io-html \
perl-io-socket-ssl \ perl-io-socket-ssl \
perl-io-stringy \ perl-io-stringy \
@@ -310,7 +309,7 @@ RUN \
perl-xml-twig \ perl-xml-twig \
perl-xml-writer \ perl-xml-writer \
py3-requests \ py3-requests \
python2 \ python3 \
tar \ tar \
uriparser \ uriparser \
wget \ wget \

View File

@@ -1,9 +1,9 @@
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.12 as buildstage FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.15 as buildstage
############## build stage ############## ############## build stage ##############
# package versions # package versions
ARG ARGTABLE_VER="2.13" ARG ARGTABLE_VER="2.13"
ARG XMLTV_VER="v0.6.3" ARG XMLTV_VER="v1.0.0"
# environment settings # environment settings
ARG TZ="Europe/Oslo" ARG TZ="Europe/Oslo"
@@ -51,7 +51,6 @@ RUN \
perl-capture-tiny \ perl-capture-tiny \
perl-cgi \ perl-cgi \
perl-compress-raw-zlib \ perl-compress-raw-zlib \
perl-data-dumper \
perl-date-manip \ perl-date-manip \
perl-datetime \ perl-datetime \
perl-datetime-format-strptime \ perl-datetime-format-strptime \
@@ -69,7 +68,6 @@ RUN \
perl-html-tree \ perl-html-tree \
perl-http-cookies \ perl-http-cookies \
perl-io \ perl-io \
perl-io-compress \
perl-io-html \ perl-io-html \
perl-io-socket-ssl \ perl-io-socket-ssl \
perl-io-stringy \ perl-io-stringy \
@@ -102,7 +100,7 @@ RUN \
perl-xml-writer \ perl-xml-writer \
pkgconf \ pkgconf \
pngquant \ pngquant \
python2 \ python3 \
sdl-dev \ sdl-dev \
tar \ tar \
uriparser-dev \ uriparser-dev \
@@ -171,6 +169,7 @@ RUN \
--disable-avahi \ --disable-avahi \
--disable-dbus_1 \ --disable-dbus_1 \
--disable-bintray_cache \ --disable-bintray_cache \
--disable-execinfo \
--disable-hdhomerun_static \ --disable-hdhomerun_static \
--enable-hdhomerun_client \ --enable-hdhomerun_client \
--enable-libav \ --enable-libav \
@@ -180,6 +179,7 @@ RUN \
--localstatedir=/var \ --localstatedir=/var \
--mandir=/usr/share/man \ --mandir=/usr/share/man \
--prefix=/usr \ --prefix=/usr \
--python=python3 \
--sysconfdir=/config && \ --sysconfdir=/config && \
make -j 2 && \ make -j 2 && \
make DESTDIR=/tmp/tvheadend-build install make DESTDIR=/tmp/tvheadend-build install
@@ -217,7 +217,7 @@ RUN \
make DESTDIR=/tmp/comskip-build install make DESTDIR=/tmp/comskip-build install
############## runtime stage ############## ############## runtime stage ##############
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.12 FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.15
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -256,7 +256,6 @@ RUN \
perl-capture-tiny \ perl-capture-tiny \
perl-cgi \ perl-cgi \
perl-compress-raw-zlib \ perl-compress-raw-zlib \
perl-data-dumper \
perl-date-manip \ perl-date-manip \
perl-datetime \ perl-datetime \
perl-datetime-format-strptime \ perl-datetime-format-strptime \
@@ -273,7 +272,6 @@ RUN \
perl-html-tree \ perl-html-tree \
perl-http-cookies \ perl-http-cookies \
perl-io \ perl-io \
perl-io-compress \
perl-io-html \ perl-io-html \
perl-io-socket-ssl \ perl-io-socket-ssl \
perl-io-stringy \ perl-io-stringy \
@@ -305,7 +303,7 @@ RUN \
perl-xml-twig \ perl-xml-twig \
perl-xml-writer \ perl-xml-writer \
py3-requests \ py3-requests \
python2 \ python3 \
tar \ tar \
uriparser \ uriparser \
wget \ wget \

View File

@@ -1,9 +1,9 @@
FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.12 as buildstage FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.15 as buildstage
############## build stage ############## ############## build stage ##############
# package versions # package versions
ARG ARGTABLE_VER="2.13" ARG ARGTABLE_VER="2.13"
ARG XMLTV_VER="v0.6.3" ARG XMLTV_VER="v1.0.0"
# environment settings # environment settings
ARG TZ="Europe/Oslo" ARG TZ="Europe/Oslo"
@@ -51,7 +51,6 @@ RUN \
perl-capture-tiny \ perl-capture-tiny \
perl-cgi \ perl-cgi \
perl-compress-raw-zlib \ perl-compress-raw-zlib \
perl-data-dumper \
perl-date-manip \ perl-date-manip \
perl-datetime \ perl-datetime \
perl-datetime-format-strptime \ perl-datetime-format-strptime \
@@ -69,7 +68,6 @@ RUN \
perl-html-tree \ perl-html-tree \
perl-http-cookies \ perl-http-cookies \
perl-io \ perl-io \
perl-io-compress \
perl-io-html \ perl-io-html \
perl-io-socket-ssl \ perl-io-socket-ssl \
perl-io-stringy \ perl-io-stringy \
@@ -102,7 +100,7 @@ RUN \
perl-xml-writer \ perl-xml-writer \
pkgconf \ pkgconf \
pngquant \ pngquant \
python2 \ python3 \
sdl-dev \ sdl-dev \
tar \ tar \
uriparser-dev \ uriparser-dev \
@@ -171,6 +169,7 @@ RUN \
--disable-avahi \ --disable-avahi \
--disable-dbus_1 \ --disable-dbus_1 \
--disable-bintray_cache \ --disable-bintray_cache \
--disable-execinfo \
--disable-hdhomerun_static \ --disable-hdhomerun_static \
--enable-hdhomerun_client \ --enable-hdhomerun_client \
--enable-libav \ --enable-libav \
@@ -179,7 +178,9 @@ RUN \
--infodir=/usr/share/info \ --infodir=/usr/share/info \
--localstatedir=/var \ --localstatedir=/var \
--mandir=/usr/share/man \ --mandir=/usr/share/man \
--nowerror \
--prefix=/usr \ --prefix=/usr \
--python=python3 \
--sysconfdir=/config && \ --sysconfdir=/config && \
make -j 2 && \ make -j 2 && \
make DESTDIR=/tmp/tvheadend-build install make DESTDIR=/tmp/tvheadend-build install
@@ -217,7 +218,7 @@ RUN \
make DESTDIR=/tmp/comskip-build install make DESTDIR=/tmp/comskip-build install
############## runtime stage ############## ############## runtime stage ##############
FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.12 FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.15
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -256,7 +257,6 @@ RUN \
perl-capture-tiny \ perl-capture-tiny \
perl-cgi \ perl-cgi \
perl-compress-raw-zlib \ perl-compress-raw-zlib \
perl-data-dumper \
perl-date-manip \ perl-date-manip \
perl-datetime \ perl-datetime \
perl-datetime-format-strptime \ perl-datetime-format-strptime \
@@ -273,7 +273,6 @@ RUN \
perl-html-tree \ perl-html-tree \
perl-http-cookies \ perl-http-cookies \
perl-io \ perl-io \
perl-io-compress \
perl-io-html \ perl-io-html \
perl-io-socket-ssl \ perl-io-socket-ssl \
perl-io-stringy \ perl-io-stringy \
@@ -305,7 +304,7 @@ RUN \
perl-xml-twig \ perl-xml-twig \
perl-xml-writer \ perl-xml-writer \
py3-requests \ py3-requests \
python2 \ python3 \
tar \ tar \
uriparser \ uriparser \
wget \ wget \

231
Jenkinsfile vendored
View File

@@ -16,6 +16,7 @@ pipeline {
GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab') GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab')
GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0') GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0')
GITLAB_NAMESPACE=credentials('gitlab-namespace-id') GITLAB_NAMESPACE=credentials('gitlab-namespace-id')
SCARF_TOKEN=credentials('scarf_api_key')
EXT_GIT_BRANCH = 'master' EXT_GIT_BRANCH = 'master'
EXT_USER = 'tvheadend' EXT_USER = 'tvheadend'
EXT_REPO = 'tvheadend' EXT_REPO = 'tvheadend'
@@ -58,7 +59,7 @@ pipeline {
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT 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.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
env.PULL_REQUEST = env.CHANGE_ID env.PULL_REQUEST = env.CHANGE_ID
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.md ./.github/ISSUE_TEMPLATE/issue.feature.md ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/greetings.yml ./.github/workflows/stale.yml ./.github/workflows/package_trigger.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/external_trigger.yml ./.github/workflows/external_trigger_scheduler.yml' env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.md ./.github/ISSUE_TEMPLATE/issue.feature.md ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/stale.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
} }
script{ script{
env.LS_RELEASE_NUMBER = sh( env.LS_RELEASE_NUMBER = sh(
@@ -106,7 +107,7 @@ pipeline {
steps{ steps{
script{ script{
env.EXT_RELEASE = sh( env.EXT_RELEASE = sh(
script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq -r '. | .sha' | cut -c1-8 ''', script: '''curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq -r '. | .sha' | cut -c1-8 ''',
returnStdout: true).trim() returnStdout: true).trim()
} }
} }
@@ -126,6 +127,30 @@ pipeline {
env.EXT_RELEASE_CLEAN = sh( env.EXT_RELEASE_CLEAN = sh(
script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g' ''', script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g' ''',
returnStdout: true).trim() returnStdout: true).trim()
def semver = env.EXT_RELEASE_CLEAN =~ /(\d+)\.(\d+)\.(\d+)/
if (semver.find()) {
env.SEMVER = "${semver[0][1]}.${semver[0][2]}.${semver[0][3]}"
} else {
semver = env.EXT_RELEASE_CLEAN =~ /(\d+)\.(\d+)(?:\.(\d+))?(.*)/
if (semver.find()) {
if (semver[0][3]) {
env.SEMVER = "${semver[0][1]}.${semver[0][2]}.${semver[0][3]}"
} else if (!semver[0][3] && !semver[0][4]) {
env.SEMVER = "${semver[0][1]}.${semver[0][2]}.${(new Date()).format('YYYYMMdd')}"
}
}
}
if (env.SEMVER != null) {
if (BRANCH_NAME != "master" && BRANCH_NAME != "main") {
env.SEMVER = "${env.SEMVER}-${BRANCH_NAME}"
}
println("SEMVER: ${env.SEMVER}")
} else {
println("No SEMVER detected")
}
} }
} }
} }
@@ -140,6 +165,7 @@ pipeline {
env.IMAGE = env.DOCKERHUB_IMAGE env.IMAGE = env.DOCKERHUB_IMAGE
env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/' + env.CONTAINER_NAME env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/' + env.CONTAINER_NAME
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/' + env.CONTAINER_NAME env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/' + env.CONTAINER_NAME
env.QUAYIMAGE = 'quay.io/linuxserver.io/' + env.CONTAINER_NAME
if (env.MULTIARCH == 'true') { if (env.MULTIARCH == 'true') {
env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
} else { } else {
@@ -162,6 +188,7 @@ pipeline {
env.IMAGE = env.DEV_DOCKERHUB_IMAGE env.IMAGE = env.DEV_DOCKERHUB_IMAGE
env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/lsiodev-' + env.CONTAINER_NAME env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/lsiodev-' + env.CONTAINER_NAME
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lsiodev-' + env.CONTAINER_NAME env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lsiodev-' + env.CONTAINER_NAME
env.QUAYIMAGE = 'quay.io/linuxserver.io/lsiodev-' + env.CONTAINER_NAME
if (env.MULTIARCH == 'true') { if (env.MULTIARCH == 'true') {
env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v7-' + 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 env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v7-' + 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 { } else {
@@ -184,6 +211,7 @@ pipeline {
env.IMAGE = env.PR_DOCKERHUB_IMAGE env.IMAGE = env.PR_DOCKERHUB_IMAGE
env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/lspipepr-' + env.CONTAINER_NAME env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/lspipepr-' + env.CONTAINER_NAME
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lspipepr-' + env.CONTAINER_NAME env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lspipepr-' + env.CONTAINER_NAME
env.QUAYIMAGE = 'quay.io/linuxserver.io/lspipepr-' + env.CONTAINER_NAME
if (env.MULTIARCH == 'true') { if (env.MULTIARCH == 'true') {
env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v7-' + 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 env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v7-' + 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 { } else {
@@ -270,7 +298,6 @@ pipeline {
git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO} git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO}
cd ${TEMPDIR}/repo/${LS_REPO} cd ${TEMPDIR}/repo/${LS_REPO}
git checkout -f master git checkout -f master
cd ${TEMPDIR}/docker-${CONTAINER_NAME}
for i in ${TEMPLATES_TO_DELETE}; do for i in ${TEMPLATES_TO_DELETE}; do
git rm "${i}" git rm "${i}"
done done
@@ -317,22 +344,24 @@ pipeline {
git commit -m 'Bot Updating Documentation' git commit -m 'Bot Updating Documentation'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all
fi fi
mkdir -p ${TEMPDIR}/unraid mkdir -p ${TEMPDIR}/unraid
git clone https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-templates git clone https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-templates
git clone https://github.com/linuxserver/templates.git ${TEMPDIR}/unraid/templates git clone https://github.com/linuxserver/templates.git ${TEMPDIR}/unraid/templates
if [[ -f ${TEMPDIR}/unraid/docker-templates/linuxserver.io/img/${CONTAINER_NAME}-icon.png ]]; then if [[ -f ${TEMPDIR}/unraid/docker-templates/linuxserver.io/img/${CONTAINER_NAME}-logo.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 sed -i "s|master/linuxserver.io/img/linuxserver-ls-logo.png|master/linuxserver.io/img/${CONTAINER_NAME}-logo.png|" ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml
fi 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}" == "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
cd ${TEMPDIR}/unraid/templates/
if grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list; then if grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list; then
echo "Image is on the ignore list, skipping Unraid template upload" echo "Image is on the ignore list, removing Unraid template"
git rm unraid/${CONTAINER_NAME}.xml || :
git commit -m 'Bot Removing Deprecated Unraid Template' || :
else else
cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml ${TEMPDIR}/unraid/templates/unraid/ cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml ${TEMPDIR}/unraid/templates/unraid/
cd ${TEMPDIR}/unraid/templates/
git add unraid/${CONTAINER_NAME}.xml git add unraid/${CONTAINER_NAME}.xml
git commit -m 'Bot Updating Unraid Template' git commit -m 'Bot Updating Unraid Template'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git --all
fi fi
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git --all
fi fi
rm -Rf ${TEMPDIR}''' rm -Rf ${TEMPDIR}'''
script{ script{
@@ -378,33 +407,94 @@ pipeline {
"visibility":"public"}' ''' "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
set -e
PACKAGE_UUID=$(curl -X GET -H "Authorization: Bearer ${SCARF_TOKEN}" https://scarf.sh/api/v1/organizations/linuxserver-ci/packages | jq -r '.[] | select(.name=="linuxserver/tvheadend") | .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/tvheadend",\
"shortDescription":"example description",\
"libraryType":"docker",\
"website":"https://github.com/linuxserver/docker-tvheadend",\
"backendUrl":"https://ghcr.io/linuxserver/tvheadend",\
"publicUrl":"https://lscr.io/linuxserver/tvheadend"}' || :
else
echo "Package already exists on Scarf.sh"
fi
'''
}
}
/* ############### /* ###############
Build Container Build Container
############### */ ############### */
// Build Docker container for push to LS Repo // Build Docker container for push to LS Repo
stage('Build-Single') { stage('Build-Single') {
when { when {
environment name: 'MULTIARCH', value: 'false' expression {
env.MULTIARCH == 'false' || params.PACKAGE_CHECK == 'true'
}
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
steps { steps {
echo "Running on node: ${NODE_NAME}" echo "Running on node: ${NODE_NAME}"
sh "docker build --no-cache --pull -t ${IMAGE}:${META_TAG} \ sh "docker build \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-tvheadend/packages\" \
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-tvheadend\" \
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-tvheadend\" \
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Tvheadend\" \
--label \"org.opencontainers.image.description=[Tvheadend](https://www.tvheadend.org/) works as a proxy server: is a TV streaming server and recorder for Linux, FreeBSD and Android supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, ISDB-T, IPTV, SAT>IP and HDHomeRun as input sources. Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming. Multiple EPG sources are supported (over-the-air DVB and ATSC including OpenTV DVB extensions, XMLTV, PyXML). \" \
--no-cache --pull -t ${IMAGE}:${META_TAG} \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
} }
} }
// Build MultiArch Docker containers for push to LS Repo // Build MultiArch Docker containers for push to LS Repo
stage('Build-Multi') { stage('Build-Multi') {
when { when {
environment name: 'MULTIARCH', value: 'true' allOf {
environment name: 'MULTIARCH', value: 'true'
expression { params.PACKAGE_CHECK == 'false' }
}
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
parallel { parallel {
stage('Build X86') { stage('Build X86') {
steps { steps {
echo "Running on node: ${NODE_NAME}" echo "Running on node: ${NODE_NAME}"
sh "docker build --no-cache --pull -t ${IMAGE}:amd64-${META_TAG} \ sh "docker build \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-tvheadend/packages\" \
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-tvheadend\" \
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-tvheadend\" \
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Tvheadend\" \
--label \"org.opencontainers.image.description=[Tvheadend](https://www.tvheadend.org/) works as a proxy server: is a TV streaming server and recorder for Linux, FreeBSD and Android supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, ISDB-T, IPTV, SAT>IP and HDHomeRun as input sources. Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming. Multiple EPG sources are supported (over-the-air DVB and ATSC including OpenTV DVB extensions, XMLTV, PyXML). \" \
--no-cache --pull -t ${IMAGE}:amd64-${META_TAG} \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
} }
} }
stage('Build ARMHF') { stage('Build ARMHF') {
@@ -417,8 +507,21 @@ pipeline {
sh '''#! /bin/bash sh '''#! /bin/bash
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
''' '''
sh "docker build --no-cache --pull -f Dockerfile.armhf -t ${IMAGE}:arm32v7-${META_TAG} \ sh "docker build \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-tvheadend/packages\" \
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-tvheadend\" \
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-tvheadend\" \
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Tvheadend\" \
--label \"org.opencontainers.image.description=[Tvheadend](https://www.tvheadend.org/) works as a proxy server: is a TV streaming server and recorder for Linux, FreeBSD and Android supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, ISDB-T, IPTV, SAT>IP and HDHomeRun as input sources. Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming. Multiple EPG sources are supported (over-the-air DVB and ATSC including OpenTV DVB extensions, XMLTV, PyXML). \" \
--no-cache --pull -f Dockerfile.armhf -t ${IMAGE}:arm32v7-${META_TAG} \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
sh "docker tag ${IMAGE}:arm32v7-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}" sh "docker tag ${IMAGE}:arm32v7-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}"
retry(5) { retry(5) {
sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}" sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}"
@@ -438,8 +541,21 @@ pipeline {
sh '''#! /bin/bash sh '''#! /bin/bash
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
''' '''
sh "docker build --no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \ sh "docker build \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-tvheadend/packages\" \
--label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-tvheadend\" \
--label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-tvheadend\" \
--label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
--label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.vendor=linuxserver.io\" \
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Tvheadend\" \
--label \"org.opencontainers.image.description=[Tvheadend](https://www.tvheadend.org/) works as a proxy server: is a TV streaming server and recorder for Linux, FreeBSD and Android supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, ISDB-T, IPTV, SAT>IP and HDHomeRun as input sources. Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming. Multiple EPG sources are supported (over-the-air DVB and ATSC including OpenTV DVB extensions, XMLTV, PyXML). \" \
--no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
sh "docker tag ${IMAGE}:arm64v8-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" sh "docker tag ${IMAGE}:arm64v8-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
retry(5) { retry(5) {
sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}" sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
@@ -462,7 +578,7 @@ pipeline {
sh '''#! /bin/bash sh '''#! /bin/bash
set -e set -e
TEMPDIR=$(mktemp -d) TEMPDIR=$(mktemp -d)
if [ "${MULTIARCH}" == "true" ]; then if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
LOCAL_CONTAINER=${IMAGE}:amd64-${META_TAG} LOCAL_CONTAINER=${IMAGE}:amd64-${META_TAG}
else else
LOCAL_CONTAINER=${IMAGE}:${META_TAG} LOCAL_CONTAINER=${IMAGE}:${META_TAG}
@@ -477,6 +593,15 @@ pipeline {
apt list -qq --installed | sed "s#/.*now ##g" | cut -d" " -f1 > /tmp/package_versions.txt && \ apt list -qq --installed | sed "s#/.*now ##g" | cut -d" " -f1 > /tmp/package_versions.txt && \
sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \ sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
chmod 777 /tmp/package_versions.txt' chmod 777 /tmp/package_versions.txt'
elif [ "${DIST_IMAGE}" == "fedora" ]; then
docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
rpm -qa > /tmp/package_versions.txt && \
sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
chmod 777 /tmp/package_versions.txt'
elif [ "${DIST_IMAGE}" == "arch" ]; then
docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
pacman -Q > /tmp/package_versions.txt && \
chmod 777 /tmp/package_versions.txt'
fi fi
NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 ) 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" echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github"
@@ -514,7 +639,7 @@ pipeline {
steps { steps {
sh '''#! /bin/bash sh '''#! /bin/bash
echo "Packages were updated. Cleaning up the image and exiting." echo "Packages were updated. Cleaning up the image and exiting."
if [ "${MULTIARCH}" == "true" ]; then if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
docker rmi ${IMAGE}:amd64-${META_TAG} docker rmi ${IMAGE}:amd64-${META_TAG}
else else
docker rmi ${IMAGE}:${META_TAG} docker rmi ${IMAGE}:${META_TAG}
@@ -538,7 +663,7 @@ pipeline {
steps { steps {
sh '''#! /bin/bash sh '''#! /bin/bash
echo "There are no package updates. Cleaning up the image and exiting." echo "There are no package updates. Cleaning up the image and exiting."
if [ "${MULTIARCH}" == "true" ]; then if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
docker rmi ${IMAGE}:amd64-${META_TAG} docker rmi ${IMAGE}:amd64-${META_TAG}
else else
docker rmi ${IMAGE}:${META_TAG} docker rmi ${IMAGE}:${META_TAG}
@@ -613,6 +738,12 @@ pipeline {
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207',
usernameVariable: 'DOCKERUSER', usernameVariable: 'DOCKERUSER',
passwordVariable: 'DOCKERPASS' passwordVariable: 'DOCKERPASS'
],
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot',
usernameVariable: 'QUAYUSER',
passwordVariable: 'QUAYPASS'
] ]
]) { ]) {
retry(5) { retry(5) {
@@ -621,22 +752,32 @@ pipeline {
echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --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 $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${IMAGE}"; do echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
docker tag ${IMAGE}:${META_TAG} ${PUSHIMAGE}:${META_TAG} docker tag ${IMAGE}:${META_TAG} ${PUSHIMAGE}:${META_TAG}
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:latest docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:latest
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG} docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER}
fi
docker push ${PUSHIMAGE}:latest docker push ${PUSHIMAGE}:latest
docker push ${PUSHIMAGE}:${META_TAG} docker push ${PUSHIMAGE}:${META_TAG}
docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG} docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker push ${PUSHIMAGE}:${SEMVER}
fi
done done
''' '''
} }
sh '''#! /bin/bash sh '''#! /bin/bash
for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${IMAGE}"; do for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
docker rmi \ docker rmi \
${DELETEIMAGE}:${META_TAG} \ ${DELETEIMAGE}:${META_TAG} \
${DELETEIMAGE}:${EXT_RELEASE_TAG} \ ${DELETEIMAGE}:${EXT_RELEASE_TAG} \
${DELETEIMAGE}:latest || : ${DELETEIMAGE}:latest || :
if [ -n "${SEMVER}" ]; then
docker rmi ${DELETEIMAGE}:${SEMVER} || :
fi
done done
''' '''
} }
@@ -655,6 +796,12 @@ pipeline {
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207',
usernameVariable: 'DOCKERUSER', usernameVariable: 'DOCKERUSER',
passwordVariable: 'DOCKERPASS' passwordVariable: 'DOCKERPASS'
],
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot',
usernameVariable: 'QUAYUSER',
passwordVariable: 'QUAYPASS'
] ]
]) { ]) {
retry(5) { retry(5) {
@@ -663,13 +810,14 @@ pipeline {
echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --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 $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [ "${CI}" == "false" ]; then if [ "${CI}" == "false" ]; then
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG} docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG}
docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
fi fi
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}"; do for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
docker tag ${IMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} docker tag ${IMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG}
docker tag ${IMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${META_TAG} docker tag ${IMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${META_TAG}
docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
@@ -679,6 +827,11 @@ pipeline {
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG}
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER}
docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${SEMVER}
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
docker push ${MANIFESTIMAGE}:amd64-${META_TAG} docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
docker push ${MANIFESTIMAGE}:arm32v7-${META_TAG} docker push ${MANIFESTIMAGE}:arm32v7-${META_TAG}
docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG} docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
@@ -688,6 +841,11 @@ pipeline {
docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
docker push ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} docker push ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG}
docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker push ${MANIFESTIMAGE}:amd64-${SEMVER}
docker push ${MANIFESTIMAGE}:arm32v7-${SEMVER}
docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
docker manifest push --purge ${MANIFESTIMAGE}:latest || : docker manifest push --purge ${MANIFESTIMAGE}:latest || :
docker manifest create ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm32v7-latest ${MANIFESTIMAGE}:arm64v8-latest docker manifest create ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm32v7-latest ${MANIFESTIMAGE}:arm64v8-latest
docker manifest annotate ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:arm32v7-latest --os linux --arch arm docker manifest annotate ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:arm32v7-latest --os linux --arch arm
@@ -700,14 +858,23 @@ pipeline {
docker manifest create ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} docker manifest create ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} --os linux --arch arm docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} --os linux --arch arm
docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} --os linux --arch arm64 --variant v8 docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} --os linux --arch arm64 --variant v8
if [ -n "${SEMVER}" ]; then
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER} || :
docker manifest create ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm32v7-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm32v7-${SEMVER} --os linux --arch arm
docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} --os linux --arch arm64 --variant v8
fi
docker manifest push --purge ${MANIFESTIMAGE}:latest docker manifest push --purge ${MANIFESTIMAGE}:latest
docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG} docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG}
docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER}
fi
done done
''' '''
} }
sh '''#! /bin/bash sh '''#! /bin/bash
for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${IMAGE}"; do for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
docker rmi \ docker rmi \
${DELETEIMAGE}:amd64-${META_TAG} \ ${DELETEIMAGE}:amd64-${META_TAG} \
${DELETEIMAGE}:amd64-latest \ ${DELETEIMAGE}:amd64-latest \
@@ -718,6 +885,12 @@ pipeline {
${DELETEIMAGE}:arm64v8-${META_TAG} \ ${DELETEIMAGE}:arm64v8-${META_TAG} \
${DELETEIMAGE}:arm64v8-latest \ ${DELETEIMAGE}:arm64v8-latest \
${DELETEIMAGE}:arm64v8-${EXT_RELEASE_TAG} || : ${DELETEIMAGE}:arm64v8-${EXT_RELEASE_TAG} || :
if [ -n "${SEMVER}" ]; then
docker rmi \
${DELETEIMAGE}:amd64-${SEMVER} \
${DELETEIMAGE}:arm32v7-${SEMVER} \
${DELETEIMAGE}:arm64v8-${SEMVER} || :
fi
done done
docker rmi \ docker rmi \
ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} \ ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} \
@@ -746,11 +919,11 @@ pipeline {
"tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' ''' "tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
echo "Pushing New release for Tag" echo "Pushing New release for Tag"
sh '''#! /bin/bash sh '''#! /bin/bash
curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq '. | .commit.message' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_RELEASE_CLEAN} | jq '.commit.message' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json
echo '{"tag_name":"'${META_TAG}'",\ echo '{"tag_name":"'${META_TAG}'",\
"target_commitish": "master",\ "target_commitish": "master",\
"name": "'${META_TAG}'",\ "name": "'${META_TAG}'",\
"body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**'${EXT_REPO}' Changes:**\\n\\n' > start
printf '","draft": false,"prerelease": false}' >> releasebody.json printf '","draft": false,"prerelease": false}' >> releasebody.json
paste -d'\\0' start releasebody.json > releasebody.json.done 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''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
@@ -775,7 +948,7 @@ pipeline {
set -e set -e
TEMPDIR=$(mktemp -d) TEMPDIR=$(mktemp -d)
docker pull ghcr.io/linuxserver/jenkins-builder:latest 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 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 pull ghcr.io/linuxserver/readme-sync
docker run --rm=true \ docker run --rm=true \
-e DOCKERHUB_USERNAME=$DOCKERUSER \ -e DOCKERHUB_USERNAME=$DOCKERUSER \

253
README.md
View File

@@ -1,5 +1,5 @@
<!-- DO NOT EDIT THIS FILE MANUALLY --> <!-- DO NOT EDIT THIS FILE MANUALLY -->
<!-- Please read the CONTRIBUTING.md --> <!-- Please read the https://github.com/linuxserver/docker-tvheadend/blob/master/.github/CONTRIBUTING.md -->
[![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)](https://linuxserver.io)
@@ -12,13 +12,14 @@
The [LinuxServer.io](https://linuxserver.io) team brings you another container release featuring: The [LinuxServer.io](https://linuxserver.io) team brings you another container release featuring:
* regular and timely application updates * regular and timely application updates
* easy user mappings (PGID, PUID) * easy user mappings (PGID, PUID)
* custom base image with s6 overlay * 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 * weekly base OS updates with common layers across the entire LinuxServer.io ecosystem to minimise space usage, down time and bandwidth
* regular security updates * regular security updates
Find us at: Find us at:
* [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more! * [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more!
* [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team. * [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team.
* [Discourse](https://discourse.linuxserver.io) - post on our community forum. * [Discourse](https://discourse.linuxserver.io) - post on our community forum.
@@ -28,11 +29,12 @@ Find us at:
# [linuxserver/tvheadend](https://github.com/linuxserver/docker-tvheadend) # [linuxserver/tvheadend](https://github.com/linuxserver/docker-tvheadend)
[![Scarf.io pulls](https://scarf.sh/installs-badge/linuxserver-ci/linuxserver%2Ftvheadend?color=94398d&label-color=555555&logo-color=ffffff&style=for-the-badge&package-type=docker)](https://scarf.sh/gateway/linuxserver-ci/docker/linuxserver%2Ftvheadend)
[![GitHub Stars](https://img.shields.io/github/stars/linuxserver/docker-tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-tvheadend) [![GitHub Stars](https://img.shields.io/github/stars/linuxserver/docker-tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-tvheadend)
[![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-tvheadend/releases) [![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-tvheadend/releases)
[![GitHub Package Repository](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub%20Package&logo=github)](https://github.com/linuxserver/docker-tvheadend/packages) [![GitHub Package Repository](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub%20Package&logo=github)](https://github.com/linuxserver/docker-tvheadend/packages)
[![GitLab Container Registry](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitLab%20Registry&logo=gitlab)](https://gitlab.com/linuxserver.io/docker-tvheadend/container_registry) [![GitLab Container Registry](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitLab%20Registry&logo=gitlab)](https://gitlab.com/linuxserver.io/docker-tvheadend/container_registry)
[![MicroBadger Layers](https://img.shields.io/microbadger/layers/linuxserver/tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge)](https://microbadger.com/images/linuxserver/tvheadend "Get your own version badge on microbadger.com") [![Quay.io](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Quay.io)](https://quay.io/repository/linuxserver.io/tvheadend)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/tvheadend) [![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/tvheadend)
[![Docker Stars](https://img.shields.io/docker/stars/linuxserver/tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/tvheadend) [![Docker Stars](https://img.shields.io/docker/stars/linuxserver/tvheadend.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/tvheadend)
[![Jenkins Build](https://img.shields.io/jenkins/build?labelColor=555555&logoColor=ffffff&style=for-the-badge&jobUrl=https%3A%2F%2Fci.linuxserver.io%2Fjob%2FDocker-Pipeline-Builders%2Fjob%2Fdocker-tvheadend%2Fjob%2Fmaster%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-tvheadend/job/master/) [![Jenkins Build](https://img.shields.io/jenkins/build?labelColor=555555&logoColor=ffffff&style=for-the-badge&jobUrl=https%3A%2F%2Fci.linuxserver.io%2Fjob%2FDocker-Pipeline-Builders%2Fjob%2Fdocker-tvheadend%2Fjob%2Fmaster%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-tvheadend/job/master/)
@@ -42,14 +44,13 @@ Find us at:
Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming. Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming.
Multiple EPG sources are supported (over-the-air DVB and ATSC including OpenTV DVB extensions, XMLTV, PyXML). Multiple EPG sources are supported (over-the-air DVB and ATSC including OpenTV DVB extensions, XMLTV, PyXML).
[![tvheadend](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/tvheadend-big.png)](https://www.tvheadend.org/) [![tvheadend](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/tvheadend-big.png)](https://www.tvheadend.org/)
## Supported Architectures ## 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) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/). 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) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/).
Simply pulling `ghcr.io/linuxserver/tvheadend` should retrieve the correct image for your arch, but you can also pull specific arch images via tags. Simply pulling `lscr.io/linuxserver/tvheadend` should retrieve the correct image for your arch, but you can also pull specific arch images via tags.
The architectures supported by this image are: The architectures supported by this image are:
@@ -67,115 +68,7 @@ This image provides various versions that are available via tags. `latest` tag u
| :----: | --- | | :----: | --- |
| latest | Current latest release. | | latest | Current latest release. |
| release-4.2 | Latest release from 4.2 branch. | | release-4.2 | Latest release from 4.2 branch. |
| stable-4.2.1 | Old stable version. Will not be updated anymore! |
| stable-4.0.9 | Old stable version. Will not be updated anymore! |
## Usage
Here are some example snippets to help you get started creating a container.
### docker-compose ([recommended](https://docs.linuxserver.io/general/docker-compose))
Compatible with docker-compose v2 schemas.
```yaml
---
version: "2.1"
services:
tvheadend:
image: ghcr.io/linuxserver/tvheadend
container_name: tvheadend
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- RUN_OPTS=<run options here> #optional
volumes:
- <path to data>:/config
- <path to recordings>:/recordings
ports:
- 9981:9981
- 9982:9982
devices:
- /dev/dri:/dev/dri #optional
- /dev/dvb:/dev/dvb #optional
restart: unless-stopped
```
### docker cli
```
docker run -d \
--name=tvheadend \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/London \
-e RUN_OPTS=<run options here> `#optional` \
-p 9981:9981 \
-p 9982:9982 \
-v <path to data>:/config \
-v <path to recordings>:/recordings \
--device /dev/dri:/dev/dri `#optional` \
--device /dev/dvb:/dev/dvb `#optional` \
--restart unless-stopped \
ghcr.io/linuxserver/tvheadend
```
#### Host vs. Bridge
If you use IPTV, SAT>IP or HDHomeRun, you need to create the container with --net=host and remove the -p flags. This is because to work with these services Tvheadend requires a multicast address of `239.255.255.250` and a UDP port of `1900` which at this time is not possible with docker bridge mode.
If you have other host services which also use multicast such as SSDP/DLNA/Emby you may experience stabilty problems. These can be solved by giving tvheadend its own IP using macavlan.
## Parameters
Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `<external>:<internal>` 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 9981` | WebUI |
| `-p 9982` | HTSP server port. |
| `-e PUID=1000` | for UserID - see below for explanation |
| `-e PGID=1000` | for GroupID - see below for explanation |
| `-e TZ=Europe/London` | Specify a timezone to use EG Europe/London. |
| `-e RUN_OPTS=<run options here>` | Optionally specify additional arguments to be passed. See Additional runtime parameters. |
| `-v /config` | Where TVHeadend show store it's config files. |
| `-v /recordings` | Where you want the PVR to store recordings. |
| `--device /dev/dri` | Only needed if you want to use your AMD/Intel GPU for hardware accelerated video encoding (vaapi). |
| `--device /dev/dvb` | Only needed if you want to pass through a DVB card to the container. If you use IPTV or HDHomeRun you can leave it out. |
## Environment variables from files (Docker secrets)
You can set any environment variable from a file by using a special prepend `FILE__`.
As an example:
```
-e FILE__PASSWORD=/run/secrets/mysecretpassword
```
Will set the environment variable `PASSWORD` based on the contents of the `/run/secrets/mysecretpassword` file.
## Umask for running applications
For all of our images we provide the ability to override the default umask settings for services started within the containers using the optional `-e UMASK=022` setting.
Keep in mind umask is not chmod it subtracts from permissions based on it's value it does not add. Please read up [here](https://en.wikipedia.org/wiki/Umask) before asking for support.
## 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=1000` and `PGID=1000`, to find yours use `id user` as below:
```
$ id username
uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup)
```
&nbsp;
## Application Setup ## Application Setup
The setup depends if you run the one of the stable tags or use latest. Running latest is the easiest as it has a setup wizard. The setup depends if you run the one of the stable tags or use latest. Running latest is the easiest as it has a setup wizard.
@@ -229,20 +122,120 @@ For advanced setup of tvheadend, go to [Tvheadend][appurl]
**Picons** **Picons**
We have added all the picons from [picons.eu](https://picons.eu/) in the folder /picons. To enable the use of these picons, add the path to the Channel icon path in Configuration --> General --> Base. We have added all the picons from [picons](https://github.com/picons/picons) in the folder /picons. To enable the use of these picons, add the path to the Channel icon path in Configuration --> General --> Base.
You need to enable minimum advanced view level to see the picons options. You need to enable minimum advanced view level to see the picons options.
## Additional runtime parameters ## Additional runtime parameters
In some cases it might be necessary to start tvheadend with additional parameters, for example to enable debugging or specify webroot for reverse proxy. Be sure to have the right parameters set, as adding the wrong once might lead to the container not starting correctly. In some cases it might be necessary to start tvheadend with additional parameters, for example to enable debugging or specify webroot for reverse proxy. Be sure to have the right parameters set, as adding the wrong once might lead to the container not starting correctly.
## Usage
Here are some example snippets to help you get started creating a container.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
```yaml
---
version: "2.1"
services:
tvheadend:
image: lscr.io/linuxserver/tvheadend
container_name: tvheadend
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- RUN_OPTS=<run options here> #optional
volumes:
- <path to data>:/config
- <path to recordings>:/recordings
ports:
- 9981:9981
- 9982:9982
devices:
- /dev/dri:/dev/dri #optional
- /dev/dvb:/dev/dvb #optional
restart: unless-stopped
```
### docker cli ([click here for more info](https://docs.docker.com/engine/reference/commandline/cli/))
```bash
docker run -d \
--name=tvheadend \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/London \
-e RUN_OPTS=<run options here> `#optional` \
-p 9981:9981 \
-p 9982:9982 \
-v <path to data>:/config \
-v <path to recordings>:/recordings \
--device /dev/dri:/dev/dri `#optional` \
--device /dev/dvb:/dev/dvb `#optional` \
--restart unless-stopped \
lscr.io/linuxserver/tvheadend
```
#### Host vs. Bridge
If you use IPTV, SAT>IP or HDHomeRun, you need to create the container with --net=host and remove the -p flags. This is because to work with these services Tvheadend requires a multicast address of `239.255.255.250` and a UDP port of `1900` which at this time is not possible with docker bridge mode.
If you have other host services which also use multicast such as SSDP/DLNA/Emby you may experience stabilty problems. These can be solved by giving tvheadend its own IP using macvlan.
## Parameters
Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `<external>:<internal>` 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 9981` | WebUI |
| `-p 9982` | HTSP server port. |
| `-e PUID=1000` | for UserID - see below for explanation |
| `-e PGID=1000` | for GroupID - see below for explanation |
| `-e TZ=Europe/London` | Specify a timezone to use EG Europe/London. |
| `-e RUN_OPTS=<run options here>` | Optionally specify additional arguments to be passed. See Additional runtime parameters. |
| `-v /config` | Where TVHeadend show store it's config files. |
| `-v /recordings` | Where you want the PVR to store recordings. |
| `--device /dev/dri` | Only needed if you want to use your AMD/Intel GPU for hardware accelerated video encoding (vaapi). |
| `--device /dev/dvb` | Only needed if you want to pass through a DVB card to the container. If you use IPTV or HDHomeRun you can leave it out. |
## Environment variables from files (Docker secrets)
You can set any environment variable from a file by using a special prepend `FILE__`.
As an example:
```bash
-e FILE__PASSWORD=/run/secrets/mysecretpassword
```
Will set the environment variable `PASSWORD` based on the contents of the `/run/secrets/mysecretpassword` file.
## Umask for running applications
For all of our images we provide the ability to override the default umask settings for services started within the containers using the optional `-e UMASK=022` setting.
Keep in mind umask is not chmod it subtracts from permissions based on it's value it does not add. Please read up [here](https://en.wikipedia.org/wiki/Umask) before asking for support.
## 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=1000` and `PGID=1000`, to find yours use `id user` as below:
```bash
$ id username
uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup)
```
## Docker Mods ## Docker Mods
[![Docker Mods](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=tvheadend&query=%24.mods%5B%27tvheadend%27%5D.mod_count&url=https%3A%2F%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-mods%2Fmaster%2Fmod-list.yml)](https://mods.linuxserver.io/?mod=tvheadend "view available mods for this container.") [![Docker Universal Mods](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=universal&query=%24.mods%5B%27universal%27%5D.mod_count&url=https%3A%2F%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-mods%2Fmaster%2Fmod-list.yml)](https://mods.linuxserver.io/?mod=universal "view available universal mods.") [![Docker Mods](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=tvheadend&query=%24.mods%5B%27tvheadend%27%5D.mod_count&url=https%3A%2F%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-mods%2Fmaster%2Fmod-list.yml)](https://mods.linuxserver.io/?mod=tvheadend "view available mods for this container.") [![Docker Universal Mods](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=universal&query=%24.mods%5B%27universal%27%5D.mod_count&url=https%3A%2F%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-mods%2Fmaster%2Fmod-list.yml)](https://mods.linuxserver.io/?mod=universal "view available universal mods.")
We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to enable additional functionality within the containers. The list of Mods available for this image (if any) as well as universal mods that can be applied to any one of our images can be accessed via the dynamic badges above. We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to enable additional functionality within the containers. The list of Mods available for this image (if any) as well as universal mods that can be applied to any one of our images can be accessed via the dynamic badges above.
## Support Info ## Support Info
* Shell access whilst the container is running: `docker exec -it tvheadend /bin/bash` * Shell access whilst the container is running: `docker exec -it tvheadend /bin/bash`
@@ -250,7 +243,7 @@ We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to
* container version number * container version number
* `docker inspect -f '{{ index .Config.Labels "build_version" }}' tvheadend` * `docker inspect -f '{{ index .Config.Labels "build_version" }}' tvheadend`
* image version number * image version number
* `docker inspect -f '{{ index .Config.Labels "build_version" }}' ghcr.io/linuxserver/tvheadend` * `docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/tvheadend`
## Updating Info ## Updating Info
@@ -259,6 +252,7 @@ Most of our images are static, versioned, and require an image update and contai
Below are the instructions for updating containers: Below are the instructions for updating containers:
### Via Docker Compose ### Via Docker Compose
* Update all images: `docker-compose pull` * Update all images: `docker-compose pull`
* or update a single image: `docker-compose pull tvheadend` * or update a single image: `docker-compose pull tvheadend`
* Let compose update all containers as necessary: `docker-compose up -d` * Let compose update all containers as necessary: `docker-compose up -d`
@@ -266,41 +260,48 @@ Below are the instructions for updating containers:
* You can also remove the old dangling images: `docker image prune` * You can also remove the old dangling images: `docker image prune`
### Via Docker Run ### Via Docker Run
* Update the image: `docker pull ghcr.io/linuxserver/tvheadend`
* Update the image: `docker pull lscr.io/linuxserver/tvheadend`
* Stop the running container: `docker stop tvheadend` * Stop the running container: `docker stop tvheadend`
* Delete the container: `docker rm tvheadend` * Delete the container: `docker rm tvheadend`
* 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) * 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` * You can also remove the old dangling images: `docker image prune`
### Via Watchtower auto-updater (only use if you don't remember the original parameters) ### Via Watchtower auto-updater (only use if you don't remember the original parameters)
* Pull the latest image at its tag and replace it with the same env variables in one run: * Pull the latest image at its tag and replace it with the same env variables in one run:
```
```bash
docker run --rm \ docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \ -v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \ containrrr/watchtower \
--run-once tvheadend --run-once tvheadend
``` ```
* You can also remove the old dangling images: `docker image prune` * You can also remove the old dangling images: `docker image prune`
**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). **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).
### Image Update Notifications - Diun (Docker Image Update Notifier) ### 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. * We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported.
## Building locally ## Building locally
If you want to make local modifications to these images for development purposes or just to customize the logic: If you want to make local modifications to these images for development purposes or just to customize the logic:
```
```bash
git clone https://github.com/linuxserver/docker-tvheadend.git git clone https://github.com/linuxserver/docker-tvheadend.git
cd docker-tvheadend cd docker-tvheadend
docker build \ docker build \
--no-cache \ --no-cache \
--pull \ --pull \
-t ghcr.io/linuxserver/tvheadend:latest . -t lscr.io/linuxserver/tvheadend:latest .
``` ```
The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static` The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
```
```bash
docker run --rm --privileged multiarch/qemu-user-static:register --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
``` ```
@@ -308,6 +309,8 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Versions ## Versions
* **05.01.22:** - Rebase to Alpine 3.15. Disable execinfo to fix builds. Update xmltv.
* **11.05.21:** - Added Intel iHD driver support.
* **02.06.20:** - Update to Alpine 3.12. * **02.06.20:** - Update to Alpine 3.12.
* **27.12.19:** - Add requests and perl-json-xs package. * **27.12.19:** - Add requests and perl-json-xs package.
* **27.12.19:** - Update to Alpine 3.11. * **27.12.19:** - Update to Alpine 3.11.

View File

@@ -1,255 +1,261 @@
alpine-baselayout-3.2.0-r7 alpine-baselayout-3.2.0-r18
alpine-keys-2.2-r0 alpine-keys-2.4-r1
alsa-lib-1.2.2-r0 alsa-lib-1.2.5.1-r1
aom-libs-1.0.0-r1 aom-libs-3.2.0-r0
apk-tools-2.10.5-r1 apk-tools-2.12.7-r3
bash-5.0.17-r0 bash-5.1.8-r0
brotli-libs-1.0.9-r1 brotli-libs-1.0.9-r5
bsd-compat-headers-0.7.2-r3 bsd-compat-headers-0.7.2-r3
busybox-1.31.1-r19 busybox-1.34.1-r4
bzip2-1.0.8-r1 bzip2-1.0.8-r1
ca-certificates-20191127-r4 ca-certificates-20211220-r0
ca-certificates-bundle-20191127-r4 ca-certificates-bundle-20211220-r0
coreutils-8.32-r0 coreutils-9.0-r2
curl-7.69.1-r3 curl-7.80.0-r0
expat-2.2.9-r1 expat-2.4.4-r0
ffmpeg-4.3.1-r0 ffmpeg-4.4.1-r2
ffmpeg-libs-4.3.1-r0 ffmpeg-libs-4.4.1-r2
fontconfig-2.13.1-r2 fontconfig-2.13.1-r4
freetype-2.10.4-r0 freetype-2.11.0-r0
fribidi-1.0.9-r0 fribidi-1.0.11-r0
fts-1.2.7-r1 fts-1.2.7-r1
gdbm-1.13-r1 gdbm-1.22-r0
gmp-6.2.0-r0 glib-2.70.1-r0
gnu-libiconv-1.15-r2 gmp-6.2.1-r1
gnutls-3.6.15-r0 gnu-libiconv-1.16-r0
gzip-1.10-r0 gnutls-3.7.1-r0
graphite2-1.3.14-r0
gzip-1.11-r0
harfbuzz-3.0.0-r2
intel-gmmlib-21.3.3-r0
intel-media-driver-21.4.1-r0
lame-3.100-r0 lame-3.100-r0
less-590-r0
libacl-2.2.53-r0 libacl-2.2.53-r0
libass-0.14.0-r0 libass-0.15.2-r0
libattr-2.4.48-r0 libattr-2.5.1-r1
libbsd-0.10.0-r0 libblkid-2.37.3-r0
libbsd-0.11.3-r1
libbz2-1.0.8-r1 libbz2-1.0.8-r1
libc-utils-0.7.2-r3 libc-utils-0.7.2-r3
libcrypto1.1-1.1.1i-r0 libcrypto1.1-1.1.1l-r8
libcurl-7.69.1-r3 libcurl-7.80.0-r0
libdav1d-0.7.0-r0 libdav1d-0.9.2-r0
libdrm-2.4.102-r0 libdrm-2.4.109-r0
libdvbcsa-1.1.0-r1 libdvbcsa-1.1.0-r1
libelf-0.179-r0 libelf-0.185-r0
libffi-3.3-r2 libffi-3.4.2-r1
libgcc-9.3.0-r2 libgcc-10.3.1_git20211027-r0
libgcrypt-1.8.5-r0 libgcrypt-1.9.4-r0
libgpg-error-1.37-r0 libgomp-10.3.1_git20211027-r0
libgpg-error-1.42-r1
libhdhomerun-libs-20200225-r0 libhdhomerun-libs-20200225-r0
libidn-1.35-r0 libidn2-2.3.2-r0
libidn2-2.3.0-r0 libintl-0.21-r0
libintl-0.20.2-r0 libjpeg-turbo-2.1.2-r0
libjpeg-turbo-2.0.5-r0 libmd-1.0.3-r0
libogg-1.3.4-r0 libmount-2.37.3-r0
libogg-1.3.5-r0
libpciaccess-0.16-r0 libpciaccess-0.16-r0
libpng-1.6.37-r1 libpng-1.6.37-r1
libproc-3.3.16-r0 libproc-3.3.17-r0
libssh-0.9.4-r1 libretls-3.3.4-r2
libssl1.1-1.1.1i-r0 libsrt-1.4.2-r1
libstdc++-9.3.0-r2 libssh-0.9.6-r1
libtasn1-4.16.0-r1 libssl1.1-1.1.1l-r8
libtheora-1.1.1-r14 libstdc++-10.3.1_git20211027-r0
libtls-standalone-2.9.1-r1 libtasn1-4.18.0-r0
libunistring-0.9.10-r0 libtheora-1.1.1-r16
liburiparser-0.9.3-r1 libunistring-0.9.10-r1
libuuid-2.35.2-r0 liburiparser-0.9.6-r0
libva-2.7.1-r0 libuuid-2.37.3-r0
libva-intel-driver-2.4.0-r1 libva-2.13.0-r0
libva-intel-driver-2.4.1-r0
libvdpau-1.4-r0 libvdpau-1.4-r0
libvorbis-1.3.6-r2 libvorbis-1.3.7-r0
libvpx-1.8.2-r0 libvpx-1.10.0-r0
libx11-1.6.12-r0 libwebp-1.2.2-r0
libx11-1.7.2-r0
libxau-1.0.9-r0 libxau-1.0.9-r0
libxcb-1.14-r1 libxcb-1.14-r2
libxdmcp-1.1.3-r0 libxdmcp-1.1.3-r0
libxext-1.3.4-r0 libxext-1.3.4-r0
libxfixes-5.0.3-r2 libxfixes-6.0.0-r0
libxml2-2.9.10-r5 libxml2-2.9.12-r2
libxshmfence-1.3-r1 libxshmfence-1.3-r1
libxslt-1.1.34-r0 libxslt-1.1.34-r1
linux-headers-5.4.5-r1 linux-headers-5.10.41-r0
linux-pam-1.3.1-r4 linux-pam-1.5.2-r0
llvm10-libs-10.0.0-r2 llvm12-libs-12.0.1-r0
mesa-20.0.7-r0 mesa-21.2.6-r0
mesa-dri-ati-20.0.7-r0 mesa-dri-ati-21.2.6-r0
mesa-dri-classic-20.0.7-r0 mesa-dri-classic-21.2.6-r0
mesa-dri-gallium-20.0.7-r0 mesa-dri-gallium-21.2.6-r0
mesa-glapi-20.0.7-r0 mesa-glapi-21.2.6-r0
mesa-va-gallium-20.0.7-r0 mesa-va-gallium-21.2.6-r0
mesa-vdpau-gallium-20.0.7-r0 mesa-vdpau-gallium-21.2.6-r0
musl-1.1.24-r10 mpdecimal-2.5.1-r1
musl-utils-1.1.24-r10 musl-1.2.2-r7
ncurses-libs-6.2_p20200523-r0 musl-utils-1.2.2-r7
ncurses-terminfo-base-6.2_p20200523-r0 ncurses-libs-6.3_p20211120-r0
nettle-3.5.1-r1 ncurses-terminfo-base-6.3_p20211120-r0
nghttp2-libs-1.41.0-r0 nettle-3.7.3-r0
openssl-1.1.1j-r0 nghttp2-libs-1.46.0-r0
opus-1.3.1-r0 openssl-1.1.1l-r8
p11-kit-0.23.22-r0 opus-1.3.1-r1
pcre2-10.35-r0 p11-kit-0.24.0-r1
perl-5.30.3-r0 pcre-8.45-r1
perl-archive-zip-1.68-r0 pcre2-10.39-r0
perl-b-hooks-endofscope-0.24-r1 perl-5.34.0-r1
perl-boolean-0.46-r1 perl-archive-zip-1.68-r1
perl-canary-stability-2013-r0 perl-b-hooks-endofscope-0.25-r0
perl-capture-tiny-0.48-r1 perl-boolean-0.46-r2
perl-cgi-4.47-r0 perl-capture-tiny-0.48-r2
perl-class-data-inheritable-0.08-r1 perl-cgi-4.53-r0
perl-class-inspector-1.36-r1 perl-class-data-inheritable-0.09-r0
perl-class-methodmaker-2.24-r6 perl-class-inspector-1.36-r2
perl-class-singleton-1.5-r1 perl-class-methodmaker-2.24-r8
perl-common-sense-3.75-r0 perl-class-singleton-1.6-r0
perl-compress-raw-bzip2-2.093-r1 perl-common-sense-3.75-r2
perl-compress-raw-zlib-2.093-r1 perl-compress-raw-zlib-2.101-r1
perl-cpan-meta-check-0.014-r1 perl-cpan-meta-check-0.014-r2
perl-data-dumper-2.173-r3 perl-date-manip-6.86-r0
perl-date-manip-6.81-r0 perl-datetime-1.54-r1
perl-datetime-1.52-r0 perl-datetime-format-strptime-1.79-r0
perl-datetime-format-strptime-1.77-r0 perl-datetime-locale-1.33-r0
perl-datetime-locale-1.25-r0 perl-datetime-timezone-2.51-r0
perl-datetime-timezone-2.47-r0 perl-dbd-sqlite-1.70-r1
perl-dbd-sqlite-1.64-r2 perl-dbi-1.643-r3
perl-dbi-1.643-r0 perl-devel-stacktrace-2.04-r3
perl-devel-stacktrace-2.04-r1 perl-devel-symdump-2.18-r2
perl-devel-symdump-2.18-r1 perl-digest-sha1-2.13-r14
perl-digest-sha1-2.13-r12 perl-dist-checkconflicts-0.11-r2
perl-dist-checkconflicts-0.11-r1 perl-doc-5.34.0-r1
perl-doc-5.30.3-r0 perl-encode-locale-1.05-r3
perl-encode-locale-1.05-r2 perl-eval-closure-0.14-r2
perl-eval-closure-0.14-r1 perl-exception-class-1.45-r0
perl-exception-class-1.44-r1 perl-exporter-tiny-1.002002-r1
perl-exporter-tiny-1.002002-r0 perl-file-listing-6.14-r0
perl-file-listing-6.04-r2 perl-file-sharedir-1.118-r0
perl-file-sharedir-1.116-r1 perl-file-sharedir-install-0.13-r2
perl-file-sharedir-install-0.13-r1 perl-file-slurp-9999.32-r1
perl-file-slurp-9999.30-r0 perl-file-temp-0.2311-r0
perl-file-temp-0.2309-r1 perl-file-which-1.27-r0
perl-file-which-1.23-r1 perl-getopt-long-2.52-r1
perl-getopt-long-2.51-r1 perl-html-parser-3.76-r1
perl-html-parser-3.72-r5 perl-html-tagset-3.20-r3
perl-html-tagset-3.20-r2 perl-html-tree-5.07-r2
perl-html-tree-5.07-r1 perl-http-cookies-6.10-r0
perl-http-cookies-6.08-r0 perl-http-daemon-6.12-r1
perl-http-daemon-6.10-r0 perl-http-date-6.05-r1
perl-http-date-6.05-r0 perl-http-message-6.35-r0
perl-http-message-6.24-r0 perl-http-negotiate-6.01-r3
perl-http-negotiate-6.01-r2 perl-importer-0.026-r1
perl-importer-0.025-r0 perl-io-1.48-r0
perl-io-1.42-r0 perl-io-html-1.004-r0
perl-io-compress-2.093-r0 perl-io-socket-ssl-2.072-r0
perl-io-html-1.001-r2 perl-io-stringy-2.113-r1
perl-io-socket-ssl-2.068-r0 perl-ipc-run3-0.048-r2
perl-io-stringy-2.113-r0 perl-json-4.03-r1
perl-ipc-run3-0.048-r1 perl-json-xs-4.03-r1
perl-json-4.02-r0 perl-libwww-6.58-r0
perl-json-xs-4.02-r1 perl-lingua-en-numbers-ordinate-1.05-r0
perl-libwww-6.44-r0 perl-lingua-preferred-0.2.4-r4
perl-lingua-en-numbers-ordinate-1.04-r2 perl-list-moreutils-0.430-r0
perl-lingua-preferred-0.2.4-r2 perl-list-moreutils-xs-0.430-r1
perl-list-moreutils-0.428-r0 perl-lwp-mediatypes-6.04-r1
perl-list-moreutils-xs-0.428-r3 perl-lwp-useragent-determined-1.07-r2
perl-lwp-mediatypes-6.04-r0 perl-module-build-0.4231-r1
perl-lwp-useragent-determined-1.07-r1 perl-module-implementation-0.09-r3
perl-module-build-0.4231-r0 perl-module-metadata-1.000037-r1
perl-module-implementation-0.09-r2 perl-module-pluggable-5.2-r2
perl-module-metadata-1.000037-r0 perl-module-runtime-0.016-r4
perl-module-pluggable-5.2-r1 perl-mozilla-ca-20211001-r0
perl-module-runtime-0.016-r3 perl-mro-compat-0.13-r2
perl-mro-compat-0.13-r1 perl-namespace-autoclean-0.29-r2
perl-namespace-autoclean-0.29-r1 perl-namespace-clean-0.27-r2
perl-namespace-clean-0.27-r1 perl-net-http-6.21-r0
perl-net-http-6.19-r0 perl-net-ssleay-1.90-r3
perl-net-libidn-0.12-r8 perl-package-deprecationmanager-0.17-r2
perl-net-ssleay-1.88-r0 perl-package-stash-0.39-r0
perl-package-deprecationmanager-0.17-r1 perl-params-util-1.102-r1
perl-package-stash-0.38-r2 perl-params-validate-1.30-r1
perl-package-stash-xs-0.29-r3 perl-params-validationcompiler-0.30-r1
perl-params-util-1.07-r8 perl-parse-recdescent-1.967015-r3
perl-params-validate-1.29-r3 perl-path-class-0.37-r2
perl-params-validationcompiler-0.30-r0 perl-pod-coverage-0.23-r2
perl-parse-recdescent-1.967015-r2 perl-pod-parser-1.63-r1
perl-path-class-0.37-r1 perl-role-tiny-2.002004-r1
perl-pod-coverage-0.23-r1 perl-scalar-list-utils-1.60-r0
perl-role-tiny-2.001004-r0 perl-scope-guard-0.21-r2
perl-scalar-list-utils-1.55-r0 perl-specio-0.47-r0
perl-scope-guard-0.21-r1 perl-sub-exporter-progressive-0.001013-r2
perl-specio-0.46-r0 perl-sub-identify-0.14-r6
perl-sub-exporter-progressive-0.001013-r1 perl-sub-info-0.002-r2
perl-sub-identify-0.14-r4 perl-sub-install-0.928-r2
perl-sub-info-0.002-r1 perl-sub-name-0.26-r3
perl-sub-install-0.928-r1 perl-sub-quote-2.006006-r1
perl-sub-name-0.26-r1 perl-sub-uplevel-0.2800-r2
perl-sub-quote-2.006006-r0 perl-term-progressbar-2.22-r2
perl-sub-uplevel-0.2800-r1 perl-term-readkey-2.38-r6
perl-term-progressbar-2.22-r1 perl-term-table-0.015-r1
perl-term-readkey-2.38-r3 perl-test-exception-0.43-r2
perl-term-table-0.015-r0 perl-test-fatal-0.016-r3
perl-test-exception-0.43-r1 perl-test-pod-1.52-r2
perl-test-fatal-0.014-r2 perl-test-requires-0.11-r1
perl-test-needs-0.002006-r0 perl-test-simple-1.302188-r1
perl-test-pod-1.52-r1 perl-test-taint-1.08-r4
perl-test-requires-0.11-r0 perl-test-warnings-0.031-r0
perl-test-simple-1.302175-r0 perl-test-without-module-0.20-r2
perl-test-taint-1.08-r2 perl-test2-plugin-nowarnings-0.09-r1
perl-test-warnings-0.030-r0 perl-test2-suite-0.000142-r0
perl-test-without-module-0.20-r1 perl-timedate-2.33-r1
perl-test2-plugin-nowarnings-0.08-r1 perl-try-tiny-0.30-r3
perl-test2-suite-0.000129-r0 perl-types-serialiser-1.01-r0
perl-timedate-2.33-r0 perl-unicode-string-2.10-r3
perl-try-tiny-0.30-r1 perl-uri-5.10-r0
perl-types-serialiser-1.0-r2 perl-variable-magic-0.62-r5
perl-unicode-string-2.10-r1 perl-www-robotrules-6.02-r3
perl-uri-1.76-r0 perl-xml-libxml-2.0207-r1
perl-variable-magic-0.62-r3 perl-xml-libxslt-1.99-r2
perl-www-robotrules-6.02-r2 perl-xml-namespacesupport-1.12-r3
perl-xml-libxml-2.0205-r0 perl-xml-parser-2.46-r2
perl-xml-libxslt-1.99-r0 perl-xml-sax-1.02-r1
perl-xml-namespacesupport-1.12-r1 perl-xml-sax-base-1.09-r3
perl-xml-parser-2.46-r0 perl-xml-treepp-0.43-r3
perl-xml-sax-1.02-r0 perl-xml-twig-3.52-r3
perl-xml-sax-base-1.09-r1 perl-xml-writer-0.900-r0
perl-xml-treepp-0.43-r2 procps-3.3.17-r0
perl-xml-twig-3.52-r2 py3-certifi-2020.12.5-r1
perl-xml-writer-0.625-r3 py3-charset-normalizer-2.0.7-r0
perl-yaml-syck-1.32-r0 py3-idna-3.3-r0
procps-3.3.16-r0 py3-requests-2.26.0-r1
py3-appdirs-1.4.4-r1 py3-urllib3-1.26.7-r0
py3-certifi-2020.4.5.1-r0 python3-3.9.7-r4
py3-chardet-3.0.4-r4 readline-8.1.1-r0
py3-idna-2.9-r0 s6-ipcserver-2.11.0.0-r0
py3-ordered-set-4.0.1-r0 scanelf-1.3.3-r0
py3-packaging-20.4-r0 sdl2-2.0.16-r4
py3-parsing-2.4.7-r0 shadow-4.8.1-r1
py3-requests-2.23.0-r0 skalibs-2.11.0.0-r0
py3-setuptools-47.0.0-r0 soxr-0.1.3-r2
py3-six-1.15.0-r0 sqlite-libs-3.36.0-r0
py3-urllib3-1.25.9-r0 ssl_client-1.34.1-r4
python2-2.7.18-r0 tar-1.34-r0
python3-3.8.5-r0 tzdata-2021e-r0
readline-8.0.4-r0 uriparser-0.9.6-r0
scanelf-1.2.6-r0 utmps-0.1.0.3-r0
sdl2-2.0.12-r1 v4l-utils-libs-1.22.1-r1
shadow-4.8.1-r0 vidstab-1.1.0-r1
sqlite-libs-3.32.1-r0 vulkan-loader-1.2.196-r0
ssl_client-1.31.1-r19 wayland-libs-client-1.19.0-r1
tar-1.32-r1 wget-1.21.2-r2
tzdata-2021a-r0 x264-20210613-r0
uriparser-0.9.3-r1 x264-libs-20210613-r0
v4l-utils-libs-1.20.0-r0 x265-3.5-r0
wayland-libs-client-1.18.0-r4 x265-libs-3.5-r0
wget-1.20.3-r1
x264-20191119-r1
x264-libs-20191119-r1
x265-3.3-r1
x265-libs-3.3-r1
xvidcore-1.3.7-r1 xvidcore-1.3.7-r1
xz-5.2.5-r0 xz-5.2.5-r0
xz-libs-5.2.5-r0 xz-libs-5.2.5-r0
zlib-1.2.11-r3 zlib-1.2.11-r3
zstd-libs-1.4.5-r0 zstd-libs-1.5.0-r0

View File

@@ -1,6 +1,7 @@
requires 'perl' => '5.24.0'; requires 'perl' => '5.24.0';
# perl packages for tvheadend x86 # perl packages for tvheadend x86
requires 'Data::Dump' ;
requires 'DateTime::Format::ISO8601' ; requires 'DateTime::Format::ISO8601' ;
requires 'DateTime::Format::SQLite' ; requires 'DateTime::Format::SQLite' ;
requires 'Encode' ; requires 'Encode' ;

View File

@@ -23,8 +23,6 @@ development_versions: true
development_versions_items: development_versions_items:
- { tag: "latest", desc: "Current latest release." } - { tag: "latest", desc: "Current latest release." }
- { tag: "release-4.2", desc: "Latest release from 4.2 branch." } - { tag: "release-4.2", desc: "Latest release from 4.2 branch." }
- { tag: "stable-4.2.1", desc: "Old stable version. Will not be updated anymore!" }
- { tag: "stable-4.0.9", desc: "Old stable version. Will not be updated anymore!" }
# container parameters # container parameters
common_param_env_vars_enabled: true common_param_env_vars_enabled: true
@@ -61,7 +59,7 @@ optional_block_1_items:
#### Host vs. Bridge #### Host vs. Bridge
If you use IPTV, SAT>IP or HDHomeRun, you need to create the container with --net=host and remove the -p flags. This is because to work with these services Tvheadend requires a multicast address of `239.255.255.250` and a UDP port of `1900` which at this time is not possible with docker bridge mode. If you use IPTV, SAT>IP or HDHomeRun, you need to create the container with --net=host and remove the -p flags. This is because to work with these services Tvheadend requires a multicast address of `239.255.255.250` and a UDP port of `1900` which at this time is not possible with docker bridge mode.
If you have other host services which also use multicast such as SSDP/DLNA/Emby you may experience stabilty problems. These can be solved by giving tvheadend its own IP using macavlan. If you have other host services which also use multicast such as SSDP/DLNA/Emby you may experience stabilty problems. These can be solved by giving tvheadend its own IP using macvlan.
# application setup block # application setup block
app_setup_block_enabled: true app_setup_block_enabled: true
@@ -117,7 +115,7 @@ app_setup_block: |
**Picons** **Picons**
We have added all the picons from [picons.eu](https://picons.eu/) in the folder /picons. To enable the use of these picons, add the path to the Channel icon path in Configuration --> General --> Base. We have added all the picons from [picons](https://github.com/picons/picons) in the folder /picons. To enable the use of these picons, add the path to the Channel icon path in Configuration --> General --> Base.
You need to enable minimum advanced view level to see the picons options. You need to enable minimum advanced view level to see the picons options.
## Additional runtime parameters ## Additional runtime parameters
@@ -126,6 +124,8 @@ app_setup_block: |
# changelog # changelog
changelogs: changelogs:
- { date: "05.01.22:", desc: "Rebase to Alpine 3.15. Disable execinfo to fix builds. Update xmltv." }
- { date: "11.05.21:", desc: "Added Intel iHD driver support." }
- { date: "02.06.20:", desc: "Update to Alpine 3.12." } - { date: "02.06.20:", desc: "Update to Alpine 3.12." }
- { date: "27.12.19:", desc: "Add requests and perl-json-xs package." } - { date: "27.12.19:", desc: "Add requests and perl-json-xs package." }
- { date: "27.12.19:", desc: "Update to Alpine 3.11." } - { date: "27.12.19:", desc: "Update to Alpine 3.11." }