Compare commits

...

41 Commits

Author SHA1 Message Date
LinuxServer-CI
95f4150538 Bot Updating Package Versions 2024-10-08 10:11:44 +00:00
Adam
efa08e0e83 Merge pull request #333 from linuxserver/master-dynamic-bind-address 2024-10-08 11:09:04 +01:00
thespad
4573a98e14 Read webui bind address from config if present. 2024-10-07 20:16:53 +01:00
LinuxServer-CI
4437b92c16 Bot Updating Package Versions 2024-10-06 06:52:08 +00:00
LinuxServer-CI
d3597ffea1 Bot Updating Package Versions 2024-09-30 17:49:32 +00:00
LinuxServer-CI
2f793f5456 Bot Updating Package Versions 2024-09-30 15:49:14 +00:00
LinuxServer-CI
50cd7a6a07 Bot Updating Package Versions 2024-09-29 06:56:52 +00:00
LinuxServer-CI
a6ba44ffa0 Bot Updating Templated Files 2024-09-29 06:54:04 +00:00
LinuxServer-CI
fa9f5c9cb3 Bot Updating Templated Files 2024-09-29 06:52:47 +00:00
LinuxServer-CI
4dcdd36ff4 Bot Updating Templated Files 2024-09-29 06:51:31 +00:00
LinuxServer-CI
d252212ad4 Bot Updating Package Versions 2024-09-22 06:52:00 +00:00
LinuxServer-CI
9ff3a279b6 Bot Updating Package Versions 2024-09-17 16:52:20 +00:00
LinuxServer-CI
8d61598a62 Bot Updating Package Versions 2024-09-15 06:52:34 +00:00
LinuxServer-CI
29fa20e177 Bot Updating Package Versions 2024-09-08 06:51:44 +00:00
LinuxServer-CI
a28fe290e2 Bot Updating Package Versions 2024-08-25 06:52:34 +00:00
LinuxServer-CI
e8bbab67d9 Bot Updating Package Versions 2024-08-20 13:49:51 +00:00
LinuxServer-CI
71ee7f2648 Bot Updating Package Versions 2024-08-18 06:54:49 +00:00
LinuxServer-CI
9968a694df Bot Updating Templated Files 2024-08-18 06:52:32 +00:00
LinuxServer-CI
b192447473 Bot Updating Templated Files 2024-08-18 06:51:02 +00:00
LinuxServer-CI
7363dd5dda Bot Updating Package Versions 2024-08-11 06:52:03 +00:00
LinuxServer-CI
9cb07c720e Bot Updating Package Versions 2024-08-04 06:51:55 +00:00
LinuxServer-CI
843a85bbfb Bot Updating Package Versions 2024-07-28 06:52:11 +00:00
LinuxServer-CI
6b9f69684e Bot Updating Package Versions 2024-07-17 12:24:04 +00:00
LinuxServer-CI
91490c2651 Bot Updating Templated Files 2024-07-17 12:20:53 +00:00
Adam
0c7cf285b6 Merge pull request #317 from linuxserver/master-cli
Restore qbittorrent-cli (master)
2024-07-17 13:18:35 +01:00
thespad
41cd38a43c Fix static version in url 2024-07-17 11:43:28 +01:00
thespad
5e4d830356 Use netcore 6 version 2024-07-17 11:22:18 +01:00
thespad
7b4c3d8977 Fix arm cli path 2024-07-17 11:18:58 +01:00
thespad
5f06988083 Restore qbittorrent-cli 2024-07-17 11:16:02 +01:00
LinuxServer-CI
fe0e7b895a Bot Updating Package Versions 2024-07-14 06:55:19 +00:00
LinuxServer-CI
95f5fee13f Bot Updating Templated Files 2024-07-14 06:53:26 +00:00
LinuxServer-CI
e1158e49f9 Bot Updating Templated Files 2024-07-14 06:52:10 +00:00
LinuxServer-CI
2f35590762 Bot Updating Package Versions 2024-07-08 15:09:33 +00:00
Roxedus
ac6dc105ed Merge pull request #314 from linuxserver/master-ro-tweaks
Don't chown /downloads unless it's mounted (master)
2024-07-08 17:07:00 +02:00
LinuxServer-CI
4fe6aac159 Bot Updating Package Versions 2024-07-07 06:52:28 +00:00
thespad
005e8e0501 Don't chown /downloads unless it's mounted 2024-07-03 19:17:09 +01:00
LinuxServer-CI
3841f98110 Bot Updating Package Versions 2024-06-30 06:52:39 +00:00
LinuxServer-CI
1018aaa7f3 Bot Updating Package Versions 2024-06-23 06:51:57 +00:00
LinuxServer-CI
e8e44a5cc5 Bot Updating Package Versions 2024-06-12 20:11:59 +00:00
LinuxServer-CI
50903e2435 Bot Updating Package Versions 2024-06-09 06:51:54 +00:00
LinuxServer-CI
5f3183e182 Bot Updating Package Versions 2024-05-30 01:46:00 +00:00
14 changed files with 561 additions and 243 deletions

View File

@@ -11,19 +11,24 @@ jobs:
- name: External Trigger
if: github.ref == 'refs/heads/master'
env:
SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }}
run: |
if [ -n "${{ secrets.PAUSE_EXTERNAL_TRIGGER_QBITTORRENT_MASTER }}" ]; then
echo "**** Github secret PAUSE_EXTERNAL_TRIGGER_QBITTORRENT_MASTER is set; skipping trigger. ****"
echo "Github secret \`PAUSE_EXTERNAL_TRIGGER_QBITTORRENT_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
printf "# External trigger for docker-qbittorrent\n\n" >> $GITHUB_STEP_SUMMARY
if grep -q "^qbittorrent_master" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`qbittorrent_master\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
echo "**** External trigger running off of master branch. To disable this trigger, set a Github secret named \"PAUSE_EXTERNAL_TRIGGER_QBITTORRENT_MASTER\". ****"
echo "External trigger running off of master branch. To disable this trigger, set a Github secret named \`PAUSE_EXTERNAL_TRIGGER_QBITTORRENT_MASTER\`" >> $GITHUB_STEP_SUMMARY
echo "**** Retrieving external version ****"
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> External trigger running off of master branch. To disable this trigger, add \`qbittorrent_master\` into the Github organizational variable \`SKIP_EXTERNAL_TRIGGER\`." >> $GITHUB_STEP_SUMMARY
printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY
EXT_RELEASE=$(curl -sL "http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz" | tar -xz -C /tmp \
&& awk '/^P:'"qbittorrent-nox"'$/,/V:/' /tmp/APKINDEX | sed -n 2p | sed 's/^V://')
echo "Type is \`alpine_repo\`" >> $GITHUB_STEP_SUMMARY
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
echo "**** Can't retrieve external version, exiting ****"
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Can't retrieve external version, exiting" >> $GITHUB_STEP_SUMMARY
FAILURE_REASON="Can't retrieve external version for qbittorrent branch master"
GHA_TRIGGER_URL="https://github.com/linuxserver/docker-qbittorrent/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,
@@ -32,9 +37,8 @@ jobs:
exit 1
fi
EXT_RELEASE=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
echo "**** External version: ${EXT_RELEASE} ****"
echo "External version: ${EXT_RELEASE}" >> $GITHUB_STEP_SUMMARY
echo "**** Retrieving last pushed version ****"
echo "External version: \`${EXT_RELEASE}\`" >> $GITHUB_STEP_SUMMARY
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY
image="linuxserver/qbittorrent"
tag="latest"
token=$(curl -sX GET \
@@ -61,53 +65,61 @@ jobs:
IMAGE_RELEASE=$(echo ${image_info} | jq -r '.Labels.build_version' | awk '{print $3}')
IMAGE_VERSION=$(echo ${IMAGE_RELEASE} | awk -F'-ls' '{print $1}')
if [ -z "${IMAGE_VERSION}" ]; then
echo "**** Can't retrieve last pushed version, exiting ****"
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "Can't retrieve last pushed version, exiting" >> $GITHUB_STEP_SUMMARY
FAILURE_REASON="Can't retrieve last pushed version for qbittorrent tag latest"
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"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
exit 1
fi
echo "**** Last pushed version: ${IMAGE_VERSION} ****"
echo "Last pushed version: ${IMAGE_VERSION}" >> $GITHUB_STEP_SUMMARY
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY
if [ "${EXT_RELEASE}" == "${IMAGE_VERSION}" ]; then
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
elif [[ $(curl -sL "http://dl-cdn.alpinelinux.org/alpine/edge/community/aarch64/APKINDEX.tar.gz" | tar -xz -C /tmp && awk '/^P:'"qbittorrent-nox"'$/,/V:/' /tmp/APKINDEX | sed -n 2p | sed 's/^V://') != "${EXT_RELEASE}" ]]; then
echo "**** New version ${EXT_RELEASE} found; but not all arch repos updated yet; exiting ****"
echo "New version ${EXT_RELEASE} found; but not all arch repos updated yet; exiting" >> $GITHUB_STEP_SUMMARY
echo "New version \`${EXT_RELEASE}\` found; but not all arch repos updated yet; exiting" >> $GITHUB_STEP_SUMMARY
FAILURE_REASON="New version ${EXT_RELEASE} for qbittorrent tag latest is detected, however not all arch repos are updated yet. Will try again later."
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
exit 0
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/master/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "**** New version ${EXT_RELEASE} found; but there already seems to be an active build on Jenkins; exiting ****"
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
else
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
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/master/buildWithParameters?PACKAGE_CHECK=false \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "**** Jenkins job queue url: ${response%$'\r'} ****"
echo "**** Sleeping 10 seconds until job starts ****"
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "**** Jenkins job build url: ${buildurl} ****"
echo "Jenkins job build url: ${buildurl}" >> $GITHUB_STEP_SUMMARY
echo "**** Attempting to change the Jenkins job description ****"
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"
echo "**** Notifying Discord ****"
TRIGGER_REASON="A version change was detected for qbittorrent tag latest. 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,
"description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
if [[ "${artifacts_found}" == "false" ]]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> New version detected, but not all artifacts are published yet; skipping trigger" >> $GITHUB_STEP_SUMMARY
FAILURE_REASON="New version ${EXT_RELEASE} for qbittorrent tag latest is detected, however not all artifacts are uploaded to upstream release yet. Will try again later."
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Trigger Failed** \n**Reason:** '"${FAILURE_REASON}"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
else
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
echo "New version \`${EXT_RELEASE}\` found; old version was \`${IMAGE_VERSION}\`. Triggering new build" >> $GITHUB_STEP_SUMMARY
if "${artifacts_found}" == "true" ]]; then
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY
fi
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/master/buildWithParameters?PACKAGE_CHECK=false \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA external trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"
echo "**** Notifying Discord ****"
TRIGGER_REASON="A version change was detected for qbittorrent tag latest. 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,
"description": "**Build Triggered** \n**Reason:** '"${TRIGGER_REASON}"' \n**Build URL:** '"${buildurl}display/redirect"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi
fi

View File

@@ -15,31 +15,31 @@ jobs:
- name: External Trigger Scheduler
run: |
echo "**** Branches found: ****"
git for-each-ref --format='%(refname:short)' refs/remotes
for br in $(git for-each-ref --format='%(refname:short)' refs/remotes)
printf "# External trigger scheduler for docker-qbittorrent\n\n" >> $GITHUB_STEP_SUMMARY
printf "Found the branches:\n\n%s\n" "$(git for-each-ref --format='- %(refname:lstrip=3)' refs/remotes)" >> $GITHUB_STEP_SUMMARY
for br in $(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes)
do
br=$(echo "$br" | sed 's|origin/||g')
echo "**** Evaluating branch ${br} ****"
if [[ "${br}" == "HEAD" ]]; then
printf "\nSkipping %s.\n" ${br} >> $GITHUB_STEP_SUMMARY
continue
fi
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY
ls_jenkins_vars=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-qbittorrent/${br}/jenkins-vars.yml)
ls_branch=$(echo "${ls_jenkins_vars}" | yq -r '.ls_branch')
ls_trigger=$(echo "${ls_jenkins_vars}" | yq -r '.external_type')
if [[ "${br}" == "${ls_branch}" ]] && [[ "${ls_trigger}" != "os" ]]; then
echo "**** Branch ${br} appears to be live and trigger is not os; checking workflow. ****"
echo "Branch appears to be live and trigger is not os; checking workflow." >> $GITHUB_STEP_SUMMARY
if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-qbittorrent/${br}/.github/workflows/external_trigger.yml > /dev/null 2>&1; then
echo "**** Workflow exists. Triggering external trigger workflow for branch ${br} ****."
echo "Triggering external trigger workflow for branch ${br}" >> $GITHUB_STEP_SUMMARY
echo "Triggering external trigger workflow for branch." >> $GITHUB_STEP_SUMMARY
curl -iX POST \
-H "Authorization: token ${{ secrets.CR_PAT }}" \
-H "Accept: application/vnd.github.v3+json" \
-d "{\"ref\":\"refs/heads/${br}\"}" \
https://api.github.com/repos/linuxserver/docker-qbittorrent/actions/workflows/external_trigger.yml/dispatches
else
echo "**** Workflow doesn't exist; skipping trigger. ****"
echo "Skipping branch ${br} due to no external trigger workflow present." >> $GITHUB_STEP_SUMMARY
echo "Skipping branch due to no external trigger workflow present." >> $GITHUB_STEP_SUMMARY
fi
else
echo "**** ${br} is either a dev branch, or has no external version; skipping trigger. ****"
echo "Skipping branch ${br} due to being detected as dev branch or having no external version." >> $GITHUB_STEP_SUMMARY
echo "Skipping branch due to being detected as dev branch or having no external version." >> $GITHUB_STEP_SUMMARY
fi
done

View File

@@ -1,42 +0,0 @@
name: Package Trigger Main
on:
workflow_dispatch:
jobs:
package-trigger-master:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.1
- name: Package Trigger
if: github.ref == 'refs/heads/master'
run: |
if [ -n "${{ secrets.PAUSE_PACKAGE_TRIGGER_QBITTORRENT_MASTER }}" ]; then
echo "**** Github secret PAUSE_PACKAGE_TRIGGER_QBITTORRENT_MASTER is set; skipping trigger. ****"
echo "Github secret \`PAUSE_PACKAGE_TRIGGER_QBITTORRENT_MASTER\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
if [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/master/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" >> $GITHUB_STEP_SUMMARY
exit 0
fi
echo "**** Package trigger running off of master branch. To disable, set a Github secret named \"PAUSE_PACKAGE_TRIGGER_QBITTORRENT_MASTER\". ****"
echo "Package trigger running off of master branch. To disable, set a Github secret named \`PAUSE_PACKAGE_TRIGGER_QBITTORRENT_MASTER\`" >> $GITHUB_STEP_SUMMARY
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/master/buildWithParameters?PACKAGE_CHECK=true \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "**** Jenkins job queue url: ${response%$'\r'} ****"
echo "**** Sleeping 10 seconds until job starts ****"
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "**** Jenkins job build url: ${buildurl} ****"
echo "Jenkins job build url: ${buildurl}" >> $GITHUB_STEP_SUMMARY
echo "**** Attempting to change the Jenkins job description ****"
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"

View File

@@ -14,37 +14,69 @@ jobs:
fetch-depth: '0'
- name: Package Trigger Scheduler
env:
SKIP_PACKAGE_TRIGGER: ${{ vars.SKIP_PACKAGE_TRIGGER }}
run: |
echo "**** Branches found: ****"
git for-each-ref --format='%(refname:short)' refs/remotes
for br in $(git for-each-ref --format='%(refname:short)' refs/remotes)
printf "# Package trigger scheduler for docker-qbittorrent\n\n" >> $GITHUB_STEP_SUMMARY
printf "Found the branches:\n\n%s\n" "$(git for-each-ref --format='- %(refname:lstrip=3)' refs/remotes)" >> $GITHUB_STEP_SUMMARY
for br in $(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes)
do
br=$(echo "$br" | sed 's|origin/||g')
echo "**** Evaluating branch ${br} ****"
ls_branch=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-qbittorrent/${br}/jenkins-vars.yml | yq -r '.ls_branch')
if [ "${br}" == "${ls_branch}" ]; then
echo "**** Branch ${br} appears to be live; checking workflow. ****"
if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-qbittorrent/${br}/.github/workflows/package_trigger.yml > /dev/null 2>&1; then
echo "**** Workflow exists. Triggering package trigger workflow for branch ${br}. ****"
echo "Triggering package trigger workflow for branch ${br}" >> $GITHUB_STEP_SUMMARY
triggered_branches="${triggered_branches}${br} "
curl -iX POST \
-H "Authorization: token ${{ secrets.CR_PAT }}" \
-H "Accept: application/vnd.github.v3+json" \
-d "{\"ref\":\"refs/heads/${br}\"}" \
https://api.github.com/repos/linuxserver/docker-qbittorrent/actions/workflows/package_trigger.yml/dispatches
sleep 30
if [[ "${br}" == "HEAD" ]]; then
printf "\nSkipping %s.\n" ${br} >> $GITHUB_STEP_SUMMARY
continue
fi
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY
JENKINS_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-qbittorrent/${br}/jenkins-vars.yml)
if [[ "${br}" == $(yq -r '.ls_branch' <<< "${JENKINS_VARS}") ]]; then
echo "Branch appears to be live; checking workflow." >> $GITHUB_STEP_SUMMARY
if [[ $(yq -r '.skip_package_check' <<< "${JENKINS_VARS}") == "true" ]]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Skipping branch ${br} due to \`skip_package_check\` being set in \`jenkins-vars.yml\`." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif grep -q "^qbittorrent_${br}" <<< "${SKIP_PACKAGE_TRIGGER}"; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> Github organizational variable \`SKIP_PACKAGE_TRIGGER\` contains \`qbittorrent_${br}\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/${br}/lastBuild/api/json | jq -r '.building') == "true" ]; then
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
echo "> There already seems to be an active build on Jenkins; skipping package trigger for ${br}" >> $GITHUB_STEP_SUMMARY
skipped_branches="${skipped_branches}${br} "
else
echo "**** Workflow doesn't exist; skipping trigger. ****"
echo "Skipping branch ${br} due to no package trigger workflow present." >> $GITHUB_STEP_SUMMARY
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
echo "> Triggering package trigger for branch ${br}" >> $GITHUB_STEP_SUMMARY
printf "> To disable, add \`qbittorrent_%s\` into the Github organizational variable \`SKIP_PACKAGE_TRIGGER\`.\n\n" "${br}" >> $GITHUB_STEP_SUMMARY
triggered_branches="${triggered_branches}${br} "
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-qbittorrent/job/${br}/buildWithParameters?PACKAGE_CHECK=true \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
sleep 10
buildurl=$(curl -s "${response%$'\r'}api/json" | jq -r '.executable.url')
buildurl="${buildurl%$'\r'}"
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
curl -iX POST \
"${buildurl}submitDescription" \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
--data-urlencode "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
--data-urlencode "Submit=Submit"
sleep 20
fi
else
echo "**** ${br} appears to be a dev branch; skipping trigger. ****"
echo "Skipping branch ${br} due to being detected as dev branch." >> $GITHUB_STEP_SUMMARY
fi
done
echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****"
echo "**** Notifying Discord ****"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Package Check Build(s) Triggered for qbittorrent** \n**Branch(es):** '"${triggered_branches}"' \n**Build URL:** '"https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-qbittorrent/activity/"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
if [[ -n "${triggered_branches}" ]] || [[ -n "${skipped_branches}" ]]; then
if [[ -n "${triggered_branches}" ]]; then
NOTIFY_BRANCHES="**Triggered:** ${triggered_branches} \n"
fi
if [[ -n "${skipped_branches}" ]]; then
NOTIFY_BRANCHES="${NOTIFY_BRANCHES}**Skipped:** ${skipped_branches} \n"
fi
echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****"
echo "**** Notifying Discord ****"
curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://cdn.discordapp.com/avatars/354986384542662657/df91181b3f1cf0ef1592fbe18e0962d7.png","embeds": [{"color": 9802903,
"description": "**Package Check Build(s) Triggered for qbittorrent** \n'"${NOTIFY_BRANCHES}"'**Build URL:** '"https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-qbittorrent/activity/"' \n"}],
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
fi

View File

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

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/unrar:latest as unrar
FROM ghcr.io/linuxserver/unrar:latest AS unrar
FROM ghcr.io/linuxserver/baseimage-alpine:edge
@@ -21,6 +21,7 @@ XDG_DATA_HOME="/config"
RUN \
echo "**** install packages ****" && \
apk add --no-cache \
grep \
icu-libs \
p7zip \
python3 \
@@ -31,6 +32,18 @@ RUN \
fi && \
apk add -U --upgrade --no-cache \
qbittorrent-nox==${QBITTORRENT_VERSION} && \
echo "***** install qbitorrent-cli ****" && \
mkdir /qbt && \
if [ -z ${QBT_CLI_VERSION+x} ]; then \
QBT_CLI_VERSION=$(curl -sL "https://api.github.com/repos/fedarovich/qbittorrent-cli/releases/latest" \
| jq -r '. | .tag_name'); \
fi && \
curl -o \
/tmp/qbt.tar.gz -L \
"https://github.com/fedarovich/qbittorrent-cli/releases/download/${QBT_CLI_VERSION}/qbt-linux-alpine-x64-net6-${QBT_CLI_VERSION#v}.tar.gz" && \
tar xf \
/tmp/qbt.tar.gz -C \
/qbt && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \
rm -rf \

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/unrar:arm64v8-latest as unrar
FROM ghcr.io/linuxserver/unrar:arm64v8-latest AS unrar
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-edge
@@ -21,6 +21,7 @@ XDG_DATA_HOME="/config"
RUN \
echo "**** install packages ****" && \
apk add --no-cache \
grep \
icu-libs \
p7zip \
python3 \
@@ -31,6 +32,18 @@ RUN \
fi && \
apk add -U --upgrade --no-cache \
qbittorrent-nox==${QBITTORRENT_VERSION} && \
echo "***** install qbitorrent-cli ****" && \
mkdir /qbt && \
if [ -z ${QBT_CLI_VERSION+x} ]; then \
QBT_CLI_VERSION=$(curl -sL "https://api.github.com/repos/fedarovich/qbittorrent-cli/releases/latest" \
| jq -r '. | .tag_name'); \
fi && \
curl -o \
/tmp/qbt.tar.gz -L \
"https://github.com/fedarovich/qbittorrent-cli/releases/download/${QBT_CLI_VERSION}/qbt-linux-alpine-arm64-net6-${QBT_CLI_VERSION#v}.tar.gz" && \
tar xf \
/tmp/qbt.tar.gz -C \
/qbt && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \
rm -rf \

134
Jenkinsfile vendored
View File

@@ -17,6 +17,8 @@ pipeline {
GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0')
GITLAB_NAMESPACE=credentials('gitlab-namespace-id')
DOCKERHUB_TOKEN=credentials('docker-hub-ci-pat')
QUAYIO_API_TOKEN=credentials('quayio-repo-api-token')
GIT_SIGNING_KEY=credentials('484fbca6-9a4f-455e-b9e3-97ac98785f5f')
CONTAINER_NAME = 'qbittorrent'
BUILD_VERSION_ARG = 'QBITTORRENT_VERSION'
LS_USER = 'linuxserver'
@@ -39,9 +41,23 @@ pipeline {
CI_WEBPATH=''
}
stages {
stage("Set git config"){
steps{
sh '''#!/bin/bash
cat ${GIT_SIGNING_KEY} > /config/.ssh/id_sign
chmod 600 /config/.ssh/id_sign
ssh-keygen -y -f /config/.ssh/id_sign > /config/.ssh/id_sign.pub
echo "Using $(ssh-keygen -lf /config/.ssh/id_sign) to sign commits"
git config --global gpg.format ssh
git config --global user.signingkey /config/.ssh/id_sign
git config --global commit.gpgsign true
'''
}
}
// Setup all the basic environment variables needed for the build
stage("Set ENV Variables base"){
steps{
echo "Running on node: ${NODE_NAME}"
sh '''#! /bin/bash
containers=$(docker ps -aq)
if [[ -n "${containers}" ]]; then
@@ -68,7 +84,7 @@ pipeline {
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
env.PULL_REQUEST = env.CHANGE_ID
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
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'
}
sh '''#! /bin/bash
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
@@ -249,7 +265,7 @@ pipeline {
-v ${WORKSPACE}:/mnt \
-e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \
-e AWS_SECRET_ACCESS_KEY=\"${S3_SECRET}\" \
ghcr.io/linuxserver/baseimage-alpine:3.19 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 python3 && \
python3 -m venv /lsiopy && \
pip install --no-cache-dir -U pip && \
@@ -299,7 +315,7 @@ pipeline {
echo "Jenkinsfile is up to date."
fi
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"
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 .github/workflows/package_trigger.yml"
for i in ${OLD_TEMPLATES}; do
if [[ -f "${i}" ]]; then
TEMPLATES_TO_DELETE="${i} ${TEMPLATES_TO_DELETE}"
@@ -356,7 +372,7 @@ pipeline {
fi
echo "Starting Stage 4 - External repo updates: Docs, Unraid Template and Readme Sync to Docker Hub"
mkdir -p ${TEMPDIR}/docs
git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/docs/docker-documentation
git clone --depth=1 https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/docs/docker-documentation
if [[ "${BRANCH_NAME}" == "${GH_DEFAULT_BRANCH}" ]] && [[ (! -f ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/docs/docker-documentation/docs/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then
cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/docs/docker-documentation/docs/images/
cd ${TEMPDIR}/docs/docker-documentation
@@ -374,8 +390,8 @@ pipeline {
echo "Docs update not needed, skipping"
fi
mkdir -p ${TEMPDIR}/unraid
git clone https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-templates
git clone https://github.com/linuxserver/templates.git ${TEMPDIR}/unraid/templates
git clone --depth=1 https://github.com/linuxserver/docker-templates.git ${TEMPDIR}/unraid/docker-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
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
@@ -385,9 +401,9 @@ pipeline {
echo "Updating Unraid template"
cd ${TEMPDIR}/unraid/templates/
GH_TEMPLATES_DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch:" | sed 's|.*HEAD branch: ||')
if grep -wq "${CONTAINER_NAME}" ${TEMPDIR}/unraid/templates/unraid/ignore.list && [[ -f ${TEMPDIR}/unraid/templates/unraid/deprecated/${CONTAINER_NAME}.xml ]]; then
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
elif grep -wq "^${CONTAINER_NAME}$" ${TEMPDIR}/unraid/templates/unraid/ignore.list; then
echo "Image is on the ignore list, marking Unraid template as deprecated"
cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml ${TEMPDIR}/unraid/templates/unraid/
git add -u unraid/${CONTAINER_NAME}.xml
@@ -480,10 +496,10 @@ pipeline {
}
}
/* #######################
GitLab Mirroring
GitLab Mirroring and Quay.io Repo Visibility
####################### */
// Ping into Gitlab to mirror this repo and have a registry endpoint
stage("GitLab Mirror"){
// Ping into Gitlab to mirror this repo and have a registry endpoint & mark this repo on Quay.io as public
stage("GitLab Mirror and Quay.io Visibility"){
when {
environment name: 'EXIT_STATUS', value: ''
}
@@ -499,6 +515,8 @@ pipeline {
"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" '''
sh '''curl -H "Content-Type: application/json" -H "Authorization: Bearer ${QUAYIO_API_TOKEN}" -X POST "https://quay.io/api/v1/repository${QUAYIMAGE/quay.io/}/changevisibility" \
-d '{"visibility":"public"}' ||: '''
}
}
/* ###############
@@ -593,7 +611,7 @@ pipeline {
--provenance=false --sbom=false \
--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}"
retry(5) {
retry_backoff(5,5) {
sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
}
sh '''#! /bin/bash
@@ -705,9 +723,17 @@ pipeline {
}
sh '''#! /bin/bash
set -e
if grep -q 'docker-baseimage' <<< "${LS_REPO}"; then
echo "Detected baseimage, setting LSIO_FIRST_PARTY=true"
if [ -n "${CI_DOCKERENV}" ]; then
CI_DOCKERENV="LSIO_FIRST_PARTY=true|${CI_DOCKERENV}"
else
CI_DOCKERENV="LSIO_FIRST_PARTY=true"
fi
fi
docker pull ghcr.io/linuxserver/ci:latest
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}
fi
docker run --rm \
@@ -717,6 +743,7 @@ pipeline {
-e DOCKER_LOGS_TIMEOUT=\"${CI_DELAY}\" \
-e TAGS=\"${CI_TAGS}\" \
-e META_TAG=\"${META_TAG}\" \
-e RELEASE_TAG=\"latest\" \
-e PORT=\"${CI_PORT}\" \
-e SSL=\"${CI_SSL}\" \
-e BASE=\"${DIST_IMAGE}\" \
@@ -726,6 +753,7 @@ pipeline {
-e WEB_SCREENSHOT=\"${CI_WEB}\" \
-e WEB_AUTH=\"${CI_AUTH}\" \
-e WEB_PATH=\"${CI_WEBPATH}\" \
-e NODE_NAME=\"${NODE_NAME}\" \
-t ghcr.io/linuxserver/ci:latest \
python3 test_build.py'''
}
@@ -749,7 +777,7 @@ pipeline {
passwordVariable: 'QUAYPASS'
]
]) {
retry(5) {
retry_backoff(5,5) {
sh '''#! /bin/bash
set -e
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
@@ -767,7 +795,7 @@ pipeline {
docker push ${PUSHIMAGE}:${META_TAG}
docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG}
if [ -n "${SEMVER}" ]; then
docker push ${PUSHIMAGE}:${SEMVER}
docker push ${PUSHIMAGE}:${SEMVER}
fi
done
'''
@@ -790,7 +818,7 @@ pipeline {
passwordVariable: 'QUAYPASS'
]
]) {
retry(5) {
retry_backoff(5,5) {
sh '''#! /bin/bash
set -e
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
@@ -798,7 +826,7 @@ pipeline {
echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
if [ "${CI}" == "false" ]; then
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}
fi
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
@@ -853,7 +881,7 @@ pipeline {
"object": "'${COMMIT_SHA}'",\
"message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
"type": "commit",\
"tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
"tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
echo "Pushing New release for Tag"
sh '''#! /bin/bash
echo "Updating external repo packages to ${EXT_RELEASE_CLEAN}" > releasebody.json
@@ -985,18 +1013,53 @@ EOF
###################### */
post {
always {
sh '''#!/bin/bash
rm -rf /config/.ssh/id_sign
rm -rf /config/.ssh/id_sign.pub
git config --global --unset gpg.format
git config --global --unset user.signingkey
git config --global --unset commit.gpgsign
'''
script{
env.JOB_DATE = sh(
script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''',
returnStdout: true).trim()
if (env.EXIT_STATUS == "ABORTED"){
sh 'echo "build aborted"'
}
else if (currentBuild.currentResult == "SUCCESS"){
sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/jenkins-avatar.png","embeds": [{"color": 1681177,\
"description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
"username": "Jenkins"}' ${BUILDS_DISCORD} '''
}
else {
sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/jenkins-avatar.png","embeds": [{"color": 16711680,\
"description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
}else{
if (currentBuild.currentResult == "SUCCESS"){
if (env.GITHUBIMAGE =~ /lspipepr/){
env.JOB_WEBHOOK_STATUS='Success'
env.JOB_WEBHOOK_COLOUR=3957028
env.JOB_WEBHOOK_FOOTER='PR Build'
}else if (env.GITHUBIMAGE =~ /lsiodev/){
env.JOB_WEBHOOK_STATUS='Success'
env.JOB_WEBHOOK_COLOUR=3957028
env.JOB_WEBHOOK_FOOTER='Dev Build'
}else{
env.JOB_WEBHOOK_STATUS='Success'
env.JOB_WEBHOOK_COLOUR=1681177
env.JOB_WEBHOOK_FOOTER='Live Build'
}
}else{
if (env.GITHUBIMAGE =~ /lspipepr/){
env.JOB_WEBHOOK_STATUS='Failure'
env.JOB_WEBHOOK_COLOUR=12669523
env.JOB_WEBHOOK_FOOTER='PR Build'
}else if (env.GITHUBIMAGE =~ /lsiodev/){
env.JOB_WEBHOOK_STATUS='Failure'
env.JOB_WEBHOOK_COLOUR=12669523
env.JOB_WEBHOOK_FOOTER='Dev Build'
}else{
env.JOB_WEBHOOK_STATUS='Failure'
env.JOB_WEBHOOK_COLOUR=16711680
env.JOB_WEBHOOK_FOOTER='Live Build'
}
}
sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/jenkins-avatar.png","embeds": [{"'color'": '${JOB_WEBHOOK_COLOUR}',\
"footer": {"text" : "'"${JOB_WEBHOOK_FOOTER}"'"},\
"timestamp": "'${JOB_DATE}'",\
"description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**ShellCheck Results:** '${SHELLCHECK_URL}'\\n**Status:** '${JOB_WEBHOOK_STATUS}'\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
"username": "Jenkins"}' ${BUILDS_DISCORD} '''
}
}
@@ -1014,3 +1077,20 @@ EOF
}
}
}
def retry_backoff(int max_attempts, int power_base, Closure c) {
int n = 0
while (n < max_attempts) {
try {
c()
return
} catch (err) {
if ((n + 1) >= max_attempts) {
throw err
}
sleep(power_base ** n)
n++
}
}
return
}

View File

@@ -86,6 +86,10 @@ A bittorrent client can be an active or a passive node. Running your client as a
Similarly to the WEBUI_PORT, to set the port to 6887 you need to pass -p 6887:6887, -p 6887:6887/udp and -e TORRENTING_PORT=6887 arguments to Docker.
## Read-Only Operation
This image can be run with a read-only container filesystem. For details please [read the docs](https://docs.linuxserver.io/misc/read-only/).
## Usage
To help you get started creating a container from this image you can either use docker-compose or the docker cli.
@@ -106,7 +110,7 @@ services:
- TORRENTING_PORT=6881
volumes:
- /path/to/qbittorrent/appdata:/config
- /path/to/downloads:/downloads
- /path/to/downloads:/downloads #optional
ports:
- 8080:8080
- 6881:6881
@@ -128,7 +132,7 @@ docker run -d \
-p 6881:6881 \
-p 6881:6881/udp \
-v /path/to/qbittorrent/appdata:/config \
-v /path/to/downloads:/downloads \
-v /path/to/downloads:/downloads `#optional` \
--restart unless-stopped \
lscr.io/linuxserver/qbittorrent:latest
```
@@ -149,6 +153,7 @@ Containers are configured using parameters passed at runtime (such as those abov
| `-e TORRENTING_PORT=6881` | for changing the port of tcp/udp connection, see below for explanation |
| `-v /config` | Contains all relevant configuration files. |
| `-v /downloads` | Location of downloads on disk. |
| `--read-only=true` | Run container with a read-only filesystem. Please [read the docs](https://docs.linuxserver.io/misc/read-only/). |
## Environment variables from files (Docker secrets)
@@ -286,7 +291,8 @@ Below are the instructions for updating containers:
### Image Update Notifications - Diun (Docker Image Update Notifier)
**tip**: 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
@@ -311,6 +317,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Versions
* **17.07.24:** - Restore qbittorrent-cli as it now supports openssl 3.
* **25.05.24:** - Remove qbittorrent-cli as it still requires openssl 1.1 which is EOL.
* **14.02.24:** - Only set/override torrenting port if the optional env var is set.
* **14.02.24:** - Add torrenting port support.

View File

@@ -1,83 +1,261 @@
NAME VERSION TYPE
7zip 23.01-r0 apk
alpine-baselayout 3.6.5-r0 apk
alpine-baselayout-data 3.6.5-r0 apk
alpine-keys 2.4-r1 apk
apk-tools 2.14.4-r0 apk
bash 5.2.26-r0 apk
brotli-libs 1.1.0-r2 apk
busybox 1.36.1-r28 apk
busybox-binsh 1.36.1-r28 apk
c-ares 1.28.1-r0 apk
ca-certificates 20240226-r0 apk
ca-certificates-bundle 20240226-r0 apk
catatonit 0.2.0-r0 apk
coreutils 9.5-r1 apk
coreutils-env 9.5-r1 apk
coreutils-fmt 9.5-r1 apk
coreutils-sha512sum 9.5-r1 apk
curl 8.8.0-r0 apk
dbus-libs 1.14.10-r1 apk
double-conversion 3.3.0-r0 apk
duktape 2.7.0-r1 apk
findutils 4.9.0-r5 apk
gdbm 1.23-r1 apk
glib 2.80.2-r0 apk
icu-data-en 74.2-r0 apk
icu-libs 74.2-r0 apk
jq 1.7.1-r0 apk
libacl 2.3.2-r0 apk
libattr 2.5.2-r0 apk
libb2 0.98.1-r3 apk
libblkid 2.40.1-r1 apk
libbsd 0.12.2-r0 apk
libbz2 1.0.8-r6 apk
libcrypto3 3.3.0-r2 apk
libcurl 8.8.0-r0 apk
libeconf 0.6.3-r0 apk
libexpat 2.6.2-r0 apk
libffi 3.4.6-r0 apk
libgcc 13.2.1_git20240309-r0 apk
libgomp 13.2.1_git20240309-r0 apk
libidn2 2.3.7-r0 apk
libintl 0.22.5-r0 apk
libmd 1.1.0-r0 apk
libmount 2.40.1-r1 apk
libncursesw 6.4_p20240420-r0 apk
libpanelw 6.4_p20240420-r0 apk
libpcre2-16 10.43-r0 apk
libproc2 4.0.4-r0 apk
libproxy 0.5.6-r0 apk
libpsl 0.21.5-r1 apk
libssl3 3.3.0-r2 apk
libstdc++ 13.2.1_git20240309-r0 apk
libtorrent-rasterbar 2.0.10-r2 apk
libunistring 1.2-r0 apk
linux-pam 1.6.0-r0 apk
mpdecimal 4.0.0-r0 apk
musl 1.2.5-r1 apk
musl-utils 1.2.5-r1 apk
ncurses-terminfo-base 6.4_p20240420-r0 apk
netcat-openbsd 1.226-r0 apk
nghttp2-libs 1.62.0-r0 apk
oniguruma 6.9.9-r0 apk
pcre2 10.43-r0 apk
procps-ng 4.0.4-r0 apk
pyc 3.12.3-r1 apk
python3 3.12.3-r1 apk
python3-pyc 3.12.3-r1 apk
python3-pycache-pyc0 3.12.3-r1 apk
qbittorrent-nox 4.6.4-r1 apk
qt6-qtbase 6.6.3-r0 apk
qt6-qtbase-sqlite 6.6.3-r0 apk
readline 8.2.10-r0 apk
scanelf 1.3.7-r2 apk
shadow 4.15.1-r0 apk
skalibs 2.14.1.1-r0 apk
sqlite-libs 3.46.0-r0 apk
ssl_client 1.36.1-r28 apk
tzdata 2024a-r1 apk
utmps-libs 0.1.2.2-r1 apk
xz-libs 5.6.1-r3 apk
zlib 1.3.1-r1 apk
zstd-libs 1.5.6-r0 apk
NAME VERSION TYPE
7zip 23.01-r0 apk
Alba.CsConsoleFormat 1.0.0.89 dotnet
BencodeNET 2.3.0.0 dotnet
Bouncy Castle for .NET (netstandard2.0) 1.8.8.2 dotnet
CommandLineUtils 2.4.4+3c2a4909757a51602dcca9b961d577511b85fd31.3c2a4909757a51602dcca9b961d577511b85fd31 dotnet
CsvHelper 12.1.2 dotnet
Json.NET 13.0.3.27908 dotnet
Microsoft.CSharp 6.0.3024.21525 dotnet
Microsoft.VisualBasic 6.0.3024.21525 dotnet
Microsoft.VisualBasic.Core 11.100.3024.21525 dotnet
Microsoft.Win32.Primitives 6.0.3024.21525 dotnet
Microsoft.Win32.Registry 6.0.3024.21525 dotnet
Mono.Posix.NETStandard 1.0.0.0 dotnet
NJsonSchema 9.14.1.0 dotnet
Portable.Xaml.dll 0.18.0.0 dotnet
QBittorrent.Client 1.9.23349.1 dotnet
System 6.0.3024.21525 dotnet
System.AppContext 6.0.3024.21525 dotnet
System.Buffers 6.0.3024.21525 dotnet
System.Collections 6.0.3024.21525 dotnet
System.Collections.Concurrent 6.0.3024.21525 dotnet
System.Collections.Immutable 6.0.3024.21525 dotnet
System.Collections.NonGeneric 6.0.3024.21525 dotnet
System.Collections.Specialized 6.0.3024.21525 dotnet
System.ComponentModel 6.0.3024.21525 dotnet
System.ComponentModel.Annotations 6.0.3024.21525 dotnet
System.ComponentModel.DataAnnotations 6.0.3024.21525 dotnet
System.ComponentModel.EventBasedAsync 6.0.3024.21525 dotnet
System.ComponentModel.Primitives 6.0.3024.21525 dotnet
System.ComponentModel.TypeConverter 6.0.3024.21525 dotnet
System.Configuration 6.0.3024.21525 dotnet
System.Console 6.0.3024.21525 dotnet
System.Core 6.0.3024.21525 dotnet
System.Data 6.0.3024.21525 dotnet
System.Data.Common 6.0.3024.21525 dotnet
System.Data.DataSetExtensions 6.0.3024.21525 dotnet
System.Diagnostics.Contracts 6.0.3024.21525 dotnet
System.Diagnostics.Debug 6.0.3024.21525 dotnet
System.Diagnostics.DiagnosticSource 6.0.3024.21525 dotnet
System.Diagnostics.FileVersionInfo 6.0.3024.21525 dotnet
System.Diagnostics.Process 6.0.3024.21525 dotnet
System.Diagnostics.StackTrace 6.0.3024.21525 dotnet
System.Diagnostics.TextWriterTraceListener 6.0.3024.21525 dotnet
System.Diagnostics.Tools 6.0.3024.21525 dotnet
System.Diagnostics.TraceSource 6.0.3024.21525 dotnet
System.Diagnostics.Tracing 6.0.3024.21525 dotnet
System.Drawing 6.0.3024.21525 dotnet
System.Drawing.Primitives 6.0.3024.21525 dotnet
System.Dynamic.Runtime 6.0.3024.21525 dotnet
System.Formats.Asn1 6.0.3024.21525 dotnet
System.Globalization 6.0.3024.21525 dotnet
System.Globalization.Calendars 6.0.3024.21525 dotnet
System.Globalization.Extensions 6.0.3024.21525 dotnet
System.IO 6.0.3024.21525 dotnet
System.IO.Compression 6.0.3024.21525 dotnet
System.IO.Compression.Brotli 6.0.3024.21525 dotnet
System.IO.Compression.FileSystem 6.0.3024.21525 dotnet
System.IO.Compression.ZipFile 6.0.3024.21525 dotnet
System.IO.FileSystem 6.0.3024.21525 dotnet
System.IO.FileSystem.AccessControl 6.0.3024.21525 dotnet
System.IO.FileSystem.DriveInfo 6.0.3024.21525 dotnet
System.IO.FileSystem.Primitives 6.0.3024.21525 dotnet
System.IO.FileSystem.Watcher 6.0.3024.21525 dotnet
System.IO.IsolatedStorage 6.0.3024.21525 dotnet
System.IO.MemoryMappedFiles 6.0.3024.21525 dotnet
System.IO.Pipes 6.0.3024.21525 dotnet
System.IO.Pipes.AccessControl 6.0.3024.21525 dotnet
System.IO.UnmanagedMemoryStream 6.0.3024.21525 dotnet
System.Linq 6.0.3024.21525 dotnet
System.Linq.Expressions 6.0.3024.21525 dotnet
System.Linq.Parallel 6.0.3024.21525 dotnet
System.Linq.Queryable 6.0.3024.21525 dotnet
System.Memory 6.0.3024.21525 dotnet
System.Net 6.0.3024.21525 dotnet
System.Net.Http 6.0.3024.21525 dotnet
System.Net.Http.Json 6.0.3024.21525 dotnet
System.Net.HttpListener 6.0.3024.21525 dotnet
System.Net.IPNetwork 2.5.235 dotnet
System.Net.Mail 6.0.3024.21525 dotnet
System.Net.NameResolution 6.0.3024.21525 dotnet
System.Net.NetworkInformation 6.0.3024.21525 dotnet
System.Net.Ping 6.0.3024.21525 dotnet
System.Net.Primitives 6.0.3024.21525 dotnet
System.Net.Quic 6.0.3024.21525 dotnet
System.Net.Requests 6.0.3024.21525 dotnet
System.Net.Security 6.0.3024.21525 dotnet
System.Net.ServicePoint 6.0.3024.21525 dotnet
System.Net.Sockets 6.0.3024.21525 dotnet
System.Net.WebClient 6.0.3024.21525 dotnet
System.Net.WebHeaderCollection 6.0.3024.21525 dotnet
System.Net.WebProxy 6.0.3024.21525 dotnet
System.Net.WebSockets 6.0.3024.21525 dotnet
System.Net.WebSockets.Client 6.0.3024.21525 dotnet
System.Numerics 6.0.3024.21525 dotnet
System.Numerics.Vectors 6.0.3024.21525 dotnet
System.ObjectModel 6.0.3024.21525 dotnet
System.Private.CoreLib 6.0.3024.21525 dotnet
System.Private.DataContractSerialization 6.0.3024.21525 dotnet
System.Private.Uri 6.0.3024.21525 dotnet
System.Private.Xml 6.0.3024.21525 dotnet
System.Private.Xml.Linq 6.0.3024.21525 dotnet
System.Reflection 6.0.3024.21525 dotnet
System.Reflection.DispatchProxy 6.0.3024.21525 dotnet
System.Reflection.Emit 6.0.3024.21525 dotnet
System.Reflection.Emit.ILGeneration 6.0.3024.21525 dotnet
System.Reflection.Emit.Lightweight 6.0.3024.21525 dotnet
System.Reflection.Extensions 6.0.3024.21525 dotnet
System.Reflection.Metadata 6.0.3024.21525 dotnet
System.Reflection.Primitives 6.0.3024.21525 dotnet
System.Reflection.TypeExtensions 6.0.3024.21525 dotnet
System.Resources.Reader 6.0.3024.21525 dotnet
System.Resources.ResourceManager 6.0.3024.21525 dotnet
System.Resources.Writer 6.0.3024.21525 dotnet
System.Runtime 6.0.3024.21525 dotnet
System.Runtime.CompilerServices.VisualC 6.0.3024.21525 dotnet
System.Runtime.Extensions 6.0.3024.21525 dotnet
System.Runtime.Handles 6.0.3024.21525 dotnet
System.Runtime.InteropServices 6.0.3024.21525 dotnet
System.Runtime.InteropServices.RuntimeInformation 6.0.3024.21525 dotnet
System.Runtime.Intrinsics 6.0.3024.21525 dotnet
System.Runtime.Loader 6.0.3024.21525 dotnet
System.Runtime.Numerics 6.0.3024.21525 dotnet
System.Runtime.Serialization 6.0.3024.21525 dotnet
System.Runtime.Serialization.Formatters 6.0.3024.21525 dotnet
System.Runtime.Serialization.Json 6.0.3024.21525 dotnet
System.Runtime.Serialization.Primitives 6.0.3024.21525 dotnet
System.Runtime.Serialization.Xml 6.0.3024.21525 dotnet
System.Security 6.0.3024.21525 dotnet
System.Security.AccessControl 6.0.3024.21525 dotnet
System.Security.Claims 6.0.3024.21525 dotnet
System.Security.Cryptography.Algorithms 6.0.3024.21525 dotnet
System.Security.Cryptography.Cng 6.0.3024.21525 dotnet
System.Security.Cryptography.Csp 6.0.3024.21525 dotnet
System.Security.Cryptography.Encoding 6.0.3024.21525 dotnet
System.Security.Cryptography.OpenSsl 6.0.3024.21525 dotnet
System.Security.Cryptography.Primitives 6.0.3024.21525 dotnet
System.Security.Cryptography.ProtectedData 5.0.20.51904 dotnet
System.Security.Cryptography.X509Certificates 6.0.3024.21525 dotnet
System.Security.Principal 6.0.3024.21525 dotnet
System.Security.Principal.Windows 6.0.3024.21525 dotnet
System.Security.SecureString 6.0.3024.21525 dotnet
System.ServiceModel.Web 6.0.3024.21525 dotnet
System.ServiceProcess 6.0.3024.21525 dotnet
System.Text.Encoding 6.0.3024.21525 dotnet
System.Text.Encoding.CodePages 6.0.3024.21525 dotnet
System.Text.Encoding.Extensions 6.0.3024.21525 dotnet
System.Text.Encodings.Web 6.0.3024.21525 dotnet
System.Text.Json 6.0.3024.21525 dotnet
System.Text.RegularExpressions 6.0.3024.21525 dotnet
System.Threading 6.0.3024.21525 dotnet
System.Threading.Channels 6.0.3024.21525 dotnet
System.Threading.Overlapped 6.0.3024.21525 dotnet
System.Threading.Tasks 6.0.3024.21525 dotnet
System.Threading.Tasks.Dataflow 6.0.3024.21525 dotnet
System.Threading.Tasks.Extensions 6.0.3024.21525 dotnet
System.Threading.Tasks.Parallel 6.0.3024.21525 dotnet
System.Threading.Thread 6.0.3024.21525 dotnet
System.Threading.ThreadPool 6.0.3024.21525 dotnet
System.Threading.Timer 6.0.3024.21525 dotnet
System.Transactions 6.0.3024.21525 dotnet
System.Transactions.Local 6.0.3024.21525 dotnet
System.ValueTuple 6.0.3024.21525 dotnet
System.Web 6.0.3024.21525 dotnet
System.Web.HttpUtility 6.0.3024.21525 dotnet
System.Windows 6.0.3024.21525 dotnet
System.Xml 6.0.3024.21525 dotnet
System.Xml.Linq 6.0.3024.21525 dotnet
System.Xml.ReaderWriter 6.0.3024.21525 dotnet
System.Xml.Serialization 6.0.3024.21525 dotnet
System.Xml.XDocument 6.0.3024.21525 dotnet
System.Xml.XPath 6.0.3024.21525 dotnet
System.Xml.XPath.XDocument 6.0.3024.21525 dotnet
System.Xml.XmlDocument 6.0.3024.21525 dotnet
System.Xml.XmlSerializer 6.0.3024.21525 dotnet
WindowsBase 6.0.3024.21525 dotnet
acl-libs 2.3.2-r1 apk
alpine-baselayout 3.6.8-r0 apk
alpine-baselayout-data 3.6.8-r0 apk
alpine-keys 2.5-r0 apk
apk-tools 2.14.4-r3 apk
bash 5.2.37-r0 apk
brotli-libs 1.1.0-r2 apk
busybox 1.36.1-r32 apk
busybox-binsh 1.36.1-r32 apk
c-ares 1.33.1-r0 apk
ca-certificates 20240705-r0 apk
ca-certificates-bundle 20240705-r0 apk
catatonit 0.2.0-r0 apk
coreutils 9.5-r1 apk
coreutils-env 9.5-r1 apk
coreutils-fmt 9.5-r1 apk
coreutils-sha512sum 9.5-r1 apk
curl 8.9.1-r2 apk
dbus-libs 1.14.10-r4 apk
double-conversion 3.3.0-r0 apk
duktape 2.7.0-r1 apk
findutils 4.10.0-r0 apk
gdbm 1.24-r0 apk
glib 2.82.1-r0 apk
grep 3.11-r0 apk
icu-data-en 74.2-r0 apk
icu-libs 74.2-r0 apk
jq 1.7.1-r0 apk
libattr 2.5.2-r2 apk
libb2 0.98.1-r3 apk
libblkid 2.40.2-r3 apk
libbsd 0.12.2-r0 apk
libbz2 1.0.8-r6 apk
libcrypto3 3.3.2-r2 apk
libcurl 8.9.1-r2 apk
libeconf 0.6.3-r0 apk
libexpat 2.6.3-r0 apk
libffi 3.4.6-r0 apk
libgcc 14.2.0-r3 apk
libgomp 14.2.0-r3 apk
libidn2 2.3.7-r0 apk
libintl 0.22.5-r0 apk
libmd 1.1.0-r0 apk
libmount 2.40.2-r3 apk
libncursesw 6.5_p20240601-r1 apk
libpanelw 6.5_p20240601-r1 apk
libpcre2-16 10.43-r0 apk
libproc2 4.0.4-r2 apk
libproxy 0.5.9-r0 apk
libpsl 0.21.5-r3 apk
libssl3 3.3.2-r2 apk
libstdc++ 14.2.0-r3 apk
libtorrent-rasterbar 2.0.10-r2 apk
libunistring 1.2-r0 apk
linux-pam 1.6.1-r1 apk
mpdecimal 4.0.0-r0 apk
mscorlib 6.0.3024.21525 dotnet
musl 1.2.5-r5 apk
musl-utils 1.2.5-r3 apk
ncurses-terminfo-base 6.5_p20240601-r1 apk
netcat-openbsd 1.226-r0 apk
netstandard 6.0.3024.21525 dotnet
nghttp2-libs 1.63.0-r0 apk
oniguruma 6.9.9-r0 apk
pcre2 10.43-r0 apk
procps-ng 4.0.4-r2 apk
pyc 3.12.7-r0 apk
python3 3.12.7-r0 apk
python3-pyc 3.12.7-r0 apk
python3-pycache-pyc0 3.12.7-r0 apk
qbittorrent-nox 5.0.0-r1 apk
qbt 1.8.24199.1+738bca0d7d7585cf40629f13a59b6198eaf6fe64 dotnet
qt6-qtbase 6.7.2-r2 apk
qt6-qtbase-sqlite 6.7.2-r2 apk
readline 8.2.13-r0 apk
scanelf 1.3.8-r0 apk
shadow 4.16.0-r0 apk
skalibs 2.14.2.0-r2 apk
sqlite-libs 3.46.1-r0 apk
ssl_client 1.36.1-r32 apk
tzdata 2024b-r1 apk
utmps-libs 0.1.2.2-r3 apk
xz-libs 5.6.3-r0 apk
zlib 1.3.1-r2 apk
zstd-libs 1.5.6-r1 apk

View File

@@ -24,7 +24,6 @@ param_container_name: "{{ project_name }}"
param_usage_include_vols: true
param_volumes:
- { vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/appdata", desc: "Contains all relevant configuration files." }
- { vol_path: "/downloads", vol_host_path: "/path/to/downloads", desc: "Location of downloads on disk." }
param_usage_include_ports: true
param_ports:
- { external_port: "8080", internal_port: "8080", port_desc: "WebUI" }
@@ -34,6 +33,11 @@ param_usage_include_env: true
param_env_vars:
- { env_var: "WEBUI_PORT", env_value: "8080", desc: "for changing the port of the web UI, see below for explanation"}
- { env_var: "TORRENTING_PORT", env_value: "6881", desc: "for changing the port of tcp/udp connection, see below for explanation" }
opt_param_usage_include_vols: true
opt_param_volumes:
- { vol_path: "/downloads", vol_host_path: "/path/to/downloads", desc: "Location of downloads on disk." }
readonly_supported: true
# application setup block
app_setup_block_enabled: true
@@ -58,6 +62,7 @@ app_setup_block: |
# changelog
changelogs:
- { date: "17.07.24:", desc: "Restore qbittorrent-cli as it now supports openssl 3." }
- { date: "25.05.24:", desc: "Remove qbittorrent-cli as it still requires openssl 1.1 which is EOL." }
- { date: "14.02.24:", desc: "Only set/override torrenting port if the optional env var is set." }
- { date: "14.02.24:", desc: "Add torrenting port support." }

View File

@@ -10,10 +10,8 @@ if [[ ! -f /config/qBittorrent/qBittorrent.conf ]]; then
fi
# chown download directory if currently not set to abc
if [[ -d /downloads ]]; then
if [[ "$(stat -c '%U' /downloads)" != "abc" ]]; then
lsiown -R abc:abc /downloads
fi
if grep -qe ' /downloads ' /proc/mounts; then
lsiown abc:abc /downloads
fi
# permissions

View File

@@ -6,6 +6,11 @@ if [[ -n "${TORRENTING_PORT}" ]]; then
TORRENTING_PORT_ARG="--torrenting-port=${TORRENTING_PORT}"
fi
WEBUI_ADDRESS=$(grep -Po "^WebUI\\\Address=\K(.*)" /config/qBittorrent/qBittorrent.conf)
if [[ -z ${WEBUI_ADDRESS} ]] || [[ ${WEBUI_ADDRESS} == "*" ]]; then
WEBUI_ADDRESS="localhost"
fi
exec \
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost ${WEBUI_PORT}" \
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z ${WEBUI_ADDRESS} ${WEBUI_PORT}" \
s6-setuidgid abc /usr/bin/qbittorrent-nox --webui-port="${WEBUI_PORT}" ${TORRENTING_PORT_ARG}

15
root/usr/bin/qbt Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
# qbt bash wrapper to prompt user when trying to save password
if [[ "$@" == "settings set password" ]]; then
echo "Setting password is not supported"
echo "Please use --ask-for-password or --password"
elif [[ "$@" == "settings set"* ]]; then
/qbt/qbt "$@"
elif [[ "$@" != *"--ask-for-password"* ]] && [[ "$@" != *"--password"* ]];then
echo "Please use --ask-for-password or --password and ensure username/url are set"
/qbt/qbt "$@"
else
/qbt/qbt "$@"
fi