Compare commits

...

119 Commits

Author SHA1 Message Date
LinuxServer-CI
6f99c81c7d Bot Updating Package Versions 2024-07-25 22:37:13 +00:00
LinuxServer-CI
e59909addc Bot Updating Package Versions 2024-07-23 11:54:34 +00:00
LinuxServer-CI
c690639528 Bot Updating Templated Files 2024-07-16 11:50:55 +00:00
LinuxServer-CI
5aebb77566 Bot Updating Templated Files 2024-07-16 11:48:24 +00:00
LinuxServer-CI
85e673015c Bot Updating Package Versions 2024-07-12 08:38:03 +00:00
LinuxServer-CI
e372bf8c1f Bot Updating Package Versions 2024-07-09 11:53:27 +00:00
LinuxServer-CI
9888ec10bb Bot Updating Package Versions 2024-07-02 11:52:22 +00:00
LinuxServer-CI
746fc2314f Bot Updating Package Versions 2024-06-25 14:57:41 +00:00
Adam
2ebf64ed79
Merge pull request #445 from linuxserver/develop-3.20
Rebase to 3.20 (develop)
2024-06-25 15:50:18 +01:00
thespad
62d13eaf3b
Rebase to 3.20 2024-06-24 20:36:45 +01:00
LinuxServer-CI
4adc904193 Bot Updating Package Versions 2024-06-21 14:36:12 +00:00
LinuxServer-CI
dbe99cc569 Bot Updating Package Versions 2024-06-17 21:34:18 +00:00
LinuxServer-CI
abba10c24c Bot Updating Package Versions 2024-06-11 11:50:49 +00:00
LinuxServer-CI
4513213b97 Bot Updating Package Versions 2024-06-04 11:50:59 +00:00
LinuxServer-CI
e25462f5d6 Bot Updating Package Versions 2024-05-28 11:52:42 +00:00
LinuxServer-CI
93c0ad7d37 Bot Updating Templated Files 2024-05-21 11:51:56 +00:00
LinuxServer-CI
c2921714b2 Bot Updating Templated Files 2024-05-21 11:49:39 +00:00
LinuxServer-CI
e4147b179b Bot Updating Package Versions 2024-05-18 08:36:32 +00:00
LinuxServer-CI
6838676b53 Bot Updating Package Versions 2024-05-14 11:53:21 +00:00
LinuxServer-CI
2687e98212 Bot Updating Templated Files 2024-05-14 11:48:35 +00:00
LinuxServer-CI
419c882f73 Bot Updating Package Versions 2024-05-07 11:53:07 +00:00
LinuxServer-CI
e5f9510fed Bot Updating Templated Files 2024-05-07 11:48:40 +00:00
LinuxServer-CI
222b58c99c Bot Updating Package Versions 2024-04-30 11:56:53 +00:00
LinuxServer-CI
e355bcbe6a Bot Updating Templated Files 2024-04-30 11:48:41 +00:00
LinuxServer-CI
4f00b831d3 Bot Updating Package Versions 2024-04-23 11:50:13 +00:00
LinuxServer-CI
7a8248f3cd Bot Updating Package Versions 2024-04-16 11:50:06 +00:00
LinuxServer-CI
915ab07cd9 Bot Updating Package Versions 2024-04-08 13:35:02 +00:00
LinuxServer-CI
afb828d4da Bot Updating Package Versions 2024-04-02 11:50:18 +00:00
LinuxServer-CI
f7056138b6 Bot Updating Package Versions 2024-03-26 11:53:11 +00:00
LinuxServer-CI
70f6155bbf Bot Updating Package Versions 2024-03-21 21:33:06 +00:00
LinuxServer-CI
b9cf966878 Bot Updating Package Versions 2024-03-19 11:52:47 +00:00
LinuxServer-CI
dead6f366e Bot Updating Package Versions 2024-03-14 21:33:06 +00:00
LinuxServer-CI
c2c4010ffb Bot Updating Templated Files 2024-03-12 20:31:37 +00:00
LinuxServer-CI
150c587dff Bot Updating Package Versions 2024-03-07 22:34:05 +00:00
LinuxServer-CI
671cf6fe6c Bot Updating Package Versions 2024-03-06 18:32:28 +00:00
LinuxServer-CI
a7da03b8d8 Bot Updating Templated Files 2024-03-06 18:25:39 +00:00
Eric Nemchik
7c8251110c
Rebase to Alpine 3.19 (#399)
* Rebase to Alpine 3.19

Signed-off-by: Eric Nemchik <eric@nemchik.com>

* update date and edge repo

---------

Signed-off-by: Eric Nemchik <eric@nemchik.com>
Co-authored-by: aptalca <541623+aptalca@users.noreply.github.com>
2024-03-06 13:24:01 -05:00
LinuxServer-CI
11824dbfe3 Bot Updating Package Versions 2024-03-05 11:50:19 +00:00
LinuxServer-CI
0004b51af8 Bot Updating Package Versions 2024-02-27 11:57:52 +00:00
LinuxServer-CI
9706c0481a Bot Updating Templated Files 2024-02-27 11:50:16 +00:00
LinuxServer-CI
bcf04398d0 Bot Updating Templated Files 2024-02-27 11:48:43 +00:00
LinuxServer-CI
48667a56dd Bot Updating Package Versions 2024-02-16 14:34:20 +00:00
LinuxServer-CI
b906641f24 Bot Updating Package Versions 2024-02-13 11:52:12 +00:00
LinuxServer-CI
9e83ba52fc Bot Updating Package Versions 2024-02-06 11:49:42 +00:00
LinuxServer-CI
0dfd84df5c Bot Updating Package Versions 2024-01-29 15:37:30 +00:00
LinuxServer-CI
231f432f80 Bot Updating Package Versions 2024-01-23 10:40:44 +00:00
LinuxServer-CI
c15658c110 Bot Updating Package Versions 2024-01-18 17:36:47 +00:00
LinuxServer-CI
388fc6d47a Bot Updating Package Versions 2024-01-16 11:56:53 +00:00
LinuxServer-CI
2fe50c2f12 Bot Updating Templated Files 2024-01-16 11:50:34 +00:00
LinuxServer-CI
21dde133fd Bot Updating Templated Files 2024-01-16 11:48:58 +00:00
LinuxServer-CI
7bed73efff Bot Updating Package Versions 2024-01-09 11:50:08 +00:00
driz
aede8706ae
Merge pull request #406 from linuxserver/dev-mime-fix
Merge pull request #405 from linuxserver/conf-fix-test
2024-01-03 20:55:16 -05:00
Eric Nemchik
ccb0036a96
Merge pull request #405 from linuxserver/conf-fix-test
maybe fix nextcloud?
2024-01-03 23:48:00 +00:00
LinuxServer-CI
6675775f5c Bot Updating Templated Files 2024-01-02 16:12:23 +00:00
Eric Nemchik
9d7ea19a71
Merge pull request #404 from linuxserver/cleanup-nginx-develop
Cleanup default site conf
2024-01-02 10:10:21 -06:00
Eric Nemchik
7a4dc0aa13
Update readme date
Signed-off-by: GitHub <noreply@github.com>
2024-01-02 16:07:05 +00:00
Eric Nemchik
56461a34b3
Cleanup default site conf
Signed-off-by: Eric Nemchik <eric@nemchik.com>
2024-01-02 16:05:58 +00:00
LinuxServer-CI
f131871e4c Bot Updating Package Versions 2024-01-02 11:49:44 +00:00
Adam
aae9593ea7
Merge pull request #396 from linuxserver/develop-mime
Avoid duplicate mime definition
2023-12-22 22:39:46 +00:00
TheSpad
4178035a55
Consistent formatting 2023-12-22 17:16:22 +00:00
TheSpad
0ad8c52d56
Use text/javascript as per rfc9239 2023-12-22 17:15:18 +00:00
TheSpad
37eb7522e1
Prefer application/javascript 2023-12-22 17:08:14 +00:00
TheSpad
794f71483a
Avoid duplicate mime definition 2023-12-22 17:01:35 +00:00
LinuxServer-CI
b22dc7887a Bot Updating Package Versions 2023-12-22 16:33:56 +00:00
Adam
408d92a2ec
Merge pull request #393 from linuxserver/develop-conf-mjs
sync with upstream nextcloud docs
2023-12-22 16:28:28 +00:00
TheSpad
c3c64ae5d5
sync with upstream nextcloud docs 2023-12-22 16:03:20 +00:00
LinuxServer-CI
bf1947d7ad Bot Updating Package Versions 2023-12-12 11:50:00 +00:00
LinuxServer-CI
94fd873ece Bot Updating Package Versions 2023-12-07 21:34:08 +00:00
LinuxServer-CI
61f34bacdc Bot Updating Package Versions 2023-12-05 11:50:04 +00:00
LinuxServer-CI
21f2fc0840 Bot Updating Package Versions 2023-11-30 21:34:34 +00:00
Eric Nemchik
2bdf249bf1
Merge pull request #383 from linuxserver/quiet-migration-develop
only run migration if conf exists
2023-11-29 08:30:52 -06:00
LinuxServer-CI
e2d34baa3f Bot Updating Package Versions 2023-11-28 11:52:19 +00:00
Eric Nemchik
be9ffb890e
only run migration if conf exists
redirect stderr to /dev/null

Signed-off-by: Eric Nemchik <eric@nemchik.com>
2023-11-25 10:49:42 -06:00
LinuxServer-CI
f62cc3b9e8 Bot Updating Package Versions 2023-11-21 11:49:54 +00:00
Eric Nemchik
45d68d0508
Merge pull request #357 from linuxserver/standard-cron-develop
standard cron develop
2023-11-18 19:09:15 -06:00
LinuxServer-CI
ba1ac62fd9 Bot Updating Package Versions 2023-11-16 21:36:06 +00:00
LinuxServer-CI
ca6afd353a Bot Updating Templated Files 2023-11-16 21:31:08 +00:00
LinuxServer-CI
acb431bc9c Bot Updating Package Versions 2023-11-14 23:32:43 +00:00
LinuxServer-CI
2639cc28cd Bot Updating Package Versions 2023-11-14 11:49:59 +00:00
LinuxServer-CI
35919306ae Bot Updating Package Versions 2023-11-10 14:35:17 +00:00
LinuxServer-CI
355c1b33c1 Bot Updating Package Versions 2023-11-02 16:40:23 +00:00
LinuxServer-CI
5bb6b49068 Bot Updating Package Versions 2023-10-28 19:59:43 +00:00
LinuxServer-CI
96ae53f2fc Bot Updating Templated Files 2023-10-28 19:54:46 +00:00
Eric Nemchik
9755ecbbc5
Merge pull request #376 from linuxserver/disable-web-upgrade-develop
Disable web upgrades using occ during init develop
2023-10-28 14:53:12 -05:00
Eric Nemchik
e07f1ae896
Disable web upgrades using occ during init
Signed-off-by: Eric Nemchik <eric@nemchik.com>
2023-10-28 14:25:07 -05:00
LinuxServer-CI
a810a8f45f Bot Updating Package Versions 2023-10-24 11:52:50 +00:00
LinuxServer-CI
4f772f8a0e Bot Updating Package Versions 2023-10-17 11:50:15 +00:00
LinuxServer-CI
eb988dcf54 Bot Updating Package Versions 2023-10-12 21:34:51 +00:00
LinuxServer-CI
c8441d7681 Bot Updating Package Versions 2023-10-10 11:54:28 +00:00
LinuxServer-CI
3caf64eb7e Bot Updating Templated Files 2023-10-10 11:50:24 +00:00
LinuxServer-CI
49474850dc Bot Updating Templated Files 2023-10-10 11:48:50 +00:00
LinuxServer-CI
373ee2efc0 Bot Updating Package Versions 2023-09-29 00:41:10 +00:00
Eric Nemchik
56ae57320b
Merge pull request #359 from linuxserver/develop-updatenotification-app
Re-add updatenotification app
2023-09-28 19:36:15 -05:00
LinuxServer-CI
26c0913d86 Bot Updating Package Versions 2023-09-28 14:38:09 +00:00
LinuxServer-CI
525efaa99a Bot Updating Package Versions 2023-09-26 11:50:04 +00:00
quietsy
50c57a68f9
Merge pull request #365 from linuxserver/fix-lsiown-develop
Fix lsiown -R order
2023-09-18 16:57:26 +03:00
quietsy
a1a8f070f1 Fix lsiown -R order 2023-09-18 16:39:12 +03:00
LinuxServer-CI
9f953af7ad Bot Updating Package Versions 2023-09-14 18:33:10 +00:00
LinuxServer-CI
4d74174b8c Bot Updating Package Versions 2023-09-12 09:35:12 +00:00
LinuxServer-CI
db66b6a2cc Bot Updating Package Versions 2023-09-07 14:33:34 +00:00
LinuxServer-CI
92378267ac Bot Updating Package Versions 2023-09-05 11:50:04 +00:00
LinuxServer-CI
7f08b006fe Bot Updating Package Versions 2023-08-31 15:33:10 +00:00
Eric Nemchik
cea5b826cc
Re-add updatenotification app
Closes https://github.com/linuxserver/docker-nextcloud/issues/356

Signed-off-by: GitHub <noreply@github.com>
2023-08-31 14:00:49 +00:00
LinuxServer-CI
e7cdf18d23 Bot Updating Package Versions 2023-08-29 11:51:13 +00:00
Eric Nemchik
74f9122ab6
Merge branch 'standard-cron' into standard-cron-develop 2023-08-26 09:59:51 -05:00
LinuxServer-CI
d935187cb3 Bot Updating Package Versions 2023-08-22 11:50:11 +00:00
LinuxServer-CI
24cb0878c4 Bot Updating Package Versions 2023-08-15 11:57:10 +00:00
LinuxServer-CI
d641ed8dba Bot Updating Package Versions 2023-08-15 11:52:53 +00:00
quietsy
9651cce68c
Merge pull request #352 from linuxserver/initial-develop
Add develop branch
2023-08-15 09:27:38 +03:00
quietsy
a7f9b4c842 Add develop branch 2023-08-15 08:52:29 +03:00
LinuxServer-CI
ecb0c736a1 Bot Updating Package Versions 2023-08-15 03:26:31 +00:00
LinuxServer-CI
a68f0f6925 Bot Updating Package Versions 2023-08-15 03:22:55 +00:00
LinuxServer-CI
9c74d389e8 Bot Updating Package Versions 2023-08-15 03:19:37 +00:00
Eric Nemchik
679d4f2c41
Merge pull request #353 from linuxserver/remove-updatenotification
Remove updatenotification
2023-08-14 22:16:03 -05:00
Eric Nemchik
fd7d9d1f0a
Run silent
Signed-off-by: Eric Nemchik <eric@nemchik.com>
2023-08-14 20:06:34 -05:00
Eric Nemchik
ea2517e26d
Remove updatenotification
Signed-off-by: Eric Nemchik <eric@nemchik.com>
2023-08-14 20:00:33 -05:00
LinuxServer-CI
d2fd6fc539 Bot Updating Package Versions 2023-08-14 14:04:59 +00:00
LinuxServer-CI
7ed49f352e Bot Updating Package Versions 2023-08-08 11:50:05 +00:00
LinuxServer-CI
e916f5b8e7 Bot Updating Package Versions 2023-08-01 11:49:55 +00:00
19 changed files with 886 additions and 769 deletions

View File

@ -24,7 +24,7 @@
## Readme ## Readme
If you would like to change our readme, please __**do not**__ directly edit the readme, as it is auto-generated on each commit. If you would like to change our readme, please __**do not**__ directly edit the readme, as it is auto-generated on each commit.
Instead edit the [readme-vars.yml](https://github.com/linuxserver/docker-nextcloud/edit/master/readme-vars.yml). Instead edit the [readme-vars.yml](https://github.com/linuxserver/docker-nextcloud/edit/develop/readme-vars.yml).
These variables are used in a template for our [Jenkins Builder](https://github.com/linuxserver/docker-jenkins-builder) as part of an ansible play. These variables are used in a template for our [Jenkins Builder](https://github.com/linuxserver/docker-jenkins-builder) as part of an ansible play.
Most of these variables are also carried over to [docs.linuxserver.io](https://docs.linuxserver.io/images/docker-nextcloud) Most of these variables are also carried over to [docs.linuxserver.io](https://docs.linuxserver.io/images/docker-nextcloud)
@ -115,7 +115,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Update the changelog ## Update the changelog
If you are modifying the Dockerfiles or any of the startup scripts in [root](https://github.com/linuxserver/docker-nextcloud/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-nextcloud/tree/develop/root), add an entry to the changelog
```yml ```yml
changelogs: changelogs:

View File

@ -67,10 +67,10 @@ body:
- type: textarea - type: textarea
attributes: attributes:
description: | description: |
Provide a full docker log, output of "docker logs linuxserver.io" Provide a full docker log, output of "docker logs nextcloud"
label: Container logs label: Container logs
placeholder: | placeholder: |
Output of `docker logs linuxserver.io` Output of `docker logs nextcloud`
render: bash render: bash
validations: validations:
required: true required: true

View File

@ -21,7 +21,7 @@
------------------------------ ------------------------------
- [ ] I have read the [contributing](https://github.com/linuxserver/docker-nextcloud/blob/master/.github/CONTRIBUTING.md) guideline and understand that I have made the correct modifications - [ ] I have read the [contributing](https://github.com/linuxserver/docker-nextcloud/blob/develop/.github/CONTRIBUTING.md) guideline and understand that I have made the correct modifications
------------------------------ ------------------------------

View File

@ -4,26 +4,26 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
external-trigger-master: external-trigger-develop:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3.1.0 - uses: actions/checkout@v4.1.1
- name: External Trigger - name: External Trigger
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/develop'
run: | run: |
if [ -n "${{ secrets.PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_MASTER }}" ]; then if [ -n "${{ secrets.PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_DEVELOP }}" ]; then
echo "**** Github secret PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_MASTER is set; skipping trigger. ****" echo "**** Github secret PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_DEVELOP is set; skipping trigger. ****"
echo "Github secret \`PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY echo "Github secret \`PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_DEVELOP\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
fi fi
echo "**** External trigger running off of master branch. To disable this trigger, set a Github secret named \"PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_MASTER\". ****" echo "**** External trigger running off of develop branch. To disable this trigger, set a Github secret named \"PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_DEVELOP\". ****"
echo "External trigger running off of master branch. To disable this trigger, set a Github secret named \`PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_MASTER\`" >> $GITHUB_STEP_SUMMARY echo "External trigger running off of develop branch. To disable this trigger, set a Github secret named \`PAUSE_EXTERNAL_TRIGGER_NEXTCLOUD_DEVELOP\`" >> $GITHUB_STEP_SUMMARY
echo "**** Retrieving external version ****" echo "**** Retrieving external version ****"
EXT_RELEASE=$(curl -u ${{ secrets.CR_USER }}:${{ secrets.CR_PAT }} -sX GET https://api.github.com/repos/nextcloud/server/releases | jq -r '.[] | select(.prerelease != true) | .tag_name' | sed 's|^v||g' | sort -rV | head -1) EXT_RELEASE=$(curl -u ${{ secrets.CR_USER }}:${{ secrets.CR_PAT }} -sX GET https://api.github.com/repos/nextcloud/server/releases | jq -r '.[] | select(.prerelease == true) | .tag_name' | sed 's|^v||g' | sort -rV | head -1)
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
echo "**** Can't retrieve external version, exiting ****" echo "**** Can't retrieve external version, exiting ****"
FAILURE_REASON="Can't retrieve external version for nextcloud branch master" FAILURE_REASON="Can't retrieve external version for nextcloud branch develop"
GHA_TRIGGER_URL="https://github.com/linuxserver/docker-nextcloud/actions/runs/${{ github.run_id }}" GHA_TRIGGER_URL="https://github.com/linuxserver/docker-nextcloud/actions/runs/${{ github.run_id }}"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680, curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680,
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n**Trigger URL:** '"${GHA_TRIGGER_URL}"' \n"}], "description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n**Trigger URL:** '"${GHA_TRIGGER_URL}"' \n"}],
@ -35,7 +35,7 @@ jobs:
echo "External version: ${EXT_RELEASE}" >> $GITHUB_STEP_SUMMARY echo "External version: ${EXT_RELEASE}" >> $GITHUB_STEP_SUMMARY
echo "**** Retrieving last pushed version ****" echo "**** Retrieving last pushed version ****"
image="linuxserver/nextcloud" image="linuxserver/nextcloud"
tag="latest" tag="develop"
token=$(curl -sX GET \ token=$(curl -sX GET \
"https://ghcr.io/token?scope=repository%3Alinuxserver%2Fnextcloud%3Apull" \ "https://ghcr.io/token?scope=repository%3Alinuxserver%2Fnextcloud%3Apull" \
| jq -r '.token') | jq -r '.token')
@ -61,7 +61,7 @@ jobs:
IMAGE_VERSION=$(echo ${IMAGE_RELEASE} | awk -F'-ls' '{print $1}') IMAGE_VERSION=$(echo ${IMAGE_RELEASE} | awk -F'-ls' '{print $1}')
if [ -z "${IMAGE_VERSION}" ]; then if [ -z "${IMAGE_VERSION}" ]; then
echo "**** Can't retrieve last pushed version, exiting ****" echo "**** Can't retrieve last pushed version, exiting ****"
FAILURE_REASON="Can't retrieve last pushed version for nextcloud tag latest" FAILURE_REASON="Can't retrieve last pushed version for nextcloud tag develop"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680, curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 16711680,
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}], "description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }} "username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
@ -73,7 +73,7 @@ jobs:
echo "**** Version ${EXT_RELEASE} already pushed, exiting ****" echo "**** Version ${EXT_RELEASE} already pushed, exiting ****"
echo "Version ${EXT_RELEASE} already pushed, exiting" >> $GITHUB_STEP_SUMMARY echo "Version ${EXT_RELEASE} already pushed, exiting" >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/develop/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 ****" echo "**** New version ${EXT_RELEASE} found; but there already seems to be an active build on Jenkins; exiting ****"
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
exit 0 exit 0
@ -81,7 +81,7 @@ jobs:
echo "**** New version ${EXT_RELEASE} found; old version was ${IMAGE_VERSION}. Triggering new build ****" echo "**** New version ${EXT_RELEASE} found; old version was ${IMAGE_VERSION}. Triggering new build ****"
echo "New version ${EXT_RELEASE} found; old version was ${IMAGE_VERSION}. Triggering new build" >> $GITHUB_STEP_SUMMARY echo "New version ${EXT_RELEASE} found; old version was ${IMAGE_VERSION}. Triggering new build" >> $GITHUB_STEP_SUMMARY
response=$(curl -iX POST \ response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/master/buildWithParameters?PACKAGE_CHECK=false \ https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/develop/buildWithParameters?PACKAGE_CHECK=false \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|") --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "**** Jenkins job queue url: ${response%$'\r'} ****" echo "**** Jenkins job queue url: ${response%$'\r'} ****"
echo "**** Sleeping 10 seconds until job starts ****" echo "**** Sleeping 10 seconds until job starts ****"
@ -97,7 +97,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 nextcloud tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}" TRIGGER_REASON="A version change was detected for nextcloud tag develop. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE}"
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 }}

View File

@ -9,7 +9,7 @@ jobs:
external-trigger-scheduler: external-trigger-scheduler:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3.1.0 - uses: actions/checkout@v4.1.1
with: with:
fetch-depth: '0' fetch-depth: '0'

View File

@ -9,5 +9,5 @@ jobs:
- uses: actions/first-interaction@v1 - uses: actions/first-interaction@v1
with: with:
issue-message: 'Thanks for opening your first issue here! Be sure to follow the relevant issue templates, or risk having this issue marked as invalid.' issue-message: 'Thanks for opening your first issue here! Be sure to follow the relevant issue templates, or risk having this issue marked as invalid.'
pr-message: 'Thanks for opening this pull request! Be sure to follow the [pull request template](https://github.com/linuxserver/docker-nextcloud/blob/master/.github/PULL_REQUEST_TEMPLATE.md)!' pr-message: 'Thanks for opening this pull request! Be sure to follow the [pull request template](https://github.com/linuxserver/docker-nextcloud/blob/develop/.github/PULL_REQUEST_TEMPLATE.md)!'
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -4,28 +4,28 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
package-trigger-master: package-trigger-develop:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3.1.0 - uses: actions/checkout@v4.1.1
- name: Package Trigger - name: Package Trigger
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/develop'
run: | run: |
if [ -n "${{ secrets.PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_MASTER }}" ]; then if [ -n "${{ secrets.PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_DEVELOP }}" ]; then
echo "**** Github secret PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_MASTER is set; skipping trigger. ****" echo "**** Github secret PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_DEVELOP is set; skipping trigger. ****"
echo "Github secret \`PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY echo "Github secret \`PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_DEVELOP\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
fi fi
if [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then if [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/develop/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "**** There already seems to be an active build on Jenkins; skipping package trigger ****" echo "**** There already seems to be an active build on Jenkins; skipping package trigger ****"
echo "There already seems to be an active build on Jenkins; skipping package trigger" >> $GITHUB_STEP_SUMMARY echo "There already seems to be an active build on Jenkins; skipping package trigger" >> $GITHUB_STEP_SUMMARY
exit 0 exit 0
fi fi
echo "**** Package trigger running off of master branch. To disable, set a Github secret named \"PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_MASTER\". ****" echo "**** Package trigger running off of develop branch. To disable, set a Github secret named \"PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_DEVELOP\". ****"
echo "Package trigger running off of master branch. To disable, set a Github secret named \`PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_MASTER\`" >> $GITHUB_STEP_SUMMARY echo "Package trigger running off of develop branch. To disable, set a Github secret named \`PAUSE_PACKAGE_TRIGGER_NEXTCLOUD_DEVELOP\`" >> $GITHUB_STEP_SUMMARY
response=$(curl -iX POST \ response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/master/buildWithParameters?PACKAGE_CHECK=true \ https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/develop/buildWithParameters?PACKAGE_CHECK=true \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|") --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "**** Jenkins job queue url: ${response%$'\r'} ****" echo "**** Jenkins job queue url: ${response%$'\r'} ****"
echo "**** Sleeping 10 seconds until job starts ****" echo "**** Sleeping 10 seconds until job starts ****"

View File

@ -9,7 +9,7 @@ jobs:
package-trigger-scheduler: package-trigger-scheduler:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3.1.0 - uses: actions/checkout@v4.1.1
with: with:
fetch-depth: '0' fetch-depth: '0'

View File

@ -5,6 +5,8 @@ on:
- '**/run' - '**/run'
- '**/finish' - '**/finish'
- '**/check' - '**/check'
- 'root/migrations/*'
jobs: jobs:
permission_check: permission_check:
uses: linuxserver/github-workflows/.github/workflows/init-svc-executable-permissions.yml@v1 uses: linuxserver/github-workflows/.github/workflows/init-svc-executable-permissions.yml@v1

View File

@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.18 FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.20
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@ -19,45 +19,44 @@ RUN \
gnu-libiconv \ gnu-libiconv \
imagemagick \ imagemagick \
libxml2 \ libxml2 \
php82-apcu \ php83-apcu \
php82-bcmath \ php83-bcmath \
php82-bz2 \ php83-bz2 \
php82-dom \ php83-dom \
php82-exif \ php83-exif \
php82-ftp \ php83-ftp \
php82-gd \ php83-gd \
php82-gmp \ php83-gmp \
php82-imap \ php83-imap \
php82-intl \ php83-intl \
php82-ldap \ php83-ldap \
php82-opcache \ php83-opcache \
php82-pcntl \ php83-pcntl \
php82-pdo_mysql \ php83-pdo_mysql \
php82-pdo_pgsql \ php83-pdo_pgsql \
php82-pdo_sqlite \ php83-pdo_sqlite \
php82-pecl-imagick \ php83-pecl-imagick \
php82-pecl-memcached \ php83-pecl-mcrypt \
php82-pecl-smbclient \ php83-pecl-memcached \
php82-pgsql \ php83-pecl-smbclient \
php82-posix \ php83-pgsql \
php82-redis \ php83-posix \
php82-sodium \ php83-redis \
php82-sqlite3 \ php83-sodium \
php82-sysvsem \ php83-sqlite3 \
php82-xmlreader \ php83-sysvsem \
php83-xmlreader \
rsync \ rsync \
samba-client \ samba-client \
sudo && \ sudo && \
apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing \
php82-pecl-mcrypt && \
echo "**** configure php-fpm to pass env vars ****" && \ echo "**** configure php-fpm to pass env vars ****" && \
sed -E -i 's/^;?clear_env ?=.*$/clear_env = no/g' /etc/php82/php-fpm.d/www.conf && \ sed -E -i 's/^;?clear_env ?=.*$/clear_env = no/g' /etc/php83/php-fpm.d/www.conf && \
grep -qxF 'clear_env = no' /etc/php82/php-fpm.d/www.conf || echo 'clear_env = no' >> /etc/php82/php-fpm.d/www.conf && \ grep -qxF 'clear_env = no' /etc/php83/php-fpm.d/www.conf || echo 'clear_env = no' >> /etc/php83/php-fpm.d/www.conf && \
echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php82/php-fpm.conf && \ echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php83/php-fpm.conf && \
echo "**** configure php for nextcloud ****" && \ echo "**** configure php for nextcloud ****" && \
{ \ { \
echo 'apc.enable_cli=1'; \ echo 'apc.enable_cli=1'; \
} >> /etc/php82/conf.d/apcu.ini && \ } >> /etc/php83/conf.d/apcu.ini && \
{ \ { \
echo 'opcache.enable=1'; \ echo 'opcache.enable=1'; \
echo 'opcache.interned_strings_buffer=32'; \ echo 'opcache.interned_strings_buffer=32'; \
@ -67,7 +66,7 @@ RUN \
echo 'opcache.revalidate_freq=60'; \ echo 'opcache.revalidate_freq=60'; \
echo 'opcache.jit=1255'; \ echo 'opcache.jit=1255'; \
echo 'opcache.jit_buffer_size=128M'; \ echo 'opcache.jit_buffer_size=128M'; \
} >> "/etc/php82/conf.d/00_opcache.ini" && \ } >> "/etc/php83/conf.d/00_opcache.ini" && \
{ \ { \
echo 'memory_limit=512M'; \ echo 'memory_limit=512M'; \
echo 'upload_max_filesize=512M'; \ echo 'upload_max_filesize=512M'; \
@ -76,23 +75,24 @@ RUN \
echo 'max_execution_time=300'; \ echo 'max_execution_time=300'; \
echo 'output_buffering=0'; \ echo 'output_buffering=0'; \
echo 'always_populate_raw_post_data=-1'; \ echo 'always_populate_raw_post_data=-1'; \
} >> "/etc/php82/conf.d/nextcloud.ini" && \ } >> "/etc/php83/conf.d/nextcloud.ini" && \
echo "**** install nextcloud ****" && \ echo "**** install nextcloud ****" && \
mkdir -p \ mkdir -p \
/app/www/src/ && \ /app/www/src/ && \
if [ -z ${NEXTCLOUD_RELEASE+x} ]; then \ if [ -z ${NEXTCLOUD_RELEASE+x} ]; then \
NEXTCLOUD_RELEASE=$(curl -sX GET https://api.github.com/repos/nextcloud/server/releases \ NEXTCLOUD_RELEASE=$(curl -sX GET https://api.github.com/repos/nextcloud/server/releases \
| jq -r '.[] | select(.prerelease != true) | .tag_name' \ | jq -r '.[] | select(.prerelease == true) | .tag_name' \
| sed 's|^v||g' | sort -rV | head -1); \ | sed 's|^v||g' | sort -rV | head -1); \
fi && \ fi && \
curl -o \ curl -o \
/tmp/nextcloud.tar.bz2 -L \ /tmp/nextcloud.tar.bz2 -L \
https://download.nextcloud.com/server/releases/nextcloud-${NEXTCLOUD_RELEASE}.tar.bz2 && \ https://download.nextcloud.com/server/prereleases/nextcloud-${NEXTCLOUD_RELEASE}.tar.bz2 && \
tar xf /tmp/nextcloud.tar.bz2 -C \ tar xf /tmp/nextcloud.tar.bz2 -C \
/app/www/src --strip-components=1 && \ /app/www/src --strip-components=1 && \
rm -rf /app/www/src/updater && \ rm -rf /app/www/src/updater && \
mkdir -p /app/www/src/data && \ mkdir -p /app/www/src/data && \
chmod +x /app/www/src/occ && \ chmod +x /app/www/src/occ && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \ echo "**** cleanup ****" && \
rm -rf \ rm -rf \
/tmp/* /tmp/*

View File

@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.18 FROM ghcr.io/linuxserver/baseimage-alpine-nginx:arm64v8-3.20
# set version label # set version label
ARG BUILD_DATE ARG BUILD_DATE
@ -19,45 +19,44 @@ RUN \
gnu-libiconv \ gnu-libiconv \
imagemagick \ imagemagick \
libxml2 \ libxml2 \
php82-apcu \ php83-apcu \
php82-bcmath \ php83-bcmath \
php82-bz2 \ php83-bz2 \
php82-dom \ php83-dom \
php82-exif \ php83-exif \
php82-ftp \ php83-ftp \
php82-gd \ php83-gd \
php82-gmp \ php83-gmp \
php82-imap \ php83-imap \
php82-intl \ php83-intl \
php82-ldap \ php83-ldap \
php82-opcache \ php83-opcache \
php82-pcntl \ php83-pcntl \
php82-pdo_mysql \ php83-pdo_mysql \
php82-pdo_pgsql \ php83-pdo_pgsql \
php82-pdo_sqlite \ php83-pdo_sqlite \
php82-pecl-imagick \ php83-pecl-imagick \
php82-pecl-memcached \ php83-pecl-mcrypt \
php82-pecl-smbclient \ php83-pecl-memcached \
php82-pgsql \ php83-pecl-smbclient \
php82-posix \ php83-pgsql \
php82-redis \ php83-posix \
php82-sodium \ php83-redis \
php82-sqlite3 \ php83-sodium \
php82-sysvsem \ php83-sqlite3 \
php82-xmlreader \ php83-sysvsem \
php83-xmlreader \
rsync \ rsync \
samba-client \ samba-client \
sudo && \ sudo && \
apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing \
php82-pecl-mcrypt && \
echo "**** configure php-fpm to pass env vars ****" && \ echo "**** configure php-fpm to pass env vars ****" && \
sed -E -i 's/^;?clear_env ?=.*$/clear_env = no/g' /etc/php82/php-fpm.d/www.conf && \ sed -E -i 's/^;?clear_env ?=.*$/clear_env = no/g' /etc/php83/php-fpm.d/www.conf && \
grep -qxF 'clear_env = no' /etc/php82/php-fpm.d/www.conf || echo 'clear_env = no' >> /etc/php82/php-fpm.d/www.conf && \ grep -qxF 'clear_env = no' /etc/php83/php-fpm.d/www.conf || echo 'clear_env = no' >> /etc/php83/php-fpm.d/www.conf && \
echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php82/php-fpm.conf && \ echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php83/php-fpm.conf && \
echo "**** configure php for nextcloud ****" && \ echo "**** configure php for nextcloud ****" && \
{ \ { \
echo 'apc.enable_cli=1'; \ echo 'apc.enable_cli=1'; \
} >> /etc/php82/conf.d/apcu.ini && \ } >> /etc/php83/conf.d/apcu.ini && \
{ \ { \
echo 'opcache.enable=1'; \ echo 'opcache.enable=1'; \
echo 'opcache.interned_strings_buffer=32'; \ echo 'opcache.interned_strings_buffer=32'; \
@ -67,7 +66,7 @@ RUN \
echo 'opcache.revalidate_freq=60'; \ echo 'opcache.revalidate_freq=60'; \
echo 'opcache.jit=1255'; \ echo 'opcache.jit=1255'; \
echo 'opcache.jit_buffer_size=128M'; \ echo 'opcache.jit_buffer_size=128M'; \
} >> "/etc/php82/conf.d/00_opcache.ini" && \ } >> "/etc/php83/conf.d/00_opcache.ini" && \
{ \ { \
echo 'memory_limit=512M'; \ echo 'memory_limit=512M'; \
echo 'upload_max_filesize=512M'; \ echo 'upload_max_filesize=512M'; \
@ -76,23 +75,24 @@ RUN \
echo 'max_execution_time=300'; \ echo 'max_execution_time=300'; \
echo 'output_buffering=0'; \ echo 'output_buffering=0'; \
echo 'always_populate_raw_post_data=-1'; \ echo 'always_populate_raw_post_data=-1'; \
} >> "/etc/php82/conf.d/nextcloud.ini" && \ } >> "/etc/php83/conf.d/nextcloud.ini" && \
echo "**** install nextcloud ****" && \ echo "**** install nextcloud ****" && \
mkdir -p \ mkdir -p \
/app/www/src/ && \ /app/www/src/ && \
if [ -z ${NEXTCLOUD_RELEASE+x} ]; then \ if [ -z ${NEXTCLOUD_RELEASE+x} ]; then \
NEXTCLOUD_RELEASE=$(curl -sX GET https://api.github.com/repos/nextcloud/server/releases \ NEXTCLOUD_RELEASE=$(curl -sX GET https://api.github.com/repos/nextcloud/server/releases \
| jq -r '.[] | select(.prerelease != true) | .tag_name' \ | jq -r '.[] | select(.prerelease == true) | .tag_name' \
| sed 's|^v||g' | sort -rV | head -1); \ | sed 's|^v||g' | sort -rV | head -1); \
fi && \ fi && \
curl -o \ curl -o \
/tmp/nextcloud.tar.bz2 -L \ /tmp/nextcloud.tar.bz2 -L \
https://download.nextcloud.com/server/releases/nextcloud-${NEXTCLOUD_RELEASE}.tar.bz2 && \ https://download.nextcloud.com/server/prereleases/nextcloud-${NEXTCLOUD_RELEASE}.tar.bz2 && \
tar xf /tmp/nextcloud.tar.bz2 -C \ tar xf /tmp/nextcloud.tar.bz2 -C \
/app/www/src --strip-components=1 && \ /app/www/src --strip-components=1 && \
rm -rf /app/www/src/updater && \ rm -rf /app/www/src/updater && \
mkdir -p /app/www/src/data && \ mkdir -p /app/www/src/data && \
chmod +x /app/www/src/occ && \ chmod +x /app/www/src/occ && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \ echo "**** cleanup ****" && \
rm -rf \ rm -rf \
/tmp/* /tmp/*

373
Jenkinsfile vendored
View File

@ -16,7 +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') DOCKERHUB_TOKEN=credentials('docker-hub-ci-pat')
BUILD_VERSION_ARG = 'NEXTCLOUD_RELEASE' BUILD_VERSION_ARG = 'NEXTCLOUD_RELEASE'
LS_USER = 'linuxserver' LS_USER = 'linuxserver'
LS_REPO = 'docker-nextcloud' LS_REPO = 'docker-nextcloud'
@ -31,8 +31,8 @@ pipeline {
CI_PORT='443' CI_PORT='443'
CI_SSL='true' CI_SSL='true'
CI_DELAY='120' CI_DELAY='120'
CI_DOCKERENV='TZ=US/Pacific' CI_DOCKERENV=''
CI_AUTH='user:password' CI_AUTH=''
CI_WEBPATH='' CI_WEBPATH=''
} }
stages { stages {
@ -48,7 +48,7 @@ pipeline {
script{ script{
env.EXIT_STATUS = '' env.EXIT_STATUS = ''
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}:develop 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''',
returnStdout: true).trim() returnStdout: true).trim()
env.LS_RELEASE_NOTES = sh( env.LS_RELEASE_NOTES = sh(
script: '''cat readme-vars.yml | awk -F \\" '/date: "[0-9][0-9].[0-9][0-9].[0-9][0-9]:/ {print $4;exit;}' | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''', script: '''cat readme-vars.yml | awk -F \\" '/date: "[0-9][0-9].[0-9][0-9].[0-9][0-9]:/ {print $4;exit;}' | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''',
@ -59,11 +59,16 @@ pipeline {
env.COMMIT_SHA = sh( env.COMMIT_SHA = sh(
script: '''git rev-parse HEAD''', script: '''git rev-parse HEAD''',
returnStdout: true).trim() returnStdout: true).trim()
env.GH_DEFAULT_BRANCH = sh(
script: '''git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||' ''',
returnStdout: true).trim()
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT env.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 .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml' env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
} }
sh '''#! /bin/bash
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
script{ script{
env.LS_RELEASE_NUMBER = sh( env.LS_RELEASE_NUMBER = sh(
script: '''echo ${LS_RELEASE} |sed 's/^.*-ls//g' ''', script: '''echo ${LS_RELEASE} |sed 's/^.*-ls//g' ''',
@ -72,7 +77,7 @@ pipeline {
script{ script{
env.LS_TAG_NUMBER = sh( env.LS_TAG_NUMBER = sh(
script: '''#! /bin/bash script: '''#! /bin/bash
tagsha=$(git rev-list -n 1 ${LS_RELEASE} 2>/dev/null) tagsha=$(git rev-list -n 1 develop-${LS_RELEASE} 2>/dev/null)
if [ "${tagsha}" == "${COMMIT_SHA}" ]; then if [ "${tagsha}" == "${COMMIT_SHA}" ]; then
echo ${LS_RELEASE_NUMBER} echo ${LS_RELEASE_NUMBER}
elif [ -z "${GIT_COMMIT}" ]; then elif [ -z "${GIT_COMMIT}" ]; then
@ -110,7 +115,7 @@ pipeline {
steps{ steps{
script{ script{
env.EXT_RELEASE = sh( env.EXT_RELEASE = sh(
script: ''' curl -sX GET https://api.github.com/repos/nextcloud/server/releases | jq -r '.[] | select(.prerelease != true) | .tag_name' | sed 's|^v||g' | sort -rV | head -1 ''', script: ''' curl -sX GET https://api.github.com/repos/nextcloud/server/releases | jq -r '.[] | select(.prerelease == true) | .tag_name' | sed 's|^v||g' | sort -rV | head -1 ''',
returnStdout: true).trim() returnStdout: true).trim()
env.RELEASE_LINK = 'custom_command' env.RELEASE_LINK = 'custom_command'
} }
@ -121,7 +126,7 @@ pipeline {
steps{ steps{
script{ script{
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+)/ def semver = env.EXT_RELEASE_CLEAN =~ /(\d+)\.(\d+)\.(\d+)/
@ -139,7 +144,7 @@ pipeline {
} }
if (env.SEMVER != null) { if (env.SEMVER != null) {
if (BRANCH_NAME != "master" && BRANCH_NAME != "main") { if (BRANCH_NAME != "${env.GH_DEFAULT_BRANCH}") {
env.SEMVER = "${env.SEMVER}-${BRANCH_NAME}" env.SEMVER = "${env.SEMVER}-${BRANCH_NAME}"
} }
println("SEMVER: ${env.SEMVER}") println("SEMVER: ${env.SEMVER}")
@ -150,10 +155,10 @@ pipeline {
} }
} }
} }
// If this is a master build use live docker endpoints // If this is a develop build use live docker endpoints
stage("Set ENV live build"){ stage("Set ENV live build"){
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
} }
steps { steps {
@ -163,20 +168,20 @@ pipeline {
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 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 + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.CI_TAGS = 'amd64-develop-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-develop-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
} else { } else {
env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.CI_TAGS = 'develop-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
} }
env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
env.META_TAG = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.META_TAG = 'develop-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'develop-version-' + env.EXT_RELEASE_CLEAN
} }
} }
} }
// If this is a dev build use dev docker endpoints // If this is a dev build use dev docker endpoints
stage("Set ENV dev build"){ stage("Set ENV dev build"){
when { when {
not {branch "master"} not {branch "develop"}
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
} }
steps { steps {
@ -186,13 +191,13 @@ pipeline {
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 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 + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA env.CI_TAGS = 'amd64-develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
} else { } else {
env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA env.CI_TAGS = 'develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
} }
env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA env.META_TAG = 'develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'develop-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/'
} }
} }
@ -209,13 +214,13 @@ pipeline {
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 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 + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST env.CI_TAGS = 'amd64-develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST + '|arm64v8-develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
} else { } else {
env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST env.CI_TAGS = 'develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
} }
env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST env.META_TAG = 'develop-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN env.EXT_RELEASE_TAG = 'develop-version-' + env.EXT_RELEASE_CLEAN
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/'
} }
@ -240,9 +245,11 @@ 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.17 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
apk add --no-cache py3-pip && \ apk add --no-cache python3 && \
pip install s3cmd && \ python3 -m venv /lsiopy && \
pip install --no-cache-dir -U pip && \
pip install --no-cache-dir s3cmd && \
s3cmd put --no-preserve --acl-public -m text/xml /mnt/shellcheck-result.xml s3://ci-tests.linuxserver.io/${IMAGE}/${META_TAG}/shellcheck-result.xml" || :''' s3cmd put --no-preserve --acl-public -m text/xml /mnt/shellcheck-result.xml s3://ci-tests.linuxserver.io/${IMAGE}/${META_TAG}/shellcheck-result.xml" || :'''
} }
} }
@ -250,7 +257,7 @@ pipeline {
// Use helper containers to render templated files // Use helper containers to render templated files
stage('Update-Templates') { stage('Update-Templates') {
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
expression { expression {
env.CONTAINER_NAME != null env.CONTAINER_NAME != null
@ -261,26 +268,34 @@ 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=master -v ${TEMPDIR}:/ansible/jenkins ghcr.io/linuxserver/jenkins-builder:latest # Cloned repo paths for templating:
# Stage 1 - Jenkinsfile update # ${TEMPDIR}/docker-${CONTAINER_NAME}: Cloned branch develop of ${LS_USER}/${LS_REPO} for running the jenkins builder on
# ${TEMPDIR}/repo/${LS_REPO}: Cloned branch develop of ${LS_USER}/${LS_REPO} for commiting various templated file changes and pushing back to Github
# ${TEMPDIR}/docs/docker-documentation: Cloned docs repo for pushing docs updates to Github
# ${TEMPDIR}/unraid/docker-templates: Cloned docker-templates repo to check for logos
# ${TEMPDIR}/unraid/templates: Cloned templates repo for commiting unraid template changes and pushing back to Github
git clone --branch develop --depth 1 https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/docker-${CONTAINER_NAME}
docker run --rm -v ${TEMPDIR}/docker-${CONTAINER_NAME}:/tmp -e LOCAL=true -e PUID=$(id -u) -e PGID=$(id -g) ghcr.io/linuxserver/jenkins-builder:latest
echo "Starting Stage 1 - Jenkinsfile update"
if [[ "$(md5sum Jenkinsfile | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile | awk '{ print $1 }')" ]]; then if [[ "$(md5sum Jenkinsfile | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile | awk '{ print $1 }')" ]]; then
mkdir -p ${TEMPDIR}/repo mkdir -p ${TEMPDIR}/repo
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 develop
cp ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile ${TEMPDIR}/repo/${LS_REPO}/ cp ${TEMPDIR}/docker-${CONTAINER_NAME}/Jenkinsfile ${TEMPDIR}/repo/${LS_REPO}/
git add Jenkinsfile git add Jenkinsfile
git commit -m 'Bot Updating Templated Files' git commit -m 'Bot Updating Templated Files'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
echo "Updating Jenkinsfile" echo "Updating Jenkinsfile and exiting build, new one will trigger based on commit"
rm -Rf ${TEMPDIR} rm -Rf ${TEMPDIR}
exit 0 exit 0
else else
echo "Jenkinsfile is up to date." echo "Jenkinsfile is up to date."
fi fi
# Stage 2 - Delete old templates echo "Starting Stage 2 - Delete old templates"
OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md .github/ISSUE_TEMPLATE/issue.bug.md .github/ISSUE_TEMPLATE/issue.feature.md .github/workflows/call_invalid_helper.yml .github/workflows/stale.yml Dockerfile.armhf" OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md .github/ISSUE_TEMPLATE/issue.bug.md .github/ISSUE_TEMPLATE/issue.feature.md .github/workflows/call_invalid_helper.yml .github/workflows/stale.yml"
for i in ${OLD_TEMPLATES}; do for i in ${OLD_TEMPLATES}; do
if [[ -f "${i}" ]]; then if [[ -f "${i}" ]]; then
TEMPLATES_TO_DELETE="${i} ${TEMPLATES_TO_DELETE}" TEMPLATES_TO_DELETE="${i} ${TEMPLATES_TO_DELETE}"
@ -290,20 +305,21 @@ pipeline {
mkdir -p ${TEMPDIR}/repo mkdir -p ${TEMPDIR}/repo
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 develop
for i in ${TEMPLATES_TO_DELETE}; do for i in ${TEMPLATES_TO_DELETE}; do
git rm "${i}" git rm "${i}"
done done
git commit -m 'Bot Updating Templated Files' git commit -m 'Bot Updating Templated Files'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
echo "Deleting old and deprecated templates" echo "Deleting old/deprecated templates and exiting build, new one will trigger based on commit"
rm -Rf ${TEMPDIR} rm -Rf ${TEMPDIR}
exit 0 exit 0
else else
echo "No templates to delete" echo "No templates to delete"
fi fi
# Stage 3 - Update templates echo "Starting Stage 3 - Update templates"
CURRENTHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8) CURRENTHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8)
cd ${TEMPDIR}/docker-${CONTAINER_NAME} cd ${TEMPDIR}/docker-${CONTAINER_NAME}
NEWHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8) NEWHASH=$(grep -hs ^ ${TEMPLATED_FILES} | md5sum | cut -c1-8)
@ -311,7 +327,7 @@ pipeline {
mkdir -p ${TEMPDIR}/repo mkdir -p ${TEMPDIR}/repo
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 develop
cd ${TEMPDIR}/docker-${CONTAINER_NAME} cd ${TEMPDIR}/docker-${CONTAINER_NAME}
mkdir -p ${TEMPDIR}/repo/${LS_REPO}/.github/workflows mkdir -p ${TEMPDIR}/repo/${LS_REPO}/.github/workflows
mkdir -p ${TEMPDIR}/repo/${LS_REPO}/.github/ISSUE_TEMPLATE mkdir -p ${TEMPDIR}/repo/${LS_REPO}/.github/ISSUE_TEMPLATE
@ -324,31 +340,50 @@ pipeline {
fi fi
git add readme-vars.yml ${TEMPLATED_FILES} git add readme-vars.yml ${TEMPLATED_FILES}
git commit -m 'Bot Updating Templated Files' git commit -m 'Bot Updating Templated Files'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
echo "Updating templates and exiting build, new one will trigger based on commit"
rm -Rf ${TEMPDIR}
exit 0
else else
echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER} echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
echo "No templates to update"
fi fi
mkdir -p ${TEMPDIR}/gitbook echo "Starting Stage 4 - External repo updates: Docs, Unraid Template and Readme Sync to Docker Hub"
git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/gitbook/docker-documentation mkdir -p ${TEMPDIR}/docs
if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then git clone --depth=1 https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/docs/docker-documentation
cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/gitbook/docker-documentation/images/ if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]] && [[ (! -f ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then
cd ${TEMPDIR}/gitbook/docker-documentation/ cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/docs/docker-documentation/docs/images/
git add images/docker-${CONTAINER_NAME}.md cd ${TEMPDIR}/docs/docker-documentation
GH_DOCS_DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||')
git add docs/images/docker-${CONTAINER_NAME}.md
echo "Updating docs repo"
git commit -m 'Bot Updating Documentation' git commit -m 'Bot Updating Documentation'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH} --rebase
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH} || \
(MAXWAIT="10" && echo "Push to docs failed, trying again in ${MAXWAIT} seconds" && \
sleep $((RANDOM % MAXWAIT)) && \
git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH} --rebase && \
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git ${GH_DOCS_DEFAULT_BRANCH})
else
echo "Docs update not needed, skipping"
fi fi
mkdir -p ${TEMPDIR}/unraid mkdir -p ${TEMPDIR}/unraid
git clone https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-templates git clone --depth=1 https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-templates
git clone https://github.com/linuxserver/templates.git ${TEMPDIR}/unraid/templates git clone --depth=1 https://github.com/linuxserver/templates.git ${TEMPDIR}/unraid/templates
if [[ -f ${TEMPDIR}/unraid/docker-templates/linuxserver.io/img/${CONTAINER_NAME}-logo.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}-logo.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
elif [[ -f ${TEMPDIR}/unraid/docker-templates/linuxserver.io/img/${CONTAINER_NAME}-icon.png ]]; then elif [[ -f ${TEMPDIR}/unraid/docker-templates/linuxserver.io/img/${CONTAINER_NAME}-icon.png ]]; then
sed -i "s|master/linuxserver.io/img/linuxserver-ls-logo.png|master/linuxserver.io/img/${CONTAINER_NAME}-icon.png|" ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml sed -i "s|master/linuxserver.io/img/linuxserver-ls-logo.png|master/linuxserver.io/img/${CONTAINER_NAME}-icon.png|" ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml
fi fi
if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml) || ("$(md5sum ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml | awk '{ print $1 }')") ]]; then if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]] && [[ (! -f ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml) || ("$(md5sum ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml | awk '{ print $1 }')") ]]; then
echo "Updating Unraid template"
cd ${TEMPDIR}/unraid/templates/ cd ${TEMPDIR}/unraid/templates/
if grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list; then GH_TEMPLATES_DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||')
if grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list && [[ -f ${TEMPDIR}/unraid/templates/unraid/deprecated/${CONTAINER_NAME}.xml ]]; then
echo "Image is on the ignore list, and already in the deprecation folder."
elif grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list; then
echo "Image is on the ignore list, marking Unraid template as deprecated" echo "Image is on the ignore list, marking Unraid template as deprecated"
cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml ${TEMPDIR}/unraid/templates/unraid/ cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml ${TEMPDIR}/unraid/templates/unraid/
git add -u unraid/${CONTAINER_NAME}.xml git add -u unraid/${CONTAINER_NAME}.xml
@ -359,7 +394,42 @@ pipeline {
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'
fi fi
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git --all git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH} --rebase
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH} || \
(MAXWAIT="10" && echo "Push to unraid templates failed, trying again in ${MAXWAIT} seconds" && \
sleep $((RANDOM % MAXWAIT)) && \
git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH} --rebase && \
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/templates.git ${GH_TEMPLATES_DEFAULT_BRANCH})
else
echo "No updates to Unraid template needed, skipping"
fi
if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]]; then
if [[ $(cat ${TEMPDIR}/docker-${CONTAINER_NAME}/README.md | wc -m) -gt 25000 ]]; then
echo "Readme is longer than 25,000 characters. Syncing the lite version to Docker Hub"
DH_README_SYNC_PATH="${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/README.lite"
else
echo "Syncing readme to Docker Hub"
DH_README_SYNC_PATH="${TEMPDIR}/docker-${CONTAINER_NAME}/README.md"
fi
if curl -s https://hub.docker.com/v2/namespaces/${DOCKERHUB_IMAGE%%/*}/repositories/${DOCKERHUB_IMAGE##*/}/tags | jq -r '.message' | grep -q 404; then
echo "Docker Hub endpoint doesn't exist. Creating endpoint first."
DH_TOKEN=$(curl -d '{"username":"linuxserverci", "password":"'${DOCKERHUB_TOKEN}'"}' -H "Content-Type: application/json" -X POST https://hub.docker.com/v2/users/login | jq -r '.token')
curl -s \
-H "Authorization: JWT ${DH_TOKEN}" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name":"'${DOCKERHUB_IMAGE##*/}'", "namespace":"'${DOCKERHUB_IMAGE%%/*}'"}' \
https://hub.docker.com/v2/repositories/ || :
fi
DH_TOKEN=$(curl -d '{"username":"linuxserverci", "password":"'${DOCKERHUB_TOKEN}'"}' -H "Content-Type: application/json" -X POST https://hub.docker.com/v2/users/login | jq -r '.token')
curl -s \
-H "Authorization: JWT ${DH_TOKEN}" \
-H "Content-Type: application/json" \
-X PATCH \
-d "{\\"full_description\\":$(jq -Rsa . ${DH_README_SYNC_PATH})}" \
https://hub.docker.com/v2/repositories/${DOCKERHUB_IMAGE} || :
else
echo "Not the default Github branch. Skipping readme sync to Docker Hub."
fi fi
rm -Rf ${TEMPDIR}''' rm -Rf ${TEMPDIR}'''
script{ script{
@ -372,7 +442,7 @@ pipeline {
// Exit the build if the Templated files were just updated // Exit the build if the Templated files were just updated
stage('Template-exit') { stage('Template-exit') {
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
environment name: 'FILES_UPDATED', value: 'true' environment name: 'FILES_UPDATED', value: 'true'
expression { expression {
@ -385,10 +455,10 @@ pipeline {
} }
} }
} }
// If this is a master build check the S6 service file perms // If this is a develop build check the S6 service file perms
stage("Check S6 Service file Permissions"){ stage("Check S6 Service file Permissions"){
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
@ -415,43 +485,16 @@ pipeline {
} }
steps{ steps{
sh '''curl -H "Content-Type: application/json" -H "Private-Token: ${GITLAB_TOKEN}" -X POST https://gitlab.com/api/v4/projects \ sh '''curl -H "Content-Type: application/json" -H "Private-Token: ${GITLAB_TOKEN}" -X POST https://gitlab.com/api/v4/projects \
-d '{"namespace_id":'${GITLAB_NAMESPACE}',\ -d '{"namespace_id":'${GITLAB_NAMESPACE}',\
"name":"'${LS_REPO}'", "name":"'${LS_REPO}'",
"mirror":true,\ "mirror":true,\
"import_url":"https://github.com/linuxserver/'${LS_REPO}'.git",\ "import_url":"https://github.com/linuxserver/'${LS_REPO}'.git",\
"issues_access_level":"disabled",\ "issues_access_level":"disabled",\
"merge_requests_access_level":"disabled",\ "merge_requests_access_level":"disabled",\
"repository_access_level":"enabled",\ "repository_access_level":"enabled",\
"visibility":"public"}' ''' "visibility":"public"}' '''
} sh '''curl -H "Private-Token: ${GITLAB_TOKEN}" -X PUT "https://gitlab.com/api/v4/projects/Linuxserver.io%2F${LS_REPO}" \
} -d "mirror=true&import_url=https://github.com/linuxserver/${LS_REPO}.git" '''
/* #######################
Scarf.sh package registry
####################### */
// Add package to Scarf.sh and set permissions
stage("Scarf.sh package registry"){
when {
branch "master"
environment name: 'EXIT_STATUS', value: ''
}
steps{
sh '''#! /bin/bash
PACKAGE_UUID=$(curl -X GET -H "Authorization: Bearer ${SCARF_TOKEN}" https://scarf.sh/api/v1/organizations/linuxserver-ci/packages | jq -r '.[] | select(.name=="linuxserver/nextcloud") | .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/nextcloud",\
"shortDescription":"example description",\
"libraryType":"docker",\
"website":"https://github.com/linuxserver/docker-nextcloud",\
"backendUrl":"https://ghcr.io/linuxserver/nextcloud",\
"publicUrl":"https://lscr.io/linuxserver/nextcloud"}' || :
else
echo "Package already exists on Scarf.sh"
fi
'''
} }
} }
/* ############### /* ###############
@ -482,6 +525,7 @@ pipeline {
--label \"org.opencontainers.image.title=Nextcloud\" \ --label \"org.opencontainers.image.title=Nextcloud\" \
--label \"org.opencontainers.image.description=[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. \" \ --label \"org.opencontainers.image.description=[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. \" \
--no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \ --no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
--provenance=false --sbom=false \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
} }
} }
@ -513,6 +557,7 @@ pipeline {
--label \"org.opencontainers.image.title=Nextcloud\" \ --label \"org.opencontainers.image.title=Nextcloud\" \
--label \"org.opencontainers.image.description=[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. \" \ --label \"org.opencontainers.image.description=[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. \" \
--no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \ --no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
--provenance=false --sbom=false \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
} }
} }
@ -541,6 +586,7 @@ pipeline {
--label \"org.opencontainers.image.title=Nextcloud\" \ --label \"org.opencontainers.image.title=Nextcloud\" \
--label \"org.opencontainers.image.description=[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. \" \ --label \"org.opencontainers.image.description=[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. \" \
--no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} --platform=linux/arm64 \ --no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} --platform=linux/arm64 \
--provenance=false --sbom=false \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." --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) {
@ -559,7 +605,7 @@ pipeline {
// Take the image we just built and dump package versions for comparison // Take the image we just built and dump package versions for comparison
stage('Update-packages') { stage('Update-packages') {
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
@ -567,7 +613,7 @@ pipeline {
sh '''#! /bin/bash sh '''#! /bin/bash
set -e set -e
TEMPDIR=$(mktemp -d) TEMPDIR=$(mktemp -d)
if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" != "true" ]; 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}
@ -582,13 +628,14 @@ pipeline {
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"
if [ "${NEW_PACKAGE_TAG}" != "${PACKAGE_TAG}" ]; then if [ "${NEW_PACKAGE_TAG}" != "${PACKAGE_TAG}" ]; then
git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/${LS_REPO} git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/${LS_REPO}
git --git-dir ${TEMPDIR}/${LS_REPO}/.git checkout -f master git --git-dir ${TEMPDIR}/${LS_REPO}/.git checkout -f develop
cp ${TEMPDIR}/package_versions.txt ${TEMPDIR}/${LS_REPO}/ cp ${TEMPDIR}/package_versions.txt ${TEMPDIR}/${LS_REPO}/
cd ${TEMPDIR}/${LS_REPO}/ cd ${TEMPDIR}/${LS_REPO}/
wait wait
git add package_versions.txt git add package_versions.txt
git commit -m 'Bot Updating Package Versions' git commit -m 'Bot Updating Package Versions'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git develop
echo "true" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER} echo "true" > /tmp/packages-${COMMIT_SHA}-${BUILD_NUMBER}
echo "Package tag updated, stopping build process" echo "Package tag updated, stopping build process"
else else
@ -606,7 +653,7 @@ pipeline {
// Exit the build if the package file was just updated // Exit the build if the package file was just updated
stage('PACKAGE-exit') { stage('PACKAGE-exit') {
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
environment name: 'PACKAGE_UPDATED', value: 'true' environment name: 'PACKAGE_UPDATED', value: 'true'
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
@ -620,7 +667,7 @@ pipeline {
// Exit the build if this is just a package check and there are no changes to push // Exit the build if this is just a package check and there are no changes to push
stage('PACKAGECHECK-exit') { stage('PACKAGECHECK-exit') {
when { when {
branch "master" branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
environment name: 'PACKAGE_UPDATED', value: 'false' environment name: 'PACKAGE_UPDATED', value: 'false'
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
@ -656,14 +703,14 @@ pipeline {
set -e set -e
docker pull ghcr.io/linuxserver/ci:latest docker pull ghcr.io/linuxserver/ci:latest
if [ "${MULTIARCH}" == "true" ]; then if [ "${MULTIARCH}" == "true" ]; then
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 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}
fi fi
docker run --rm \ docker run --rm \
--shm-size=1gb \ --shm-size=1gb \
-v /var/run/docker.sock:/var/run/docker.sock \ -v /var/run/docker.sock:/var/run/docker.sock \
-e IMAGE=\"${IMAGE}\" \ -e IMAGE=\"${IMAGE}\" \
-e DELAY_START=\"${CI_DELAY}\" \ -e DOCKER_LOGS_TIMEOUT=\"${CI_DELAY}\" \
-e TAGS=\"${CI_TAGS}\" \ -e TAGS=\"${CI_TAGS}\" \
-e META_TAG=\"${META_TAG}\" \ -e META_TAG=\"${META_TAG}\" \
-e PORT=\"${CI_PORT}\" \ -e PORT=\"${CI_PORT}\" \
@ -691,12 +738,6 @@ pipeline {
} }
steps { steps {
withCredentials([ withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207',
usernameVariable: 'DOCKERUSER',
passwordVariable: 'DOCKERPASS'
],
[ [
$class: 'UsernamePasswordMultiBinding', $class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot', credentialsId: 'Quay.io-Robot',
@ -707,18 +748,18 @@ pipeline {
retry(5) { retry(5) {
sh '''#! /bin/bash sh '''#! /bin/bash
set -e set -e
echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin echo $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
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do 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}:develop
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG} docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then if [ -n "${SEMVER}" ]; then
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER} docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER}
fi fi
docker push ${PUSHIMAGE}:latest docker push ${PUSHIMAGE}:develop
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 if [ -n "${SEMVER}" ]; then
@ -738,12 +779,6 @@ pipeline {
} }
steps { steps {
withCredentials([ withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207',
usernameVariable: 'DOCKERUSER',
passwordVariable: 'DOCKERPASS'
],
[ [
$class: 'UsernamePasswordMultiBinding', $class: 'UsernamePasswordMultiBinding',
credentialsId: 'Quay.io-Robot', credentialsId: 'Quay.io-Robot',
@ -754,20 +789,20 @@ pipeline {
retry(5) { retry(5) {
sh '''#! /bin/bash sh '''#! /bin/bash
set -e set -e
echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin echo $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 [ "${CI}" == "false" ]; then if [ "${CI}" == "false" ]; then
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 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}
fi fi
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; 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 ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-latest docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-develop
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-latest docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-develop
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 if [ -n "${SEMVER}" ]; then
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER} docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER}
@ -775,43 +810,21 @@ pipeline {
fi fi
docker push ${MANIFESTIMAGE}:amd64-${META_TAG} docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
docker push ${MANIFESTIMAGE}:amd64-latest docker push ${MANIFESTIMAGE}:amd64-develop
docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG} docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker push ${MANIFESTIMAGE}:arm64v8-latest docker push ${MANIFESTIMAGE}:arm64v8-develop
docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then if [ -n "${SEMVER}" ]; then
docker push ${MANIFESTIMAGE}:amd64-${SEMVER} docker push ${MANIFESTIMAGE}:amd64-${SEMVER}
docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER} docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi fi
docker manifest push --purge ${MANIFESTIMAGE}:latest || : done
docker manifest create ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
docker manifest annotate ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:arm64v8-latest --os linux --arch arm64 --variant v8 docker buildx imagetools create -t ${MANIFESTIMAGE}:develop ${MANIFESTIMAGE}:amd64-develop ${MANIFESTIMAGE}:arm64v8-develop
docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG} || : docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker manifest create ${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}
docker manifest annotate ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} --os linux --arch arm64 --variant v8
docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} || :
docker manifest create ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} --os linux --arch arm64 --variant v8
if [ -n "${SEMVER}" ]; then if [ -n "${SEMVER}" ]; then
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER} || : docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
docker manifest create ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} --os linux --arch arm64 --variant v8
fi
token=$(curl -sX GET "https://ghcr.io/token?scope=repository%3Alinuxserver%2F${CONTAINER_NAME}%3Apull" | jq -r '.token')
digest=$(curl -s \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer ${token}" \
"https://ghcr.io/v2/linuxserver/${CONTAINER_NAME}/manifests/arm32v7-latest")
if [[ $(echo "$digest" | jq -r '.layers') != "null" ]]; then
docker manifest push --purge ${MANIFESTIMAGE}:arm32v7-latest || :
docker manifest create ${MANIFESTIMAGE}:arm32v7-latest ${MANIFESTIMAGE}:amd64-latest
docker manifest push --purge ${MANIFESTIMAGE}:arm32v7-latest
fi
docker manifest push --purge ${MANIFESTIMAGE}:latest
docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG}
docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER}
fi fi
done done
''' '''
@ -822,7 +835,7 @@ pipeline {
// If this is a public release tag it in the LS Github // If this is a public release tag it in the LS Github
stage('Github-Tag-Push-Release') { stage('Github-Tag-Push-Release') {
when { when {
branch "master" branch "develop"
expression { expression {
env.LS_RELEASE != env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER env.LS_RELEASE != env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
} }
@ -834,52 +847,54 @@ pipeline {
sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \ sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
-d '{"tag":"'${META_TAG}'",\ -d '{"tag":"'${META_TAG}'",\
"object": "'${COMMIT_SHA}'",\ "object": "'${COMMIT_SHA}'",\
"message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to develop",\
"type": "commit",\ "type": "commit",\
"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
echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json
echo '{"tag_name":"'${META_TAG}'",\ echo '{"tag_name":"'${META_TAG}'",\
"target_commitish": "master",\ "target_commitish": "develop",\
"name": "'${META_TAG}'",\ "name": "'${META_TAG}'",\
"body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**Remote Changes:**\\n\\n' > start "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**Remote Changes:**\\n\\n' > start
printf '","draft": false,"prerelease": false}' >> releasebody.json printf '","draft": false,"prerelease": true}' >> 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'''
} }
} }
// Use helper container to sync the current README on master to the dockerhub endpoint // Add protection to the release branch
stage('Sync-README') { stage('Github-Release-Branch-Protection') {
when { when {
branch "develop"
environment name: 'CHANGE_ID', value: '' environment name: 'CHANGE_ID', value: ''
environment name: 'EXIT_STATUS', value: '' environment name: 'EXIT_STATUS', value: ''
} }
steps { steps {
withCredentials([ echo "Setting up protection for release branch develop"
[ sh '''#! /bin/bash
$class: 'UsernamePasswordMultiBinding', curl -H "Authorization: token ${GITHUB_TOKEN}" -X PUT https://api.github.com/repos/${LS_USER}/${LS_REPO}/branches/develop/protection \
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207', -d $(jq -c . << EOF
usernameVariable: 'DOCKERUSER', {
passwordVariable: 'DOCKERPASS' "required_status_checks": null,
] "enforce_admins": false,
]) { "required_pull_request_reviews": {
sh '''#! /bin/bash "dismiss_stale_reviews": false,
set -e "require_code_owner_reviews": false,
TEMPDIR=$(mktemp -d) "require_last_push_approval": false,
docker pull ghcr.io/linuxserver/jenkins-builder:latest "required_approving_review_count": 1
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 "restrictions": null,
docker run --rm=true \ "required_linear_history": false,
-e DOCKERHUB_USERNAME=$DOCKERUSER \ "allow_force_pushes": false,
-e DOCKERHUB_PASSWORD=$DOCKERPASS \ "allow_deletions": false,
-e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \ "block_creations": false,
-e DOCKER_REPOSITORY=${IMAGE} \ "required_conversation_resolution": true,
-e GIT_BRANCH=master \ "lock_branch": false,
-v ${TEMPDIR}/docker-${CONTAINER_NAME}:/mnt \ "allow_fork_syncing": false,
ghcr.io/linuxserver/readme-sync bash -c 'node sync' "required_signatures": false
rm -Rf ${TEMPDIR} ''' }
} EOF
) '''
} }
} }
// If this is a Pull request send the CI link as a comment on it // If this is a Pull request send the CI link as a comment on it

173
README.md
View File

@ -1,6 +1,5 @@
<!-- DO NOT EDIT THIS FILE MANUALLY --> <!-- DO NOT EDIT THIS FILE MANUALLY -->
<!-- Please read the https://github.com/linuxserver/docker-nextcloud/blob/master/.github/CONTRIBUTING.md --> <!-- Please read https://github.com/linuxserver/docker-nextcloud/blob/develop/.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)
[![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!")
@ -29,7 +28,7 @@ Find us at:
# [linuxserver/nextcloud](https://github.com/linuxserver/docker-nextcloud) # [linuxserver/nextcloud](https://github.com/linuxserver/docker-nextcloud)
[![Scarf.io pulls](https://scarf.sh/installs-badge/linuxserver-ci/linuxserver%2Fnextcloud?color=94398d&label-color=555555&logo-color=ffffff&style=for-the-badge&package-type=docker)](https://scarf.sh/gateway/linuxserver-ci/docker/linuxserver%2Fnextcloud) [![Scarf.io pulls](https://scarf.sh/installs-badge/linuxserver-ci/linuxserver%2Fnextcloud?color=94398d&label-color=555555&logo-color=ffffff&style=for-the-badge&package-type=docker)](https://scarf.sh)
[![GitHub Stars](https://img.shields.io/github/stars/linuxserver/docker-nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-nextcloud) [![GitHub Stars](https://img.shields.io/github/stars/linuxserver/docker-nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-nextcloud)
[![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-nextcloud/releases) [![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-nextcloud/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-nextcloud/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-nextcloud/packages)
@ -37,7 +36,7 @@ Find us at:
[![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/nextcloud) [![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/nextcloud)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/nextcloud) [![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/nextcloud)
[![Docker Stars](https://img.shields.io/docker/stars/linuxserver/nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/nextcloud) [![Docker Stars](https://img.shields.io/docker/stars/linuxserver/nextcloud.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/nextcloud)
[![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-nextcloud%2Fjob%2Fmaster%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/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-nextcloud%2Fjob%2Fdevelop%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-nextcloud/job/develop/)
[![LSIO CI](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=CI&query=CI&url=https%3A%2F%2Fci-tests.linuxserver.io%2Flinuxserver%2Fnextcloud%2Flatest%2Fci-status.yml)](https://ci-tests.linuxserver.io/linuxserver/nextcloud/latest/index.html) [![LSIO CI](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=CI&query=CI&url=https%3A%2F%2Fci-tests.linuxserver.io%2Flinuxserver%2Fnextcloud%2Flatest%2Fci-status.yml)](https://ci-tests.linuxserver.io/linuxserver/nextcloud/latest/index.html)
[Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are. [Nextcloud](https://nextcloud.com/) gives you access to all your files wherever you are.
@ -48,9 +47,9 @@ Where are your photos and documents? With Nextcloud you pick a server of your ch
## Supported Architectures ## Supported Architectures
We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/). We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://distribution.github.io/distribution/spec/manifest-v2-2/#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/).
Simply pulling `lscr.io/linuxserver/nextcloud:latest` should retrieve the correct image for your arch, but you can also pull specific arch images via tags. Simply pulling `lscr.io/linuxserver/nextcloud:develop` 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:
@ -60,6 +59,15 @@ The architectures supported by this image are:
| arm64 | ✅ | arm64v8-\<version tag\> | | arm64 | ✅ | arm64v8-\<version tag\> |
| armhf | ❌ | | | armhf | ❌ | |
## Version Tags
This image provides various versions that are available via tags. Please read the descriptions carefully and exercise caution when using unstable or development tags.
| Tag | Available | Description |
| :----: | :----: |--- |
| latest | ✅ | Stable Nextcloud releases |
| develop | ✅ | Beta Nextcloud pre-releases *only* |
## Application Setup ## Application Setup
Access the webui at `https://<your-ip>:443`, for more information check out [Nextcloud](https://nextcloud.com/). Access the webui at `https://<your-ip>:443`, for more information check out [Nextcloud](https://nextcloud.com/).
@ -96,23 +104,22 @@ If you are using a reverse proxy which validates certificates, you need to [disa
## Usage ## Usage
Here are some example snippets to help you get started creating a container. To help you get started creating a container from this image you can either use docker-compose or the docker cli.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose)) ### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
```yaml ```yaml
--- ---
version: "2.1"
services: services:
nextcloud: nextcloud:
image: lscr.io/linuxserver/nextcloud:latest image: lscr.io/linuxserver/nextcloud:develop
container_name: nextcloud container_name: nextcloud
environment: environment:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
- TZ=Etc/UTC - TZ=Etc/UTC
volumes: volumes:
- /path/to/appdata:/config - /path/to/nextcloud/config:/config
- /path/to/data:/data - /path/to/data:/data
ports: ports:
- 443:443 - 443:443
@ -128,16 +135,15 @@ docker run -d \
-e PGID=1000 \ -e PGID=1000 \
-e TZ=Etc/UTC \ -e TZ=Etc/UTC \
-p 443:443 \ -p 443:443 \
-v /path/to/appdata:/config \ -v /path/to/nextcloud/config:/config \
-v /path/to/data:/data \ -v /path/to/data:/data \
--restart unless-stopped \ --restart unless-stopped \
lscr.io/linuxserver/nextcloud:latest lscr.io/linuxserver/nextcloud:develop
``` ```
## Parameters ## 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. Containers 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 | | Parameter | Function |
| :----: | --- | | :----: | --- |
@ -145,7 +151,7 @@ Container images are configured using parameters passed at runtime (such as thos
| `-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). |
| `-v /config` | Nextcloud configs. | | `-v /config` | Persistent config files |
| `-v /data` | Your personal data. | | `-v /data` | Your personal data. |
## Environment variables from files (Docker secrets) ## Environment variables from files (Docker secrets)
@ -155,10 +161,10 @@ You can set any environment variable from a file by using a special prepend `FIL
As an example: As an example:
```bash ```bash
-e FILE__PASSWORD=/run/secrets/mysecretpassword -e FILE__MYVAR=/run/secrets/mysecretvariable
``` ```
Will set the environment variable `PASSWORD` based on the contents of the `/run/secrets/mysecretpassword` file. Will set the environment variable `MYVAR` based on the contents of the `/run/secrets/mysecretvariable` file.
## Umask for running applications ## Umask for running applications
@ -167,15 +173,20 @@ Keep in mind umask is not chmod it subtracts from permissions based on it's valu
## User / Group Identifiers ## User / Group Identifiers
When using volumes (`-v` flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`. When using volumes (`-v` flags), permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`.
Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic. Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.
In this instance `PUID=1000` and `PGID=1000`, to find yours use `id user` as below: In this instance `PUID=1000` and `PGID=1000`, to find yours use `id your_user` as below:
```bash ```bash
$ id username id your_user
uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup) ```
Example output:
```text
uid=1000(your_user) gid=1000(your_user) groups=1000(your_user)
``` ```
## Docker Mods ## Docker Mods
@ -186,53 +197,100 @@ We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to
## Support Info ## Support Info
* Shell access whilst the container is running: `docker exec -it nextcloud /bin/bash` * Shell access whilst the container is running:
* To monitor the logs of the container in realtime: `docker logs -f nextcloud`
* container version number ```bash
* `docker inspect -f '{{ index .Config.Labels "build_version" }}' nextcloud` docker exec -it nextcloud /bin/bash
* image version number ```
* `docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/nextcloud:latest`
* To monitor the logs of the container in realtime:
```bash
docker logs -f nextcloud
```
* Container version number:
```bash
docker inspect -f '{{ index .Config.Labels "build_version" }}' nextcloud
```
* Image version number:
```bash
docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/nextcloud:develop
```
## Updating Info ## Updating Info
Most of our images are static, versioned, and require an image update and container recreation to update the app inside. With some exceptions (ie. nextcloud, plex), we do not recommend or support updating apps inside the container. Please consult the [Application Setup](#application-setup) section above to see if it is recommended for the image. Most of our images are static, versioned, and require an image update and container recreation to update the app inside. With some exceptions (noted in the relevant readme.md), we do not recommend or support updating apps inside the container. Please consult the [Application Setup](#application-setup) section above to see if it is recommended for the image.
Below are the instructions for updating containers: Below are the instructions for updating containers:
### Via Docker Compose ### Via Docker Compose
* Update all images: `docker-compose pull` * Update images:
* or update a single image: `docker-compose pull nextcloud` * All images:
* Let compose update all containers as necessary: `docker-compose up -d`
* or update a single container: `docker-compose up -d nextcloud` ```bash
* You can also remove the old dangling images: `docker image prune` docker-compose pull
```
* Single image:
```bash
docker-compose pull nextcloud
```
* Update containers:
* All containers:
```bash
docker-compose up -d
```
* Single container:
```bash
docker-compose up -d nextcloud
```
* You can also remove the old dangling images:
```bash
docker image prune
```
### Via Docker Run ### Via Docker Run
* Update the image: `docker pull lscr.io/linuxserver/nextcloud:latest` * Update the image:
* Stop the running container: `docker stop nextcloud`
* Delete the container: `docker rm nextcloud` ```bash
docker pull lscr.io/linuxserver/nextcloud:develop
```
* Stop the running container:
```bash
docker stop nextcloud
```
* Delete the container:
```bash
docker rm nextcloud
```
* 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:
### Via Watchtower auto-updater (only use if you don't remember the original parameters) ```bash
docker image prune
* Pull the latest image at its tag and replace it with the same env variables in one run: ```
```bash
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once nextcloud
```
* 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).
### 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. **tip**: We recommend [Diun](https://crazymax.dev/diun/) for update notifications. Other tools that automatically update containers unattended are not recommended or supported.
## Building locally ## Building locally
@ -244,7 +302,7 @@ cd docker-nextcloud
docker build \ docker build \
--no-cache \ --no-cache \
--pull \ --pull \
-t lscr.io/linuxserver/nextcloud:latest . -t lscr.io/linuxserver/nextcloud:develop .
``` ```
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`
@ -257,6 +315,13 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Versions ## Versions
* **24.06.24:** - Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings.
* **06.03.24:** - Rebase to Alpine 3.19 with php 8.3.
* **02.01.24:** - Existing users should update: site-confs/default.conf - Cleanup default site conf.
* **22.12.23:** - Site default conf updating to include mime.types for js and mjs and update location to include more file types.
* **28.10.23:** - Disable web upgrades using occ during init.
* **31.08.23:** - Re-add updatenotification app. This allows users to be notified for app updates, but also notifies for NextCloud updates. Updating NextCloud via the web UI is not supported when using this image.
* **14.08.23:** - Add develop branch.
* **25.06.23:** - Move Nextcloud installation inside container. Remove CLI updater. [See changes announcement](https://info.linuxserver.io/issues/2023-06-25-nextcloud/). * **25.06.23:** - Move Nextcloud installation inside container. Remove CLI updater. [See changes announcement](https://info.linuxserver.io/issues/2023-06-25-nextcloud/).
* **21.06.23:** - Existing users should update `/config/nginx/site-confs/default.conf` - Security fix for real ip settings. * **21.06.23:** - Existing users should update `/config/nginx/site-confs/default.conf` - Security fix for real ip settings.
* **25.05.23:** - Rebase to Alpine 3.18, deprecate armhf. * **25.05.23:** - Rebase to Alpine 3.18, deprecate armhf.

View File

@ -3,11 +3,10 @@
# jenkins variables # jenkins variables
project_name: docker-nextcloud project_name: docker-nextcloud
external_type: na external_type: na
custom_version_command: "curl -sX GET https://api.github.com/repos/nextcloud/server/releases | jq -r '.[] | select(.prerelease != true) | .tag_name' | sed 's|^v||g' | sort -rV | head -1" custom_version_command: "curl -sX GET https://api.github.com/repos/nextcloud/server/releases | jq -r '.[] | select(.prerelease == true) | .tag_name' | sed 's|^v||g' | sort -rV | head -1"
release_type: stable release_type: prerelease
release_tag: latest release_tag: develop
ls_branch: master ls_branch: develop
build_armhf: false
repo_vars: repo_vars:
- BUILD_VERSION_ARG = 'NEXTCLOUD_RELEASE' - BUILD_VERSION_ARG = 'NEXTCLOUD_RELEASE'
- LS_USER = 'linuxserver' - LS_USER = 'linuxserver'
@ -23,6 +22,6 @@ repo_vars:
- CI_PORT='443' - CI_PORT='443'
- CI_SSL='true' - CI_SSL='true'
- CI_DELAY='120' - CI_DELAY='120'
- CI_DOCKERENV='TZ=US/Pacific' - CI_DOCKERENV=''
- CI_AUTH='user:password' - CI_AUTH=''
- CI_WEBPATH='' - CI_WEBPATH=''

View File

@ -1,378 +1,400 @@
NAME VERSION TYPE NAME VERSION TYPE
alpine-baselayout 3.4.3-r1 apk Process Wrapper 1.0.0.0 dotnet (+1 duplicate)
alpine-baselayout-data 3.4.3-r1 apk activity 3.0.0 npm
alpine-keys 2.4-r1 apk alpine-baselayout 3.6.5-r0 apk
alpine-release 3.18.2-r0 apk alpine-baselayout-data 3.6.5-r0 apk
alsa-lib 1.2.9-r1 apk alpine-keys 2.4-r1 apk
amphp/amp v2.6.2 php-composer alpine-release 3.20.1-r0 apk
amphp/byte-stream v1.8.1 php-composer alsa-lib 1.2.11-r0 apk
amphp/parallel v1.4.3 php-composer amphp/amp v2.6.2 php-composer
amphp/parser v1.1.0 php-composer amphp/byte-stream v1.8.1 php-composer
amphp/process v1.1.4 php-composer amphp/parallel v1.4.3 php-composer
amphp/serialization v1.0.0 php-composer amphp/parser v1.1.0 php-composer
amphp/sync v1.4.2 php-composer amphp/process v1.1.4 php-composer
aom-libs 3.6.1-r0 apk amphp/serialization v1.0.0 php-composer
apache2-utils 2.4.57-r3 apk amphp/sync v1.4.2 php-composer
apk-tools 2.14.0-r2 apk aom-libs 3.9.0-r0 apk
apr 1.7.4-r0 apk apache2-utils 2.4.62-r0 apk
apr-util 1.6.3-r1 apk apk-tools 2.14.4-r0 apk
argon2-libs 20190702-r4 apk apr 1.7.4-r0 apk
avahi-libs 0.8-r13 apk apr-util 1.6.3-r1 apk
aws/aws-crt-php v1.0.2 php-composer argon2-libs 20190702-r5 apk
aws/aws-sdk-php 3.240.8 php-composer aws/aws-crt-php v1.2.5 php-composer
bantu/ini-get-wrapper v1.0.1 php-composer aws/aws-sdk-php 3.311.2 php-composer
bash 5.2.15-r5 apk bantu/ini-get-wrapper v1.0.1 php-composer
beberlei/assert v3.3.1 php-composer bash 5.2.26-r0 apk
brick/math 0.9.2 php-composer brick/math 0.12.1 php-composer
brotli-libs 1.0.9-r14 apk brotli-libs 1.1.0-r2 apk
busybox 1.36.1 binary bruteforcesettings 3.0.0 npm
busybox 1.36.1-r1 apk busybox 1.36.1-r29 apk
busybox-binsh 1.36.1-r1 apk busybox-binsh 1.36.1-r29 apk
c-client 2007f-r15 apk c-ares 1.28.1-r0 apk
ca-certificates 20230506-r0 apk c-client 2007f-r15 apk
ca-certificates-bundle 20230506-r0 apk ca-certificates 20240705-r0 apk
cairo 1.17.8-r1 apk ca-certificates-bundle 20240705-r0 apk
cairo-gobject 1.17.8-r1 apk catatonit 0.2.0-r0 apk
christian-riesen/base32 1.6.0 php-composer christian-riesen/base32 1.6.0 php-composer
christophwurst/id3parser v0.1.4 php-composer cjson 1.7.18-r0 apk
cjson 1.7.15-r4 apk composer 2.7.7 binary
coreutils 9.3-r1 apk coreutils 9.5-r1 apk
cups-libs 2.4.6-r0 apk coreutils-env 9.5-r1 apk
curl 8.1.2-r0 apk coreutils-fmt 9.5-r1 apk
cweagans/composer-patches 1.7.1 php-composer coreutils-sha512sum 9.5-r1 apk
darsyn/ip 4.1.0 php-composer curl 8.8.0-r0 apk
dbus-libs 1.14.8-r0 apk cweagans/composer-patches 1.7.3 php-composer
deepdiver/zipstreamer 2.0.0 php-composer dbus-libs 1.14.10-r1 apk
deepdiver1975/tarstreamer 2.0.0 php-composer deepdiver/zipstreamer v2.0.3 php-composer
doctrine/cache 2.2.0 php-composer deepdiver1975/tarstreamer v2.1.0 php-composer
doctrine/dbal 3.3.8 php-composer doctrine/cache 2.2.0 php-composer
doctrine/deprecations v1.0.0 php-composer doctrine/dbal 3.8.3 php-composer
doctrine/event-manager 1.2.0 php-composer doctrine/deprecations 1.1.3 php-composer
doctrine/lexer 1.2.3 php-composer doctrine/event-manager 1.2.0 php-composer
egulias/email-validator 3.2.5 php-composer doctrine/lexer 3.0.1 php-composer
ffmpeg 6.0-r15 apk egulias/email-validator 4.0.2 php-composer
ffmpeg-libavcodec 6.0-r15 apk ffmpeg 6.1.1-r8 apk
ffmpeg-libavdevice 6.0-r15 apk ffmpeg-libavcodec 6.1.1-r8 apk
ffmpeg-libavfilter 6.0-r15 apk ffmpeg-libavdevice 6.1.1-r8 apk
ffmpeg-libavformat 6.0-r15 apk ffmpeg-libavfilter 6.1.1-r8 apk
ffmpeg-libavutil 6.0-r15 apk ffmpeg-libavformat 6.1.1-r8 apk
ffmpeg-libpostproc 6.0-r15 apk ffmpeg-libavutil 6.1.1-r8 apk
ffmpeg-libswresample 6.0-r15 apk ffmpeg-libpostproc 6.1.1-r8 apk
ffmpeg-libswscale 6.0-r15 apk ffmpeg-libswresample 6.1.1-r8 apk
fgrosse/phpasn1 v2.3.0 php-composer ffmpeg-libswscale 6.1.1-r8 apk
flac-libs 1.4.3-r0 apk fftw-double-libs 3.3.10-r5 apk
fontconfig 2.14.2-r3 apk files_downloadlimit 3.0.0 npm
freetype 2.13.0-r5 apk files_pdfviewer 3.0.0 npm
fribidi 1.0.13-r0 apk findutils 4.9.0-r5 apk
fusonic/linq v1.1.0 php-composer firstrunwizard 3.0.0 npm
fusonic/opengraph v2.2.0 php-composer fontconfig 2.15.0-r1 apk
gdbm 1.23-r1 apk freetype 2.13.2-r0 apk
gdk-pixbuf 2.42.10-r5 apk fribidi 1.0.15-r0 apk
ghostscript 10.01.2-r0 apk fusonic/opengraph v2.3.0 php-composer
giggsey/libphonenumber-for-php 8.13.7 php-composer gdbm 1.23-r1 apk
giggsey/locale 2.3 php-composer giflib 5.2.2-r0 apk
git 2.40.1-r0 apk giggsey/libphonenumber-for-php-lite 8.13.35 php-composer
glib 2.76.4-r0 apk git 2.45.2-r0 apk
glslang-libs 1.3.243.0-r1 apk git-init-template 2.45.2-r0 apk
gmp 6.2.1-r3 apk glib 2.80.2-r0 apk
gnu-libiconv 1.17-r1 apk glslang-libs 1.3.261.1-r0 apk
gnu-libiconv-libs 1.17-r1 apk gmp 6.3.0-r1 apk
gnutls 3.8.0-r2 apk gnu-libiconv 1.17-r2 apk
graphite2 1.3.14-r5 apk gnu-libiconv-libs 1.17-r2 apk
guzzlehttp/guzzle 7.5.0 php-composer gnutls 3.8.5-r0 apk
guzzlehttp/promises 1.5.2 php-composer graphite2 1.3.14-r6 apk
guzzlehttp/psr7 2.4.5 php-composer guzzlehttp/guzzle 7.8.1 php-composer
guzzlehttp/uri-template v0.2.0 php-composer guzzlehttp/promises 2.0.2 php-composer
harfbuzz 7.3.0-r0 apk guzzlehttp/psr7 2.6.2 php-composer
hexogen/kdtree v0.2.5 php-composer guzzlehttp/uri-template v1.0.3 php-composer
hwdata-pci 0.370-r0 apk harfbuzz 8.5.0-r0 apk
icewind/searchdav v3.0.1 php-composer hexogen/kdtree v0.2.5 php-composer
icewind/smb v3.5.4 php-composer hwdata-pci 0.382-r0 apk
icewind/streams v0.7.7 php-composer icewind/searchdav v3.1.0 php-composer
icu-data-en 73.2-r2 apk icewind/smb v3.5.4 php-composer
icu-libs 73.2-r2 apk icewind/streams v0.7.7 php-composer (+1 duplicate)
imagemagick 7.1.1.13-r0 apk icu-data-en 74.2-r0 apk
imagemagick-libs 7.1.1.13-r0 apk icu-libs 74.2-r0 apk
jansson 2.14-r3 apk imagemagick 7.1.1.32-r2 apk
jbig2dec 0.19-r3 apk imagemagick-jpeg 7.1.1.32-r2 apk
jq 1.6-r3 apk imagemagick-jxl 7.1.1.32-r2 apk
justinrainbow/json-schema 5.2.10 php-composer imagemagick-libs 7.1.1.32-r2 apk
lame-libs 3.100-r5 apk imagemagick-webp 7.1.1.32-r2 apk
laravel/serializable-closure v1.2.2 php-composer imath 3.1.11-r2 apk
lcms2 2.15-r2 apk jansson 2.14-r4 apk
ldb 2.7.2-r1 apk jq 1.7.1-r0 apk
league/flysystem 2.5.0 php-composer justinrainbow/json-schema v5.2.13 php-composer
league/mime-type-detection 1.11.0 php-composer kornrunner/blurhash v1.2.2 php-composer
league/uri 6.4.0 php-composer lame-libs 3.100-r5 apk
league/uri-interfaces 2.2.0 php-composer laravel/serializable-closure v1.3.3 php-composer
libacl 2.3.1-r3 apk lcms2 2.16-r0 apk
libarchive 3.6.2-r2 apk lcobucci/clock 3.0.0 php-composer
libass 0.17.1-r0 apk ldb 2.8.0-r1 apk
libasyncns 0.8-r1 apk league/flysystem 2.5.0 php-composer
libattr 2.5.1-r4 apk league/mime-type-detection 1.11.0 php-composer
libavif 0.11.1-r2 apk libSvtAv1Enc 2.0.0-r1 apk
libblkid 2.38.1-r8 apk libacl 2.3.2-r0 apk
libbluray 1.3.4-r0 apk libarchive 3.7.4-r0 apk
libbsd 0.11.7-r1 apk libass 0.17.2-r0 apk
libbz2 1.0.8-r5 apk libasyncns 0.8-r3 apk
libc-utils 0.7.2-r5 apk libattr 2.5.2-r0 apk
libcap2 2.69-r0 apk libauth-samba 4.19.6-r0 apk
libcrypto3 3.1.1-r3 apk libavif 1.0.4-r0 apk
libcurl 8.1.2-r0 apk libblkid 2.40.1-r1 apk
libdav1d 1.2.1-r0 apk libbluray 1.3.4-r1 apk
libde265 1.0.12-r0 apk libbsd 0.12.2-r0 apk
libdrm 2.4.115-r4 apk libbz2 1.0.8-r6 apk
libedit 20221030.3.1-r1 apk libcap2 2.70-r0 apk
libevent 2.1.12-r6 apk libcrypto3 3.3.1-r3 apk
libexpat 2.5.0-r1 apk libcurl 8.8.0-r0 apk
libffi 3.4.4-r2 apk libdav1d 1.4.2-r0 apk
libformw 6.4_p20230506-r0 apk libdovi 3.3.0-r0 apk
libgcc 12.2.1_git20220924-r10 apk libdrm 2.4.120-r0 apk
libgomp 12.2.1_git20220924-r10 apk libeconf 0.6.3-r0 apk
libheif 1.16.2-r0 apk libedit 20240517.3.1-r0 apk
libhwy 1.0.4-r1 apk libevent 2.1.12-r7 apk
libice 1.1.1-r2 apk libexpat 2.6.2-r0 apk
libidn2 2.3.4-r1 apk libffi 3.4.6-r0 apk
libintl 0.21.1-r7 apk libflac 1.4.3-r1 apk
libjpeg-turbo 2.1.5.1-r3 apk libformw 6.4_p20240420-r0 apk
libjxl 0.8.2-r0 apk libgcc 13.2.1_git20240309-r0 apk
libldap 2.6.5-r0 apk libgomp 13.2.1_git20240309-r0 apk
libltdl 2.4.7-r2 apk libhwy 1.0.7-r0 apk
libmcrypt 2.5.8-r10 apk libice 1.1.1-r6 apk
libmd 1.0.4-r2 apk libidn2 2.3.7-r0 apk
libmemcached-libs 1.1.4-r1 apk libintl 0.22.5-r0 apk
libmount 2.38.1-r8 apk libjpeg-turbo 3.0.3-r0 apk
libncursesw 6.4_p20230506-r0 apk libjxl 0.10.2-r0 apk
libogg 1.3.5-r4 apk libldap 2.6.7-r0 apk
libopenmpt 0.7.2-r0 apk libltdl 2.4.7-r3 apk
libpanelw 6.4_p20230506-r0 apk libmcrypt 2.5.8-r10 apk
libpciaccess 0.17-r2 apk libmd 1.1.0-r0 apk
libplacebo 5.264.1-r1 apk libmemcached-libs 1.1.4-r1 apk
libpng 1.6.39-r3 apk libmount 2.40.1-r1 apk
libpq 15.3-r0 apk libncursesw 6.4_p20240420-r0 apk
libproc2 4.0.3-r1 apk libogg 1.3.5-r5 apk
libpulse 16.1-r10 apk libopenmpt 0.7.7-r0 apk
libraw 0.21.1-r1 apk libpanelw 6.4_p20240420-r0 apk
librist 0.2.7-r0 apk libpciaccess 0.18.1-r0 apk
librsvg 2.56.3-r0 apk libplacebo 6.338.2-r1 apk
libsasl 2.1.28-r4 apk libpng 1.6.43-r0 apk
libsm 1.2.4-r1 apk libpq 16.3-r0 apk
libsmbclient 4.18.5-r0 apk libproc2 4.0.4-r0 apk
libsndfile 1.2.0-r2 apk libpsl 0.21.5-r1 apk
libsodium 1.0.18-r3 apk libpulse 17.0-r0 apk
libsrt 1.5.2-r0 apk librist 0.2.10-r1 apk
libssh 0.10.5-r0 apk libsasl 2.1.28-r6 apk
libssl3 3.1.1-r3 apk libsharpyuv 1.3.2-r0 apk
libstdc++ 12.2.1_git20220924-r10 apk libsm 1.2.4-r4 apk
libtasn1 4.19.0-r1 apk libsmbclient 4.19.6-r0 apk
libtheora 1.1.1-r17 apk libsndfile 1.2.2-r0 apk
libunibreak 5.1-r0 apk libsodium 1.0.19-r0 apk
libunistring 1.1-r1 apk libsrt 1.5.3-r0 apk
libuuid 2.38.1-r8 apk libssh 0.10.6-r0 apk
libva 2.18.0-r1 apk libssl3 3.3.1-r3 apk
libvdpau 1.5-r1 apk libstdc++ 13.2.1_git20240309-r0 apk
libvorbis 1.3.7-r1 apk libtasn1 4.19.0-r2 apk
libvpx 1.13.0-r1 apk libtheora 1.1.1-r18 apk
libwbclient 4.18.5-r0 apk libunibreak 6.1-r0 apk
libwebp 1.3.1-r0 apk libunistring 1.2-r0 apk
libx11 1.8.4-r4 apk libuuid 2.40.1-r1 apk
libxau 1.0.11-r2 apk libva 2.21.0-r0 apk
libxcb 1.15-r1 apk libvdpau 1.5-r3 apk
libxdmcp 1.1.4-r2 apk libvorbis 1.3.7-r2 apk
libxext 1.3.5-r2 apk libvpx 1.14.1-r0 apk
libxfixes 6.0.1-r2 apk libwbclient 4.19.6-r0 apk
libxft 2.3.8-r1 apk libwebp 1.3.2-r0 apk
libxml2 2.11.4-r0 apk libwebpdemux 1.3.2-r0 apk
libxpm 3.5.16-r1 apk libwebpmux 1.3.2-r0 apk
libxrender 0.9.11-r3 apk libx11 1.8.9-r1 apk
libxt 1.3.0-r2 apk libxau 1.0.11-r4 apk
libxxhash 0.8.2-r0 apk libxcb 1.16.1-r0 apk
libzip 1.9.2-r2 apk libxdmcp 1.1.5-r1 apk
libzmq 4.3.4-r4 apk libxext 1.3.6-r2 apk
linux-pam 1.5.2-r10 apk libxfixes 6.0.1-r4 apk
lmdb 0.9.31-r0 apk libxml2 2.12.7-r0 apk
logrotate 3.21.0-r1 apk libxpm 3.5.17-r0 apk
lz4-libs 1.9.4-r4 apk libxt 1.3.0-r5 apk
mbedtls 2.28.3-r1 apk libxxhash 0.8.2-r2 apk
mexitek/phpcolors v1.0.4 php-composer libzip 1.10.1-r0 apk
microsoft/azure-storage-blob 1.5.4 php-composer libzmq 4.3.5-r2 apk
microsoft/azure-storage-common 1.5.2 php-composer lilv-libs 0.24.24-r1 apk
mlocati/ip-lib 1.18.0 php-composer linux-pam 1.6.0-r0 apk
mpg123-libs 1.31.3-r1 apk lmdb 0.9.32-r0 apk
mtdowling/jmespath.php 2.6.1 php-composer logreader 3.0.0 npm
musl 1.2.4-r0 apk logrotate 3.21.0-r1 apk
musl-utils 1.2.4-r0 apk lz4-libs 1.9.4-r5 apk
nano 7.2-r1 apk masterminds/html5 2.9.0 php-composer
ncurses-terminfo-base 6.4_p20230506-r0 apk mbedtls 3.6.0-r0 apk
netcat-openbsd 1.219-r1 apk mexitek/phpcolors v1.0.4 php-composer
nettle 3.8.1-r2 apk microsoft/azure-storage-blob 1.5.4 php-composer
nextcloud/lognormalizer v1.0.0 php-composer microsoft/azure-storage-common 1.5.2 php-composer
nghttp2-libs 1.53.0-r0 apk mlocati/ip-lib 1.18.0 php-composer
nginx 1.24.0-r6 apk mpg123-libs 1.32.6-r0 apk
numactl 2.0.16-r4 apk mtdowling/jmespath.php 2.7.0 php-composer
onevpl-libs 2023.2.1-r0 apk musl 1.2.5-r0 apk
oniguruma 6.9.8-r1 apk musl-utils 1.2.5-r0 apk
openssl 3.1.1-r3 apk nano 8.0-r0 apk
opis/closure 3.6.3 php-composer ncurses-terminfo-base 6.4_p20240420-r0 apk
opus 1.4-r0 apk netcat-openbsd 1.226-r0 apk
orc 0.4.34-r0 apk nettle 3.9.1-r0 apk
p11-kit 0.24.1-r2 apk nextcloud 1.0.0 npm
pango 1.50.14-r1 apk nextcloud/lognormalizer v1.0.0 php-composer
pcre 8.45-r3 apk nghttp2-libs 1.62.1-r0 apk
pcre2 10.42-r1 apk nginx 1.26.1-r0 apk
pear/archive_tar 1.4.14 php-composer notifications 3.0.0 npm
pear/console_getopt v1.4.3 php-composer numactl 2.0.18-r0 apk
pear/pear-core-minimal v1.10.10 php-composer onevpl-libs 2023.3.1-r2 apk
pear/pear_exception v1.0.2 php-composer oniguruma 6.9.9-r0 apk
php-cli 8.2.8 binary openexr-libiex 3.1.13-r1 apk
php-fpm 8.2.8 binary openexr-libilmthread 3.1.13-r1 apk
php-http/guzzle7-adapter 1.0.0 php-composer openexr-libopenexr 3.1.13-r1 apk
php-http/httplug 2.2.0 php-composer openssl 3.3.1-r3 apk
php-http/promise 1.1.0 php-composer opus 1.5.2-r0 apk
php-opencloud/openstack v3.2.1 php-composer orc 0.4.37-r0 apk
php82 8.2.8-r0 apk p11-kit 0.25.3-r0 apk
php82-bcmath 8.2.8-r0 apk paragonie/constant_time_encoding v2.6.3 php-composer
php82-bz2 8.2.8-r0 apk password_policy 2.0.0 npm
php82-common 8.2.8-r0 apk pcre 8.45-r3 apk
php82-ctype 8.2.8-r0 apk pcre2 10.43-r0 apk
php82-curl 8.2.8-r0 apk pear/archive_tar 1.5.0 php-composer
php82-dom 8.2.8-r0 apk pear/console_getopt v1.4.3 php-composer
php82-exif 8.2.8-r0 apk pear/pear-core-minimal v1.10.15 php-composer
php82-fileinfo 8.2.8-r0 apk pear/pear_exception v1.0.2 php-composer
php82-fpm 8.2.8-r0 apk photos 3.0.0 npm
php82-ftp 8.2.8-r0 apk php-http/guzzle7-adapter 1.0.0 php-composer
php82-gd 8.2.8-r0 apk php-http/httplug 2.2.0 php-composer
php82-gmp 8.2.8-r0 apk php-http/promise 1.1.0 php-composer
php82-iconv 8.2.8-r0 apk php-opencloud/openstack v3.10.0 php-composer
php82-imap 8.2.8-r0 apk php83 8.3.9-r0 apk
php82-intl 8.2.8-r0 apk php83-bcmath 8.3.9-r0 apk
php82-ldap 8.2.8-r0 apk php83-bz2 8.3.9-r0 apk
php82-mbstring 8.2.8-r0 apk php83-common 8.3.9-r0 apk
php82-mysqlnd 8.2.8-r0 apk php83-ctype 8.3.9-r0 apk
php82-opcache 8.2.8-r0 apk php83-curl 8.3.9-r0 apk
php82-openssl 8.2.8-r0 apk php83-dom 8.3.9-r0 apk
php82-pcntl 8.2.8-r0 apk php83-exif 8.3.9-r0 apk
php82-pdo 8.2.8-r0 apk php83-fileinfo 8.3.9-r0 apk
php82-pdo_mysql 8.2.8-r0 apk php83-fpm 8.3.9-r0 apk
php82-pdo_pgsql 8.2.8-r0 apk php83-ftp 8.3.9-r0 apk
php82-pdo_sqlite 8.2.8-r0 apk php83-gd 8.3.9-r0 apk
php82-pecl-apcu 5.1.22-r0 apk php83-gmp 8.3.9-r0 apk
php82-pecl-igbinary 3.2.14-r0 apk php83-iconv 8.3.9-r0 apk
php82-pecl-imagick 3.7.0-r5 apk php83-imap 8.3.9-r0 apk
php82-pecl-mcrypt 1.0.6-r0 apk php83-intl 8.3.9-r0 apk
php82-pecl-memcached 3.2.0-r1 apk php83-ldap 8.3.9-r0 apk
php82-pecl-msgpack 2.2.0-r0 apk php83-mbstring 8.3.9-r0 apk
php82-pecl-redis 5.3.7-r2 apk php83-mysqlnd 8.3.9-r0 apk
php82-pecl-smbclient 1.1.1-r0 apk php83-opcache 8.3.9-r0 apk
php82-pgsql 8.2.8-r0 apk php83-openssl 8.3.9-r0 apk
php82-phar 8.2.8-r0 apk php83-pcntl 8.3.9-r0 apk
php82-posix 8.2.8-r0 apk php83-pdo 8.3.9-r0 apk
php82-session 8.2.8-r0 apk php83-pdo_mysql 8.3.9-r0 apk
php82-simplexml 8.2.8-r0 apk php83-pdo_pgsql 8.3.9-r0 apk
php82-sockets 8.2.8-r0 apk php83-pdo_sqlite 8.3.9-r0 apk
php82-sodium 8.2.8-r0 apk php83-pecl-apcu 5.1.23-r0 apk
php82-sqlite3 8.2.8-r0 apk php83-pecl-igbinary 3.2.15-r0 apk
php82-sysvsem 8.2.8-r0 apk php83-pecl-imagick 3.7.0-r0 apk
php82-xml 8.2.8-r0 apk php83-pecl-mcrypt 1.0.7-r0 apk
php82-xmlreader 8.2.8-r0 apk php83-pecl-memcached 3.2.0-r0 apk
php82-xmlwriter 8.2.8-r0 apk php83-pecl-msgpack 2.2.0-r2 apk
php82-zip 8.2.8-r0 apk php83-pecl-redis 6.0.2-r0 apk
phpseclib/phpseclib 2.0.40 php-composer php83-pecl-smbclient 1.1.1-r0 apk
pimple/pimple v3.5.0 php-composer php83-pgsql 8.3.9-r0 apk
pixman 0.42.2-r1 apk php83-phar 8.3.9-r0 apk
pkgconf 1.9.5-r0 apk php83-posix 8.3.9-r0 apk
popt 1.19-r2 apk php83-session 8.3.9-r0 apk
procps-ng 4.0.3-r1 apk php83-simplexml 8.3.9-r0 apk
psr/cache 1.0.1 php-composer php83-sockets 8.3.9-r0 apk
psr/clock 1.0.0 php-composer php83-sodium 8.3.9-r0 apk
psr/container 2.0.2 php-composer php83-sqlite3 8.3.9-r0 apk
psr/event-dispatcher 1.0.0 php-composer php83-sysvsem 8.3.9-r0 apk
psr/http-client 1.0.1 php-composer php83-xml 8.3.9-r0 apk
psr/http-factory 1.0.1 php-composer php83-xmlreader 8.3.9-r0 apk
psr/http-message 1.0.1 php-composer php83-xmlwriter 8.3.9-r0 apk
psr/log 1.1.4 php-composer php83-zip 8.3.9-r0 apk
punic/punic 1.6.5 php-composer phpseclib/phpseclib 2.0.47 php-composer
ralouphie/getallheaders 3.0.3 php-composer pimple/pimple v3.5.0 php-composer
ramsey/collection 1.1.3 php-composer popt 1.19-r3 apk
ramsey/uuid 4.1.1 php-composer privacy 2.0.0 npm
readline 8.2.1-r1 apk procps-ng 4.0.4-r0 apk
rsync 3.2.7-r4 apk psr/cache 3.0.0 php-composer
rubix/ml dev-chore/bump-flysystem-v2.1.1 php-composer psr/clock 1.0.0 php-composer
rubix/tensor 2.2.3 php-composer psr/container 2.0.2 php-composer
rullzer/easytotp v0.1.4 php-composer psr/event-dispatcher 1.0.0 php-composer
sabre/dav 4.4.0 php-composer psr/http-client 1.0.3 php-composer
sabre/event 5.1.4 php-composer psr/http-factory 1.1.0 php-composer
sabre/http 5.1.5 php-composer psr/http-message 1.1 php-composer
sabre/uri 2.2.2 php-composer psr/log 1.1.4 php-composer
sabre/vobject 4.4.2 php-composer psr/log 2.0.0 php-composer
sabre/xml 2.2.5 php-composer punic/punic 3.8.1 php-composer
samba-client 4.18.5-r0 apk ralouphie/getallheaders 3.0.3 php-composer
samba-client-libs 4.18.5-r0 apk rav1e-libs 0.7.1-r0 apk
samba-common 4.18.5-r0 apk readline 8.2.10-r0 apk
samba-libs 4.18.5-r0 apk recommendations 3.0.0 npm
samba-util-libs 4.18.5-r0 apk related_resources 1.5.0 npm
scanelf 1.3.7-r1 apk rsync 3.3.0-r0 apk
scssphp/scssphp v1.11.0 php-composer rubix/ml dev-chore/bump-flysystem-v2.1.1 php-composer
sdl2 2.26.5-r0 apk rubix/tensor 2.2.3 php-composer
shaderc 2023.3-r1 apk rullzer/easytotp v0.1.4 php-composer
shadow 4.13-r4 apk sabre/dav 4.6.0 php-composer
shared-mime-info 2.2-r5 apk sabre/event 5.1.4 php-composer
skalibs 2.13.1.1-r1 apk sabre/http 5.1.10 php-composer
soxr 0.1.3-r5 apk sabre/uri 2.3.3 php-composer
speexdsp 1.2.1-r1 apk sabre/vobject 4.5.4 php-composer
spirv-tools 1.3.243.0-r1 apk sabre/xml 2.2.7 php-composer
spomky-labs/base64url v2.0.4 php-composer samba-client 4.19.6-r0 apk
spomky-labs/cbor-php v2.0.1 php-composer samba-client-libs 4.19.6-r0 apk
sqlite-libs 3.41.2-r2 apk samba-common 4.19.6-r0 apk
ssl_client 1.36.1-r1 apk samba-libs 4.19.6-r0 apk
stecman/symfony-console-completion 0.11.0 php-composer samba-util-libs 4.19.6-r0 apk
sudo 1.9.13_p3-r2 apk scanelf 1.3.7-r2 apk
svt-av1-libs 1.6.0-r0 apk scssphp/scssphp v1.12.1 php-composer
swiftmailer/swiftmailer v6.3.0 php-composer sdl2 2.28.5-r1 apk
symfony/console v5.4.19 php-composer serd-libs 0.32.2-r0 apk
symfony/css-selector v5.4.11 php-composer shaderc 2024.0-r0 apk
symfony/deprecation-contracts v2.5.2 php-composer shadow 4.15.1-r0 apk
symfony/dom-crawler v5.4.11 php-composer skalibs 2.14.1.1-r0 apk
symfony/event-dispatcher v4.4.30 php-composer sord-libs 0.16.16-r0 apk
symfony/event-dispatcher-contracts v1.1.9 php-composer soxr 0.1.3-r7 apk
symfony/http-foundation v5.4.10 php-composer speexdsp 1.2.1-r2 apk
symfony/mailer v5.4.19 php-composer spirv-tools 1.3.261.1-r0 apk
symfony/mime v5.4.19 php-composer spomky-labs/cbor-php 3.0.4 php-composer
symfony/polyfill-ctype v1.23.0 php-composer spomky-labs/pki-framework 1.2.1 php-composer
symfony/polyfill-iconv v1.27.0 php-composer sqlite-libs 3.45.3-r1 apk
symfony/polyfill-intl-grapheme v1.23.1 php-composer sratom 0.6.16-r0 apk
symfony/polyfill-intl-idn v1.27.0 php-composer ssl_client 1.36.1-r29 apk
symfony/polyfill-intl-normalizer v1.27.0 php-composer stecman/symfony-console-completion 0.11.0 php-composer
symfony/polyfill-mbstring v1.27.0 php-composer sudo 1.9.15_p5-r0 apk
symfony/polyfill-php72 v1.27.0 php-composer support 2.0.0 npm
symfony/polyfill-php73 v1.23.0 php-composer suspicious_login 8.0.0 npm
symfony/polyfill-php73 v1.26.0 php-composer symfony/console v5.4.35 php-composer
symfony/polyfill-php80 v1.26.0 php-composer symfony/css-selector v6.4.3 php-composer
symfony/polyfill-php80 v1.27.0 php-composer symfony/deprecation-contracts v3.5.0 php-composer
symfony/process v4.4.30 php-composer symfony/dom-crawler v6.4.4 php-composer
symfony/routing v4.4.30 php-composer symfony/event-dispatcher v5.4.26 php-composer
symfony/service-contracts v3.0.2 php-composer symfony/event-dispatcher-contracts v3.0.2 php-composer
symfony/string v6.0.19 php-composer symfony/http-foundation v5.4.25 php-composer
symfony/translation v4.4.41 php-composer symfony/mailer v5.4.22 php-composer
symfony/translation-contracts v2.4.0 php-composer symfony/mime v5.4.19 php-composer
talloc 2.4.0-r1 apk symfony/polyfill-ctype v1.29.0 php-composer
tdb-libs 1.4.8-r1 apk symfony/polyfill-intl-grapheme v1.29.0 php-composer
tevent 0.14.1-r1 apk symfony/polyfill-intl-idn v1.29.0 php-composer
thecodingmachine/safe v1.3.3 php-composer symfony/polyfill-intl-normalizer v1.29.0 php-composer
tiff 4.5.1-r0 apk symfony/polyfill-mbstring v1.27.0 php-composer
tzdata 2023c-r1 apk symfony/polyfill-mbstring v1.29.0 php-composer
utmps-libs 0.1.2.1-r1 apk symfony/polyfill-php72 v1.29.0 php-composer
v4l-utils-libs 1.24.1-r0 apk symfony/polyfill-php73 v1.26.0 php-composer
vidstab 1.1.1-r0 apk symfony/polyfill-php73 v1.28.0 php-composer
vulkan-loader 1.3.243.0-r1 apk symfony/polyfill-php80 v1.27.0 php-composer
wayland-libs-client 1.22.0-r2 apk symfony/polyfill-php80 v1.29.0 php-composer
web-auth/cose-lib v3.3.9 php-composer symfony/polyfill-uuid v1.29.0 php-composer
web-auth/metadata-service v3.3.9 php-composer symfony/process v5.4.34 php-composer
web-auth/webauthn-lib v3.3.9 php-composer symfony/routing v5.4.25 php-composer
x264-libs 0.164_git20220602-r1 apk symfony/service-contracts v3.0.2 php-composer
x265-libs 3.5-r4 apk symfony/string v6.0.19 php-composer
xvidcore 1.3.7-r1 apk symfony/translation v6.4.4 php-composer
xz-libs 5.4.3-r0 apk symfony/translation-contracts v3.4.2 php-composer
zimg 3.0.5-r0 apk symfony/uid v6.4.3 php-composer
zlib 1.2.13-r1 apk talloc 2.4.2-r1 apk
zstd-libs 1.5.5-r4 apk tdb-libs 1.4.9-r1 apk
tevent 0.16.1-r0 apk
text 4.0.0 npm
twofactor_totp 12.0.0-dev npm
tzdata 2024a-r1 apk
utmps-libs 0.1.2.2-r1 apk
v4l-utils-libs 1.24.1-r1 apk
vidstab 1.1.1-r0 apk
viewer 3.0.0 npm
vulkan-loader 1.3.261.1-r0 apk
wapmorgan/mp3info 0.1.0 php-composer
wayland-libs-client 1.22.0-r4 apk
web-auth/cose-lib 4.3.0 php-composer
web-auth/metadata-service 4.8.5 php-composer
web-auth/webauthn-lib 4.8.5 php-composer
x264-libs 0.164_git20231001-r0 apk
x265-libs 3.6-r0 apk
xvidcore 1.3.7-r2 apk
xz-libs 5.6.1-r3 apk
zimg 3.0.5-r2 apk
zix-libs 0.4.2-r0 apk
zlib 1.3.1-r1 apk
zstd-libs 1.5.6-r0 apk

View File

@ -9,7 +9,6 @@ project_blurb: |
Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home.
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_blurb_optional_extras_enabled: false
# supported architectures # supported architectures
available_architectures: available_architectures:
@ -17,34 +16,21 @@ available_architectures:
- { arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"} - { arch: "{{ arch_arm64 }}", tag: "arm64v8-latest"}
# development version # development version
development_versions: false development_versions: true
development_versions_items: development_versions_items:
- { tag: "latest", desc: "Stable Nextcloud releases" } - { tag: "latest", desc: "Stable Nextcloud releases" }
- { tag: "develop", desc: "Beta Nextcloud pre-releases *only*" }
# container parameters # container parameters
common_param_env_vars_enabled: true common_param_env_vars_enabled: true
param_container_name: "{{ project_name }}" param_container_name: "{{ project_name }}"
param_usage_include_net: false
param_usage_include_env: true
param_env_vars:
- { env_var: "TZ", env_value: "Europe/London", desc: "Specify a timezone to use EG Europe/London." }
param_usage_include_vols: true param_usage_include_vols: true
param_volumes: param_volumes:
- { vol_path: "/config", vol_host_path: "/path/to/appdata", desc: "Nextcloud configs." } - { vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/config", desc: "Persistent config files" }
- { vol_path: "/data", vol_host_path: "/path/to/data", desc: "Your personal data." } - { vol_path: "/data", vol_host_path: "/path/to/data", desc: "Your personal data." }
param_usage_include_ports: true param_usage_include_ports: true
param_ports: param_ports:
- { external_port: "443", internal_port: "443", port_desc: "WebUI" } - { external_port: "443", internal_port: "443", port_desc: "WebUI" }
param_device_map: false
cap_add_param: false
# optional container parameters
opt_param_usage_include_env: false
opt_param_usage_include_vols: false
opt_param_usage_include_ports: false
opt_param_device_map: false
opt_cap_add_param: false
optional_block_1: false
# application setup block # application setup block
app_setup_block_enabled: true app_setup_block_enabled: true
@ -78,6 +64,13 @@ app_setup_block: |
# changelog # changelog
changelogs: changelogs:
- { date: "24.06.24:", desc: "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."}
- { date: "06.03.24:", desc: "Rebase to Alpine 3.19 with php 8.3."}
- { date: "02.01.24:", desc: "Existing users should update: site-confs/default.conf - Cleanup default site conf." }
- { date: "22.12.23:", desc: "Site default conf updating to include mime.types for js and mjs and update location to include more file types." }
- { date: "28.10.23:", desc: "Disable web upgrades using occ during init." }
- { date: "31.08.23:", desc: "Re-add updatenotification app. This allows users to be notified for app updates, but also notifies for NextCloud updates. Updating NextCloud via the web UI is not supported when using this image." }
- { date: "14.08.23:", desc: "Add develop branch." }
- { date: "25.06.23:", desc: "Move Nextcloud installation inside container. Remove CLI updater. [See changes announcement](https://info.linuxserver.io/issues/2023-06-25-nextcloud/)." } - { date: "25.06.23:", desc: "Move Nextcloud installation inside container. Remove CLI updater. [See changes announcement](https://info.linuxserver.io/issues/2023-06-25-nextcloud/)." }
- { date: "21.06.23:", desc: "Existing users should update `/config/nginx/site-confs/default.conf` - Security fix for real ip settings." } - { date: "21.06.23:", desc: "Existing users should update `/config/nginx/site-confs/default.conf` - Security fix for real ip settings." }
- { date: "25.05.23:", desc: "Rebase to Alpine 3.18, deprecate armhf." } - { date: "25.05.23:", desc: "Rebase to Alpine 3.18, deprecate armhf." }

View File

@ -1,4 +1,4 @@
## Version 2023/06/23 - Changelog: https://github.com/linuxserver/docker-nextcloud/commits/master/root/defaults/nginx/site-confs/default.conf.sample ## Version 2024/06/24 - Changelog: https://github.com/linuxserver/docker-nextcloud/commits/master/root/defaults/nginx/site-confs/default.conf.sample
# Set the `immutable` cache control options only for assets with a cache busting `v` argument # Set the `immutable` cache control options only for assets with a cache busting `v` argument
map $arg_v $asset_immutable { map $arg_v $asset_immutable {
@ -7,11 +7,8 @@ map $arg_v $asset_immutable {
} }
server { server {
listen 80 default_server; listen *:80 default_server;
listen [::]:80 default_server; listen *:443 ssl default_server;
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _; server_name _;
@ -36,25 +33,24 @@ server {
gzip_comp_level 4; gzip_comp_level 4;
gzip_min_length 256; gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; gzip_types application/atom+xml text/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
# Pagespeed is not supported by Nextcloud, so if your server is built # Pagespeed is not supported by Nextcloud, so if your server is built
# with the `ngx_pagespeed` module, uncomment this line to disable it. # with the `ngx_pagespeed` module, uncomment this line to disable it.
#pagespeed off; #pagespeed off;
# The settings allows you to optimize the HTTP2 bandwitdth. # The settings allows you to optimize the HTTP2 bandwidth.
# See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/ # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
# for tunning hints # for tuning hints
client_body_buffer_size 512k; client_body_buffer_size 512k;
# HTTP response headers borrowed from Nextcloud `.htaccess` # HTTP response headers borrowed from Nextcloud `.htaccess`
add_header Referrer-Policy "no-referrer" always; add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always; add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always; add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Permitted-Cross-Domain-Policies "none" always; add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-Robots-Tag "noindex, nofollow" always; add_header X-XSS-Protection "1; mode=block" always;
add_header X-XSS-Protection "1; mode=block" always;
# Remove X-Powered-By, which is an information leak # Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By; fastcgi_hide_header X-Powered-By;
@ -66,7 +62,7 @@ server {
# that file is correctly served; if it doesn't, then the request is passed to # that file is correctly served; if it doesn't, then the request is passed to
# the front-end controller. This consistent behaviour means that we don't need # the front-end controller. This consistent behaviour means that we don't need
# to specify custom rules for certain paths (e.g. images and other assets, # to specify custom rules for certain paths (e.g. images and other assets,
# `/updater`, `/ocm-provider`, `/ocs-provider`), and thus # `/updater`, `/ocs-provider`), and thus
# `try_files $uri $uri/ /index.php$request_uri` # `try_files $uri $uri/ /index.php$request_uri`
# always provides the desired behaviour. # always provides the desired behaviour.
index index.php index.html /index.php$request_uri; index index.php index.html /index.php$request_uri;
@ -113,7 +109,7 @@ server {
# to the URI, resulting in a HTTP 500 error response. # to the URI, resulting in a HTTP 500 error response.
location ~ \.php(?:$|/) { location ~ \.php(?:$|/) {
# Required for legacy support # Required for legacy support
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri; rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info; set $path_info $fastcgi_path_info;
@ -134,7 +130,8 @@ server {
fastcgi_max_temp_file_size 0; fastcgi_max_temp_file_size 0;
} }
location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ { # Serve static files
location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ {
try_files $uri /index.php$request_uri; try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, $asset_immutable"; add_header Cache-Control "public, max-age=15778463, $asset_immutable";
access_log off; # Optional: Don't log access to assets access_log off; # Optional: Don't log access to assets
@ -142,6 +139,7 @@ server {
location ~ \.wasm$ { location ~ \.wasm$ {
default_type application/wasm; default_type application/wasm;
} }
} }
location ~ \.woff2?$ { location ~ \.woff2?$ {

View File

@ -90,7 +90,7 @@ if [ -f /config/www/nextcloud/config/needs_migration ] || [ -f /tmp/needs_instal
echo "Setting permissions" echo "Setting permissions"
lsiown abc:abc /data lsiown abc:abc /data
lsiown abc:abc -R \ lsiown -R abc:abc \
/app/www/public \ /app/www/public \
/config/www/nextcloud /config/www/nextcloud
@ -124,7 +124,7 @@ if occ config:system:get installed >/dev/null 2>&1; then
occ config:system:set memcache.local --value='\\OC\\Memcache\\APCu' occ config:system:set memcache.local --value='\\OC\\Memcache\\APCu'
fi fi
if ! occ config:system:get filelocking.enabled >/dev/null 2>&1; then if ! occ config:system:get filelocking.enabled >/dev/null 2>&1; then
occ config:system:set filelocking.enabled --value=true occ config:system:set filelocking.enabled --value=true --type=boolean
fi fi
if ! occ config:system:get memcache.locking >/dev/null 2>&1; then if ! occ config:system:get memcache.locking >/dev/null 2>&1; then
occ config:system:set memcache.locking --value='\\OC\\Memcache\\APCu' occ config:system:set memcache.locking --value='\\OC\\Memcache\\APCu'
@ -132,6 +132,9 @@ if occ config:system:get installed >/dev/null 2>&1; then
if ! occ config:system:get datadirectory >/dev/null 2>&1; then if ! occ config:system:get datadirectory >/dev/null 2>&1; then
occ config:system:set datadirectory --value='/data' occ config:system:set datadirectory --value='/data'
fi fi
if ! occ config:system:get upgrade.disable-web >/dev/null 2>&1; then
occ config:system:set upgrade.disable-web --value=true --type=boolean
fi
else else
echo "After completing the web-based installer, restart the Nextcloud container to apply default memory caching and transactional file locking configurations." echo "After completing the web-based installer, restart the Nextcloud container to apply default memory caching and transactional file locking configurations."
echo "Alternatively, you can apply your own configurations by editing /config/www/nextcloud/config/config.php following the documentation:" echo "Alternatively, you can apply your own configurations by editing /config/www/nextcloud/config/config.php following the documentation:"
@ -139,11 +142,25 @@ else
echo "https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/files_locking_transactional.html" echo "https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/files_locking_transactional.html"
fi fi
if (occ app:list --no-interaction | grep -q richdocumentscode) 2>/dev/null; then # remove problematic apps
echo "Removing CODE Server" for APP in richdocumentscode; do
APP=$(occ app:list --no-interaction | grep richdocumentscode | awk -F ' ' '{print $2}' | tr -d ':') if (occ app:list | grep -q " - ${APP}:") 2>/dev/null; then
occ app:remove --no-interaction "${APP}" 2>/dev/null echo "Removing ${APP}"
fi fi
APP_PATH=$(occ app:getpath "${APP}" 2>/dev/null)
if [ -z "${APP_PATH}" ] || [ ! -d "${APP_PATH}" ]; then
APP_PATH="/app/www/public/apps/${APP}"
fi
if [ -d "${APP_PATH}" ]; then
occ app:disable "${APP}" >/dev/null 2>&1
fi
APP_STATUS="$(occ config:app:get "${APP}" enabled 2>/dev/null)"
if [ "${APP_STATUS}" != "no" ] && [ -n "${APP_STATUS}" ]; then
occ config:app:set "${APP}" enabled --value="no" >/dev/null 2>&1
fi
occ app:remove "${APP}" >/dev/null 2>&1
rm -rf "${APP_PATH}"
done
# set data directory # set data directory
if [ ! -s /config/www/nextcloud/config/config.php ]; then if [ ! -s /config/www/nextcloud/config/config.php ]; then
@ -151,3 +168,9 @@ if [ ! -s /config/www/nextcloud/config/config.php ]; then
elif [ -f /config/www/nextcloud/config/config.php ]; then elif [ -f /config/www/nextcloud/config/config.php ]; then
sed -i "s|/app/www/public/data|/data|g" /config/www/nextcloud/config/config.php sed -i "s|/app/www/public/data|/data|g" /config/www/nextcloud/config/config.php
fi fi
#modify javascript mime type and add .mjs support
if [ -s /etc/nginx/mime.types ]; then
sed -i 's|\bjs;|js mjs;|g' /etc/nginx/mime.types
sed -i 's|\bapplication/javascript|text/javascript|g' /etc/nginx/mime.types
fi

View File

@ -5,7 +5,7 @@ DEFAULT_CONF="/config/nginx/site-confs/default.conf"
OLD_ROOT="root /config/www/nextcloud/;" OLD_ROOT="root /config/www/nextcloud/;"
NEW_ROOT="root /app/www/public;" NEW_ROOT="root /app/www/public;"
if grep -q "${OLD_ROOT}" "${DEFAULT_CONF}"; then if [[ -f "${DEFAULT_CONF}" ]] && grep -q "${OLD_ROOT}" "${DEFAULT_CONF}" 2>/dev/null; then
echo "updating root in ${DEFAULT_CONF}" echo "updating root in ${DEFAULT_CONF}"
sed -i "s|${OLD_ROOT}|${NEW_ROOT}|" "${DEFAULT_CONF}" sed -i "s|${OLD_ROOT}|${NEW_ROOT}|" "${DEFAULT_CONF}"
fi fi