mirror of
https://github.com/linuxserver/docker-audacity.git
synced 2025-07-25 00:31:49 +02:00
Compare commits
No commits in common. "main" and "3.7.0-ls176" have entirely different histories.
main
...
3.7.0-ls17
18 changed files with 1454 additions and 1690 deletions
0
.editorconfig
Normal file → Executable file
0
.editorconfig
Normal file → Executable file
6
.github/CONTRIBUTING.md
vendored
6
.github/CONTRIBUTING.md
vendored
|
@ -6,7 +6,7 @@
|
||||||
* Read, and fill the Pull Request template
|
* Read, and fill the Pull Request template
|
||||||
* If this is a fix for a typo (in code, documentation, or the README) please file an issue and let us sort it out. We do not need a PR
|
* If this is a fix for a typo (in code, documentation, or the README) please file an issue and let us sort it out. We do not need a PR
|
||||||
* If the PR is addressing an existing issue include, closes #\<issue number>, in the body of the PR commit message
|
* If the PR is addressing an existing issue include, closes #\<issue number>, in the body of the PR commit message
|
||||||
* If you want to discuss changes, you can also bring it up in [#dev-talk](https://discordapp.com/channels/354974912613449730/757585807061155840) in our [Discord server](https://linuxserver.io/discord)
|
* If you want to discuss changes, you can also bring it up in [#dev-talk](https://discordapp.com/channels/354974912613449730/757585807061155840) in our [Discord server](https://discord.gg/YWrKVTn)
|
||||||
|
|
||||||
## Common files
|
## Common files
|
||||||
|
|
||||||
|
@ -105,10 +105,10 @@ docker build \
|
||||||
-t linuxserver/audacity:latest .
|
-t linuxserver/audacity:latest .
|
||||||
```
|
```
|
||||||
|
|
||||||
The ARM variants can be built on x86_64 hardware and vice versa using `lscr.io/linuxserver/qemu-static`
|
The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run --rm --privileged lscr.io/linuxserver/qemu-static --reset
|
docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||||
```
|
```
|
||||||
|
|
||||||
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
|
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
|
||||||
|
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -1,7 +1,7 @@
|
||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Discord chat support
|
- name: Discord chat support
|
||||||
url: https://linuxserver.io/discord
|
url: https://discord.gg/YWrKVTn
|
||||||
about: Realtime support / chat with the community and the team.
|
about: Realtime support / chat with the community and the team.
|
||||||
|
|
||||||
- name: Discourse discussion forum
|
- name: Discourse discussion forum
|
||||||
|
|
0
.github/ISSUE_TEMPLATE/issue.bug.yml
vendored
Normal file → Executable file
0
.github/ISSUE_TEMPLATE/issue.bug.yml
vendored
Normal file → Executable file
0
.github/ISSUE_TEMPLATE/issue.feature.yml
vendored
Normal file → Executable file
0
.github/ISSUE_TEMPLATE/issue.feature.yml
vendored
Normal file → Executable file
3
.github/workflows/call_issue_pr_tracker.yml
vendored
Normal file → Executable file
3
.github/workflows/call_issue_pr_tracker.yml
vendored
Normal file → Executable file
|
@ -8,9 +8,6 @@ on:
|
||||||
pull_request_review:
|
pull_request_review:
|
||||||
types: [submitted,edited,dismissed]
|
types: [submitted,edited,dismissed]
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
manage-project:
|
manage-project:
|
||||||
permissions:
|
permissions:
|
||||||
|
|
3
.github/workflows/call_issues_cron.yml
vendored
Normal file → Executable file
3
.github/workflows/call_issues_cron.yml
vendored
Normal file → Executable file
|
@ -4,9 +4,6 @@ on:
|
||||||
- cron: '52 17 * * *'
|
- cron: '52 17 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
stale:
|
stale:
|
||||||
permissions:
|
permissions:
|
||||||
|
|
57
.github/workflows/external_trigger.yml
vendored
57
.github/workflows/external_trigger.yml
vendored
|
@ -3,9 +3,6 @@ name: External Trigger Main
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
external-trigger-main:
|
external-trigger-main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -18,10 +15,7 @@ jobs:
|
||||||
SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }}
|
SKIP_EXTERNAL_TRIGGER: ${{ vars.SKIP_EXTERNAL_TRIGGER }}
|
||||||
run: |
|
run: |
|
||||||
printf "# External trigger for docker-audacity\n\n" >> $GITHUB_STEP_SUMMARY
|
printf "# External trigger for docker-audacity\n\n" >> $GITHUB_STEP_SUMMARY
|
||||||
if grep -q "^audacity_main_" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
|
if grep -q "^audacity_main" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
|
||||||
echo "> [!NOTE]" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`audacity_main_\`; will skip trigger if version matches." >> $GITHUB_STEP_SUMMARY
|
|
||||||
elif grep -q "^audacity_main" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
|
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`audacity_main\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
|
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` contains \`audacity_main\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -31,11 +25,6 @@ jobs:
|
||||||
printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY
|
printf "\n## Retrieving external version\n\n" >> $GITHUB_STEP_SUMMARY
|
||||||
EXT_RELEASE=$(curl -u ${{ secrets.CR_USER }}:${{ secrets.CR_PAT }} -sX GET https://api.github.com/repos/audacity/audacity/releases/latest | jq -r '.tag_name' | sed 's|^Audacity-||')
|
EXT_RELEASE=$(curl -u ${{ secrets.CR_USER }}:${{ secrets.CR_PAT }} -sX GET https://api.github.com/repos/audacity/audacity/releases/latest | jq -r '.tag_name' | sed 's|^Audacity-||')
|
||||||
echo "Type is \`custom_version_command\`" >> $GITHUB_STEP_SUMMARY
|
echo "Type is \`custom_version_command\`" >> $GITHUB_STEP_SUMMARY
|
||||||
if grep -q "^audacity_main_${EXT_RELEASE}" <<< "${SKIP_EXTERNAL_TRIGGER}"; then
|
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "> Github organizational variable \`SKIP_EXTERNAL_TRIGGER\` matches current external release; skipping trigger." >> $GITHUB_STEP_SUMMARY
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
|
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "> Can't retrieve external version, exiting" >> $GITHUB_STEP_SUMMARY
|
echo "> Can't retrieve external version, exiting" >> $GITHUB_STEP_SUMMARY
|
||||||
|
@ -46,43 +35,19 @@ jobs:
|
||||||
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
EXT_RELEASE_SANITIZED=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
|
EXT_RELEASE=$(echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g')
|
||||||
echo "Sanitized external version: \`${EXT_RELEASE_SANITIZED}\`" >> $GITHUB_STEP_SUMMARY
|
echo "External version: \`${EXT_RELEASE}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY
|
echo "Retrieving last pushed version" >> $GITHUB_STEP_SUMMARY
|
||||||
image="linuxserver/audacity"
|
image="linuxserver/audacity"
|
||||||
tag="latest"
|
tag="latest"
|
||||||
token=$(curl -sX GET \
|
token=$(curl -sX GET \
|
||||||
"https://ghcr.io/token?scope=repository%3Alinuxserver%2Faudacity%3Apull" \
|
"https://ghcr.io/token?scope=repository%3Alinuxserver%2Faudacity%3Apull" \
|
||||||
| jq -r '.token')
|
| jq -r '.token')
|
||||||
multidigest=$(curl -s \
|
digest=$(curl -s \
|
||||||
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
|
|
||||||
--header "Accept: application/vnd.oci.image.index.v1+json" \
|
|
||||||
--header "Authorization: Bearer ${token}" \
|
|
||||||
"https://ghcr.io/v2/${image}/manifests/${tag}")
|
|
||||||
if jq -e '.layers // empty' <<< "${multidigest}" >/dev/null 2>&1; then
|
|
||||||
# If there's a layer element it's a single-arch manifest so just get that digest
|
|
||||||
digest=$(jq -r '.config.digest' <<< "${multidigest}")
|
|
||||||
else
|
|
||||||
# Otherwise it's multi-arch or has manifest annotations
|
|
||||||
if jq -e '.manifests[]?.annotations // empty' <<< "${multidigest}" >/dev/null 2>&1; then
|
|
||||||
# Check for manifest annotations and delete if found
|
|
||||||
multidigest=$(jq 'del(.manifests[] | select(.annotations))' <<< "${multidigest}")
|
|
||||||
fi
|
|
||||||
if [[ $(jq '.manifests | length' <<< "${multidigest}") -gt 1 ]]; then
|
|
||||||
# If there's still more than one digest, it's multi-arch
|
|
||||||
multidigest=$(jq -r ".manifests[] | select(.platform.architecture == \"amd64\").digest?" <<< "${multidigest}")
|
|
||||||
else
|
|
||||||
# Otherwise it's single arch
|
|
||||||
multidigest=$(jq -r ".manifests[].digest?" <<< "${multidigest}")
|
|
||||||
fi
|
|
||||||
if digest=$(curl -s \
|
|
||||||
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
|
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
|
||||||
--header "Accept: application/vnd.oci.image.manifest.v1+json" \
|
|
||||||
--header "Authorization: Bearer ${token}" \
|
--header "Authorization: Bearer ${token}" \
|
||||||
"https://ghcr.io/v2/${image}/manifests/${multidigest}"); then
|
"https://ghcr.io/v2/${image}/manifests/${tag}" \
|
||||||
digest=$(jq -r '.config.digest' <<< "${digest}");
|
| jq -r '.config.digest')
|
||||||
fi
|
|
||||||
fi
|
|
||||||
image_info=$(curl -sL \
|
image_info=$(curl -sL \
|
||||||
--header "Authorization: Bearer ${token}" \
|
--header "Authorization: Bearer ${token}" \
|
||||||
"https://ghcr.io/v2/${image}/blobs/${digest}")
|
"https://ghcr.io/v2/${image}/blobs/${digest}")
|
||||||
|
@ -103,8 +68,8 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY
|
echo "Last pushed version: \`${IMAGE_VERSION}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
if [ "${EXT_RELEASE_SANITIZED}" == "${IMAGE_VERSION}" ]; then
|
if [ "${EXT_RELEASE}" == "${IMAGE_VERSION}" ]; then
|
||||||
echo "Sanitized version \`${EXT_RELEASE_SANITIZED}\` 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-audacity/job/main/lastBuild/api/json | jq -r '.building') == "true" ]; then
|
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-audacity/job/main/lastBuild/api/json | jq -r '.building') == "true" ]; then
|
||||||
echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY
|
echo "New version \`${EXT_RELEASE}\` found; but there already seems to be an active build on Jenkins; exiting" >> $GITHUB_STEP_SUMMARY
|
||||||
|
@ -119,8 +84,8 @@ jobs:
|
||||||
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
else
|
else
|
||||||
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
|
printf "\n## Trigger new build\n\n" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "New sanitized version \`${EXT_RELEASE_SANITIZED}\` 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
|
||||||
if [[ "${artifacts_found}" == "true" ]]; then
|
if "${artifacts_found}" == "true" ]]; then
|
||||||
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY
|
echo "All artifacts seem to be uploaded." >> $GITHUB_STEP_SUMMARY
|
||||||
fi
|
fi
|
||||||
response=$(curl -iX POST \
|
response=$(curl -iX POST \
|
||||||
|
@ -139,7 +104,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 audacity tag latest. Old version:${IMAGE_VERSION} New version:${EXT_RELEASE_SANITIZED}"
|
TRIGGER_REASON="A version change was detected for audacity 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,
|
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 }}
|
||||||
|
|
|
@ -5,9 +5,6 @@ on:
|
||||||
- cron: '34 * * * *'
|
- cron: '34 * * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
external-trigger-scheduler:
|
external-trigger-scheduler:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
6
.github/workflows/greetings.yml
vendored
6
.github/workflows/greetings.yml
vendored
|
@ -2,14 +2,8 @@ name: Greetings
|
||||||
|
|
||||||
on: [pull_request_target, issues]
|
on: [pull_request_target, issues]
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
greeting:
|
greeting:
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/first-interaction@v1
|
- uses: actions/first-interaction@v1
|
||||||
|
|
35
.github/workflows/package_trigger_scheduler.yml
vendored
35
.github/workflows/package_trigger_scheduler.yml
vendored
|
@ -5,9 +5,6 @@ on:
|
||||||
- cron: '49 4 * * 2'
|
- cron: '49 4 * * 2'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
package-trigger-scheduler:
|
package-trigger-scheduler:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -30,18 +27,9 @@ jobs:
|
||||||
fi
|
fi
|
||||||
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY
|
printf "\n## Evaluating \`%s\`\n\n" ${br} >> $GITHUB_STEP_SUMMARY
|
||||||
JENKINS_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-audacity/${br}/jenkins-vars.yml)
|
JENKINS_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-audacity/${br}/jenkins-vars.yml)
|
||||||
if ! curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-audacity/${br}/Jenkinsfile >/dev/null 2>&1; then
|
if [[ "${br}" == $(yq -r '.ls_branch' <<< "${JENKINS_VARS}") ]]; then
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "> No Jenkinsfile found. Branch is either deprecated or is an early dev branch." >> $GITHUB_STEP_SUMMARY
|
|
||||||
skipped_branches="${skipped_branches}${br} "
|
|
||||||
elif [[ "${br}" == $(yq -r '.ls_branch' <<< "${JENKINS_VARS}") ]]; then
|
|
||||||
echo "Branch appears to be live; checking workflow." >> $GITHUB_STEP_SUMMARY
|
echo "Branch appears to be live; checking workflow." >> $GITHUB_STEP_SUMMARY
|
||||||
README_VARS=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-audacity/${br}/readme-vars.yml)
|
if [[ $(yq -r '.skip_package_check' <<< "${JENKINS_VARS}") == "true" ]]; then
|
||||||
if [[ $(yq -r '.project_deprecation_status' <<< "${README_VARS}") == "true" ]]; then
|
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "> Branch appears to be deprecated; skipping trigger." >> $GITHUB_STEP_SUMMARY
|
|
||||||
skipped_branches="${skipped_branches}${br} "
|
|
||||||
elif [[ $(yq -r '.skip_package_check' <<< "${JENKINS_VARS}") == "true" ]]; then
|
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "> Skipping branch ${br} due to \`skip_package_check\` being set in \`jenkins-vars.yml\`." >> $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} "
|
skipped_branches="${skipped_branches}${br} "
|
||||||
|
@ -49,7 +37,7 @@ jobs:
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "> Github organizational variable \`SKIP_PACKAGE_TRIGGER\` contains \`audacity_${br}\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
|
echo "> Github organizational variable \`SKIP_PACKAGE_TRIGGER\` contains \`audacity_${br}\`; skipping trigger." >> $GITHUB_STEP_SUMMARY
|
||||||
skipped_branches="${skipped_branches}${br} "
|
skipped_branches="${skipped_branches}${br} "
|
||||||
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-audacity/job/${br}/lastBuild/api/json | jq -r '.building' 2>/dev/null) == "true" ]; then
|
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-audacity/job/${br}/lastBuild/api/json | jq -r '.building') == "true" ]; then
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "> There already seems to be an active build on Jenkins; skipping package trigger for ${br}" >> $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} "
|
skipped_branches="${skipped_branches}${br} "
|
||||||
|
@ -61,11 +49,6 @@ jobs:
|
||||||
response=$(curl -iX POST \
|
response=$(curl -iX POST \
|
||||||
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-audacity/job/${br}/buildWithParameters?PACKAGE_CHECK=true \
|
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-audacity/job/${br}/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|")
|
||||||
if [[ -z "${response}" ]]; then
|
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "> Jenkins build could not be triggered. Skipping branch."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
|
echo "Jenkins [job queue url](${response%$'\r'})" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
|
echo "Sleeping 10 seconds until job starts" >> $GITHUB_STEP_SUMMARY
|
||||||
sleep 10
|
sleep 10
|
||||||
|
@ -73,14 +56,11 @@ jobs:
|
||||||
buildurl="${buildurl%$'\r'}"
|
buildurl="${buildurl%$'\r'}"
|
||||||
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
|
echo "Jenkins job [build url](${buildurl})" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
|
echo "Attempting to change the Jenkins job description" >> $GITHUB_STEP_SUMMARY
|
||||||
if ! curl -ifX POST \
|
curl -iX POST \
|
||||||
"${buildurl}submitDescription" \
|
"${buildurl}submitDescription" \
|
||||||
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
|
--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 "description=GHA package trigger https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
|
||||||
--data-urlencode "Submit=Submit"; then
|
--data-urlencode "Submit=Submit"
|
||||||
echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "> Unable to change the Jenkins job description."
|
|
||||||
fi
|
|
||||||
sleep 20
|
sleep 20
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
@ -90,14 +70,13 @@ jobs:
|
||||||
if [[ -n "${triggered_branches}" ]] || [[ -n "${skipped_branches}" ]]; then
|
if [[ -n "${triggered_branches}" ]] || [[ -n "${skipped_branches}" ]]; then
|
||||||
if [[ -n "${triggered_branches}" ]]; then
|
if [[ -n "${triggered_branches}" ]]; then
|
||||||
NOTIFY_BRANCHES="**Triggered:** ${triggered_branches} \n"
|
NOTIFY_BRANCHES="**Triggered:** ${triggered_branches} \n"
|
||||||
NOTIFY_BUILD_URL="**Build URL:** https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-audacity/activity/ \n"
|
|
||||||
echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****"
|
|
||||||
fi
|
fi
|
||||||
if [[ -n "${skipped_branches}" ]]; then
|
if [[ -n "${skipped_branches}" ]]; then
|
||||||
NOTIFY_BRANCHES="${NOTIFY_BRANCHES}**Skipped:** ${skipped_branches} \n"
|
NOTIFY_BRANCHES="${NOTIFY_BRANCHES}**Skipped:** ${skipped_branches} \n"
|
||||||
fi
|
fi
|
||||||
|
echo "**** Package check build(s) triggered for branch(es): ${triggered_branches} ****"
|
||||||
echo "**** Notifying Discord ****"
|
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,
|
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) for audacity** \n'"${NOTIFY_BRANCHES}"''"${NOTIFY_BUILD_URL}"'"}],
|
"description": "**Package Check Build(s) Triggered for audacity** \n'"${NOTIFY_BRANCHES}"'**Build URL:** '"https://ci.linuxserver.io/blue/organizations/jenkins/Docker-Pipeline-Builders%2Fdocker-audacity/activity/"' \n"}],
|
||||||
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
"username": "Github Actions"}' ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
fi
|
fi
|
||||||
|
|
0
.github/workflows/permissions.yml
vendored
Normal file → Executable file
0
.github/workflows/permissions.yml
vendored
Normal file → Executable file
|
@ -1,6 +1,6 @@
|
||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
FROM ghcr.io/linuxserver/baseimage-selkies:ubuntunoble
|
FROM ghcr.io/linuxserver/baseimage-kasmvnc:ubuntunoble
|
||||||
|
|
||||||
# set version label
|
# set version label
|
||||||
ARG BUILD_DATE
|
ARG BUILD_DATE
|
||||||
|
@ -15,7 +15,7 @@ ENV TITLE=Audacity
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** add icon ****" && \
|
echo "**** add icon ****" && \
|
||||||
curl -o \
|
curl -o \
|
||||||
/usr/share/selkies/www/icon.png \
|
/kclient/public/icon.png \
|
||||||
https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/audacity-logo.png && \
|
https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/audacity-logo.png && \
|
||||||
echo "**** install packages ****" && \
|
echo "**** install packages ****" && \
|
||||||
apt-get update && \
|
apt-get update && \
|
||||||
|
|
324
Jenkinsfile
vendored
324
Jenkinsfile
vendored
|
@ -8,7 +8,7 @@ pipeline {
|
||||||
}
|
}
|
||||||
// Input to determine if this is a package check
|
// Input to determine if this is a package check
|
||||||
parameters {
|
parameters {
|
||||||
string(defaultValue: 'false', description: 'package check run', name: 'PACKAGE_CHECK')
|
string(defaultValue: 'false', description: 'package check run', name: 'PACKAGE_CHECK')
|
||||||
}
|
}
|
||||||
// Configuration for the variables used for this specific repo
|
// Configuration for the variables used for this specific repo
|
||||||
environment {
|
environment {
|
||||||
|
@ -30,8 +30,8 @@ pipeline {
|
||||||
MULTIARCH = 'false'
|
MULTIARCH = 'false'
|
||||||
CI = 'true'
|
CI = 'true'
|
||||||
CI_WEB = 'true'
|
CI_WEB = 'true'
|
||||||
CI_PORT = '3001'
|
CI_PORT = '3000'
|
||||||
CI_SSL = 'true'
|
CI_SSL = 'false'
|
||||||
CI_DELAY = '120'
|
CI_DELAY = '120'
|
||||||
CI_DOCKERENV = ''
|
CI_DOCKERENV = ''
|
||||||
CI_AUTH = ''
|
CI_AUTH = ''
|
||||||
|
@ -56,23 +56,11 @@ pipeline {
|
||||||
steps{
|
steps{
|
||||||
echo "Running on node: ${NODE_NAME}"
|
echo "Running on node: ${NODE_NAME}"
|
||||||
sh '''#! /bin/bash
|
sh '''#! /bin/bash
|
||||||
echo "Pruning builder"
|
containers=$(docker ps -aq)
|
||||||
docker builder prune -f --builder container || :
|
|
||||||
containers=$(docker ps -q)
|
|
||||||
if [[ -n "${containers}" ]]; then
|
if [[ -n "${containers}" ]]; then
|
||||||
BUILDX_CONTAINER_ID=$(docker ps -qf 'name=buildx_buildkit')
|
docker stop ${containers}
|
||||||
for container in ${containers}; do
|
|
||||||
if [[ "${container}" == "${BUILDX_CONTAINER_ID}" ]]; then
|
|
||||||
echo "skipping buildx container in docker stop"
|
|
||||||
else
|
|
||||||
echo "Stopping container ${container}"
|
|
||||||
docker stop ${container}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
docker system prune -f --volumes || :
|
docker system prune -af --volumes || : '''
|
||||||
docker image prune -af || :
|
|
||||||
'''
|
|
||||||
script{
|
script{
|
||||||
env.EXIT_STATUS = ''
|
env.EXIT_STATUS = ''
|
||||||
env.LS_RELEASE = sh(
|
env.LS_RELEASE = sh(
|
||||||
|
@ -94,11 +82,7 @@ pipeline {
|
||||||
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
|
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
|
||||||
env.PULL_REQUEST = env.CHANGE_ID
|
env.PULL_REQUEST = env.CHANGE_ID
|
||||||
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml'
|
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml'
|
||||||
if ( env.SYFT_IMAGE_TAG == null ) {
|
|
||||||
env.SYFT_IMAGE_TAG = 'latest'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
echo "Using syft image tag ${SYFT_IMAGE_TAG}"
|
|
||||||
sh '''#! /bin/bash
|
sh '''#! /bin/bash
|
||||||
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
|
echo "The default github branch detected as ${GH_DEFAULT_BRANCH}" '''
|
||||||
script{
|
script{
|
||||||
|
@ -207,7 +191,6 @@ pipeline {
|
||||||
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 = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
|
||||||
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
|
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
|
||||||
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -232,7 +215,6 @@ pipeline {
|
||||||
env.META_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.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
|
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
|
||||||
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/'
|
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/'
|
||||||
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,7 +239,6 @@ pipeline {
|
||||||
env.EXT_RELEASE_TAG = 'version-' + env.EXT_RELEASE_CLEAN
|
env.EXT_RELEASE_TAG = '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/'
|
||||||
env.BUILDCACHE = 'docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -354,35 +335,6 @@ pipeline {
|
||||||
else
|
else
|
||||||
echo "No templates to delete"
|
echo "No templates to delete"
|
||||||
fi
|
fi
|
||||||
echo "Starting Stage 2.5 - Update init diagram"
|
|
||||||
if ! grep -q 'init_diagram:' readme-vars.yml; then
|
|
||||||
echo "Adding the key 'init_diagram' to readme-vars.yml"
|
|
||||||
sed -i '\\|^#.*changelog.*$|d' readme-vars.yml
|
|
||||||
sed -i 's|^changelogs:|# init diagram\\ninit_diagram:\\n\\n# changelog\\nchangelogs:|' readme-vars.yml
|
|
||||||
fi
|
|
||||||
mkdir -p ${TEMPDIR}/d2
|
|
||||||
docker run --rm -v ${TEMPDIR}/d2:/output -e PUID=$(id -u) -e PGID=$(id -g) -e RAW="true" ghcr.io/linuxserver/d2-builder:latest ${CONTAINER_NAME}:latest
|
|
||||||
ls -al ${TEMPDIR}/d2
|
|
||||||
yq -ei ".init_diagram |= load_str(\\"${TEMPDIR}/d2/${CONTAINER_NAME}-latest.d2\\")" readme-vars.yml
|
|
||||||
if [[ $(md5sum readme-vars.yml | cut -c1-8) != $(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/readme-vars.yml | cut -c1-8) ]]; then
|
|
||||||
echo "'init_diagram' has been updated. Updating repo and exiting build, new one will trigger based on commit."
|
|
||||||
mkdir -p ${TEMPDIR}/repo
|
|
||||||
git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO}
|
|
||||||
cd ${TEMPDIR}/repo/${LS_REPO}
|
|
||||||
git checkout -f main
|
|
||||||
cp ${WORKSPACE}/readme-vars.yml ${TEMPDIR}/repo/${LS_REPO}/readme-vars.yml
|
|
||||||
git add readme-vars.yml
|
|
||||||
git commit -m 'Bot Updating Templated Files'
|
|
||||||
git pull https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git main
|
|
||||||
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git main
|
|
||||||
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
|
|
||||||
echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
|
|
||||||
echo "Init diagram is unchanged"
|
|
||||||
fi
|
|
||||||
echo "Starting 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}
|
||||||
|
@ -591,42 +543,8 @@ pipeline {
|
||||||
--label \"org.opencontainers.image.title=Audacity\" \
|
--label \"org.opencontainers.image.title=Audacity\" \
|
||||||
--label \"org.opencontainers.image.description=[Audacity](https://www.audacityteam.org/) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.\" \
|
--label \"org.opencontainers.image.description=[Audacity](https://www.audacityteam.org/) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.\" \
|
||||||
--no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
|
--no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
|
||||||
--provenance=true --sbom=true --builder=container --load \
|
--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 '''#! /bin/bash
|
|
||||||
set -e
|
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
|
||||||
for i in "${CACHE[@]}"; do
|
|
||||||
docker tag ${IMAGE}:${META_TAG} ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
|
|
||||||
done
|
|
||||||
'''
|
|
||||||
withCredentials([
|
|
||||||
[
|
|
||||||
$class: 'UsernamePasswordMultiBinding',
|
|
||||||
credentialsId: 'Quay.io-Robot',
|
|
||||||
usernameVariable: 'QUAYUSER',
|
|
||||||
passwordVariable: 'QUAYPASS'
|
|
||||||
]
|
|
||||||
]) {
|
|
||||||
retry_backoff(5,5) {
|
|
||||||
sh '''#! /bin/bash
|
|
||||||
set -e
|
|
||||||
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --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 $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
|
|
||||||
if [[ "${PACKAGE_CHECK}" != "true" ]]; then
|
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
|
||||||
for i in "${CACHE[@]}"; do
|
|
||||||
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
|
|
||||||
done
|
|
||||||
for p in $(jobs -p); do
|
|
||||||
wait "$p" || { echo "job $p failed" >&2; exit 1; }
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Build MultiArch Docker containers for push to LS Repo
|
// Build MultiArch Docker containers for push to LS Repo
|
||||||
|
@ -657,42 +575,8 @@ pipeline {
|
||||||
--label \"org.opencontainers.image.title=Audacity\" \
|
--label \"org.opencontainers.image.title=Audacity\" \
|
||||||
--label \"org.opencontainers.image.description=[Audacity](https://www.audacityteam.org/) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.\" \
|
--label \"org.opencontainers.image.description=[Audacity](https://www.audacityteam.org/) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.\" \
|
||||||
--no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
|
--no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
|
||||||
--provenance=true --sbom=true --builder=container --load \
|
--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 '''#! /bin/bash
|
|
||||||
set -e
|
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
|
||||||
for i in "${CACHE[@]}"; do
|
|
||||||
docker tag ${IMAGE}:amd64-${META_TAG} ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
|
|
||||||
done
|
|
||||||
'''
|
|
||||||
withCredentials([
|
|
||||||
[
|
|
||||||
$class: 'UsernamePasswordMultiBinding',
|
|
||||||
credentialsId: 'Quay.io-Robot',
|
|
||||||
usernameVariable: 'QUAYUSER',
|
|
||||||
passwordVariable: 'QUAYPASS'
|
|
||||||
]
|
|
||||||
]) {
|
|
||||||
retry_backoff(5,5) {
|
|
||||||
sh '''#! /bin/bash
|
|
||||||
set -e
|
|
||||||
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --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 $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
|
|
||||||
if [[ "${PACKAGE_CHECK}" != "true" ]]; then
|
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
|
||||||
for i in "${CACHE[@]}"; do
|
|
||||||
docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
|
|
||||||
done
|
|
||||||
for p in $(jobs -p); do
|
|
||||||
wait "$p" || { echo "job $p failed" >&2; exit 1; }
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Build ARM64') {
|
stage('Build ARM64') {
|
||||||
|
@ -701,6 +585,10 @@ pipeline {
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
echo "Running on node: ${NODE_NAME}"
|
echo "Running on node: ${NODE_NAME}"
|
||||||
|
echo 'Logging into Github'
|
||||||
|
sh '''#! /bin/bash
|
||||||
|
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
|
||||||
|
'''
|
||||||
sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64"
|
sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64"
|
||||||
sh "docker buildx build \
|
sh "docker buildx build \
|
||||||
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
|
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
|
||||||
|
@ -716,50 +604,18 @@ pipeline {
|
||||||
--label \"org.opencontainers.image.title=Audacity\" \
|
--label \"org.opencontainers.image.title=Audacity\" \
|
||||||
--label \"org.opencontainers.image.description=[Audacity](https://www.audacityteam.org/) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.\" \
|
--label \"org.opencontainers.image.description=[Audacity](https://www.audacityteam.org/) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source.\" \
|
||||||
--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=true --sbom=true --builder=container --load \
|
--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 '''#! /bin/bash
|
sh "docker tag ${IMAGE}:arm64v8-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
|
||||||
set -e
|
retry_backoff(5,5) {
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
|
||||||
for i in "${CACHE[@]}"; do
|
|
||||||
docker tag ${IMAGE}:arm64v8-${META_TAG} ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
|
|
||||||
done
|
|
||||||
'''
|
|
||||||
withCredentials([
|
|
||||||
[
|
|
||||||
$class: 'UsernamePasswordMultiBinding',
|
|
||||||
credentialsId: 'Quay.io-Robot',
|
|
||||||
usernameVariable: 'QUAYUSER',
|
|
||||||
passwordVariable: 'QUAYPASS'
|
|
||||||
]
|
|
||||||
]) {
|
|
||||||
retry_backoff(5,5) {
|
|
||||||
sh '''#! /bin/bash
|
|
||||||
set -e
|
|
||||||
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --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 $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
|
|
||||||
if [[ "${PACKAGE_CHECK}" != "true" ]]; then
|
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
|
||||||
for i in "${CACHE[@]}"; do
|
|
||||||
docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
|
|
||||||
done
|
|
||||||
for p in $(jobs -p); do
|
|
||||||
wait "$p" || { echo "job $p failed" >&2; exit 1; }
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sh '''#! /bin/bash
|
sh '''#! /bin/bash
|
||||||
containers=$(docker ps -aq)
|
containers=$(docker ps -aq)
|
||||||
if [[ -n "${containers}" ]]; then
|
if [[ -n "${containers}" ]]; then
|
||||||
docker stop ${containers}
|
docker stop ${containers}
|
||||||
fi
|
fi
|
||||||
docker system prune -f --volumes || :
|
docker system prune -af --volumes || : '''
|
||||||
docker image prune -af || :
|
|
||||||
'''
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -784,7 +640,7 @@ pipeline {
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||||
-v ${TEMPDIR}:/tmp \
|
-v ${TEMPDIR}:/tmp \
|
||||||
ghcr.io/anchore/syft:${SYFT_IMAGE_TAG} \
|
ghcr.io/anchore/syft:latest \
|
||||||
${LOCAL_CONTAINER} -o table=/tmp/package_versions.txt
|
${LOCAL_CONTAINER} -o table=/tmp/package_versions.txt
|
||||||
NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 )
|
NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 )
|
||||||
echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github"
|
echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github"
|
||||||
|
@ -894,7 +750,6 @@ pipeline {
|
||||||
-e WEB_AUTH=\"${CI_AUTH}\" \
|
-e WEB_AUTH=\"${CI_AUTH}\" \
|
||||||
-e WEB_PATH=\"${CI_WEBPATH}\" \
|
-e WEB_PATH=\"${CI_WEBPATH}\" \
|
||||||
-e NODE_NAME=\"${NODE_NAME}\" \
|
-e NODE_NAME=\"${NODE_NAME}\" \
|
||||||
-e SYFT_IMAGE_TAG=\"${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
|
|
||||||
-t ghcr.io/linuxserver/ci:latest \
|
-t ghcr.io/linuxserver/ci:latest \
|
||||||
python3 test_build.py'''
|
python3 test_build.py'''
|
||||||
}
|
}
|
||||||
|
@ -910,23 +765,37 @@ pipeline {
|
||||||
environment name: 'EXIT_STATUS', value: ''
|
environment name: 'EXIT_STATUS', value: ''
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
retry_backoff(5,5) {
|
withCredentials([
|
||||||
sh '''#! /bin/bash
|
[
|
||||||
set -e
|
$class: 'UsernamePasswordMultiBinding',
|
||||||
for PUSHIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
credentialsId: 'Quay.io-Robot',
|
||||||
[[ ${PUSHIMAGE%%/*} =~ \\. ]] && PUSHIMAGEPLUS="${PUSHIMAGE}" || PUSHIMAGEPLUS="docker.io/${PUSHIMAGE}"
|
usernameVariable: 'QUAYUSER',
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
passwordVariable: 'QUAYPASS'
|
||||||
for i in "${CACHE[@]}"; do
|
]
|
||||||
if [[ "${PUSHIMAGEPLUS}" == "$(cut -d "/" -f1 <<< ${i})"* ]]; then
|
]) {
|
||||||
CACHEIMAGE=${i}
|
retry_backoff(5,5) {
|
||||||
fi
|
sh '''#! /bin/bash
|
||||||
|
set -e
|
||||||
|
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --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 $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
|
||||||
|
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
|
||||||
|
docker tag ${IMAGE}:${META_TAG} ${PUSHIMAGE}:${META_TAG}
|
||||||
|
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:latest
|
||||||
|
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG}
|
||||||
|
if [ -n "${SEMVER}" ]; then
|
||||||
|
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER}
|
||||||
|
fi
|
||||||
|
docker push ${PUSHIMAGE}:latest
|
||||||
|
docker push ${PUSHIMAGE}:${META_TAG}
|
||||||
|
docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG}
|
||||||
|
if [ -n "${SEMVER}" ]; then
|
||||||
|
docker push ${PUSHIMAGE}:${SEMVER}
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
|
'''
|
||||||
if [ -n "${SEMVER}" ]; then
|
}
|
||||||
docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
'''
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -937,34 +806,57 @@ pipeline {
|
||||||
environment name: 'EXIT_STATUS', value: ''
|
environment name: 'EXIT_STATUS', value: ''
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
retry_backoff(5,5) {
|
withCredentials([
|
||||||
sh '''#! /bin/bash
|
[
|
||||||
set -e
|
$class: 'UsernamePasswordMultiBinding',
|
||||||
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
credentialsId: 'Quay.io-Robot',
|
||||||
[[ ${MANIFESTIMAGE%%/*} =~ \\. ]] && MANIFESTIMAGEPLUS="${MANIFESTIMAGE}" || MANIFESTIMAGEPLUS="docker.io/${MANIFESTIMAGE}"
|
usernameVariable: 'QUAYUSER',
|
||||||
IFS=',' read -ra CACHE <<< "$BUILDCACHE"
|
passwordVariable: 'QUAYPASS'
|
||||||
for i in "${CACHE[@]}"; do
|
]
|
||||||
if [[ "${MANIFESTIMAGEPLUS}" == "$(cut -d "/" -f1 <<< ${i})"* ]]; then
|
]) {
|
||||||
CACHEIMAGE=${i}
|
retry_backoff(5,5) {
|
||||||
fi
|
sh '''#! /bin/bash
|
||||||
|
set -e
|
||||||
|
echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --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 $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} --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
|
||||||
|
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-${EXT_RELEASE_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-${EXT_RELEASE_TAG}
|
||||||
|
if [ -n "${SEMVER}" ]; then
|
||||||
|
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER}
|
||||||
|
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
|
||||||
|
fi
|
||||||
|
docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
|
||||||
|
docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
|
||||||
|
docker push ${MANIFESTIMAGE}:amd64-latest
|
||||||
|
docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
|
||||||
|
docker push ${MANIFESTIMAGE}:arm64v8-latest
|
||||||
|
docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
|
||||||
|
if [ -n "${SEMVER}" ]; then
|
||||||
|
docker push ${MANIFESTIMAGE}:amd64-${SEMVER}
|
||||||
|
docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
|
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
||||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
|
docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
|
||||||
if [ -n "${SEMVER}" ]; then
|
docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
|
||||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
|
docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
|
||||||
docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
|
if [ -n "${SEMVER}" ]; then
|
||||||
fi
|
docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
|
||||||
done
|
fi
|
||||||
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
|
done
|
||||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
|
'''
|
||||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
|
}
|
||||||
|
|
||||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
|
|
||||||
if [ -n "${SEMVER}" ]; then
|
|
||||||
docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
'''
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -992,7 +884,7 @@ pipeline {
|
||||||
echo '{"tag_name":"'${META_TAG}'",\
|
echo '{"tag_name":"'${META_TAG}'",\
|
||||||
"target_commitish": "main",\
|
"target_commitish": "main",\
|
||||||
"name": "'${META_TAG}'",\
|
"name": "'${META_TAG}'",\
|
||||||
"body": "**CI Report:**\\n\\n'${CI_URL:-N/A}'\\n\\n**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**Remote Changes:**\\n\\n' > start
|
"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": false}' >> releasebody.json
|
||||||
paste -d'\\0' start releasebody.json > releasebody.json.done
|
paste -d'\\0' start releasebody.json > releasebody.json.done
|
||||||
curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
|
curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
|
||||||
|
@ -1170,22 +1062,12 @@ EOF
|
||||||
}
|
}
|
||||||
cleanup {
|
cleanup {
|
||||||
sh '''#! /bin/bash
|
sh '''#! /bin/bash
|
||||||
echo "Pruning builder!!"
|
echo "Performing docker system prune!!"
|
||||||
docker builder prune -f --builder container || :
|
containers=$(docker ps -aq)
|
||||||
containers=$(docker ps -q)
|
|
||||||
if [[ -n "${containers}" ]]; then
|
if [[ -n "${containers}" ]]; then
|
||||||
BUILDX_CONTAINER_ID=$(docker ps -qf 'name=buildx_buildkit')
|
docker stop ${containers}
|
||||||
for container in ${containers}; do
|
|
||||||
if [[ "${container}" == "${BUILDX_CONTAINER_ID}" ]]; then
|
|
||||||
echo "skipping buildx container in docker stop"
|
|
||||||
else
|
|
||||||
echo "Stopping container ${container}"
|
|
||||||
docker stop ${container}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
docker system prune -f --volumes || :
|
docker system prune -af --volumes || :
|
||||||
docker image prune -af || :
|
|
||||||
'''
|
'''
|
||||||
cleanWs()
|
cleanWs()
|
||||||
}
|
}
|
||||||
|
|
173
README.md
173
README.md
|
@ -3,8 +3,9 @@
|
||||||
[](https://linuxserver.io)
|
[](https://linuxserver.io)
|
||||||
|
|
||||||
[](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!")
|
[](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!")
|
||||||
[](https://linuxserver.io/discord "realtime support / chat with the community and the team.")
|
[](https://discord.gg/YWrKVTn "realtime support / chat with the community and the team.")
|
||||||
[](https://discourse.linuxserver.io "post on our community forum.")
|
[](https://discourse.linuxserver.io "post on our community forum.")
|
||||||
|
[](https://fleet.linuxserver.io "an online web interface which displays all of our maintained images.")
|
||||||
[](https://github.com/linuxserver "view the source for all of our repositories.")
|
[](https://github.com/linuxserver "view the source for all of our repositories.")
|
||||||
[](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget")
|
[](https://opencollective.com/linuxserver "please consider helping us by either donating or contributing to our budget")
|
||||||
|
|
||||||
|
@ -19,8 +20,9 @@ The [LinuxServer.io](https://linuxserver.io) team brings you another container r
|
||||||
Find us at:
|
Find us at:
|
||||||
|
|
||||||
* [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more!
|
* [Blog](https://blog.linuxserver.io) - all the things you can do with our containers including How-To guides, opinions and much more!
|
||||||
* [Discord](https://linuxserver.io/discord) - realtime support / chat with the community and the team.
|
* [Discord](https://discord.gg/YWrKVTn) - realtime support / chat with the community and the team.
|
||||||
* [Discourse](https://discourse.linuxserver.io) - post on our community forum.
|
* [Discourse](https://discourse.linuxserver.io) - post on our community forum.
|
||||||
|
* [Fleet](https://fleet.linuxserver.io) - an online web interface which displays all of our maintained images.
|
||||||
* [GitHub](https://github.com/linuxserver) - view the source for all of our repositories.
|
* [GitHub](https://github.com/linuxserver) - view the source for all of our repositories.
|
||||||
* [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget
|
* [Open Collective](https://opencollective.com/linuxserver) - please consider helping us by either donating or contributing to our budget
|
||||||
|
|
||||||
|
@ -53,164 +55,66 @@ The architectures supported by this image are:
|
||||||
| :----: | :----: | ---- |
|
| :----: | :----: | ---- |
|
||||||
| x86-64 | ✅ | amd64-\<version tag\> |
|
| x86-64 | ✅ | amd64-\<version tag\> |
|
||||||
| arm64 | ❌ | |
|
| arm64 | ❌ | |
|
||||||
|
| armhf | ❌ | |
|
||||||
|
|
||||||
## Application Setup
|
## Application Setup
|
||||||
|
|
||||||
The application can be accessed at:
|
The application can be accessed at:
|
||||||
|
|
||||||
|
* http://yourhost:3000/
|
||||||
* https://yourhost:3001/
|
* https://yourhost:3001/
|
||||||
|
|
||||||
### Strict reverse proxies
|
### Options in all KasmVNC based GUI containers
|
||||||
|
|
||||||
This image uses a self-signed certificate by default. This naturally means the scheme is `https`.
|
This container is based on [Docker Baseimage KasmVNC](https://github.com/linuxserver/docker-baseimage-kasmvnc) which means there are additional environment variables and run configurations to enable or disable specific functionality.
|
||||||
If you are using a reverse proxy which validates certificates, you need to [disable this check for the container](https://docs.linuxserver.io/faq#strict-proxy).
|
|
||||||
|
|
||||||
**Modern GUI desktop apps may have compatibility issues with the latest Docker syscall restrictions. You can use Docker with the `--security-opt seccomp=unconfined` setting to allow these syscalls on hosts with older Kernels or libseccomp versions.**
|
#### Optional environment variables
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
>[!WARNING]
|
|
||||||
>This container provides privileged access to the host system. Do not expose it to the Internet unless you have secured it properly.
|
|
||||||
|
|
||||||
**HTTPS is required for full functionality.** Modern browser features such as WebCodecs, used for video and audio, will not function over an insecure HTTP connection.
|
|
||||||
|
|
||||||
By default, this container has no authentication. The optional `CUSTOM_USER` and `PASSWORD` environment variables enable basic HTTP auth, which is suitable only for securing the container on a trusted local network. For internet exposure, we strongly recommend placing the container behind a reverse proxy, such as [SWAG](https://github.com/linuxserver/docker-swag), with a robust authentication mechanism.
|
|
||||||
|
|
||||||
The web interface includes a terminal with passwordless `sudo` access. Any user with access to the GUI can gain root control within the container, install arbitrary software, and probe your local network.
|
|
||||||
|
|
||||||
### Options in all Selkies-based GUI containers
|
|
||||||
|
|
||||||
This container is based on [Docker Baseimage Selkies](https://github.com/linuxserver/docker-baseimage-selkies), which provides the following environment variables and run configurations to customize its functionality.
|
|
||||||
|
|
||||||
#### Optional Environment Variables
|
|
||||||
|
|
||||||
| Variable | Description |
|
| Variable | Description |
|
||||||
| :----: | --- |
|
| :----: | --- |
|
||||||
| `CUSTOM_PORT` | Internal HTTP port. Defaults to `3000`. |
|
| CUSTOM_PORT | Internal port the container listens on for http if it needs to be swapped from the default 3000. |
|
||||||
| `CUSTOM_HTTPS_PORT` | Internal HTTPS port. Defaults to `3001`. |
|
| CUSTOM_HTTPS_PORT | Internal port the container listens on for https if it needs to be swapped from the default 3001. |
|
||||||
| `CUSTOM_USER` | Username for HTTP Basic Auth. Defaults to `abc`. |
|
| CUSTOM_USER | HTTP Basic auth username, abc is default. |
|
||||||
| `PASSWORD` | Password for HTTP Basic Auth. If unset, authentication is disabled. |
|
| PASSWORD | HTTP Basic auth password, abc is default. If unset there will be no auth |
|
||||||
| `SUBFOLDER` | Application subfolder for reverse proxy configurations. Must include leading and trailing slashes, e.g., `/subfolder/`. |
|
| SUBFOLDER | Subfolder for the application if running a subfolder reverse proxy, need both slashes IE `/subfolder/` |
|
||||||
| `TITLE` | Page title displayed in the web browser. Defaults to "Selkies". |
|
| TITLE | The page title displayed on the web browser, default "KasmVNC Client". |
|
||||||
| `START_DOCKER` | If set to `false`, the privileged Docker-in-Docker setup will not start automatically. |
|
| FM_HOME | This is the home directory (landing) for the file manager, default "/config". |
|
||||||
| `DISABLE_IPV6` | Set to `true` to disable IPv6 support in the container. |
|
| START_DOCKER | If set to false a container with privilege will not automatically start the DinD Docker setup. |
|
||||||
| `LC_ALL` | Sets the container's locale, e.g., `fr_FR.UTF-8`. |
|
| DRINODE | If mounting in /dev/dri for [DRI3 GPU Acceleration](https://www.kasmweb.com/kasmvnc/docs/master/gpu_acceleration.html) allows you to specify the device to use IE `/dev/dri/renderD128` |
|
||||||
| `DRINODE` | If mounting in /dev/dri for DRI3 GPU Acceleration allows you to specify the device to use IE `/dev/dri/renderD128` |
|
| LC_ALL | Set the Language for the container to run as IE `fr_FR.UTF-8` `ar_AE.UTF-8` |
|
||||||
| `NO_DECOR` | If set, applications will run without window borders, suitable for PWA usage. |
|
| NO_DECOR | If set the application will run without window borders for use as a PWA. |
|
||||||
| `NO_FULL` | If set, applications will not be automatically fullscreened. |
|
| NO_FULL | Do not autmatically fullscreen applications when using openbox. |
|
||||||
| `DISABLE_ZINK` | If set, Zink-related environment variables will not be configured when a video card is detected. |
|
|
||||||
| `WATERMARK_PNG` | Full path to a watermark PNG file inside the container, e.g., `/usr/share/selkies/www/icon.png`. |
|
|
||||||
| `WATERMARK_LOCATION` | Integer specifying the watermark location: `1` (Top Left), `2` (Top Right), `3` (Bottom Left), `4` (Bottom Right), `5` (Centered), `6` (Animated). |
|
|
||||||
|
|
||||||
#### Optional Run Configurations
|
#### Optional run configurations
|
||||||
|
|
||||||
| Argument | Description |
|
| Variable | Description |
|
||||||
| :----: | --- |
|
| :----: | --- |
|
||||||
| `--privileged` | Starts a Docker-in-Docker (DinD) environment. For better performance, mount the Docker data directory from the host, e.g., `-v /path/to/docker-data:/var/lib/docker`. |
|
| `--privileged` | Will start a Docker in Docker (DinD) setup inside the container to use docker in an isolated environment. For increased performance mount the Docker directory inside the container to the host IE `-v /home/user/docker-data:/var/lib/docker`. |
|
||||||
| `-v /var/run/docker.sock:/var/run/docker.sock` | Mounts the host's Docker socket to manage host containers from within this container. |
|
| `-v /var/run/docker.sock:/var/run/docker.sock` | Mount in the host level Docker socket to either interact with it via CLI or use Docker enabled applications. |
|
||||||
| `--device /dev/dri:/dev/dri` | Mount a GPU into the container, this can be used in conjunction with the `DRINODE` environment variable to leverage a host video card for GPU accelerated applications. Only **Open Source** drivers are supported IE (Intel,AMDGPU,Radeon,ATI,Nouveau) |
|
| `--device /dev/dri:/dev/dri` | Mount a GPU into the container, this can be used in conjunction with the `DRINODE` environment variable to leverage a host video card for GPU accelerated appplications. Only **Open Source** drivers are supported IE (Intel,AMDGPU,Radeon,ATI,Nouveau) |
|
||||||
|
|
||||||
### Language Support - Internationalization
|
### Language Support - Internationalization
|
||||||
|
|
||||||
To launch the desktop session in a different language, set the `LC_ALL` environment variable. For example:
|
The environment variable `LC_ALL` can be used to start this image in a different language than English simply pass for example to launch the Desktop session in French `LC_ALL=fr_FR.UTF-8`. Some languages like Chinese, Japanese, or Korean will be missing fonts needed to render properly known as cjk fonts, but others may exist and not be installed. We only ensure fonts for Latin characters are present. Fonts can be installed with a mod on startup.
|
||||||
|
|
||||||
* `-e LC_ALL=zh_CN.UTF-8` - Chinese
|
To install cjk fonts on startup as an example pass the environment variables:
|
||||||
* `-e LC_ALL=ja_JP.UTF-8` - Japanese
|
|
||||||
* `-e LC_ALL=ko_KR.UTF-8` - Korean
|
|
||||||
* `-e LC_ALL=ar_AE.UTF-8` - Arabic
|
|
||||||
* `-e LC_ALL=ru_RU.UTF-8` - Russian
|
|
||||||
* `-e LC_ALL=es_MX.UTF-8` - Spanish (Latin America)
|
|
||||||
* `-e LC_ALL=de_DE.UTF-8` - German
|
|
||||||
* `-e LC_ALL=fr_FR.UTF-8` - French
|
|
||||||
* `-e LC_ALL=nl_NL.UTF-8` - Netherlands
|
|
||||||
* `-e LC_ALL=it_IT.UTF-8` - Italian
|
|
||||||
|
|
||||||
### DRI3 GPU Acceleration
|
|
||||||
|
|
||||||
For accelerated apps or games, render devices can be mounted into the container and leveraged by applications using:
|
|
||||||
|
|
||||||
`--device /dev/dri:/dev/dri`
|
|
||||||
|
|
||||||
This feature only supports **Open Source** GPU drivers:
|
|
||||||
|
|
||||||
| Driver | Description |
|
|
||||||
| :----: | --- |
|
|
||||||
| Intel | i965 and i915 drivers for Intel iGPU chipsets |
|
|
||||||
| AMD | AMDGPU, Radeon, and ATI drivers for AMD dedicated or APU chipsets |
|
|
||||||
| NVIDIA | nouveau2 drivers only, closed source NVIDIA drivers lack DRI3 support |
|
|
||||||
|
|
||||||
The `DRINODE` environment variable can be used to point to a specific GPU.
|
|
||||||
|
|
||||||
DRI3 will work on aarch64 given the correct drivers are installed inside the container for your chipset.
|
|
||||||
|
|
||||||
### Nvidia GPU Support
|
|
||||||
|
|
||||||
**Note: Nvidia support is not available for Alpine-based images.**
|
|
||||||
|
|
||||||
Nvidia GPU support is available by leveraging Zink for OpenGL. When a compatible Nvidia GPU is passed through, it will also be **automatically utilized for hardware-accelerated video stream encoding** (using the `x264enc` full-frame profile), significantly reducing CPU load.
|
|
||||||
|
|
||||||
Enable Nvidia support with the following runtime flags:
|
|
||||||
|
|
||||||
| Flag | Description |
|
|
||||||
| :----: | --- |
|
|
||||||
| `--gpus all` | Passes all available host GPUs to the container. This can be filtered to specific GPUs. |
|
|
||||||
| `--runtime nvidia` | Specifies the Nvidia runtime, which provides the necessary drivers and tools from the host. |
|
|
||||||
|
|
||||||
For Docker Compose, you must first configure the Nvidia runtime as the default on the host:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo nvidia-ctk runtime configure --runtime=docker --set-as-default
|
-e DOCKER_MODS=linuxserver/mods:universal-package-install
|
||||||
sudo systemctl restart docker
|
-e INSTALL_PACKAGES=fonts-noto-cjk
|
||||||
|
-e LC_ALL=zh_CN.UTF-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Then, assign the GPU to the service in your `compose.yaml`:
|
The web interface has the option for "IME Input Mode" in Settings which will allow non english characters to be used from a non en_US keyboard on the client. Once enabled it will perform the same as a local Linux installation set to your locale.
|
||||||
|
|
||||||
```
|
### Lossless mode
|
||||||
services:
|
|
||||||
audacity:
|
|
||||||
image: lscr.io/linuxserver/audacity:latest
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
reservations:
|
|
||||||
devices:
|
|
||||||
- driver: nvidia
|
|
||||||
count: 1
|
|
||||||
capabilities: [compute,video,graphics,utility]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Application Management
|
This container is capable of delivering a true lossless image at a high framerate to your web browser by changing the Stream Quality preset to "Lossless", more information [here](https://www.kasmweb.com/docs/latest/how_to/lossless.html#technical-background). In order to use this mode from a non localhost endpoint the HTTPS port on 3001 needs to be used. If using a reverse proxy to port 3000 specific headers will need to be set as outlined [here](https://github.com/linuxserver/docker-baseimage-kasmvnc#lossless).
|
||||||
|
|
||||||
There are two methods for installing applications inside the container: PRoot Apps (recommended for persistence) and Native Apps.
|
|
||||||
|
|
||||||
#### PRoot Apps (Persistent)
|
|
||||||
|
|
||||||
Natively installed packages (e.g., via `apt-get install`) will not persist if the container is recreated. To retain applications and their settings across container updates, we recommend using [proot-apps](https://github.com/linuxserver/proot-apps). These are portable applications installed to the user's persistent `$HOME` directory.
|
|
||||||
|
|
||||||
To install an application, use the command line inside the container:
|
|
||||||
|
|
||||||
```
|
|
||||||
proot-apps install filezilla
|
|
||||||
```
|
|
||||||
|
|
||||||
A list of supported applications is available [here](https://github.com/linuxserver/proot-apps?tab=readme-ov-file#supported-apps).
|
|
||||||
|
|
||||||
#### Native Apps (Non-Persistent)
|
|
||||||
|
|
||||||
You can install packages from the system's native repository using the [universal-package-install](https://github.com/linuxserver/docker-mods/tree/universal-package-install) mod. This method will increase the container's start time and is not persistent. Add the following to your `compose.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
environment:
|
|
||||||
- DOCKER_MODS=linuxserver/mods:universal-package-install
|
|
||||||
- INSTALL_PACKAGES=libfuse2|git|gdb
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
To help you get started creating a container from this image you can either use docker-compose or the docker cli.
|
To help you get started creating a container from this image you can either use docker-compose or the docker cli.
|
||||||
|
|
||||||
>[!NOTE]
|
|
||||||
>Unless a parameter is flaged as 'optional', it is *mandatory* and a value must be provided.
|
|
||||||
|
|
||||||
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
|
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -252,8 +156,8 @@ Containers are configured using parameters passed at runtime (such as those abov
|
||||||
|
|
||||||
| Parameter | Function |
|
| Parameter | Function |
|
||||||
| :----: | --- |
|
| :----: | --- |
|
||||||
| `-p 3000:3000` | Audacity desktop gui HTTP, must be proxied. |
|
| `-p 3000` | Audacity desktop gui. |
|
||||||
| `-p 3001:3001` | Audacity desktop gui HTTPS. |
|
| `-p 3001` | Audacity desktop gui HTTPS. |
|
||||||
| `-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). |
|
||||||
|
@ -411,17 +315,16 @@ docker build \
|
||||||
-t lscr.io/linuxserver/audacity:latest .
|
-t lscr.io/linuxserver/audacity:latest .
|
||||||
```
|
```
|
||||||
|
|
||||||
The ARM variants can be built on x86_64 hardware and vice versa using `lscr.io/linuxserver/qemu-static`
|
The ARM variants can be built on x86_64 hardware using `multiarch/qemu-user-static`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run --rm --privileged lscr.io/linuxserver/qemu-static --reset
|
docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||||
```
|
```
|
||||||
|
|
||||||
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
|
Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64`.
|
||||||
|
|
||||||
## Versions
|
## Versions
|
||||||
|
|
||||||
* **12.07.25:** - Rebase to Selkies, HTTPS IS NOW REQUIRED.
|
|
||||||
* **31.10.24:** - Fix artifact name.
|
* **31.10.24:** - Fix artifact name.
|
||||||
* **19.08.24:** - Rebase to noble.
|
* **19.08.24:** - Rebase to noble.
|
||||||
* **10.02.24:** - Update Readme with new env vars, ingest proper PWA icon, and pre-extract appimage.
|
* **10.02.24:** - Update Readme with new env vars, ingest proper PWA icon, and pre-extract appimage.
|
||||||
|
|
|
@ -19,8 +19,8 @@ repo_vars:
|
||||||
- MULTIARCH = 'false'
|
- MULTIARCH = 'false'
|
||||||
- CI = 'true'
|
- CI = 'true'
|
||||||
- CI_WEB = 'true'
|
- CI_WEB = 'true'
|
||||||
- CI_PORT = '3001'
|
- CI_PORT = '3000'
|
||||||
- CI_SSL = 'true'
|
- CI_SSL = 'false'
|
||||||
- CI_DELAY = '120'
|
- CI_DELAY = '120'
|
||||||
- CI_DOCKERENV = ''
|
- CI_DOCKERENV = ''
|
||||||
- CI_AUTH = ''
|
- CI_AUTH = ''
|
||||||
|
|
2378
package_versions.txt
2378
package_versions.txt
File diff suppressed because it is too large
Load diff
146
readme-vars.yml
146
readme-vars.yml
|
@ -6,104 +6,88 @@ project_url: "https://www.audacityteam.org/"
|
||||||
project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/audacity-logo.png"
|
project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/audacity-logo.png"
|
||||||
project_blurb: "[Audacity]({{ project_url }}) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source."
|
project_blurb: "[Audacity]({{ project_url }}) is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source."
|
||||||
project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}"
|
project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}"
|
||||||
project_categories: "Audio Processing"
|
|
||||||
project_blurb_optional_extras_enabled: false
|
project_blurb_optional_extras_enabled: false
|
||||||
|
|
||||||
# supported architectures
|
# supported architectures
|
||||||
available_architectures:
|
available_architectures:
|
||||||
- {arch: "{{ arch_x86_64 }}", tag: "latest"}
|
- { arch: "{{ arch_x86_64 }}", tag: "latest"}
|
||||||
|
|
||||||
# development version
|
# development version
|
||||||
development_versions: false
|
development_versions: false
|
||||||
|
|
||||||
# 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_vols: true
|
param_usage_include_vols: true
|
||||||
param_volumes:
|
param_volumes:
|
||||||
- {vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/config", desc: "Users home directory in the container, stores program settings and images"}
|
- { vol_path: "/config", vol_host_path: "/path/to/{{ project_name }}/config", desc: "Users home directory in the container, stores program settings and images" }
|
||||||
param_usage_include_ports: true
|
param_usage_include_ports: true
|
||||||
param_ports:
|
param_ports:
|
||||||
- {external_port: "3000", internal_port: "3000", port_desc: "Audacity desktop gui HTTP, must be proxied."}
|
- { external_port: "3000", internal_port: "3000", port_desc: "Audacity desktop gui." }
|
||||||
- {external_port: "3001", internal_port: "3001", port_desc: "Audacity desktop gui HTTPS."}
|
- { external_port: "3001", internal_port: "3001", port_desc: "Audacity desktop gui HTTPS." }
|
||||||
# Selkies blurb settings
|
|
||||||
selkies_blurb: true
|
|
||||||
show_nvidia: true
|
|
||||||
# application setup block
|
# application setup block
|
||||||
app_setup_block_enabled: true
|
app_setup_block_enabled: true
|
||||||
app_setup_block: |
|
app_setup_block: |
|
||||||
The application can be accessed at:
|
The application can be accessed at:
|
||||||
|
|
||||||
|
* http://yourhost:3000/
|
||||||
* https://yourhost:3001/
|
* https://yourhost:3001/
|
||||||
# init diagram
|
|
||||||
init_diagram: |
|
### Options in all KasmVNC based GUI containers
|
||||||
"audacity:latest": {
|
|
||||||
docker-mods
|
This container is based on [Docker Baseimage KasmVNC](https://github.com/linuxserver/docker-baseimage-kasmvnc) which means there are additional environment variables and run configurations to enable or disable specific functionality.
|
||||||
base {
|
|
||||||
fix-attr +\nlegacy cont-init
|
#### Optional environment variables
|
||||||
}
|
|
||||||
docker-mods -> base
|
| Variable | Description |
|
||||||
legacy-services
|
| :----: | --- |
|
||||||
custom services
|
| CUSTOM_PORT | Internal port the container listens on for http if it needs to be swapped from the default 3000. |
|
||||||
init-services -> legacy-services
|
| CUSTOM_HTTPS_PORT | Internal port the container listens on for https if it needs to be swapped from the default 3001. |
|
||||||
init-services -> custom services
|
| CUSTOM_USER | HTTP Basic auth username, abc is default. |
|
||||||
custom services -> legacy-services
|
| PASSWORD | HTTP Basic auth password, abc is default. If unset there will be no auth |
|
||||||
legacy-services -> ci-service-check
|
| SUBFOLDER | Subfolder for the application if running a subfolder reverse proxy, need both slashes IE `/subfolder/` |
|
||||||
init-migrations -> init-adduser
|
| TITLE | The page title displayed on the web browser, default "KasmVNC Client". |
|
||||||
init-os-end -> init-config
|
| FM_HOME | This is the home directory (landing) for the file manager, default "/config". |
|
||||||
init-selkies-end -> init-config
|
| START_DOCKER | If set to false a container with privilege will not automatically start the DinD Docker setup. |
|
||||||
init-config -> init-config-end
|
| DRINODE | If mounting in /dev/dri for [DRI3 GPU Acceleration](https://www.kasmweb.com/kasmvnc/docs/master/gpu_acceleration.html) allows you to specify the device to use IE `/dev/dri/renderD128` |
|
||||||
init-crontab-config -> init-config-end
|
| LC_ALL | Set the Language for the container to run as IE `fr_FR.UTF-8` `ar_AE.UTF-8` |
|
||||||
init-config -> init-crontab-config
|
| NO_DECOR | If set the application will run without window borders for use as a PWA. |
|
||||||
init-mods-end -> init-custom-files
|
| NO_FULL | Do not autmatically fullscreen applications when using openbox. |
|
||||||
init-adduser -> init-device-perms
|
|
||||||
base -> init-envfile
|
#### Optional run configurations
|
||||||
base -> init-migrations
|
|
||||||
init-config-end -> init-mods
|
| Variable | Description |
|
||||||
init-mods-package-install -> init-mods-end
|
| :----: | --- |
|
||||||
init-mods -> init-mods-package-install
|
| `--privileged` | Will start a Docker in Docker (DinD) setup inside the container to use docker in an isolated environment. For increased performance mount the Docker directory inside the container to the host IE `-v /home/user/docker-data:/var/lib/docker`. |
|
||||||
init-selkies -> init-nginx
|
| `-v /var/run/docker.sock:/var/run/docker.sock` | Mount in the host level Docker socket to either interact with it via CLI or use Docker enabled applications. |
|
||||||
init-adduser -> init-os-end
|
| `--device /dev/dri:/dev/dri` | Mount a GPU into the container, this can be used in conjunction with the `DRINODE` environment variable to leverage a host video card for GPU accelerated appplications. Only **Open Source** drivers are supported IE (Intel,AMDGPU,Radeon,ATI,Nouveau) |
|
||||||
init-device-perms -> init-os-end
|
|
||||||
init-envfile -> init-os-end
|
### Language Support - Internationalization
|
||||||
init-os-end -> init-selkies
|
|
||||||
init-nginx -> init-selkies-config
|
The environment variable `LC_ALL` can be used to start this image in a different language than English simply pass for example to launch the Desktop session in French `LC_ALL=fr_FR.UTF-8`. Some languages like Chinese, Japanese, or Korean will be missing fonts needed to render properly known as cjk fonts, but others may exist and not be installed. We only ensure fonts for Latin characters are present. Fonts can be installed with a mod on startup.
|
||||||
init-video -> init-selkies-end
|
|
||||||
init-custom-files -> init-services
|
To install cjk fonts on startup as an example pass the environment variables:
|
||||||
init-selkies-config -> init-video
|
|
||||||
init-services -> svc-cron
|
```
|
||||||
svc-cron -> legacy-services
|
-e DOCKER_MODS=linuxserver/mods:universal-package-install
|
||||||
init-services -> svc-dbus
|
-e INSTALL_PACKAGES=fonts-noto-cjk
|
||||||
svc-xorg -> svc-dbus
|
-e LC_ALL=zh_CN.UTF-8
|
||||||
svc-dbus -> legacy-services
|
```
|
||||||
init-services -> svc-de
|
|
||||||
svc-nginx -> svc-de
|
The web interface has the option for "IME Input Mode" in Settings which will allow non english characters to be used from a non en_US keyboard on the client. Once enabled it will perform the same as a local Linux installation set to your locale.
|
||||||
svc-selkies -> svc-de
|
|
||||||
svc-xorg -> svc-de
|
### Lossless mode
|
||||||
svc-de -> legacy-services
|
|
||||||
init-services -> svc-docker
|
This container is capable of delivering a true lossless image at a high framerate to your web browser by changing the Stream Quality preset to "Lossless", more information [here](https://www.kasmweb.com/docs/latest/how_to/lossless.html#technical-background). In order to use this mode from a non localhost endpoint the HTTPS port on 3001 needs to be used. If using a reverse proxy to port 3000 specific headers will need to be set as outlined [here](https://github.com/linuxserver/docker-baseimage-kasmvnc#lossless).
|
||||||
svc-docker -> legacy-services
|
|
||||||
init-services -> svc-nginx
|
|
||||||
svc-nginx -> legacy-services
|
|
||||||
init-services -> svc-pulseaudio
|
|
||||||
svc-pulseaudio -> legacy-services
|
|
||||||
init-services -> svc-selkies
|
|
||||||
svc-nginx -> svc-selkies
|
|
||||||
svc-pulseaudio -> svc-selkies
|
|
||||||
svc-xorg -> svc-selkies
|
|
||||||
svc-selkies -> legacy-services
|
|
||||||
init-services -> svc-xorg
|
|
||||||
svc-xorg -> legacy-services
|
|
||||||
}
|
|
||||||
Base Images: {
|
|
||||||
"baseimage-selkies:ubuntunoble" <- "baseimage-ubuntu:noble"
|
|
||||||
}
|
|
||||||
"audacity:latest" <- Base Images
|
|
||||||
# changelog
|
# changelog
|
||||||
changelogs:
|
changelogs:
|
||||||
- {date: "12.07.25:", desc: "Rebase to Selkies, HTTPS IS NOW REQUIRED."}
|
- { date: "31.10.24:", desc: "Fix artifact name." }
|
||||||
- {date: "31.10.24:", desc: "Fix artifact name."}
|
- { date: "19.08.24:", desc: "Rebase to noble." }
|
||||||
- {date: "19.08.24:", desc: "Rebase to noble."}
|
- { date: "10.02.24:", desc: "Update Readme with new env vars, ingest proper PWA icon, and pre-extract appimage." }
|
||||||
- {date: "10.02.24:", desc: "Update Readme with new env vars, ingest proper PWA icon, and pre-extract appimage."}
|
- { date: "05.05.23:", desc: "Start Audacity in full screen." }
|
||||||
- {date: "05.05.23:", desc: "Start Audacity in full screen."}
|
- { date: "18.03.23:", desc: "Rebase to KasmVNC base image." }
|
||||||
- {date: "18.03.23:", desc: "Rebase to KasmVNC base image."}
|
- { date: "13.12.22:", desc: "Rebase to Jammy." }
|
||||||
- {date: "13.12.22:", desc: "Rebase to Jammy."}
|
- { date: "14.09.21:", desc: "Use the official appimage, switch to single arch (x86_64). Armhf and aarch64 users can remain on version 3.0.2 but there won't be further updates." }
|
||||||
- {date: "14.09.21:", desc: "Use the official appimage, switch to single arch (x86_64). Armhf and aarch64 users can remain on version 3.0.2 but there won't be further updates."}
|
- { date: "07.04.21:", desc: "Initial release." }
|
||||||
- {date: "07.04.21:", desc: "Initial release."}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue