Compare commits

..

60 Commits

Author SHA1 Message Date
LinuxServer-CI
83e9ee723c Bot Updating Templated Files 2026-04-10 19:13:21 +00:00
LinuxServer-CI
69f8714750 Bot Updating Package Versions 2026-03-27 19:14:15 +00:00
LinuxServer-CI
fb0817506c Bot Updating Package Versions 2026-03-20 19:09:06 +00:00
LinuxServer-CI
812f33861c Bot Updating Package Versions 2026-03-13 19:03:25 +00:00
LinuxServer-CI
0ea5f069a1 Bot Updating Package Versions 2026-02-20 19:08:26 +00:00
LinuxServer-CI
0bbf23fef2 Bot Updating Templated Files 2026-02-13 19:12:34 +00:00
LinuxServer-CI
745334ec1d Bot Updating Templated Files 2026-02-13 19:10:27 +00:00
LinuxServer-CI
5ce6c7af4a Bot Updating Package Versions 2026-02-06 19:10:18 +00:00
LinuxServer-CI
4070c6c1c1 Bot Updating Package Versions 2026-01-30 19:04:04 +00:00
LinuxServer-CI
6f90ce6e0d Bot Updating Package Versions 2026-01-23 18:55:21 +00:00
LinuxServer-CI
2b346cb9fa Bot Updating Package Versions 2026-01-02 18:49:15 +00:00
LinuxServer-CI
a40f07406b Bot Updating Package Versions 2025-12-26 18:47:23 +00:00
LinuxServer-CI
1c1f459dc4 Bot Updating Package Versions 2025-12-19 18:48:19 +00:00
LinuxServer-CI
302ee1006f Bot Updating Package Versions 2025-12-12 18:49:33 +00:00
LinuxServer-CI
fcc5f92e92 Bot Updating Package Versions 2025-11-28 18:44:27 +00:00
LinuxServer-CI
9fea03932a Bot Updating Package Versions 2025-11-21 18:46:07 +00:00
LinuxServer-CI
74ec59b86d Bot Updating Templated Files 2025-11-21 18:41:24 +00:00
LinuxServer-CI
724ba9ef76 Bot Updating Package Versions 2025-11-14 18:46:12 +00:00
LinuxServer-CI
f50233ce8b Bot Updating Package Versions 2025-10-24 18:44:06 +00:00
LinuxServer-CI
c73a11aba7 Bot Updating Templated Files 2025-10-24 18:41:03 +00:00
LinuxServer-CI
703c162c61 Bot Updating Package Versions 2025-10-17 18:40:31 +00:00
LinuxServer-CI
255dadc4a2 Bot Updating Package Versions 2025-10-10 18:42:53 +00:00
LinuxServer-CI
b630586890 Bot Updating Package Versions 2025-10-03 18:41:31 +00:00
LinuxServer-CI
5b41448ab4 Bot Updating Package Versions 2025-09-26 18:40:43 +00:00
LinuxServer-CI
7de3a01c49 Bot Updating Package Versions 2025-09-19 18:41:36 +00:00
LinuxServer-CI
e862bbe087 Bot Updating Package Versions 2025-08-22 18:44:39 +00:00
LinuxServer-CI
631ca67ed7 Bot Updating Package Versions 2025-08-15 18:48:03 +00:00
LinuxServer-CI
feddce3a10 Bot Updating Package Versions 2025-08-08 18:48:17 +00:00
LinuxServer-CI
c9cae0a107 Bot Updating Package Versions 2025-08-01 18:50:09 +00:00
LinuxServer-CI
d81ca906b4 Bot Updating Package Versions 2025-07-29 14:26:44 +00:00
LinuxServer-CI
003291efcd Bot Updating Templated Files 2025-07-29 14:22:58 +00:00
Adam
84eab95209 Merge pull request #160 from linuxserver/master-3.22 2025-07-29 15:20:42 +01:00
thespad
4884cbbffe Fix opcache dir 2025-07-27 13:51:33 +01:00
LinuxServer-CI
cf1be7a51b Bot Updating Package Versions 2025-07-25 18:49:16 +00:00
thespad
367b8290ae Rebase to 3.22 2025-07-20 15:55:48 +01:00
LinuxServer-CI
28be1a9d0d Bot Updating Package Versions 2025-07-18 18:48:21 +00:00
LinuxServer-CI
baf9346f97 Bot Updating Package Versions 2025-07-17 14:55:54 +00:00
LinuxServer-CI
96e0f64b82 Bot Updating Package Versions 2025-07-11 18:47:00 +00:00
LinuxServer-CI
9fee85e68f Bot Updating Templated Files 2025-07-04 18:46:06 +00:00
LinuxServer-CI
b861d95624 Bot Updating Templated Files 2025-07-04 18:44:07 +00:00
LinuxServer-CI
1a07453ce2 Bot Updating Templated Files 2025-06-13 18:44:46 +00:00
LinuxServer-CI
05979763c7 Bot Updating Package Versions 2025-05-23 18:48:30 +00:00
LinuxServer-CI
87dc95bd6d Bot Updating Package Versions 2025-05-16 18:47:07 +00:00
LinuxServer-CI
2a7210c37e Bot Updating Templated Files 2025-05-16 18:42:10 +00:00
LinuxServer-CI
35f6b1f6d8 Bot Updating Package Versions 2025-04-18 18:39:23 +00:00
LinuxServer-CI
2c4d1b9b62 Bot Updating Package Versions 2025-04-11 18:41:50 +00:00
LinuxServer-CI
42fbe8217a Bot Updating Package Versions 2025-04-04 18:40:31 +00:00
LinuxServer-CI
7dee5e1a01 Bot Updating Package Versions 2025-03-21 18:42:02 +00:00
LinuxServer-CI
a230d311d1 Bot Updating Package Versions 2025-03-14 18:40:08 +00:00
LinuxServer-CI
ab125ba9c9 Bot Updating Package Versions 2025-02-28 18:40:12 +00:00
LinuxServer-CI
ab686871e0 Bot Updating Package Versions 2025-02-21 18:37:51 +00:00
LinuxServer-CI
ad873f5eb7 Bot Updating Package Versions 2025-02-14 18:41:09 +00:00
LinuxServer-CI
017a6a04c8 Bot Updating Templated Files 2025-02-14 18:36:03 +00:00
LinuxServer-CI
8fde173b55 Bot Updating Templated Files 2025-01-31 18:37:58 +00:00
LinuxServer-CI
7e221490a1 Bot Updating Templated Files 2025-01-31 18:36:28 +00:00
LinuxServer-CI
0b86fded9b Bot Updating Package Versions 2025-01-24 18:37:18 +00:00
quietsy
34e623e206 Merge pull request #158 from linuxserver/add-project-categories
Add categories to readme-vars.yml
2025-01-22 19:53:46 +02:00
quietsy
fe1da81d91 Add categories to readme-vars.yml 2025-01-22 14:53:01 +02:00
LinuxServer-CI
04b2db2a1e Bot Updating Package Versions 2025-01-17 18:36:41 +00:00
LinuxServer-CI
6f7a724083 Bot Updating Package Versions 2025-01-10 18:38:17 +00:00
20 changed files with 526 additions and 426 deletions

0
.editorconfig Executable file → Normal file
View File

2
.github/CONTRIBUTING.md vendored Executable file → Normal file
View File

@@ -6,7 +6,7 @@
* Read, and fill the Pull Request template * Read, and fill the Pull Request template
* 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 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://linuxserver.io/discord)
## Common files ## Common files

0
.github/FUNDING.yml vendored Executable file → Normal file
View File

2
.github/ISSUE_TEMPLATE/config.yml vendored Executable file → Normal file
View File

@@ -1,7 +1,7 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Discord chat support - name: Discord chat support
url: https://discord.gg/YWrKVTn url: https://linuxserver.io/discord
about: Realtime support / chat with the community and the team. about: Realtime support / chat with the community and the team.
- name: Discourse discussion forum - name: Discourse discussion forum

0
.github/ISSUE_TEMPLATE/issue.bug.yml vendored Executable file → Normal file
View File

0
.github/ISSUE_TEMPLATE/issue.feature.yml vendored Executable file → Normal file
View File

3
.github/workflows/call_issue_pr_tracker.yml vendored Executable file → Normal file
View File

@@ -8,6 +8,9 @@ on:
pull_request_review: pull_request_review:
types: [submitted,edited,dismissed] types: [submitted,edited,dismissed]
permissions:
contents: read
jobs: jobs:
manage-project: manage-project:
permissions: permissions:

3
.github/workflows/call_issues_cron.yml vendored Executable file → Normal file
View File

@@ -4,6 +4,9 @@ on:
- cron: '14 15 * * *' - cron: '14 15 * * *'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
stale: stale:
permissions: permissions:

25
.github/workflows/external_trigger.yml vendored Executable file → Normal file
View File

@@ -3,6 +3,9 @@ name: External Trigger Main
on: on:
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
external-trigger-master: external-trigger-master:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -15,7 +18,10 @@ jobs:
SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }} SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }}
run: | run: |
printf "# External trigger for docker-heimdall\n\n" >> $GITHUB_STEP_SUMMARY printf "# External trigger for docker-heimdall\n\n" >> $GITHUB_STEP_SUMMARY
if grep -q "^heimdall_master" <<< "${SKIP_EXTERNAL_TRIGGER}"; then if grep -q "^heimdall_master_" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`heimdall_master_\`; will skip trigger if version matches." >> $GITHUB_STEP_SUMMARY
elif grep -q "^heimdall_master" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`heimdall_master\`; skipping trigger." >> $GITHUB_STEP_SUMMARY echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`heimdall_master\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
@@ -25,6 +31,11 @@ jobs:
printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY
EXT_RELEASE=$(curl -u "${{ secrets.CR_USER }}:${{ secrets.CR_PAT }}" -sX GET "https://api.github.com/repos/linuxserver/Heimdall/releases/latest" | jq -r '. | .tag_name') EXT_RELEASE=$(curl -u "${{ secrets.CR_USER }}:${{ secrets.CR_PAT }}" -sX GET "https://api.github.com/repos/linuxserver/Heimdall/releases/latest" | jq -r '. | .tag_name')
echo "Type is \`github_stable\`" >> $GITHUB_STEP_SUMMARY echo "Type is \`github_stable\`" >> $GITHUB_STEP_SUMMARY
if grep -q "^heimdall_master_${EXT_RELEASE}" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` matches current external release; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Can't retrieve external version, exiting" >> $GITHUB_STEP_SUMMARY echo "> Can't retrieve external version, exiting" >> $GITHUB_STEP_SUMMARY
@@ -35,8 +46,8 @@ jobs:
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
exit 1 exit 1
fi fi
EXT_RELEASE=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g') EXT_RELEASE_SANITIZED=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
echo "External version: \`${EXT_RELEASE}\`" >> $GITHUB_STEP_SUMMARY echo "Sanitized external version: \`${EXT_RELEASE_SANITIZED}\`" >> $GITHUB_STEP_SUMMARY
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY
image="linuxserver/heimdall" image="linuxserver/heimdall"
tag="latest" tag="latest"
@@ -92,8 +103,8 @@ jobs:
exit 1 exit 1
fi fi
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY
if [ "${EXT_RELEASE}" == "${IMAGE_VERSION}" ]; then if [ "${EXT_RELEASE_SANITIZED}" == "${IMAGE_VERSION}" ]; then
echo "Version \`${EXT_RELEASE}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY echo "Sanitized version \`${EXT_RELEASE_SANITIZED}\` already pushed, exiting" >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-heimdall/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-heimdall/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY
@@ -108,7 +119,7 @@ jobs:
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
else else
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
echo "New version \`${EXT_RELEASE}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY echo "New sanitized version \`${EXT_RELEASE_SANITIZED}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
if [[ "${artifacts_found}" == "true" ]]; then if [[ "${artifacts_found}" == "true" ]]; then
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY
fi fi
@@ -128,7 +139,7 @@ jobs:
--data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ --data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit" --data-urlencode "Submit=Submit"
echo "**** Notifying Discord ****" echo "**** Notifying Discord ****"
TRIGGER_REASON="A version change was detected for heimdall tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}" TRIGGER_REASON="A version change was detected for heimdall tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE_SANITIZED}"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903, curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}], "description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}

3
.github/workflows/external_trigger_scheduler.yml vendored Executable file → Normal file
View File

@@ -5,6 +5,9 @@ on:
- cron: '39 * * * *' - cron: '39 * * * *'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
external-trigger-scheduler: external-trigger-scheduler:
runs-on: ubuntu-latest runs-on: ubuntu-latest

6
.github/workflows/greetings.yml vendored Executable file → Normal file
View File

@@ -2,8 +2,14 @@ name: Greetings
on: [pull_request_target, issues] on: [pull_request_target, issues]
permissions:
contents: read
jobs: jobs:
greeting: greeting:
permissions:
issues: write
pull-requests: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/first-interaction@v1 - uses: actions/first-interaction@v1

3
.github/workflows/package_trigger_scheduler.yml vendored Executable file → Normal file
View File

@@ -5,6 +5,9 @@ on:
- cron: '14 18 * * 5' - cron: '14 18 * * 5'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
package-trigger-scheduler: package-trigger-scheduler:
runs-on: ubuntu-latest runs-on: ubuntu-latest

0
.github/workflows/permissions.yml vendored Executable file → Normal file
View File

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.20 FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.22
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -12,13 +12,13 @@ LABEL maintainer="aptalca"
RUN \ RUN \
echo "**** install runtime packages ****" && \ echo "**** install runtime packages ****" && \
apk add --no-cache \ apk add --no-cache \
php83-dom \ php84-dom \
php83-intl \ php84-intl \
php83-pdo_pgsql \ php84-opcache \
php83-pdo_sqlite \ php84-pdo_mysql \
php83-pdo_mysql \ php84-pdo_pgsql \
php83-opcache \ php84-pdo_sqlite \
php83-tokenizer && \ php84-tokenizer && \
echo "**** configure nginx ****" && \ echo "**** configure nginx ****" && \
echo 'fastcgi_param PHP_AUTH_USER $remote_user; # Heimdall user authorization' >> \ echo 'fastcgi_param PHP_AUTH_USER $remote_user; # Heimdall user authorization' >> \
/etc/nginx/fastcgi_params && \ /etc/nginx/fastcgi_params && \
@@ -26,7 +26,11 @@ RUN \
/etc/nginx/fastcgi_params && \ /etc/nginx/fastcgi_params && \
echo "**** configure php opcache ****" && \ echo "**** configure php opcache ****" && \
echo 'opcache.validate_timestamps=0' >> \ echo 'opcache.validate_timestamps=0' >> \
/etc/php83/conf.d/00_opcache.ini && \ /etc/php84/conf.d/00_opcache.ini && \
echo "**** configure php-fpm to pass env vars ****" && \
sed -E -i 's/^;?clear_env ?=.*$/clear_env = no/g' /etc/php84/php-fpm.d/www.conf && \
if ! grep -qxF 'clear_env = no' /etc/php84/php-fpm.d/www.conf; then echo 'clear_env = no' >> /etc/php84/php-fpm.d/www.conf; fi && \
echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php84/php-fpm.conf && \
echo "**** install heimdall ****" && \ echo "**** install heimdall ****" && \
mkdir -p \ mkdir -p \
/heimdall && \ /heimdall && \

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.20 FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.22
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@@ -12,13 +12,13 @@ LABEL maintainer="aptalca"
RUN \ RUN \
echo "**** install runtime packages ****" && \ echo "**** install runtime packages ****" && \
apk add --no-cache \ apk add --no-cache \
php83-dom \ php84-dom \
php83-intl \ php84-intl \
php83-pdo_pgsql \ php84-opcache \
php83-pdo_sqlite \ php84-pdo_mysql \
php83-pdo_mysql \ php84-pdo_pgsql \
php83-opcache \ php84-pdo_sqlite \
php83-tokenizer && \ php84-tokenizer && \
echo "**** configure nginx ****" && \ echo "**** configure nginx ****" && \
echo 'fastcgi_param PHP_AUTH_USER $remote_user; # Heimdall user authorization' >> \ echo 'fastcgi_param PHP_AUTH_USER $remote_user; # Heimdall user authorization' >> \
/etc/nginx/fastcgi_params && \ /etc/nginx/fastcgi_params && \
@@ -26,7 +26,11 @@ RUN \
/etc/nginx/fastcgi_params && \ /etc/nginx/fastcgi_params && \
echo "**** configure php opcache ****" && \ echo "**** configure php opcache ****" && \
echo 'opcache.validate_timestamps=0' >> \ echo 'opcache.validate_timestamps=0' >> \
/etc/php83/conf.d/00_opcache.ini && \ /etc/php84/conf.d/00_opcache.ini && \
echo "**** configure php-fpm to pass env vars ****" && \
sed -E -i 's/^;?clear_env ?=.*$/clear_env = no/g' /etc/php84/php-fpm.d/www.conf && \
if ! grep -qxF 'clear_env = no' /etc/php84/php-fpm.d/www.conf; then echo 'clear_env = no' >> /etc/php84/php-fpm.d/www.conf; fi && \
echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php84/php-fpm.conf && \
echo "**** install heimdall ****" && \ echo "**** install heimdall ****" && \
mkdir -p \ mkdir -p \
/heimdall && \ /heimdall && \

330
Jenkinsfile vendored
View File

@@ -59,13 +59,26 @@ pipeline {
steps{ steps{
echo "Running on node: ${NODE_NAME}" echo "Running on node: ${NODE_NAME}"
sh '''#! /bin/bash sh '''#! /bin/bash
containers=$(docker ps -aq) echo "Pruning builder"
docker builder prune -f --builder container || :
containers=$(docker ps -q)
if [[ -n "${containers}" ]]; then if [[ -n "${containers}" ]]; then
docker stop ${containers} BUILDX_CONTAINER_ID=$(docker ps -qf 'name=buildx_buildkit')
for container in ${containers}; do
if [[ "${container}" == "${BUILDX_CONTAINER_ID}" ]]; then
echo "skipping buildx container in docker stop"
else
echo "Stopping container ${container}"
docker stop ${container}
fi
done
fi fi
docker system prune -af --volumes || : ''' docker system prune -f --volumes || :
docker image prune -af || :
'''
script{ script{
env.EXIT_STATUS = '' env.EXIT_STATUS = ''
env.CI_TEST_ATTEMPTED = ''
env.LS_RELEASE = sh( env.LS_RELEASE = sh(
script: '''docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''', script: '''docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''',
returnStdout: true).trim() returnStdout: true).trim()
@@ -85,7 +98,11 @@ pipeline {
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 .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml' env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml'
if ( env.SYFT_IMAGE_TAG == null ) {
env.SYFT_IMAGE_TAG = 'latest'
}
} }
echo "Using syft image tag ${SYFT_IMAGE_TAG}"
sh '''#! /bin/bash sh '''#! /bin/bash
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" ''' echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
script{ script{
@@ -202,6 +219,7 @@ pipeline {
env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache' env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
env.CITEST_IMAGETAG = 'latest'
} }
} }
} }
@@ -227,6 +245,7 @@ pipeline {
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/'
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache' env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
env.CITEST_IMAGETAG = 'develop'
} }
} }
} }
@@ -252,6 +271,7 @@ pipeline {
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/'
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache' env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
env.CITEST_IMAGETAG = 'develop'
} }
} }
} }
@@ -274,7 +294,7 @@ pipeline {
-v ${WORKSPACE}:/mnt \ -v ${WORKSPACE}:/mnt \
-e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \ -e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \
-e AWS_SECRET_ACCESS_KEY=\"${S3_SECRET}\" \ -e AWS_SECRET_ACCESS_KEY=\"${S3_SECRET}\" \
ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ ghcr.io/linuxserver/baseimage-alpine:3.23 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
apk add --no-cache python3 && \ apk add --no-cache python3 && \
python3 -m venv /lsiopy && \ python3 -m venv /lsiopy && \
pip install --no-cache-dir -U pip && \ pip install --no-cache-dir -U pip && \
@@ -609,13 +629,16 @@ pipeline {
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 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [[ "${PACKAGE_CHECK}" != "true" ]]; then if [[ "${PACKAGE_CHECK}" != "true" ]]; then
declare -A pids
IFS=',' read -ra CACHE <<< "$BUILDCACHE" IFS=',' read -ra CACHE <<< "$BUILDCACHE"
for i in "${CACHE[@]}"; do for i in "${CACHE[@]}"; do
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} & docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
pids[$!]="$i"
done done
for p in $(jobs -p); do for p in "${!pids[@]}"; do
wait "$p" || { echo "job $p failed" >&2; exit 1; } wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
done done
fi fi
''' '''
@@ -675,13 +698,16 @@ pipeline {
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 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [[ "${PACKAGE_CHECK}" != "true" ]]; then if [[ "${PACKAGE_CHECK}" != "true" ]]; then
declare -A pids
IFS=',' read -ra CACHE <<< "$BUILDCACHE" IFS=',' read -ra CACHE <<< "$BUILDCACHE"
for i in "${CACHE[@]}"; do for i in "${CACHE[@]}"; do
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} & docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
pids[$!]="$i"
done done
for p in $(jobs -p); do for p in "${!pids[@]}"; do
wait "$p" || { echo "job $p failed" >&2; exit 1; } wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
done done
fi fi
''' '''
@@ -735,12 +761,14 @@ pipeline {
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 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [[ "${PACKAGE_CHECK}" != "true" ]]; then if [[ "${PACKAGE_CHECK}" != "true" ]]; then
declare -A pids
IFS=',' read -ra CACHE <<< "$BUILDCACHE" IFS=',' read -ra CACHE <<< "$BUILDCACHE"
for i in "${CACHE[@]}"; do for i in "${CACHE[@]}"; do
docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} & docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
pids[$!]="$i"
done done
for p in $(jobs -p); do for p in "${!pids[@]}"; do
wait "$p" || { echo "job $p failed" >&2; exit 1; } wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
done done
fi fi
''' '''
@@ -751,7 +779,8 @@ pipeline {
if [[ -n "${containers}" ]]; then if [[ -n "${containers}" ]]; then
docker stop ${containers} docker stop ${containers}
fi fi
docker system prune -af --volumes || : docker system prune -f --volumes || :
docker image prune -af || :
''' '''
} }
} }
@@ -777,7 +806,7 @@ pipeline {
docker run --rm \ docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock:ro \ -v /var/run/docker.sock:/var/run/docker.sock:ro \
-v ${TEMPDIR}:/tmp \ -v ${TEMPDIR}:/tmp \
ghcr.io/anchore/syft:latest \ ghcr.io/anchore/syft:${SYFT_IMAGE_TAG} \
${LOCAL_CONTAINER} -o table=/tmp/package_versions.txt ${LOCAL_CONTAINER} -o table=/tmp/package_versions.txt
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"
@@ -853,6 +882,7 @@ pipeline {
script{ script{
env.CI_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/index.html' env.CI_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/index.html'
env.CI_JSON_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/report.json' env.CI_JSON_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/report.json'
env.CI_TEST_ATTEMPTED = 'true'
} }
sh '''#! /bin/bash sh '''#! /bin/bash
set -e set -e
@@ -864,7 +894,7 @@ pipeline {
CI_DOCKERENV="LSIO_FIRST_PARTY=true" CI_DOCKERENV="LSIO_FIRST_PARTY=true"
fi fi
fi fi
docker pull ghcr.io/linuxserver/ci:latest docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
if [ "${MULTIARCH}" == "true" ]; then if [ "${MULTIARCH}" == "true" ]; then
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
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}
@@ -887,7 +917,10 @@ pipeline {
-e WEB_AUTH=\"${CI_AUTH}\" \ -e WEB_AUTH=\"${CI_AUTH}\" \
-e WEB_PATH=\"${CI_WEBPATH}\" \ -e WEB_PATH=\"${CI_WEBPATH}\" \
-e NODE_NAME=\"${NODE_NAME}\" \ -e NODE_NAME=\"${NODE_NAME}\" \
-t ghcr.io/linuxserver/ci:latest \ -e SYFT_IMAGE_TAG=\"${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
-e COMMIT_SHA=\"${COMMIT_SHA}\" \
-e BUILD_NUMBER=\"${BUILD_NUMBER}\" \
-t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
python3 test_build.py''' python3 test_build.py'''
} }
} }
@@ -913,9 +946,11 @@ pipeline {
CACHEIMAGE=${i} CACHEIMAGE=${i}
fi fi
done done
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
{ if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
if [ -n "${SEMVER}" ]; then if [ -n "${SEMVER}" ]; then
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
{ if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
fi fi
done done
''' '''
@@ -940,20 +975,27 @@ pipeline {
CACHEIMAGE=${i} CACHEIMAGE=${i}
fi fi
done done
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
if [ -n "${SEMVER}" ]; then if [ -n "${SEMVER}" ]; then
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
fi fi
done done
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
if [ -n "${SEMVER}" ]; then if [ -n "${SEMVER}" ]; then
docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
{ if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
fi fi
done done
''' '''
@@ -971,23 +1013,41 @@ pipeline {
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
steps { steps {
echo "Pushing New tag for current commit ${META_TAG}"
sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
-d '{"tag":"'${META_TAG}'",\
"object": "'${COMMIT_SHA}'",\
"message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
"type": "commit",\
"tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
echo "Pushing New release for Tag"
sh '''#! /bin/bash sh '''#! /bin/bash
curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq '. |.body' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json echo "Auto-generating release notes"
echo '{"tag_name":"'${META_TAG}'",\ if [ "$(git tag --points-at HEAD)" != "" ]; then
"target_commitish": "master",\ echo "Existing tag points to current commit, suggesting no new LS changes"
"name": "'${META_TAG}'",\ AUTO_RELEASE_NOTES="No changes"
"body": "**CI Report:**\\n\\n'${CI_URL:-N/A}'\\n\\n**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**Remote Changes:**\\n\\n' > start else
printf '","draft": false,"prerelease": false}' >> releasebody.json AUTO_RELEASE_NOTES=$(curl -fsL -H "Authorization: token ${GITHUB_TOKEN}" -H "Accept: application/vnd.github+json" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases/generate-notes \
paste -d'\\0' start releasebody.json > releasebody.json.done -d '{"tag_name":"'${META_TAG}'",\
curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' "target_commitish": "master"}' \
| jq -r '.body' | sed 's|## What.s Changed||')
fi
echo "Pushing New tag for current commit ${META_TAG}"
curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
-d '{"tag":"'${META_TAG}'",\
"object": "'${COMMIT_SHA}'",\
"message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
"type": "commit",\
"tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}'
echo "Pushing New release for Tag"
curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq -r '. |.body' > releasebody.json
jq -n \
--arg tag_name "$META_TAG" \
--arg target_commitish "master" \
--arg ci_url "${CI_URL:-N/A}" \
--arg ls_notes "$AUTO_RELEASE_NOTES" \
--arg remote_notes "$(cat releasebody.json)" \
'{
"tag_name": $tag_name,
"target_commitish": $target_commitish,
"name": $tag_name,
"body": ("**CI Report:**\\n\\n" + $ci_url + "\\n\\n**LinuxServer Changes:**\\n\\n" + $ls_notes + "\\n\\n**Remote Changes:**\\n\\n" + $remote_notes),
"draft": false,
"prerelease": false }' > 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
'''
} }
} }
// Add protection to the release branch // Add protection to the release branch
@@ -1025,98 +1085,13 @@ EOF
) ''' ) '''
} }
} }
// If this is a Pull request send the CI link as a comment on it
stage('Pull Request Comment') {
when {
not {environment name: 'CHANGE_ID', value: ''}
environment name: 'EXIT_STATUS', value: ''
}
steps {
sh '''#! /bin/bash
# Function to retrieve JSON data from URL
get_json() {
local url="$1"
local response=$(curl -s "$url")
if [ $? -ne 0 ]; then
echo "Failed to retrieve JSON data from $url"
return 1
fi
local json=$(echo "$response" | jq .)
if [ $? -ne 0 ]; then
echo "Failed to parse JSON data from $url"
return 1
fi
echo "$json"
}
build_table() {
local data="$1"
# Get the keys in the JSON data
local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]')
# Check if keys are empty
if [ -z "$keys" ]; then
echo "JSON report data does not contain any keys or the report does not exist."
return 1
fi
# Build table header
local header="| Tag | Passed |\\n| --- | --- |\\n"
# Loop through the JSON data to build the table rows
local rows=""
for build in $keys; do
local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success")
if [ "$status" = "true" ]; then
status="✅"
else
status="❌"
fi
local row="| "$build" | "$status" |\\n"
rows="${rows}${row}"
done
local table="${header}${rows}"
local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g')
echo "$escaped_table"
}
if [[ "${CI}" = "true" ]]; then
# Retrieve JSON data from URL
data=$(get_json "$CI_JSON_URL")
# Create table from JSON data
table=$(build_table "$data")
echo -e "$table"
curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \
-d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}"
else
curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \
-d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}"
fi
'''
}
}
} }
/* ###################### /* ######################
Send status to Discord Comment on PR and Send status to Discord
###################### */ ###################### */
post { post {
always { always {
sh '''#!/bin/bash script {
rm -rf /config/.ssh/id_sign
rm -rf /config/.ssh/id_sign.pub
git config --global --unset gpg.format
git config --global --unset user.signingkey
git config --global --unset commit.gpgsign
'''
script{
env.JOB_DATE = sh( env.JOB_DATE = sh(
script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''', script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''',
returnStdout: true).trim() returnStdout: true).trim()
@@ -1159,15 +1134,106 @@ EOF
"username": "Jenkins"}' ${BUILDS_DISCORD} ''' "username": "Jenkins"}' ${BUILDS_DISCORD} '''
} }
} }
script {
if (env.GITHUBIMAGE =~ /lspipepr/){
if (env.CI_TEST_ATTEMPTED == "true"){
sh '''#! /bin/bash
# Function to retrieve JSON data from URL
get_json() {
local url="$1"
local response=$(curl -s "$url")
if [ $? -ne 0 ]; then
echo "Failed to retrieve JSON data from $url"
return 1
fi
local json=$(echo "$response" | jq .)
if [ $? -ne 0 ]; then
echo "Failed to parse JSON data from $url"
return 1
fi
echo "$json"
}
build_table() {
local data="$1"
# Get the keys in the JSON data
local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]')
# Check if keys are empty
if [ -z "$keys" ]; then
echo "JSON report data does not contain any keys or the report does not exist."
return 1
fi
# Build table header
local header="| Tag | Passed |\\n| --- | --- |\\n"
# Loop through the JSON data to build the table rows
local rows=""
for build in $keys; do
local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success")
if [ "$status" = "true" ]; then
status="✅"
else
status="❌"
fi
local row="| "$build" | "$status" |\\n"
rows="${rows}${row}"
done
local table="${header}${rows}"
local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g')
echo "$escaped_table"
}
if [[ "${CI}" = "true" ]]; then
# Retrieve JSON data from URL
data=$(get_json "$CI_JSON_URL")
# Create table from JSON data
table=$(build_table "$data")
echo -e "$table"
curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \
-d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}"
else
curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \
-d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}"
fi
'''
}
}
}
sh '''#!/bin/bash
rm -rf /config/.ssh/id_sign
rm -rf /config/.ssh/id_sign.pub
git config --global --unset gpg.format
git config --global --unset user.signingkey
git config --global --unset commit.gpgsign
'''
} }
cleanup { cleanup {
sh '''#! /bin/bash sh '''#! /bin/bash
echo "Performing docker system prune!!" echo "Pruning builder!!"
containers=$(docker ps -aq) docker builder prune -f --builder container || :
containers=$(docker ps -q)
if [[ -n "${containers}" ]]; then if [[ -n "${containers}" ]]; then
docker stop ${containers} BUILDX_CONTAINER_ID=$(docker ps -qf 'name=buildx_buildkit')
for container in ${containers}; do
if [[ "${container}" == "${BUILDX_CONTAINER_ID}" ]]; then
echo "skipping buildx container in docker stop"
else
echo "Stopping container ${container}"
docker stop ${container}
fi
done
fi fi
docker system prune -af --volumes || : docker system prune -f --volumes || :
docker image prune -af || :
''' '''
cleanWs() cleanWs()
} }

0
LICENSE Executable file → Normal file
View File

View File

@@ -3,9 +3,8 @@
[![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)
[![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!") [![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!")
[![Discord](https://img.shields.io/discord/354974912613449730.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Discord&logo=discord)](https://discord.gg/YWrKVTn "realtime support / chat with the community and the team.") [![Discord](https://img.shields.io/discord/354974912613449730.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Discord&logo=discord)](https://linuxserver.io/discord "realtime support / chat with the community and the team.")
[![Discourse](https://img.shields.io/discourse/https/discourse.linuxserver.io/topics.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=discourse)](https://discourse.linuxserver.io "post on our community forum.") [![Discourse](https://img.shields.io/discourse/https/discourse.linuxserver.io/topics.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=discourse)](https://discourse.linuxserver.io "post on our community forum.")
[![Fleet](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Fleet)](https://fleet.linuxserver.io "an online web interface which displays all of our maintained images.")
[![GitHub](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub&logo=github)](https://github.com/linuxserver "view the source for all of our repositories.") [![GitHub](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub&logo=github)](https://github.com/linuxserver "view the source for all of our repositories.")
[![Open Collective](https://img.shields.io/opencollective/all/linuxserver.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Supporters&logo=open%20collective)](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget") [![Open Collective](https://img.shields.io/opencollective/all/linuxserver.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Supporters&logo=open%20collective)](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget")
@@ -20,9 +19,8 @@ The [LinuxServer.io](https://linuxserver.io) team brings you another container r
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://linuxserver.io/discord) - 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.
* [Fleet](https://fleet.linuxserver.io) - an online web interface which displays all of our maintained images.
* [GitHub](https://github.com/linuxserver) - view the source for all of our repositories. * [GitHub](https://github.com/linuxserver) - view the source for all of our repositories.
* [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget * [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget
@@ -59,7 +57,6 @@ The architectures supported by this image are:
| :----: | :----: | ---- | | :----: | :----: | ---- |
| x86-64 | ✅ | amd64-\<version tag\> | | x86-64 | ✅ | amd64-\<version tag\> |
| arm64 | ✅ | arm64v8-\<version tag\> | | arm64 | ✅ | arm64v8-\<version tag\> |
| armhf | ❌ | |
## Version Tags ## Version Tags
@@ -83,7 +80,7 @@ This image now supports password protection through htpasswd. Run the following
To help you get started creating a container from this image you can either use docker-compose or the docker cli. To help you get started creating a container from this image you can either use docker-compose or the docker cli.
>[!NOTE] >[!NOTE]
>Unless a parameter is flaged as 'optional', it is *mandatory* and a value must be provided. >Unless a parameter is flagged as 'optional', it is *mandatory* and a value must be provided.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose)) ### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
@@ -97,6 +94,7 @@ services:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
- TZ=Etc/UTC - TZ=Etc/UTC
- ALLOW_INTERNAL_REQUESTS=false #optional
volumes: volumes:
- /path/to/heimdall/config:/config - /path/to/heimdall/config:/config
ports: ports:
@@ -113,6 +111,7 @@ docker run -d \
-e PUID=1000 \ -e PUID=1000 \
-e PGID=1000 \ -e PGID=1000 \
-e TZ=Etc/UTC \ -e TZ=Etc/UTC \
-e ALLOW_INTERNAL_REQUESTS=false `#optional` \
-p 80:80 \ -p 80:80 \
-p 443:443 \ -p 443:443 \
-v /path/to/heimdall/config:/config \ -v /path/to/heimdall/config:/config \
@@ -131,6 +130,7 @@ Containers are configured using parameters passed at runtime (such as those abov
| `-e PUID=1000` | for UserID - see below for explanation | | `-e PUID=1000` | for UserID - see below for explanation |
| `-e PGID=1000` | for GroupID - see below for explanation | | `-e PGID=1000` | for GroupID - see below for explanation |
| `-e TZ=Etc/UTC` | specify a timezone to use, see this [list](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). | | `-e TZ=Etc/UTC` | specify a timezone to use, see this [list](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). |
| `-e ALLOW_INTERNAL_REQUESTS=false` | By default, Heimdall blocks lookup requests to private or reserved IP addresses, if your instance is not exposed to the internet, or is behind some level of authentication, you can set this to `true` to allow requests to private IP addresses. |
| `-v /config` | Persistent config files | | `-v /config` | Persistent config files |
## Environment variables from files (Docker secrets) ## Environment variables from files (Docker secrets)
@@ -295,6 +295,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Versions ## Versions
* **20.07.25:** - Rebase to Alpine 3.22, enable PHP environment passthrough.
* **27.06.24:** - Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings. * **27.06.24:** - Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings.
* **07.03.24:** - Enable the opcache and disable file revalidation. * **07.03.24:** - Enable the opcache and disable file revalidation.
* **06.03.24:** - Existing users should update: site-confs/default.conf - Cleanup default site conf. * **06.03.24:** - Existing users should update: site-confs/default.conf - Cleanup default site conf.

View File

@@ -1,251 +1,245 @@
NAME VERSION TYPE NAME VERSION TYPE
Hidden Input 1, 0, 0, 0 dotnet Hidden Input 1, 0, 0, 0 binary
alpine-baselayout 3.6.5-r0 apk acl-libs 2.3.2-r1 apk
alpine-baselayout-data 3.6.5-r0 apk alpine-baselayout 3.7.0-r0 apk
alpine-keys 2.4-r1 apk alpine-baselayout-data 3.7.0-r0 apk
alpine-release 3.20.3-r0 apk alpine-keys 2.5-r0 apk
apache2-utils 2.4.62-r0 apk alpine-release 3.22.3-r0 apk
apk-tools 2.14.4-r1 apk apache2-utils 2.4.66-r0 apk
apr 1.7.5-r0 apk apk-tools 2.14.9-r3 apk
apr-util 1.6.3-r1 apk apr 1.7.5-r0 apk
argon2-libs 20190702-r5 apk apr-util 1.6.3-r1 apk
aws/aws-crt-php v1.2.4 php-composer argon2-libs 20190702-r5 apk
aws/aws-sdk-php 3.299.1 php-composer aws/aws-crt-php v1.2.7 php-composer
barryvdh/laravel-ide-helper v2.15.1 php-composer aws/aws-sdk-php 3.349.3 php-composer
barryvdh/reflection-docblock v2.1.1 php-composer barryvdh/laravel-ide-helper v3.5.5 php-composer
bash 5.2.26-r0 apk barryvdh/reflection-docblock v2.3.1 php-composer
brick/math 0.11.0 php-composer bash 5.2.37-r0 apk
brotli-libs 1.1.0-r2 apk brick/math 0.12.3 php-composer
busybox 1.36.1-r29 apk brotli-libs 1.1.0-r2 apk
busybox-binsh 1.36.1-r29 apk busybox 1.37.0-r20 apk
c-ares 1.33.1-r0 apk busybox-binsh 1.37.0-r20 apk
ca-certificates 20240705-r0 apk c-ares 1.34.6-r0 apk
ca-certificates-bundle 20240705-r0 apk ca-certificates 20250911-r0 apk
carbonphp/carbon-doctrine-types 2.1.0 php-composer ca-certificates-bundle 20250911-r0 apk
catatonit 0.2.0-r0 apk carbonphp/carbon-doctrine-types 3.2.0 php-composer
clue/stream-filter v1.7.0 php-composer catatonit 0.2.1-r0 apk
composer 2.8.4 binary clue/stream-filter v1.7.0 php-composer
composer/class-map-generator 1.1.0 php-composer composer 2.9.5 binary
composer/pcre 3.1.1 php-composer composer/class-map-generator 1.6.1 php-composer
coreutils 9.5-r1 apk composer/pcre 3.3.2 php-composer
coreutils-env 9.5-r1 apk coreutils 9.7-r1 apk
coreutils-fmt 9.5-r1 apk coreutils-env 9.7-r1 apk
coreutils-sha512sum 9.5-r1 apk coreutils-fmt 9.7-r1 apk
curl 8.11.1-r0 apk coreutils-sha512sum 9.7-r1 apk
dflydev/dot-access-data v3.0.2 php-composer curl 8.14.1-r2 apk
doctrine/cache 2.2.0 php-composer dflydev/dot-access-data v3.0.3 php-composer
doctrine/dbal 3.8.2 php-composer doctrine/inflector 2.0.10 php-composer
doctrine/deprecations 1.1.3 php-composer doctrine/lexer 3.0.1 php-composer
doctrine/event-manager 2.0.0 php-composer dragonmantank/cron-expression v3.4.0 php-composer
doctrine/inflector 2.0.9 php-composer egulias/email-validator 4.0.4 php-composer
doctrine/instantiator 2.0.0 php-composer enshrined/svg-sanitize 0.21.0 php-composer
doctrine/lexer 3.0.1 php-composer fakerphp/faker v1.24.1 php-composer
dragonmantank/cron-expression v3.3.3 php-composer filp/whoops 2.18.3 php-composer
egulias/email-validator 4.0.2 php-composer findutils 4.10.0-r0 apk
fakerphp/faker v1.23.1 php-composer fruitcake/php-cors v1.3.0 php-composer
filp/whoops 2.15.4 php-composer git 2.49.1-r0 apk
findutils 4.9.0-r5 apk git-init-template 2.49.1-r0 apk
fruitcake/php-cors v1.3.0 php-composer graham-campbell/bounded-cache v3.0.0 php-composer
git 2.45.2-r0 apk graham-campbell/github v12.8.0 php-composer
git-init-template 2.45.2-r0 apk graham-campbell/manager v5.2.0 php-composer
graham-campbell/bounded-cache v2.2.0 php-composer graham-campbell/result-type v1.1.3 php-composer
graham-campbell/github v12.4.0 php-composer guzzlehttp/guzzle 7.9.3 php-composer
graham-campbell/manager v5.1.0 php-composer guzzlehttp/promises 2.2.0 php-composer
graham-campbell/result-type v1.1.2 php-composer guzzlehttp/psr7 2.7.1 php-composer
guzzlehttp/guzzle 7.8.1 php-composer guzzlehttp/uri-template v1.0.4 php-composer
guzzlehttp/promises 2.0.2 php-composer hamcrest/hamcrest-php v2.1.1 php-composer
guzzlehttp/psr7 2.6.2 php-composer icu-data-en 76.1-r1 apk
guzzlehttp/uri-template v1.0.3 php-composer icu-libs 76.1-r1 apk
hamcrest/hamcrest-php v2.0.1 php-composer jq 1.8.1-r0 apk
icu-data-en 74.2-r0 apk knplabs/github-api v3.16.0 php-composer
icu-libs 74.2-r0 apk laravel/framework v11.45.1 php-composer
jq 1.7.1-r0 apk laravel/prompts v0.3.6 php-composer
knplabs/github-api v3.13.0 php-composer laravel/serializable-closure v2.0.4 php-composer
laravel/framework v10.44.0 php-composer laravel/tinker v2.10.1 php-composer
laravel/prompts v0.1.15 php-composer laravel/ui v4.6.1 php-composer
laravel/serializable-closure v1.3.3 php-composer lcobucci/jwt 5.5.0 php-composer
laravel/tinker v2.9.0 php-composer league/commonmark 2.7.0 php-composer
laravel/ui v4.4.0 php-composer league/config v1.2.0 php-composer
laravelcollective/html v6.4.1 php-composer league/flysystem 3.30.0 php-composer
lcobucci/jwt 5.2.0 php-composer league/flysystem-aws-s3-v3 3.29.0 php-composer
league/commonmark 2.4.2 php-composer league/flysystem-local 3.30.0 php-composer
league/config v1.2.0 php-composer league/mime-type-detection 1.16.0 php-composer
league/flysystem 3.24.0 php-composer league/uri 7.5.1 php-composer
league/flysystem-aws-s3-v3 3.24.0 php-composer league/uri-interfaces 7.5.0 php-composer
league/flysystem-local 3.23.1 php-composer libapk2 2.14.9-r3 apk
league/mime-type-detection 1.15.0 php-composer libattr 2.5.2-r2 apk
libacl 2.3.2-r0 apk libbsd 0.12.2-r0 apk
libattr 2.5.2-r0 apk libbz2 1.0.8-r6 apk
libbsd 0.12.2-r0 apk libcrypto3 3.5.5-r0 apk
libbz2 1.0.8-r6 apk libcurl 8.14.1-r2 apk
libcrypto3 3.3.2-r1 apk libedit 20250104.3.1-r1 apk
libcurl 8.11.1-r0 apk libexpat 2.7.5-r0 apk
libedit 20240517.3.1-r0 apk libgcc 14.2.0-r6 apk
libexpat 2.6.4-r0 apk libidn2 2.3.7-r0 apk
libgcc 13.2.1_git20240309-r0 apk libintl 0.24.1-r0 apk
libidn2 2.3.7-r0 apk libmd 1.1.0-r0 apk
libintl 0.22.5-r0 apk libncursesw 6.5_p20250503-r0 apk
libmd 1.1.0-r0 apk libpq 17.9-r0 apk
libncursesw 6.4_p20240420-r2 apk libproc2 4.0.4-r3 apk
libpq 16.6-r0 apk libpsl 0.21.5-r3 apk
libproc2 4.0.4-r0 apk libssl3 3.5.5-r0 apk
libpsl 0.21.5-r1 apk libstdc++ 14.2.0-r6 apk
libssl3 3.3.2-r1 apk libunistring 1.3-r0 apk
libstdc++ 13.2.1_git20240309-r0 apk libuuid 2.41-r9 apk
libunistring 1.2-r0 apk libxml2 2.13.9-r0 apk
libuuid 2.40.1-r1 apk libzip 1.11.4-r0 apk
libxml2 2.12.7-r0 apk linux-pam 1.7.0-r4 apk
libzip 1.10.1-r0 apk logrotate 3.21.0-r1 apk
linux-pam 1.6.0-r0 apk mockery/mockery 1.6.12 php-composer
logrotate 3.21.0-r1 apk monolog/monolog 3.9.0 php-composer
mockery/mockery 1.6.7 php-composer mtdowling/jmespath.php 2.8.0 php-composer
monolog/monolog 3.5.0 php-composer musl 1.2.5-r10 apk
mtdowling/jmespath.php 2.7.0 php-composer musl-utils 1.2.5-r10 apk
musl 1.2.5-r0 apk myclabs/deep-copy 1.13.3 php-composer
musl-utils 1.2.5-r0 apk nano 8.4-r0 apk
myclabs/deep-copy 1.11.1 php-composer ncurses-terminfo-base 6.5_p20250503-r0 apk
nano 8.0-r0 apk nesbot/carbon 3.10.1 php-composer
ncurses-terminfo-base 6.4_p20240420-r2 apk netcat-openbsd 1.229.1-r0 apk
nesbot/carbon 2.72.3 php-composer nette/schema v1.3.2 php-composer
netcat-openbsd 1.226-r0 apk nette/utils v4.0.7 php-composer
nette/schema v1.3.0 php-composer nghttp2-libs 1.65.0-r0 apk
nette/utils v4.0.4 php-composer nginx 1.28.3-r0 apk
nghttp2-libs 1.62.1-r0 apk nikic/php-parser v5.5.0 php-composer
nginx 1.26.2-r0 apk nunomaduro/collision v8.5.0 php-composer
nikic/php-parser v5.0.0 php-composer nunomaduro/termwind v2.3.1 php-composer
nunomaduro/collision v6.4.0 php-composer oniguruma 6.9.10-r0 apk
nunomaduro/termwind v1.15.1 php-composer openssl 3.5.5-r0 apk
oniguruma 6.9.9-r0 apk pcre2 10.46-r0 apk
openssl 3.3.2-r1 apk phar-io/manifest 2.0.4 php-composer
pcre 8.45-r3 apk phar-io/version 3.2.1 php-composer
pcre2 10.43-r0 apk php-http/cache-plugin 2.0.1 php-composer
phar-io/manifest 2.0.3 php-composer php-http/client-common 2.7.2 php-composer
phar-io/version 3.2.1 php-composer php-http/discovery 1.20.0 php-composer
php-http/cache-plugin 1.8.1 php-composer php-http/httplug 2.4.1 php-composer
php-http/client-common 2.7.1 php-composer php-http/message 1.16.2 php-composer
php-http/discovery 1.19.2 php-composer php-http/multipart-stream-builder 1.4.2 php-composer
php-http/httplug 2.4.0 php-composer php-http/promise 1.3.1 php-composer
php-http/message 1.16.0 php-composer php84 8.4.16-r0 apk
php-http/message-factory 1.1.0 php-composer php84-common 8.4.16-r0 apk
php-http/multipart-stream-builder 1.3.0 php-composer php84-ctype 8.4.16-r0 apk
php-http/promise 1.3.0 php-composer php84-curl 8.4.16-r0 apk
php83 8.3.15-r0 apk php84-dom 8.4.16-r0 apk
php83-common 8.3.15-r0 apk php84-fileinfo 8.4.16-r0 apk
php83-ctype 8.3.15-r0 apk php84-fpm 8.4.16-r0 apk
php83-curl 8.3.15-r0 apk php84-iconv 8.4.16-r0 apk
php83-dom 8.3.15-r0 apk php84-intl 8.4.16-r0 apk
php83-fileinfo 8.3.15-r0 apk php84-mbstring 8.4.16-r0 apk
php83-fpm 8.3.15-r0 apk php84-mysqlnd 8.4.16-r0 apk
php83-iconv 8.3.15-r0 apk php84-opcache 8.4.16-r0 apk
php83-intl 8.3.15-r0 apk php84-openssl 8.4.16-r0 apk
php83-mbstring 8.3.15-r0 apk php84-pdo 8.4.16-r0 apk
php83-mysqlnd 8.3.15-r0 apk php84-pdo_mysql 8.4.16-r0 apk
php83-opcache 8.3.15-r0 apk php84-pdo_pgsql 8.4.16-r0 apk
php83-openssl 8.3.15-r0 apk php84-pdo_sqlite 8.4.16-r0 apk
php83-pdo 8.3.15-r0 apk php84-phar 8.4.16-r0 apk
php83-pdo_mysql 8.3.15-r0 apk php84-session 8.4.16-r0 apk
php83-pdo_pgsql 8.3.15-r0 apk php84-simplexml 8.4.16-r0 apk
php83-pdo_sqlite 8.3.15-r0 apk php84-tokenizer 8.4.16-r0 apk
php83-phar 8.3.15-r0 apk php84-xml 8.4.16-r0 apk
php83-session 8.3.15-r0 apk php84-xmlwriter 8.4.16-r0 apk
php83-simplexml 8.3.15-r0 apk php84-zip 8.4.16-r0 apk
php83-tokenizer 8.3.15-r0 apk phpoption/phpoption 1.9.3 php-composer
php83-xml 8.3.15-r0 apk phpunit/php-code-coverage 10.1.16 php-composer
php83-xmlwriter 8.3.15-r0 apk phpunit/php-file-iterator 4.1.0 php-composer
php83-zip 8.3.15-r0 apk phpunit/php-invoker 4.0.0 php-composer
phpdocumentor/reflection-common 2.2.0 php-composer phpunit/php-text-template 3.0.1 php-composer
phpdocumentor/type-resolver 1.8.0 php-composer phpunit/php-timer 6.0.0 php-composer
phpoption/phpoption 1.9.2 php-composer phpunit/phpunit 10.5.47 php-composer
phpstan/phpdoc-parser 1.25.0 php-composer popt 1.19-r4 apk
phpunit/php-code-coverage 9.2.30 php-composer procps-ng 4.0.4-r3 apk
phpunit/php-file-iterator 3.0.6 php-composer psr/cache 3.0.0 php-composer
phpunit/php-invoker 3.1.1 php-composer psr/clock 1.0.0 php-composer
phpunit/php-text-template 2.0.4 php-composer psr/container 2.0.2 php-composer
phpunit/php-timer 5.0.3 php-composer psr/event-dispatcher 1.0.0 php-composer
phpunit/phpunit 9.6.16 php-composer psr/http-client 1.0.3 php-composer
popt 1.19-r3 apk psr/http-factory 1.1.0 php-composer
procps-ng 4.0.4-r0 apk psr/http-message 2.0 php-composer
psr/cache 3.0.0 php-composer psr/log 3.0.2 php-composer
psr/clock 1.0.0 php-composer psr/simple-cache 3.0.0 php-composer
psr/container 2.0.2 php-composer psy/psysh v0.12.9 php-composer
psr/event-dispatcher 1.0.0 php-composer ralouphie/getallheaders 3.0.3 php-composer
psr/http-client 1.0.3 php-composer ramsey/collection 2.1.1 php-composer
psr/http-factory 1.0.2 php-composer ramsey/uuid 4.9.0 php-composer
psr/http-message 2.0 php-composer readline 8.2.13-r1 apk
psr/log 3.0.0 php-composer scanelf 1.3.8-r1 apk
psr/simple-cache 3.0.0 php-composer sebastian/cli-parser 2.0.1 php-composer
psy/psysh v0.12.0 php-composer sebastian/code-unit 2.0.0 php-composer
ralouphie/getallheaders 3.0.3 php-composer sebastian/code-unit-reverse-lookup 3.0.0 php-composer
ramsey/collection 2.0.0 php-composer sebastian/comparator 5.0.3 php-composer
ramsey/uuid 4.7.5 php-composer sebastian/complexity 3.2.0 php-composer
readline 8.2.10-r0 apk sebastian/diff 5.1.1 php-composer
scanelf 1.3.7-r2 apk sebastian/environment 6.1.0 php-composer
sebastian/cli-parser 1.0.1 php-composer sebastian/exporter 5.1.2 php-composer
sebastian/code-unit 1.0.8 php-composer sebastian/global-state 6.0.2 php-composer
sebastian/code-unit-reverse-lookup 2.0.3 php-composer sebastian/lines-of-code 2.0.2 php-composer
sebastian/comparator 4.0.8 php-composer sebastian/object-enumerator 5.0.0 php-composer
sebastian/complexity 2.0.3 php-composer sebastian/object-reflector 3.0.0 php-composer
sebastian/diff 4.0.5 php-composer sebastian/recursion-context 5.0.0 php-composer
sebastian/environment 5.1.5 php-composer sebastian/type 4.0.0 php-composer
sebastian/exporter 4.0.5 php-composer sebastian/version 4.0.1 php-composer
sebastian/global-state 5.0.6 php-composer shadow 4.17.3-r0 apk
sebastian/lines-of-code 1.0.4 php-composer skalibs-libs 2.14.4.0-r0 apk
sebastian/object-enumerator 4.0.4 php-composer spatie/backtrace 1.7.4 php-composer
sebastian/object-reflector 2.0.4 php-composer spatie/error-solutions 1.1.3 php-composer
sebastian/recursion-context 4.0.5 php-composer spatie/flare-client-php 1.10.1 php-composer
sebastian/resource-operations 3.0.3 php-composer spatie/ignition 1.15.1 php-composer
sebastian/type 3.2.1 php-composer spatie/laravel-html 3.12.0 php-composer
sebastian/version 3.0.2 php-composer spatie/laravel-ignition 2.9.1 php-composer
shadow 4.15.1-r0 apk sqlite-libs 3.49.2-r1 apk
skalibs 2.14.1.1-r0 apk squizlabs/php_codesniffer 3.13.2 php-composer
spatie/backtrace 1.5.3 php-composer ssl_client 1.37.0-r20 apk
spatie/flare-client-php 1.4.4 php-composer symfony/cache v7.3.1 php-composer
spatie/ignition 1.12.0 php-composer symfony/cache-contracts v3.6.0 php-composer
spatie/laravel-ignition 2.4.2 php-composer symfony/clock v7.3.0 php-composer
sqlite-libs 3.45.3-r1 apk symfony/console v7.3.1 php-composer
squizlabs/php_codesniffer 3.9.0 php-composer symfony/css-selector v7.3.0 php-composer
ssl_client 1.36.1-r29 apk symfony/deprecation-contracts v3.6.0 php-composer
symfony/cache v6.4.3 php-composer symfony/error-handler v7.3.1 php-composer
symfony/cache-contracts v3.4.0 php-composer symfony/event-dispatcher v7.3.0 php-composer
symfony/console v6.4.3 php-composer symfony/event-dispatcher-contracts v3.6.0 php-composer
symfony/css-selector v7.0.3 php-composer symfony/finder v7.3.0 php-composer
symfony/deprecation-contracts v3.4.0 php-composer symfony/http-foundation v7.3.1 php-composer
symfony/error-handler v6.4.3 php-composer symfony/http-kernel v7.3.1 php-composer
symfony/event-dispatcher v7.0.3 php-composer symfony/mailer v7.3.1 php-composer
symfony/event-dispatcher-contracts v3.4.0 php-composer symfony/mime v7.3.0 php-composer
symfony/finder v6.4.0 php-composer symfony/options-resolver v7.3.0 php-composer
symfony/http-foundation v6.4.3 php-composer symfony/polyfill-ctype v1.32.0 php-composer
symfony/http-kernel v6.4.3 php-composer symfony/polyfill-intl-grapheme v1.32.0 php-composer
symfony/mailer v6.4.3 php-composer symfony/polyfill-intl-idn v1.32.0 php-composer
symfony/mime v6.4.3 php-composer symfony/polyfill-intl-normalizer v1.32.0 php-composer
symfony/options-resolver v7.0.0 php-composer symfony/polyfill-mbstring v1.32.0 php-composer
symfony/polyfill-ctype v1.29.0 php-composer symfony/polyfill-php80 v1.32.0 php-composer
symfony/polyfill-intl-grapheme v1.29.0 php-composer symfony/polyfill-php83 v1.32.0 php-composer
symfony/polyfill-intl-idn v1.29.0 php-composer symfony/polyfill-uuid v1.32.0 php-composer
symfony/polyfill-intl-normalizer v1.29.0 php-composer symfony/process v7.3.0 php-composer
symfony/polyfill-mbstring v1.29.0 php-composer symfony/routing v7.3.0 php-composer
symfony/polyfill-php72 v1.29.0 php-composer symfony/service-contracts v3.6.0 php-composer
symfony/polyfill-php80 v1.29.0 php-composer symfony/string v7.3.0 php-composer
symfony/polyfill-php83 v1.29.0 php-composer symfony/thanks v1.4.0 php-composer
symfony/polyfill-uuid v1.29.0 php-composer symfony/translation v7.3.1 php-composer
symfony/process v6.4.3 php-composer symfony/translation-contracts v3.6.0 php-composer
symfony/routing v6.4.3 php-composer symfony/uid v7.3.1 php-composer
symfony/service-contracts v3.4.1 php-composer symfony/var-dumper v7.3.1 php-composer
symfony/string v7.0.3 php-composer symfony/var-exporter v7.3.0 php-composer
symfony/thanks v1.2.10 php-composer symfony/yaml v7.3.1 php-composer
symfony/translation v6.4.3 php-composer theseer/tokenizer 1.2.3 php-composer
symfony/translation-contracts v3.4.1 php-composer tijsverkoyen/css-to-inline-styles v2.3.0 php-composer
symfony/uid v6.4.3 php-composer tzdata 2026a-r0 apk
symfony/var-dumper v6.4.3 php-composer utmps-libs 0.1.3.1-r0 apk
symfony/var-exporter v7.0.3 php-composer vlucas/phpdotenv v5.6.2 php-composer
symfony/yaml v6.4.3 php-composer voku/portable-ascii 2.0.3 php-composer
theseer/tokenizer 1.2.2 php-composer webmozart/assert 1.11.0 php-composer
tijsverkoyen/css-to-inline-styles v2.2.7 php-composer xz-libs 5.8.1-r0 apk
tzdata 2024b-r0 apk zlib 1.3.1-r2 apk
utmps-libs 0.1.2.2-r1 apk zstd-libs 1.5.7-r0 apk
vlucas/phpdotenv v5.6.0 php-composer
voku/portable-ascii 2.0.1 php-composer
webmozart/assert 1.11.0 php-composer
xz-libs 5.6.2-r0 apk
zlib 1.3.1-r1 apk
zstd-libs 1.5.6-r0 apk

View File

@@ -11,6 +11,7 @@ project_blurb: |
Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo. Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo.
project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}" project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}"
project_categories: "Dashboard"
# supported architectures # supported architectures
available_architectures: available_architectures:
- {arch: "{{ arch_x86_64 }}", tag: "amd64-latest"} - {arch: "{{ arch_x86_64 }}", tag: "amd64-latest"}
@@ -30,6 +31,9 @@ param_usage_include_ports: true
param_ports: param_ports:
- {external_port: "80", internal_port: "80", port_desc: "http gui"} - {external_port: "80", internal_port: "80", port_desc: "http gui"}
- {external_port: "443", internal_port: "443", port_desc: "https gui"} - {external_port: "443", internal_port: "443", port_desc: "https gui"}
opt_param_usage_include_env: true
opt_param_env_vars:
- {env_var: "ALLOW_INTERNAL_REQUESTS", env_value: "false", desc: "By default, Heimdall blocks lookup requests to private or reserved IP addresses, if your instance is not exposed to the internet, or is behind some level of authentication, you can set this to `true` to allow requests to private IP addresses."}
# application setup block # application setup block
app_setup_block_enabled: true app_setup_block_enabled: true
app_setup_block: | app_setup_block: |
@@ -56,32 +60,29 @@ init_diagram: |
init-nginx-end -> init-config init-nginx-end -> init-config
init-os-end -> init-config init-os-end -> init-config
init-config -> init-config-end init-config -> init-config-end
init-crontab-config -> init-config-end
init-heimdall-config -> init-config-end init-heimdall-config -> init-config-end
init-os-end -> init-crontab-config init-config -> init-crontab-config
init-mods-end -> init-custom-files init-mods-end -> init-custom-files
init-adduser -> init-device-perms
base -> init-envfile base -> init-envfile
init-os-end -> init-folders init-os-end -> init-folders
init-nginx-end -> init-heimdall-config init-nginx-end -> init-heimdall-config
init-php -> init-keygen init-php -> init-keygen
base -> init-migrations base -> init-migrations
base -> init-mods
init-config-end -> init-mods init-config-end -> init-mods
init-version-checks -> init-mods
init-mods -> init-mods-end
init-mods-package-install -> init-mods-end init-mods-package-install -> init-mods-end
init-mods -> init-mods-package-install init-mods -> init-mods-package-install
init-samples -> init-nginx init-samples -> init-nginx
init-permissions -> init-nginx-end init-version-checks -> init-nginx-end
base -> init-os-end
init-adduser -> init-os-end init-adduser -> init-os-end
init-device-perms -> init-os-end
init-envfile -> init-os-end init-envfile -> init-os-end
init-migrations -> init-os-end
init-keygen -> init-permissions init-keygen -> init-permissions
init-nginx -> init-php init-nginx -> init-php
init-folders -> init-samples init-folders -> init-samples
init-custom-files -> init-services init-custom-files -> init-services
init-mods-end -> init-services init-permissions -> init-version-checks
init-config-end -> init-version-checks
init-services -> svc-cron init-services -> svc-cron
svc-cron -> legacy-services svc-cron -> legacy-services
init-services -> svc-nginx init-services -> svc-nginx
@@ -92,11 +93,12 @@ init_diagram: |
svc-queue -> legacy-services svc-queue -> legacy-services
} }
Base Images: { Base Images: {
"baseimage-alpine-nginx:3.20" <- "baseimage-alpine:3.20" "baseimage-alpine-nginx:3.22" <- "baseimage-alpine:3.22"
} }
"heimdall:latest" <- Base Images "heimdall:latest" <- Base Images
# changelog # changelog
changelogs: changelogs:
- {date: "20.07.25:", desc: "Rebase to Alpine 3.22, enable PHP environment passthrough."}
- {date: "27.06.24:", desc: "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."} - {date: "27.06.24:", desc: "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."}
- {date: "07.03.24:", desc: "Enable the opcache and disable file revalidation."} - {date: "07.03.24:", desc: "Enable the opcache and disable file revalidation."}
- {date: "06.03.24:", desc: "Existing users should update: site-confs/default.conf - Cleanup default site conf."} - {date: "06.03.24:", desc: "Existing users should update: site-confs/default.conf - Cleanup default site conf."}