diff --git a/.editorconfig b/.editorconfig
index a92f7df..5f150f3 100755
--- a/.editorconfig
+++ b/.editorconfig
@@ -15,6 +15,6 @@ trim_trailing_whitespace = false
indent_style = space
indent_size = 2
-[{**.sh,root/etc/cont-init.d/**,root/etc/services.d/**}]
+[{**.sh,root/etc/s6-overlay/s6-rc.d/**,root/etc/cont-init.d/**,root/etc/services.d/**}]
indent_style = space
indent_size = 4
diff --git a/.github/workflows/call_issue_pr_tracker.yml b/.github/workflows/call_issue_pr_tracker.yml
new file mode 100644
index 0000000..2c30784
--- /dev/null
+++ b/.github/workflows/call_issue_pr_tracker.yml
@@ -0,0 +1,16 @@
+name: Issue & PR Tracker
+
+on:
+ issues:
+ types: [opened,reopened,labeled,unlabeled,closed]
+ pull_request_target:
+ types: [opened,reopened,review_requested,review_request_removed,labeled,unlabeled,closed]
+ pull_request_review:
+ types: [submitted,edited,dismissed]
+
+jobs:
+ manage-project:
+ permissions:
+ issues: write
+ uses: linuxserver/github-workflows/.github/workflows/issue-pr-tracker.yml@v1
+ secrets: inherit
diff --git a/.github/workflows/call_issues_cron.yml b/.github/workflows/call_issues_cron.yml
new file mode 100644
index 0000000..f58336b
--- /dev/null
+++ b/.github/workflows/call_issues_cron.yml
@@ -0,0 +1,13 @@
+name: Mark stale issues and pull requests
+on:
+ schedule:
+ - cron: '58 23 * * *'
+ workflow_dispatch:
+
+jobs:
+ stale:
+ permissions:
+ issues: write
+ pull-requests: write
+ uses: linuxserver/github-workflows/.github/workflows/issues-cron.yml@v1
+ secrets: inherit
diff --git a/.github/workflows/external_trigger.yml b/.github/workflows/external_trigger.yml
index e23f7e4..c142c4c 100644
--- a/.github/workflows/external_trigger.yml
+++ b/.github/workflows/external_trigger.yml
@@ -14,11 +14,13 @@ jobs:
run: |
if [ -n "${{ secrets.PAUSE_EXTERNAL_TRIGGER_CURA_MAIN }}" ]; then
echo "**** Github secret PAUSE_EXTERNAL_TRIGGER_CURA_MAIN is set; skipping trigger. ****"
+ echo "Github secret \`PAUSE_EXTERNAL_TRIGGER_CURA_MAIN\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
echo "**** External trigger running off of main branch. To disable this trigger, set a Github secret named \"PAUSE_EXTERNAL_TRIGGER_CURA_MAIN\". ****"
+ echo "External trigger running off of main branch. To disable this trigger, set a Github secret named \`PAUSE_EXTERNAL_TRIGGER_CURA_MAIN\`" >> $GITHUB_STEP_SUMMARY
echo "**** Retrieving external version ****"
- EXT_RELEASE=$(curl -u ${{ secrets.CR_USER }}:${{ secrets.CR_PAT }} -sX GET https://api.github.com/repos/Ultimaker/Cura/releases/latest | jq -r '.tag_name')
+ EXT_RELEASE=$(curl -u "${{ secrets.CR_USER }}:${{ secrets.CR_PAT }}" -sX GET "https://api.github.com/repos/Ultimaker/Cura/releases/latest" | jq -r '. | .tag_name')
if [ -z "${EXT_RELEASE}" ] || [ "${EXT_RELEASE}" == "null" ]; then
echo "**** Can't retrieve external version, exiting ****"
FAILURE_REASON="Can't retrieve external version for cura branch main"
@@ -30,6 +32,7 @@ jobs:
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 ****"
image="linuxserver/cura"
tag="latest"
@@ -60,14 +63,18 @@ jobs:
exit 1
fi
echo "**** Last pushed version: ${IMAGE_VERSION} ****"
+ 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
exit 0
elif [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-cura/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 ****"
+ 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-cura/job/main/buildWithParameters?PACKAGE_CHECK=false \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
@@ -77,6 +84,7 @@ jobs:
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" \
diff --git a/.github/workflows/external_trigger_scheduler.yml b/.github/workflows/external_trigger_scheduler.yml
index 3d9e91e..3b3907d 100644
--- a/.github/workflows/external_trigger_scheduler.yml
+++ b/.github/workflows/external_trigger_scheduler.yml
@@ -2,7 +2,7 @@ name: External Trigger Scheduler
on:
schedule:
- - cron: '34 * * * *'
+ - cron: '42 * * * *'
workflow_dispatch:
jobs:
@@ -17,18 +17,18 @@ jobs:
run: |
echo "**** Branches found: ****"
git for-each-ref --format='%(refname:short)' refs/remotes
- echo "**** Pulling the yq docker image ****"
- docker pull ghcr.io/linuxserver/yq
for br in $(git for-each-ref --format='%(refname:short)' 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-cura/${br}/jenkins-vars.yml \
- | docker run --rm -i --entrypoint yq ghcr.io/linuxserver/yq -r .ls_branch)
- if [ "$br" == "$ls_branch" ]; then
- echo "**** Branch ${br} appears to be live; checking workflow. ****"
+ ls_jenkins_vars=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-cura/${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. ****"
if curl -sfX GET https://raw.githubusercontent.com/linuxserver/docker-cura/${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
curl -iX POST \
-H "Authorization: token ${{ secrets.CR_PAT }}" \
-H "Accept: application/vnd.github.v3+json" \
@@ -36,8 +36,10 @@ jobs:
https://api.github.com/repos/linuxserver/docker-cura/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
fi
else
- echo "**** ${br} appears to be a dev branch; skipping trigger. ****"
+ 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
fi
done
diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml
index 5763f0b..878cefb 100644
--- a/.github/workflows/greetings.yml
+++ b/.github/workflows/greetings.yml
@@ -8,6 +8,6 @@ jobs:
steps:
- uses: actions/first-interaction@v1
with:
- issue-message: 'Thanks for opening your first issue here! Be sure to follow the [bug](https://github.com/linuxserver/docker-cura/blob/main/.github/ISSUE_TEMPLATE/issue.bug.yml) or [feature](https://github.com/linuxserver/docker-cura/blob/main/.github/ISSUE_TEMPLATE/issue.feature.yml) issue templates!'
+ issue-message: 'Thanks for opening your first issue here! Be sure to follow the relevant issue templates, or risk having this issue marked as invalid.'
pr-message: 'Thanks for opening this pull request! Be sure to follow the [pull request template](https://github.com/linuxserver/docker-cura/blob/main/.github/PULL_REQUEST_TEMPLATE.md)!'
repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/package_trigger.yml b/.github/workflows/package_trigger.yml
index 3729d70..1a44fac 100644
--- a/.github/workflows/package_trigger.yml
+++ b/.github/workflows/package_trigger.yml
@@ -14,13 +14,16 @@ jobs:
run: |
if [ -n "${{ secrets.PAUSE_PACKAGE_TRIGGER_CURA_MAIN }}" ]; then
echo "**** Github secret PAUSE_PACKAGE_TRIGGER_CURA_MAIN is set; skipping trigger. ****"
+ echo "Github secret \`PAUSE_PACKAGE_TRIGGER_CURA_MAIN\` is set; skipping trigger." >> $GITHUB_STEP_SUMMARY
exit 0
fi
if [ $(curl -s https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-cura/job/main/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 main branch. To disable, set a Github secret named \"PAUSE_PACKAGE_TRIGGER_CURA_MAIN\". ****"
+ echo "Package trigger running off of main branch. To disable, set a Github secret named \`PAUSE_PACKAGE_TRIGGER_CURA_MAIN\`" >> $GITHUB_STEP_SUMMARY
response=$(curl -iX POST \
https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-cura/job/main/buildWithParameters?PACKAGE_CHECK=true \
--user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} | grep -i location | sed "s|^[L|l]ocation: \(.*\)|\1|")
@@ -30,6 +33,7 @@ jobs:
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" \
diff --git a/.github/workflows/package_trigger_scheduler.yml b/.github/workflows/package_trigger_scheduler.yml
index 938153a..5eb9bae 100644
--- a/.github/workflows/package_trigger_scheduler.yml
+++ b/.github/workflows/package_trigger_scheduler.yml
@@ -2,7 +2,7 @@ name: Package Trigger Scheduler
on:
schedule:
- - cron: '54 8 * * 4'
+ - cron: '22 3 * * 1'
workflow_dispatch:
jobs:
@@ -17,18 +17,16 @@ jobs:
run: |
echo "**** Branches found: ****"
git for-each-ref --format='%(refname:short)' refs/remotes
- echo "**** Pulling the yq docker image ****"
- docker pull ghcr.io/linuxserver/yq
for br in $(git for-each-ref --format='%(refname:short)' 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-cura/${br}/jenkins-vars.yml \
- | docker run --rm -i --entrypoint yq ghcr.io/linuxserver/yq -r .ls_branch)
+ ls_branch=$(curl -sX GET https://raw.githubusercontent.com/linuxserver/docker-cura/${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-cura/${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 }}" \
@@ -38,9 +36,11 @@ jobs:
sleep 30
else
echo "**** Workflow doesn't exist; skipping trigger. ****"
+ echo "Skipping branch ${br} due to no package trigger workflow present." >> $GITHUB_STEP_SUMMARY
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} ****"
diff --git a/.github/workflows/permissions.yml b/.github/workflows/permissions.yml
new file mode 100644
index 0000000..1447bc5
--- /dev/null
+++ b/.github/workflows/permissions.yml
@@ -0,0 +1,10 @@
+name: Permission check
+on:
+ pull_request_target:
+ paths:
+ - '**/run'
+ - '**/finish'
+ - '**/check'
+jobs:
+ permission_check:
+ uses: linuxserver/github-workflows/.github/workflows/init-svc-executable-permissions.yml@v1
diff --git a/Dockerfile b/Dockerfile
index d797d3e..dfdc202 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,33 +1,47 @@
-FROM ghcr.io/linuxserver/baseimage-rdesktop-web:arch
+FROM ghcr.io/linuxserver/baseimage-kasmvnc:debianbookworm
# set version label
ARG BUILD_DATE
ARG VERSION
ARG CURA_VERSION
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
-LABEL maintainer="alex-phillips"
+LABEL maintainer="thelamer"
+
+# title
+ENV TITLE=Cura
RUN \
- echo "**** install cura ****" && \
+ echo "**** install packages ****" && \
+ apt-get update && \
+ DEBIAN_FRONTEND=noninteractive \
+ apt-get install --no-install-recommends -y \
+ firefox-esr && \
+ echo "**** install cura from appimage ****" && \
if [ -z ${CURA_VERSION+x} ]; then \
CURA_VERSION=$(curl -sX GET "https://api.github.com/repos/Ultimaker/Cura/releases/latest" \
| awk '/tag_name/{print $4;exit}' FS='[""]'); \
fi && \
- mkdir -p /app/cura/ && \
+ cd /tmp && \
curl -o \
- /app/cura/cura -L \
- "https://github.com/Ultimaker/Cura/releases/download/${CURA_VERSION}/Ultimaker-Cura-${CURA_VERSION}-linux-modern.AppImage" && \
- chmod +x /app/cura/cura && \
+ /tmp/cura.app -L \
+ "https://github.com/Ultimaker/Cura/releases/download/${CURA_VERSION}/UltiMaker-Cura-${CURA_VERSION}-linux-X64.AppImage" && \
+ chmod +x /tmp/cura.app && \
+ ./cura.app --appimage-extract && \
+ mv squashfs-root /opt/cura && \
+ sed -i 's/QT_QPA_PLATFORMTHEME=xdgdesktopportal/QT_QPA_PLATFORMTHEME=gtk3/' /opt/cura/AppRun.env && \
+ sed -i 's|| \n yes\n \n|' /etc/xdg/openbox/rc.xml && \
echo "**** cleanup ****" && \
+ apt-get autoclean && \
rm -rf \
- /tmp/* \
+ /config/.cache \
+ /config/.launchpadlib \
/var/lib/apt/lists/* \
- /var/tmp/*
+ /var/tmp/* \
+ /tmp/*
# add local files
COPY /root /
# ports and volumes
EXPOSE 3000
-
VOLUME /config
diff --git a/Jenkinsfile b/Jenkinsfile
index d141b80..14aad46 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -16,7 +16,8 @@ pipeline {
GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab')
GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0')
GITLAB_NAMESPACE=credentials('gitlab-namespace-id')
- SCARF_TOKEN=credentials('scarf_api_key')
+ EXT_USER = 'Ultimaker'
+ EXT_REPO = 'Cura'
BUILD_VERSION_ARG = 'CURA_VERSION'
LS_USER = 'linuxserver'
LS_REPO = 'docker-cura'
@@ -24,7 +25,7 @@ pipeline {
DOCKERHUB_IMAGE = 'linuxserver/cura'
DEV_DOCKERHUB_IMAGE = 'lsiodev/cura'
PR_DOCKERHUB_IMAGE = 'lspipepr/cura'
- DIST_IMAGE = 'arch'
+ DIST_IMAGE = 'ubuntu'
MULTIARCH = 'false'
CI = 'true'
CI_WEB = 'true'
@@ -39,10 +40,16 @@ pipeline {
// Setup all the basic environment variables needed for the build
stage("Set ENV Variables base"){
steps{
+ sh '''#! /bin/bash
+ containers=$(docker ps -aq)
+ if [[ -n "${containers}" ]]; then
+ docker stop ${containers}
+ fi
+ docker system prune -af --volumes || : '''
script{
env.EXIT_STATUS = ''
env.LS_RELEASE = sh(
- script: '''docker run --rm ghcr.io/linuxserver/alexeiled-skopeo sh -c 'skopeo inspect docker://docker.io/'${DOCKERHUB_IMAGE}':latest 2>/dev/null' | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''',
+ script: '''docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''',
returnStdout: true).trim()
env.LS_RELEASE_NOTES = sh(
script: '''cat readme-vars.yml | awk -F \\" '/date: "[0-9][0-9].[0-9][0-9].[0-9][0-9]:/ {print $4;exit;}' | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''',
@@ -56,7 +63,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/stale.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
+ env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.yml ./.github/ISSUE_TEMPLATE/issue.feature.yml ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/call_issue_pr_tracker.yml ./.github/workflows/call_issues_cron.yml ./.github/workflows/permissions.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
}
script{
env.LS_RELEASE_NUMBER = sh(
@@ -99,16 +106,23 @@ pipeline {
/* ########################
External Release Tagging
######################## */
- // If this is a custom command to determine version use that command
- stage("Set tag custom bash"){
- steps{
- script{
- env.EXT_RELEASE = sh(
- script: ''' curl -sX GET https://api.github.com/repos/Ultimaker/Cura/releases/latest | jq -r '.tag_name' ''',
- returnStdout: true).trim()
- env.RELEASE_LINK = 'custom_command'
- }
- }
+ // If this is a stable github release use the latest endpoint from github to determine the ext tag
+ stage("Set ENV github_stable"){
+ steps{
+ script{
+ env.EXT_RELEASE = sh(
+ script: '''curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq -r '. | .tag_name' ''',
+ returnStdout: true).trim()
+ }
+ }
+ }
+ // If this is a stable or devel github release generate the link for the build message
+ stage("Set ENV github_link"){
+ steps{
+ script{
+ env.RELEASE_LINK = 'https://github.com/' + env.EXT_USER + '/' + env.EXT_REPO + '/releases/tag/' + env.EXT_RELEASE
+ }
+ }
}
// Sanitize the release tag and strip illegal docker or github characters
stage("Sanitize tag"){
@@ -157,7 +171,7 @@ pipeline {
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/' + env.CONTAINER_NAME
env.QUAYIMAGE = 'quay.io/linuxserver.io/' + env.CONTAINER_NAME
if (env.MULTIARCH == 'true') {
- env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
+ env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
} else {
env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
}
@@ -180,7 +194,7 @@ pipeline {
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lsiodev-' + env.CONTAINER_NAME
env.QUAYIMAGE = 'quay.io/linuxserver.io/lsiodev-' + env.CONTAINER_NAME
if (env.MULTIARCH == 'true') {
- env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
+ env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
} else {
env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
}
@@ -203,12 +217,12 @@ pipeline {
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lspipepr-' + env.CONTAINER_NAME
env.QUAYIMAGE = 'quay.io/linuxserver.io/lspipepr-' + env.CONTAINER_NAME
if (env.MULTIARCH == 'true') {
- env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
+ env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
} else {
- env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
+ env.CI_TAGS = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
}
- env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
- env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
+ env.VERSION_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
+ env.META_TAG = env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '-pr-' + env.PULL_REQUEST
env.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.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/'
@@ -228,19 +242,16 @@ pipeline {
script{
env.SHELLCHECK_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/shellcheck-result.xml'
}
- sh '''curl -sL https://raw.githubusercontent.com/linuxserver/docker-shellcheck/master/checkrun.sh | /bin/bash'''
+ sh '''curl -sL https://raw.githubusercontent.com/linuxserver/docker-jenkins-builder/master/checkrun.sh | /bin/bash'''
sh '''#! /bin/bash
- set -e
- docker pull ghcr.io/linuxserver/lsiodev-spaces-file-upload:latest
docker run --rm \
- -e DESTINATION=\"${IMAGE}/${META_TAG}/shellcheck-result.xml\" \
- -e FILE_NAME="shellcheck-result.xml" \
- -e MIMETYPE="text/xml" \
- -v ${WORKSPACE}:/mnt \
- -e SECRET_KEY=\"${S3_SECRET}\" \
- -e ACCESS_KEY=\"${S3_KEY}\" \
- -t ghcr.io/linuxserver/lsiodev-spaces-file-upload:latest \
- python /upload.py'''
+ -v ${WORKSPACE}:/mnt \
+ -e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \
+ -e AWS_SECRET_ACCESS_KEY=\"${S3_SECRET}\" \
+ ghcr.io/linuxserver/baseimage-alpine:3.17 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
+ apk add --no-cache py3-pip && \
+ pip install s3cmd && \
+ s3cmd put --no-preserve --acl-public -m text/xml /mnt/shellcheck-result.xml s3://ci-tests.linuxserver.io/${IMAGE}/${META_TAG}/shellcheck-result.xml" || :'''
}
}
}
@@ -277,7 +288,7 @@ pipeline {
echo "Jenkinsfile is up to date."
fi
# Stage 2 - Delete old templates
- OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md\n.github/ISSUE_TEMPLATE/issue.bug.md\n.github/ISSUE_TEMPLATE/issue.feature.md"
+ OLD_TEMPLATES=".github/ISSUE_TEMPLATE.md .github/ISSUE_TEMPLATE/issue.bug.md .github/ISSUE_TEMPLATE/issue.feature.md .github/workflows/call_invalid_helper.yml .github/workflows/stale.yml Dockerfile.armhf"
for i in ${OLD_TEMPLATES}; do
if [[ -f "${i}" ]]; then
TEMPLATES_TO_DELETE="${i} ${TEMPLATES_TO_DELETE}"
@@ -294,7 +305,7 @@ pipeline {
git commit -m 'Bot Updating Templated Files'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all
echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
- echo "Deleting old templates"
+ echo "Deleting old and deprecated templates"
rm -Rf ${TEMPDIR}
exit 0
else
@@ -313,24 +324,25 @@ pipeline {
mkdir -p ${TEMPDIR}/repo/${LS_REPO}/.github/workflows
mkdir -p ${TEMPDIR}/repo/${LS_REPO}/.github/ISSUE_TEMPLATE
cp --parents ${TEMPLATED_FILES} ${TEMPDIR}/repo/${LS_REPO}/ || :
+ cp --parents readme-vars.yml ${TEMPDIR}/repo/${LS_REPO}/ || :
cd ${TEMPDIR}/repo/${LS_REPO}/
if ! grep -q '.jenkins-external' .gitignore 2>/dev/null; then
echo ".jenkins-external" >> .gitignore
git add .gitignore
fi
- git add ${TEMPLATED_FILES}
+ git add readme-vars.yml ${TEMPLATED_FILES}
git commit -m 'Bot Updating Templated Files'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/${LS_USER}/${LS_REPO}.git --all
echo "true" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
else
echo "false" > /tmp/${COMMIT_SHA}-${BUILD_NUMBER}
fi
- mkdir -p ${TEMPDIR}/gitbook
- git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/gitbook/docker-documentation
- if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md) || ("$(md5sum ${TEMPDIR}/gitbook/docker-documentation/images/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md | awk '{ print $1 }')") ]]; then
- cp ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/docker-${CONTAINER_NAME}.md ${TEMPDIR}/gitbook/docker-documentation/images/
- cd ${TEMPDIR}/gitbook/docker-documentation/
- git add images/docker-${CONTAINER_NAME}.md
+ mkdir -p ${TEMPDIR}/docs
+ git clone https://github.com/linuxserver/docker-documentation.git ${TEMPDIR}/docs/docker-documentation
+ if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -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
+ git add docs/images/docker-${CONTAINER_NAME}.md
git commit -m 'Bot Updating Documentation'
git push https://LinuxServer-CI:${GITHUB_TOKEN}@github.com/linuxserver/docker-documentation.git --all
fi
@@ -339,6 +351,8 @@ pipeline {
git clone 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
+ sed -i "s|master/linuxserver.io/img/linuxserver-ls-logo.png|master/linuxserver.io/img/${CONTAINER_NAME}-icon.png|" ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml
fi
if [[ ("${BRANCH_NAME}" == "master") || ("${BRANCH_NAME}" == "main") ]] && [[ (! -f ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml) || ("$(md5sum ${TEMPDIR}/unraid/templates/unraid/${CONTAINER_NAME}.xml | awk '{ print $1 }')" != "$(md5sum ${TEMPDIR}/docker-${CONTAINER_NAME}/.jenkins-external/${CONTAINER_NAME}.xml | awk '{ print $1 }')") ]]; then
cd ${TEMPDIR}/unraid/templates/
@@ -379,6 +393,26 @@ pipeline {
}
}
}
+ // If this is a main build check the S6 service file perms
+ stage("Check S6 Service file Permissions"){
+ when {
+ branch "main"
+ environment name: 'CHANGE_ID', value: ''
+ environment name: 'EXIT_STATUS', value: ''
+ }
+ steps {
+ script{
+ sh '''#! /bin/bash
+ WRONG_PERM=$(find ./ -path "./.git" -prune -o \\( -name "run" -o -name "finish" -o -name "check" \\) -not -perm -u=x,g=x,o=x -print)
+ if [[ -n "${WRONG_PERM}" ]]; then
+ echo "The following S6 service files are missing the executable bit; canceling the faulty build: ${WRONG_PERM}"
+ exit 1
+ else
+ echo "S6 service file perms look good."
+ fi '''
+ }
+ }
+ }
/* #######################
GitLab Mirroring
####################### */
@@ -399,36 +433,6 @@ pipeline {
"visibility":"public"}' '''
}
}
- /* #######################
- Scarf.sh package registry
- ####################### */
- // Add package to Scarf.sh and set permissions
- stage("Scarf.sh package registry"){
- when {
- branch "main"
- environment name: 'EXIT_STATUS', value: ''
- }
- steps{
- sh '''#! /bin/bash
- set -e
- PACKAGE_UUID=$(curl -X GET -H "Authorization: Bearer ${SCARF_TOKEN}" https://scarf.sh/api/v1/organizations/linuxserver-ci/packages | jq -r '.[] | select(.name=="linuxserver/cura") | .uuid')
- if [ -z "${PACKAGE_UUID}" ]; then
- echo "Adding package to Scarf.sh"
- curl -sX POST https://scarf.sh/api/v1/organizations/linuxserver-ci/packages \
- -H "Authorization: Bearer ${SCARF_TOKEN}" \
- -H "Content-Type: application/json" \
- -d '{"name":"linuxserver/cura",\
- "shortDescription":"example description",\
- "libraryType":"docker",\
- "website":"https://github.com/linuxserver/docker-cura",\
- "backendUrl":"https://ghcr.io/linuxserver/cura",\
- "publicUrl":"https://lscr.io/linuxserver/cura"}' || :
- else
- echo "Package already exists on Scarf.sh"
- fi
- '''
- }
- }
/* ###############
Build Container
############### */
@@ -442,7 +446,8 @@ pipeline {
}
steps {
echo "Running on node: ${NODE_NAME}"
- sh "docker build \
+ sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile"
+ sh "docker buildx build \
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-cura/packages\" \
@@ -454,8 +459,8 @@ pipeline {
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Cura\" \
- --label \"org.opencontainers.image.description=[Ultimaker Cura](https://ultimaker.com/software/ultimaker-cura) is a state-of-the-art slicer app to prepare your 3D models for your 3D printer.\" \
- --no-cache --pull -t ${IMAGE}:${META_TAG} \
+ --label \"org.opencontainers.image.description=[UltiMaker Cura](https://ultimaker.com/software/ultimaker-cura/) is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results.\" \
+ --no-cache --pull -t ${IMAGE}:${META_TAG} --platform=linux/amd64 \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
}
}
@@ -472,7 +477,8 @@ pipeline {
stage('Build X86') {
steps {
echo "Running on node: ${NODE_NAME}"
- sh "docker build \
+ sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile"
+ sh "docker buildx build \
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-cura/packages\" \
@@ -484,45 +490,11 @@ pipeline {
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Cura\" \
- --label \"org.opencontainers.image.description=[Ultimaker Cura](https://ultimaker.com/software/ultimaker-cura) is a state-of-the-art slicer app to prepare your 3D models for your 3D printer.\" \
- --no-cache --pull -t ${IMAGE}:amd64-${META_TAG} \
+ --label \"org.opencontainers.image.description=[UltiMaker Cura](https://ultimaker.com/software/ultimaker-cura/) is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results.\" \
+ --no-cache --pull -t ${IMAGE}:amd64-${META_TAG} --platform=linux/amd64 \
--build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
}
}
- stage('Build ARMHF') {
- agent {
- label 'ARMHF'
- }
- steps {
- 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 "docker build \
- --label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
- --label \"org.opencontainers.image.authors=linuxserver.io\" \
- --label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-cura/packages\" \
- --label \"org.opencontainers.image.documentation=https://docs.linuxserver.io/images/docker-cura\" \
- --label \"org.opencontainers.image.source=https://github.com/linuxserver/docker-cura\" \
- --label \"org.opencontainers.image.version=${EXT_RELEASE_CLEAN}-ls${LS_TAG_NUMBER}\" \
- --label \"org.opencontainers.image.revision=${COMMIT_SHA}\" \
- --label \"org.opencontainers.image.vendor=linuxserver.io\" \
- --label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
- --label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
- --label \"org.opencontainers.image.title=Cura\" \
- --label \"org.opencontainers.image.description=[Ultimaker Cura](https://ultimaker.com/software/ultimaker-cura) is a state-of-the-art slicer app to prepare your 3D models for your 3D printer.\" \
- --no-cache --pull -f Dockerfile.armhf -t ${IMAGE}:arm32v7-${META_TAG} \
- --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${VERSION_TAG}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
- sh "docker tag ${IMAGE}:arm32v7-${META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}"
- retry(5) {
- sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}"
- }
- sh '''docker rmi \
- ${IMAGE}:arm32v7-${META_TAG} \
- ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} || :'''
- }
- }
stage('Build ARM64') {
agent {
label 'ARM64'
@@ -533,7 +505,8 @@ pipeline {
sh '''#! /bin/bash
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
'''
- sh "docker build \
+ sh "sed -r -i 's|(^FROM .*)|\\1\\n\\nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64"
+ sh "docker buildx build \
--label \"org.opencontainers.image.created=${GITHUB_DATE}\" \
--label \"org.opencontainers.image.authors=linuxserver.io\" \
--label \"org.opencontainers.image.url=https://github.com/linuxserver/docker-cura/packages\" \
@@ -545,16 +518,19 @@ pipeline {
--label \"org.opencontainers.image.licenses=GPL-3.0-only\" \
--label \"org.opencontainers.image.ref.name=${COMMIT_SHA}\" \
--label \"org.opencontainers.image.title=Cura\" \
- --label \"org.opencontainers.image.description=[Ultimaker Cura](https://ultimaker.com/software/ultimaker-cura) is a state-of-the-art slicer app to prepare your 3D models for your 3D printer.\" \
- --no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} \
+ --label \"org.opencontainers.image.description=[UltiMaker Cura](https://ultimaker.com/software/ultimaker-cura/) is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results.\" \
+ --no-cache --pull -f Dockerfile.aarch64 -t ${IMAGE}:arm64v8-${META_TAG} --platform=linux/arm64 \
--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) {
sh "docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}"
}
- sh '''docker rmi \
- ${IMAGE}:arm64v8-${META_TAG} \
- ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || :'''
+ sh '''#! /bin/bash
+ containers=$(docker ps -aq)
+ if [[ -n "${containers}" ]]; then
+ docker stop ${containers}
+ fi
+ docker system prune -af --volumes || : '''
}
}
}
@@ -575,26 +551,12 @@ pipeline {
else
LOCAL_CONTAINER=${IMAGE}:${META_TAG}
fi
- if [ "${DIST_IMAGE}" == "alpine" ]; then
- docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
- apk info -v > /tmp/package_versions.txt && \
- sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
- chmod 777 /tmp/package_versions.txt'
- elif [ "${DIST_IMAGE}" == "ubuntu" ]; then
- docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
- apt list -qq --installed | sed "s#/.*now ##g" | cut -d" " -f1 > /tmp/package_versions.txt && \
- sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
- chmod 777 /tmp/package_versions.txt'
- elif [ "${DIST_IMAGE}" == "fedora" ]; then
- docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
- rpm -qa > /tmp/package_versions.txt && \
- sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
- chmod 777 /tmp/package_versions.txt'
- elif [ "${DIST_IMAGE}" == "arch" ]; then
- docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
- pacman -Q > /tmp/package_versions.txt && \
- chmod 777 /tmp/package_versions.txt'
- fi
+ touch ${TEMPDIR}/package_versions.txt
+ docker run --rm \
+ -v /var/run/docker.sock:/var/run/docker.sock:ro \
+ -v ${TEMPDIR}:/tmp \
+ ghcr.io/anchore/syft:latest \
+ ${LOCAL_CONTAINER} -o table=/tmp/package_versions.txt
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"
if [ "${NEW_PACKAGE_TAG}" != "${PACKAGE_TAG}" ]; then
@@ -629,13 +591,6 @@ pipeline {
environment name: 'EXIT_STATUS', value: ''
}
steps {
- sh '''#! /bin/bash
- echo "Packages were updated. Cleaning up the image and exiting."
- if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
- docker rmi ${IMAGE}:amd64-${META_TAG}
- else
- docker rmi ${IMAGE}:${META_TAG}
- fi'''
script{
env.EXIT_STATUS = 'ABORTED'
}
@@ -653,13 +608,6 @@ pipeline {
}
}
steps {
- sh '''#! /bin/bash
- echo "There are no package updates. Cleaning up the image and exiting."
- if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
- docker rmi ${IMAGE}:amd64-${META_TAG}
- else
- docker rmi ${IMAGE}:${META_TAG}
- fi'''
script{
env.EXIT_STATUS = 'ABORTED'
}
@@ -681,14 +629,13 @@ pipeline {
]) {
script{
env.CI_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/index.html'
+ env.CI_JSON_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/report.json'
}
sh '''#! /bin/bash
set -e
docker pull ghcr.io/linuxserver/ci:latest
if [ "${MULTIARCH}" == "true" ]; then
- docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
- docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG}
docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
fi
docker run --rm \
@@ -707,8 +654,6 @@ pipeline {
-e WEB_SCREENSHOT=\"${CI_WEB}\" \
-e WEB_AUTH=\"${CI_AUTH}\" \
-e WEB_PATH=\"${CI_WEBPATH}\" \
- -e DO_REGION="ams3" \
- -e DO_BUCKET="lsio-ci" \
-t ghcr.io/linuxserver/ci:latest \
python3 test_build.py'''
}
@@ -761,17 +706,6 @@ pipeline {
done
'''
}
- sh '''#! /bin/bash
- for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
- docker rmi \
- ${DELETEIMAGE}:${META_TAG} \
- ${DELETEIMAGE}:${EXT_RELEASE_TAG} \
- ${DELETEIMAGE}:latest || :
- if [ -n "${SEMVER}" ]; then
- docker rmi ${DELETEIMAGE}:${SEMVER} || :
- fi
- done
- '''
}
}
}
@@ -804,58 +738,54 @@ 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:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
- docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG}
docker tag ghcr.io/linuxserver/lsiodev-buildcache: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 ${IMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${META_TAG}
- docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-latest
- docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-latest
- docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-latest
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
- docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${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}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${SEMVER}
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
- docker push ${MANIFESTIMAGE}:arm32v7-${META_TAG}
- docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
- docker push ${MANIFESTIMAGE}:amd64-latest
- docker push ${MANIFESTIMAGE}:arm32v7-latest
- docker push ${MANIFESTIMAGE}:arm64v8-latest
docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
- docker push ${MANIFESTIMAGE}:arm32v7-${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}:arm32v7-${SEMVER}
docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
fi
docker manifest push --purge ${MANIFESTIMAGE}:latest || :
- docker manifest create ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm32v7-latest ${MANIFESTIMAGE}:arm64v8-latest
- docker manifest annotate ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:arm32v7-latest --os linux --arch arm
+ docker manifest create ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
docker manifest annotate ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:arm64v8-latest --os linux --arch arm64 --variant v8
docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG} || :
- docker manifest create ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
- docker manifest annotate ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:arm32v7-${META_TAG} --os linux --arch arm
+ docker manifest create ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
docker manifest annotate ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} --os linux --arch arm64 --variant v8
docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} || :
- docker manifest create ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
- docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} --os linux --arch arm
+ docker manifest create ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} --os linux --arch arm64 --variant v8
if [ -n "${SEMVER}" ]; then
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER} || :
- docker manifest create ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm32v7-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
- docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm32v7-${SEMVER} --os linux --arch arm
+ docker manifest create ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} --os linux --arch arm64 --variant v8
fi
+ token=$(curl -sX GET "https://ghcr.io/token?scope=repository%3Alinuxserver%2F${CONTAINER_NAME}%3Apull" | jq -r '.token')
+ digest=$(curl -s \
+ --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
+ --header "Authorization: Bearer ${token}" \
+ "https://ghcr.io/v2/linuxserver/${CONTAINER_NAME}/manifests/arm32v7-latest")
+ if [[ $(echo "$digest" | jq -r '.layers') != "null" ]]; then
+ docker manifest push --purge ${MANIFESTIMAGE}:arm32v7-latest || :
+ docker manifest create ${MANIFESTIMAGE}:arm32v7-latest ${MANIFESTIMAGE}:amd64-latest
+ docker manifest push --purge ${MANIFESTIMAGE}:arm32v7-latest
+ fi
docker manifest push --purge ${MANIFESTIMAGE}:latest
docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG}
docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG}
@@ -865,29 +795,6 @@ pipeline {
done
'''
}
- sh '''#! /bin/bash
- for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
- docker rmi \
- ${DELETEIMAGE}:amd64-${META_TAG} \
- ${DELETEIMAGE}:amd64-latest \
- ${DELETEIMAGE}:amd64-${EXT_RELEASE_TAG} \
- ${DELETEIMAGE}:arm32v7-${META_TAG} \
- ${DELETEIMAGE}:arm32v7-latest \
- ${DELETEIMAGE}:arm32v7-${EXT_RELEASE_TAG} \
- ${DELETEIMAGE}:arm64v8-${META_TAG} \
- ${DELETEIMAGE}:arm64v8-latest \
- ${DELETEIMAGE}:arm64v8-${EXT_RELEASE_TAG} || :
- if [ -n "${SEMVER}" ]; then
- docker rmi \
- ${DELETEIMAGE}:amd64-${SEMVER} \
- ${DELETEIMAGE}:arm32v7-${SEMVER} \
- ${DELETEIMAGE}:arm64v8-${SEMVER} || :
- fi
- done
- docker rmi \
- ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} \
- ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || :
- '''
}
}
}
@@ -911,16 +818,51 @@ pipeline {
"tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
echo "Pushing New release for Tag"
sh '''#! /bin/bash
- echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json
+ curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq '. |.body' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json
echo '{"tag_name":"'${META_TAG}'",\
"target_commitish": "main",\
"name": "'${META_TAG}'",\
- "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**Remote Changes:**\\n\\n' > start
+ "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n\\n**'${EXT_REPO}' Changes:**\\n\\n' > start
printf '","draft": false,"prerelease": false}' >> releasebody.json
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'''
}
}
+ // Add protection to the release branch
+ stage('Github-Release-Branch-Protection') {
+ when {
+ branch "main"
+ environment name: 'CHANGE_ID', value: ''
+ environment name: 'EXIT_STATUS', value: ''
+ }
+ steps {
+ echo "Setting up protection for release branch main"
+ sh '''#! /bin/bash
+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X PUT https://api.github.com/repos/${LS_USER}/${LS_REPO}/branches/main/protection \
+ -d $(jq -c . << EOF
+ {
+ "required_status_checks": null,
+ "enforce_admins": false,
+ "required_pull_request_reviews": {
+ "dismiss_stale_reviews": false,
+ "require_code_owner_reviews": false,
+ "require_last_push_approval": false,
+ "required_approving_review_count": 1
+ },
+ "restrictions": null,
+ "required_linear_history": false,
+ "allow_force_pushes": false,
+ "allow_deletions": false,
+ "block_creations": false,
+ "required_conversation_resolution": true,
+ "lock_branch": false,
+ "allow_fork_syncing": false,
+ "required_signatures": false
+ }
+EOF
+ ) '''
+ }
+ }
// Use helper container to sync the current README on master to the dockerhub endpoint
stage('Sync-README') {
when {
@@ -958,12 +900,78 @@ pipeline {
stage('Pull Request Comment') {
when {
not {environment name: 'CHANGE_ID', value: ''}
- environment name: 'CI', value: 'true'
environment name: 'EXIT_STATUS', value: ''
}
steps {
- sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/issues/${PULL_REQUEST}/comments \
- -d '{"body": "I am a bot, here are the test results for this PR: \\n'${CI_URL}' \\n'${SHELLCHECK_URL}'"}' '''
+ sh '''#! /bin/bash
+ # Function to retrieve JSON data from URL
+ get_json() {
+ local url="$1"
+ local response=$(curl -s "$url")
+ if [ $? -ne 0 ]; then
+ echo "Failed to retrieve JSON data from $url"
+ return 1
+ fi
+ local json=$(echo "$response" | jq .)
+ if [ $? -ne 0 ]; then
+ echo "Failed to parse JSON data from $url"
+ return 1
+ fi
+ echo "$json"
+ }
+
+ build_table() {
+ local data="$1"
+
+ # Get the keys in the JSON data
+ local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]')
+
+ # Check if keys are empty
+ if [ -z "$keys" ]; then
+ echo "JSON report data does not contain any keys or the report does not exist."
+ return 1
+ fi
+
+ # Build table header
+ local header="| Tag | Passed |\\n| --- | --- |\\n"
+
+ # Loop through the JSON data to build the table rows
+ local rows=""
+ for build in $keys; do
+ local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success")
+ if [ "$status" = "true" ]; then
+ status="✅"
+ else
+ status="❌"
+ fi
+ local row="| "$build" | "$status" |\\n"
+ rows="${rows}${row}"
+ done
+
+ local table="${header}${rows}"
+ local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g')
+ echo "$escaped_table"
+ }
+
+ if [[ "${CI}" = "true" ]]; then
+ # Retrieve JSON data from URL
+ data=$(get_json "$CI_JSON_URL")
+ # Create table from JSON data
+ table=$(build_table "$data")
+ echo -e "$table"
+
+ curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
+ -H "Accept: application/vnd.github.v3+json" \
+ "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \
+ -d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}"
+ else
+ curl -X POST -H "Authorization: token $GITHUB_TOKEN" \
+ -H "Accept: application/vnd.github.v3+json" \
+ "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \
+ -d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}"
+ fi
+ '''
+
}
}
}
@@ -977,18 +985,26 @@ pipeline {
sh 'echo "build aborted"'
}
else if (currentBuild.currentResult == "SUCCESS"){
- sh ''' curl -X POST -H "Content-Type: application/json" --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\
+ 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://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\
+ 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"}],\
"username": "Jenkins"}' ${BUILDS_DISCORD} '''
}
}
}
cleanup {
+ sh '''#! /bin/bash
+ echo "Performing docker system prune!!"
+ containers=$(docker ps -aq)
+ if [[ -n "${containers}" ]]; then
+ docker stop ${containers}
+ fi
+ docker system prune -af --volumes || :
+ '''
cleanWs()
}
}
diff --git a/README.md b/README.md
index 0f79f50..9e596d5 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
-
-
-
+
+
[](https://linuxserver.io)
[](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!")
@@ -40,13 +39,13 @@ Find us at:
[](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-cura/job/main/)
[](https://ci-tests.linuxserver.io/linuxserver/cura/latest/index.html)
-[Ultimaker Cura](https://ultimaker.com/software/ultimaker-cura) is a state-of-the-art slicer app to prepare your 3D models for your 3D printer.
+[UltiMaker Cura](https://ultimaker.com/software/ultimaker-cura/) is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results.
-[](https://ultimaker.com/software/ultimaker-cura)
+[](https://ultimaker.com/software/ultimaker-cura/)
## Supported Architectures
-We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-2.md#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/).
+We utilise the docker manifest for multi-platform awareness. More information is available from docker [here](https://distribution.github.io/distribution/spec/manifest-v2-2/#manifest-list) and our announcement [here](https://blog.linuxserver.io/2019/02/21/the-lsio-pipeline-project/).
Simply pulling `lscr.io/linuxserver/cura:latest` should retrieve the correct image for your arch, but you can also pull specific arch images via tags.
@@ -56,21 +55,48 @@ The architectures supported by this image are:
| :----: | :----: | ---- |
| x86-64 | ✅ | amd64-\ |
| arm64 | ❌ | |
-| armhf| ❌ | |
+| armhf | ❌ | |
## Application Setup
The application can be accessed at:
* http://yourhost:3000/
+* https://yourhost:3001/
-By default the user/pass is abc/abc, if you change your password or want to login manually to the GUI session for any reason use the following link:
+### Options in all KasmVNC based GUI containers
-* http://yourhost:3000/?login=true
+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.
+
+#### Optional environment variables
+
+| Variable | Description |
+| :----: | --- |
+| CUSTOM_PORT | Internal port the container listens on for http if it needs to be swapped from the default 3000. |
+| CUSTOM_HTTPS_PORT | Internal port the container listens on for https if it needs to be swapped from the default 3001. |
+| CUSTOM_USER | HTTP Basic auth username, abc is default. |
+| PASSWORD | HTTP Basic auth password, abc is default. If unset there will be no auth |
+| SUBFOLDER | Subfolder for the application if running a subfolder reverse proxy, need both slashes IE `/subfolder/` |
+| TITLE | The page title displayed on the web browser, default "KasmVNC Client". |
+| FM_HOME | This is the home directory (landing) for the file manager, default "/config". |
+| START_DOCKER | If set to false a container with privilege will not automatically start the DinD Docker setup. |
+| 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` |
+
+#### Optional run configurations
+
+| Variable | Description |
+| :----: | --- |
+| `--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` | 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 appplications. Only **Open Source** drivers are supported IE (Intel,AMDGPU,Radeon,ATI,Nouveau) |
+
+### Lossless mode
+
+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).
## Usage
-Here are some example snippets to help you get started creating a container.
+To help you get started creating a container from this image you can either use docker-compose or the docker cli.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
@@ -81,14 +107,17 @@ services:
cura:
image: lscr.io/linuxserver/cura:latest
container_name: cura
+ security_opt:
+ - seccomp:unconfined #optional
environment:
- PUID=1000
- PGID=1000
- - TZ=Europe/London
+ - TZ=Etc/UTC
volumes:
- /path/to/config:/config
ports:
- 3000:3000
+ - 3001:3001
restart: unless-stopped
```
@@ -97,10 +126,12 @@ services:
```bash
docker run -d \
--name=cura \
+ --security-opt seccomp=unconfined `#optional` \
-e PUID=1000 \
-e PGID=1000 \
- -e TZ=Europe/London \
+ -e TZ=Etc/UTC \
-p 3000:3000 \
+ -p 3001:3001 \
-v /path/to/config:/config \
--restart unless-stopped \
lscr.io/linuxserver/cura:latest
@@ -108,15 +139,17 @@ docker run -d \
## Parameters
-Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `:` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container.
+Containers are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `:` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container.
| Parameter | Function |
| :----: | --- |
| `-p 3000` | Cura desktop gui. |
+| `-p 3001` | Cura desktop gui HTTPS. |
| `-e PUID=1000` | for UserID - see below for explanation |
| `-e PGID=1000` | for GroupID - see below for explanation |
-| `-e TZ=Europe/London` | Specify a timezone to use EG Europe/London. |
-| `-v /config` | Users home directory in the container, stores program settings and files |
+| `-e TZ=Etc/UTC` | specify a timezone to use, see this [list](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). |
+| `-v /config` | Users home directory in the container, stores program settings and files. |
+| `--security-opt seccomp=unconfined` | For Docker Engine only, many modern gui apps need this to function on older hosts as syscalls are unknown to Docker. |
## Environment variables from files (Docker secrets)
@@ -125,10 +158,10 @@ You can set any environment variable from a file by using a special prepend `FIL
As an example:
```bash
--e FILE__PASSWORD=/run/secrets/mysecretpassword
+-e FILE__MYVAR=/run/secrets/mysecretvariable
```
-Will set the environment variable `PASSWORD` based on the contents of the `/run/secrets/mysecretpassword` file.
+Will set the environment variable `MYVAR` based on the contents of the `/run/secrets/mysecretvariable` file.
## Umask for running applications
@@ -137,15 +170,20 @@ Keep in mind umask is not chmod it subtracts from permissions based on it's valu
## User / Group Identifiers
-When using volumes (`-v` flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`.
+When using volumes (`-v` flags), permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user `PUID` and group `PGID`.
Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.
-In this instance `PUID=1000` and `PGID=1000`, to find yours use `id user` as below:
+In this instance `PUID=1000` and `PGID=1000`, to find yours use `id your_user` as below:
```bash
- $ id username
- uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup)
+id your_user
+```
+
+Example output:
+
+```text
+uid=1000(your_user) gid=1000(your_user) groups=1000(your_user)
```
## Docker Mods
@@ -156,12 +194,29 @@ We publish various [Docker Mods](https://github.com/linuxserver/docker-mods) to
## Support Info
-* Shell access whilst the container is running: `docker exec -it cura /bin/bash`
-* To monitor the logs of the container in realtime: `docker logs -f cura`
-* container version number
- * `docker inspect -f '{{ index .Config.Labels "build_version" }}' cura`
-* image version number
- * `docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/cura:latest`
+* Shell access whilst the container is running:
+
+ ```bash
+ docker exec -it cura /bin/bash
+ ```
+
+* To monitor the logs of the container in realtime:
+
+ ```bash
+ docker logs -f cura
+ ```
+
+* Container version number:
+
+ ```bash
+ docker inspect -f '{{ index .Config.Labels "build_version" }}' cura
+ ```
+
+* Image version number:
+
+ ```bash
+ docker inspect -f '{{ index .Config.Labels "build_version" }}' lscr.io/linuxserver/cura:latest
+ ```
## Updating Info
@@ -171,38 +226,83 @@ Below are the instructions for updating containers:
### Via Docker Compose
-* Update all images: `docker-compose pull`
- * or update a single image: `docker-compose pull cura`
-* Let compose update all containers as necessary: `docker-compose up -d`
- * or update a single container: `docker-compose up -d cura`
-* You can also remove the old dangling images: `docker image prune`
+* Update images:
+ * All images:
+
+ ```bash
+ docker-compose pull
+ ```
+
+ * Single image:
+
+ ```bash
+ docker-compose pull cura
+ ```
+
+* Update containers:
+ * All containers:
+
+ ```bash
+ docker-compose up -d
+ ```
+
+ * Single container:
+
+ ```bash
+ docker-compose up -d cura
+ ```
+
+* You can also remove the old dangling images:
+
+ ```bash
+ docker image prune
+ ```
### Via Docker Run
-* Update the image: `docker pull lscr.io/linuxserver/cura:latest`
-* Stop the running container: `docker stop cura`
-* Delete the container: `docker rm cura`
+* Update the image:
+
+ ```bash
+ docker pull lscr.io/linuxserver/cura:latest
+ ```
+
+* Stop the running container:
+
+ ```bash
+ docker stop cura
+ ```
+
+* Delete the container:
+
+ ```bash
+ docker rm cura
+ ```
+
* Recreate a new container with the same docker run parameters as instructed above (if mapped correctly to a host folder, your `/config` folder and settings will be preserved)
-* You can also remove the old dangling images: `docker image prune`
+* You can also remove the old dangling images:
+
+ ```bash
+ docker image prune
+ ```
### Via Watchtower auto-updater (only use if you don't remember the original parameters)
* Pull the latest image at its tag and replace it with the same env variables in one run:
- ```bash
- docker run --rm \
- -v /var/run/docker.sock:/var/run/docker.sock \
- containrrr/watchtower \
- --run-once cura
- ```
+ ```bash
+ docker run --rm \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ containrrr/watchtower \
+ --run-once cura
+ ```
* You can also remove the old dangling images: `docker image prune`
-**Note:** We do not endorse the use of Watchtower as a solution to automated updates of existing Docker containers. In fact we generally discourage automated updates. However, this is a useful tool for one-time manual updates of containers where you have forgotten the original parameters. In the long term, we highly recommend using [Docker Compose](https://docs.linuxserver.io/general/docker-compose).
+**warning**: We do not endorse the use of Watchtower as a solution to automated updates of existing Docker containers. In fact we generally discourage automated updates. However, this is a useful tool for one-time manual updates of containers where you have forgotten the original parameters. In the long term, we highly recommend using [Docker Compose](https://docs.linuxserver.io/general/docker-compose).
### Image Update Notifications - Diun (Docker Image Update Notifier)
-* 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
@@ -227,4 +327,4 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Versions
-* **21.01.23:** - Initial release.
+* **15.11.23:** - Initial release.
diff --git a/jenkins-vars.yml b/jenkins-vars.yml
index 4579fb0..b8587b5 100644
--- a/jenkins-vars.yml
+++ b/jenkins-vars.yml
@@ -2,12 +2,13 @@
# jenkins variables
project_name: docker-cura
-external_type: na
-custom_version_command: "curl -sX GET https://api.github.com/repos/Ultimaker/Cura/releases/latest | jq -r '.tag_name'"
+external_type: github_stable
release_type: stable
release_tag: latest
ls_branch: main
repo_vars:
+ - EXT_USER = 'Ultimaker'
+ - EXT_REPO = 'Cura'
- BUILD_VERSION_ARG = 'CURA_VERSION'
- LS_USER = 'linuxserver'
- LS_REPO = 'docker-cura'
@@ -15,7 +16,7 @@ repo_vars:
- DOCKERHUB_IMAGE = 'linuxserver/cura'
- DEV_DOCKERHUB_IMAGE = 'lsiodev/cura'
- PR_DOCKERHUB_IMAGE = 'lspipepr/cura'
- - DIST_IMAGE = 'arch'
+ - DIST_IMAGE = 'ubuntu'
- MULTIARCH = 'false'
- CI = 'true'
- CI_WEB = 'true'
diff --git a/package_versions.txt b/package_versions.txt
deleted file mode 100755
index 314b3fd..0000000
--- a/package_versions.txt
+++ /dev/null
@@ -1,458 +0,0 @@
-adduser3.118ubuntu5
-adwaita-icon-theme41.0-1ubuntu1
-apt2.4.8
-apt-transport-https2.4.8
-apt-utils2.4.8
-base-files12ubuntu4.2
-base-passwd3.5.52build1
-bash5.1-6ubuntu1
-bsdextrautils2.37.2-4ubuntu3
-bsdutils1:2.37.2-4ubuntu3
-ca-certificates20211016ubuntu0.22.04.1
-coreutils8.32-4.1ubuntu1
-cpp-1111.3.0-1ubuntu1~22.04
-cpp4:11.2.0-1ubuntu1
-curl7.81.0-1ubuntu1.7
-dash0.5.11+git20210903+057cd650a4ed-3build1
-dbus1.12.20-2ubuntu4.1
-dbus-x111.12.20-2ubuntu4.1
-dconf-gsettings-backend0.40.0-3
-dconf-service0.40.0-3
-debconf1.5.79ubuntu1
-debianutils5.5-1ubuntu2
-diffutils1:3.8-0ubuntu2
-dirmngr2.2.27-3ubuntu2.1
-distro-info-data0.52ubuntu0.2
-docker-ce-cli5:20.10.22~3-0~ubuntu-bionic
-dpkg1.21.1ubuntu2.1
-e2fsprogs1.46.5-2ubuntu1.1
-findutils4.8.0-1ubuntu3
-fontconfig2.13.1-4.2ubuntu5
-fontconfig-config2.13.1-4.2ubuntu5
-fonts-dejavu-core2.37-2build1
-gawk1:5.1.0-1build3
-gcc-11-base11.3.0-1ubuntu1~22.04
-gcc-12-base12.1.0-2ubuntu1~22.04
-gir1.2-glib-2.01.72.0-1
-gir1.2-packagekitglib-1.01.2.5-2ubuntu2
-glib-networking2.72.0-1
-glib-networking-common2.72.0-1
-glib-networking-services2.72.0-1
-gnupg22.2.27-3ubuntu2.1
-gnupg2.2.27-3ubuntu2.1
-gnupg-l10n2.2.27-3ubuntu2.1
-gnupg-utils2.2.27-3ubuntu2.1
-gpg2.2.27-3ubuntu2.1
-gpg-agent2.2.27-3ubuntu2.1
-gpgconf2.2.27-3ubuntu2.1
-gpgsm2.2.27-3ubuntu2.1
-gpgv2.2.27-3ubuntu2.1
-gpg-wks-client2.2.27-3ubuntu2.1
-gpg-wks-server2.2.27-3ubuntu2.1
-grep3.7-1build1
-groff-base1.22.4-8build1
-gsettings-desktop-schemas42.0-1ubuntu1
-gtk-update-icon-cache3.24.33-1ubuntu2
-guacd1.1.0-1
-gzip1.10-4ubuntu4.1
-hicolor-icon-theme0.17-2
-hostname3.23ubuntu2
-humanity-icon-theme0.6.16
-init-system-helpers1.62
-iso-codes4.9.0-1
-jq1.6-2.1ubuntu3
-keyboard-configuration1.205ubuntu3
-libacl12.3.1-1
-libapparmor13.0.4-2ubuntu2.1
-libappstream40.15.2-2
-libapt-pkg6.02.4.8
-libargon2-10~20171227-0.3
-libasound21.2.6.1-1ubuntu1
-libasound2-data1.2.6.1-1ubuntu1
-libasound2-plugins1.2.6-1
-libassuan02.5.5-1build1
-libasyncns00.8-6build2
-libatk1.0-02.36.0-3build1
-libatk1.0-data2.36.0-3build1
-libatk-bridge2.0-02.38.0-3
-libatspi2.0-02.44.0-3
-libattr11:2.5.1-1build1
-libaudit11:3.0.7-1build1
-libaudit-common1:3.0.7-1build1
-libavahi-client30.8-5ubuntu5
-libavahi-common30.8-5ubuntu5
-libavahi-common-data0.8-5ubuntu5
-libblkid12.37.2-4ubuntu3
-libbrotli11.0.9-2build6
-libbsd00.11.5-1
-libbz2-1.01.0.8-5build1
-libc62.35-0ubuntu3.1
-libcairo21.16.0-5ubuntu2
-libcairo-gobject21.16.0-5ubuntu2
-libcap21:2.44-1build3
-libcap2-bin1:2.44-1build3
-libcap-ng00.7.9-2.2build3
-libc-bin2.35-0ubuntu3.1
-libcbor0.80.8.0-2ubuntu1
-libcolord21.4.6-1
-libcom-err21.46.5-2ubuntu1.1
-libcrypt11:4.4.27-1
-libcryptsetup122:2.4.3-1ubuntu1.1
-libcups22.4.1op1-1ubuntu4.1
-libcurl3-gnutls7.81.0-1ubuntu1.7
-libcurl47.81.0-1ubuntu1.7
-libdatrie10.2.13-2
-libdb5.35.3.28+dfsg1-0.8ubuntu3
-libdbus-1-31.12.20-2ubuntu4.1
-libdconf10.40.0-3
-libdebconfclient00.261ubuntu1
-libdeflate01.10-2
-libdevmapper1.02.12:1.02.175-2.1ubuntu4
-libdrm22.4.110-1ubuntu1
-libdrm-amdgpu12.4.110-1ubuntu1
-libdrm-common2.4.110-1ubuntu1
-libdrm-intel12.4.110-1ubuntu1
-libdrm-nouveau22.4.110-1ubuntu1
-libdrm-radeon12.4.110-1ubuntu1
-libdw10.186-1build1
-libedit23.1-20210910-1build1
-libegl11.4.0-1
-libegl-mesa022.0.5-0ubuntu0.3
-libelf10.186-1build1
-libepoxy01.5.10-1
-libexpat12.4.7-1ubuntu0.2
-libext2fs21.46.5-2ubuntu1.1
-libffi83.4.2-4
-libfftw3-single33.3.8-2ubuntu8
-libfido2-11.10.0-1
-libflac81.3.3-2ubuntu0.1
-libfontconfig12.13.1-4.2ubuntu5
-libfontenc11:1.1.4-1build3
-libfreerdp2-22.6.1+dfsg1-3ubuntu2.3
-libfreerdp-client2-22.6.1+dfsg1-3ubuntu2.3
-libfreetype62.11.1+dfsg-1ubuntu0.1
-libfribidi01.0.8-2ubuntu3.1
-libfuse22.9.9-5ubuntu3
-libgbm122.0.5-0ubuntu0.3
-libgcc-s112.1.0-2ubuntu1~22.04
-libgcrypt201.9.4-3ubuntu3
-libgdbm61.23-1
-libgdk-pixbuf-2.0-02.42.8+dfsg-1ubuntu0.2
-libgdk-pixbuf2.0-common2.42.8+dfsg-1ubuntu0.2
-libgif75.1.9-2build2
-libgirepository-1.0-11.72.0-1
-libgl11.4.0-1
-libgl1-mesa-dri22.0.5-0ubuntu0.3
-libglapi-mesa22.0.5-0ubuntu0.3
-libglib2.0-02.72.4-0ubuntu1
-libglib2.0-bin2.72.4-0ubuntu1
-libglib2.0-data2.72.4-0ubuntu1
-libglvnd01.4.0-1
-libglx01.4.0-1
-libglx-mesa022.0.5-0ubuntu0.3
-libgmp102:6.2.1+dfsg-3ubuntu1
-libgnutls303.7.3-4ubuntu1.1
-libgomp112.1.0-2ubuntu1~22.04
-libgpg-error01.43-3
-libgraphite2-31.3.14-1build2
-libgssapi-krb5-21.19.2-2
-libgstreamer1.0-01.20.3-0ubuntu1
-libgstreamer-plugins-base1.0-01.20.1-1
-libgtk-3-03.24.33-1ubuntu2
-libgtk-3-common3.24.33-1ubuntu2
-libharfbuzz0b2.7.4-1ubuntu3.1
-libhogweed63.7.3-1build2
-libice62:1.0.10-1build2
-libicu7070.1-2
-libid3tag00.15.1b-14
-libidn2-02.3.2-2build1
-libimlib21.7.4-1build1
-libip4tc21.8.7-1ubuntu5
-libisl230.24-2build1
-libjack-jackd2-01.9.20~dfsg-1
-libjbig02.1-3.1ubuntu0.22.04.1
-libjpeg88c-2ubuntu10
-libjpeg-turbo82.1.2-0ubuntu1
-libjq11.6-2.1ubuntu3
-libjson-c50.15-3~ubuntu1.22.04.1
-libjson-glib-1.0-01.6.6-1build1
-libjson-glib-1.0-common1.6.6-1build1
-libk5crypto31.19.2-2
-libkeyutils11.6.1-2ubuntu3
-libkmod229-1ubuntu1
-libkrb5-31.19.2-2
-libkrb5support01.19.2-2
-libksba81.6.0-2ubuntu0.2
-liblcms2-22.12~rc1-2build2
-libldap-2.5-02.5.13+dfsg-0ubuntu0.22.04.1
-libldap-common2.5.13+dfsg-0ubuntu0.22.04.1
-libllvm131:13.0.1-2ubuntu2.1
-liblocale-gettext-perl1.07-4build3
-libltdl72.4.6-15build2
-liblz4-11.9.3-2build2
-liblzma55.2.5-2ubuntu1
-libmd01.0.4-1build1
-libmount12.37.2-4ubuntu3
-libmpc31.2.1-2build1
-libmpdec32.5.1-2build2
-libmpfr64.1.0-3build3
-libncurses66.3-2
-libncursesw66.3-2
-libnettle83.7.3-1build2
-libnghttp2-141.43.0-1build3
-libnpth01.6-3build2
-libnsl21.3.0-2build2
-libnspr42:4.32-3build1
-libnss32:3.68.2-0ubuntu1.1
-libobrender32v53.6.1-10
-libobt2v53.6.1-10
-libogg01.3.5-0ubuntu3
-libonig56.9.7.1-2build1
-libopus01.3.1-0.1build2
-liborc-0.4-01:0.4.32-2
-libossp-uuid161.6.2-1.5build9
-libp11-kit00.24.0-6build1
-libpackagekit-glib2-181.2.5-2ubuntu2
-libpam0g1.4.0-11ubuntu2
-libpam-modules1.4.0-11ubuntu2
-libpam-modules-bin1.4.0-11ubuntu2
-libpam-runtime1.4.0-11ubuntu2
-libpam-systemd249.11-0ubuntu3.6
-libpango-1.0-01.50.6+ds-2
-libpangocairo-1.0-01.50.6+ds-2
-libpangoft2-1.0-01.50.6+ds-2
-libpangoxft-1.0-01.50.6+ds-2
-libpciaccess00.16-3
-libpcre2-8-010.39-3ubuntu0.1
-libpcre32:8.39-13ubuntu0.22.04.1
-libpipeline11.5.5-1
-libpixman-1-00.40.0-1ubuntu0.22.04.1
-libpng16-161.6.37-3build5
-libpolkit-agent-1-00.105-33
-libpolkit-gobject-1-00.105-33
-libprocps82:3.3.17-6ubuntu2
-libproxy1v50.4.17-2
-libpsl50.21.0-1.2build2
-libpthread-stubs0-dev0.4-1build2
-libpulse01:15.99.1+dfsg1-1ubuntu2
-libpulsedsp1:15.99.1+dfsg1-1ubuntu2
-libpython2.7-minimal2.7.18-13ubuntu1.1
-libpython2.7-stdlib2.7.18-13ubuntu1.1
-libpython2-stdlib2.7.18-3
-libpython3.10-minimal3.10.6-1~22.04.2
-libpython3.10-stdlib3.10.6-1~22.04.2
-libpython3-stdlib3.10.6-1~22.04
-libreadline88.1.2-1
-librsvg2-22.52.5+dfsg-3
-librtmp12.4+20151223.gitfa8646d.1-2build4
-libsamplerate00.2.2-1build1
-libsasl2-22.1.27+dfsg2-3ubuntu1.1
-libsasl2-modules2.1.27+dfsg2-3ubuntu1.1
-libsasl2-modules-db2.1.27+dfsg2-3ubuntu1.1
-libseccomp22.5.3-2ubuntu2
-libselinux13.3-1build2
-libsemanage23.3-1build2
-libsemanage-common3.3-1build2
-libsensors51:3.6.0-7ubuntu1
-libsensors-config1:3.6.0-7ubuntu1
-libsepol23.3-1build1
-libsigsegv22.13-1ubuntu3
-libsm62:1.2.3-1build2
-libsmartcols12.37.2-4ubuntu3
-libsnapd-glib11.60-0ubuntu1
-libsndfile11.0.31-2build1
-libsoup2.4-12.74.2-3
-libsoup2.4-common2.74.2-3
-libsoxr00.1.3-4build2
-libspeexdsp11.2~rc1.2-1.1ubuntu3
-libsqlite3-03.37.2-2ubuntu0.1
-libss21.46.5-2ubuntu1.1
-libssh-40.9.6-2build1
-libssl33.0.2-0ubuntu1.7
-libstartup-notification00.12-6build2
-libstdc++612.1.0-2ubuntu1~22.04
-libstemmer0d2.2.0-1build1
-libsystemd0249.11-0ubuntu3.6
-libtasn1-64.18.0-4build1
-libtdb11.4.5-2build1
-libthai00.1.29-1build1
-libthai-data0.1.29-1build1
-libtiff54.3.0-6ubuntu0.3
-libtinfo66.3-2
-libtirpc31.3.2-2ubuntu0.1
-libtirpc-common1.3.2-2ubuntu0.1
-libuchardet00.0.7-1build2
-libudev1249.11-0ubuntu3.6
-libunistring21.0-1
-libunwind81.3.2-2build2
-libusb-1.0-02:1.0.25-1ubuntu2
-libutempter01.2.1-2build2
-libuuid12.37.2-4ubuntu3
-libvorbis0a1.3.7-1build2
-libvorbisenc21.3.7-1build2
-libvulkan11.3.204.1-2
-libwayland-client01.20.0-1ubuntu0.1
-libwayland-cursor01.20.0-1ubuntu0.1
-libwayland-egl11.20.0-1ubuntu0.1
-libwayland-server01.20.0-1ubuntu0.1
-libwebp71.2.2-2
-libwebrtc-audio-processing10.3.1-0ubuntu5
-libwinpr2-22.6.1+dfsg1-3ubuntu2.3
-libwrap07.6.q-31build2
-libx11-62:1.7.5-1
-libx11-data2:1.7.5-1
-libx11-dev2:1.7.5-1
-libx11-xcb12:1.7.5-1
-libxau61:1.0.9-1build5
-libxau-dev1:1.0.9-1build5
-libxaw72:1.0.14-1
-libxcb11.14-3ubuntu3
-libxcb1-dev1.14-3ubuntu3
-libxcb-dri2-01.14-3ubuntu3
-libxcb-dri3-01.14-3ubuntu3
-libxcb-glx01.14-3ubuntu3
-libxcb-present01.14-3ubuntu3
-libxcb-render01.14-3ubuntu3
-libxcb-shape01.14-3ubuntu3
-libxcb-shm01.14-3ubuntu3
-libxcb-sync11.14-3ubuntu3
-libxcb-util10.4.0-1build2
-libxcb-xfixes01.14-3ubuntu3
-libxcomposite11:0.4.5-1build2
-libxcursor11:1.2.0-2build4
-libxcvt00.1.1-3
-libxdamage11:1.1.5-2build2
-libxdmcp61:1.1.3-0ubuntu5
-libxdmcp-dev1:1.1.3-0ubuntu5
-libxext62:1.3.4-1build1
-libxfixes31:6.0.0-1
-libxfont21:2.0.5-1build1
-libxft22.3.4-1
-libxi62:1.8-1build1
-libxinerama12:1.1.4-3
-libxkbcommon01.4.0-1
-libxkbfile11:1.1.0-1build3
-libxml22.9.13+dfsg-1ubuntu0.2
-libxmlb20.3.6-2build1
-libxmu62:1.1.3-3
-libxmuu12:1.1.3-3
-libxpm41:3.5.12-1build2
-libxrandr22:1.5.2-1build1
-libxrender11:0.9.10-1build4
-libxshmfence11.3-1build4
-libxss11:1.2.3-1build2
-libxt61:1.2.1-1
-libxtst62:1.2.3-1build4
-libxv12:1.0.11-1build2
-libxvmc12:1.0.12-2build2
-libxxf86dga12:1.1.5-0ubuntu3
-libxxf86vm11:1.1.4-1build3
-libxxhash00.8.1-1
-libyaml-0-20.2.2-1build2
-libzstd11.4.8+dfsg-3build1
-locales2.35-0ubuntu3.1
-login1:4.8.1-2ubuntu2.1
-logsave1.46.5-2ubuntu1.1
-lsb-base11.1.0ubuntu4
-lsb-release11.1.0ubuntu4
-man-db2.10.2-1
-mawk1.3.4.20200120-3
-media-types7.0.0
-mount2.37.2-4ubuntu3
-ncurses-base6.3-2
-ncurses-bin6.3-2
-netcat1.218-4ubuntu1
-netcat-openbsd1.218-4ubuntu1
-nodejs16.19.0-deb-1nodesource1
-obconf1:2.0.4+git20150213-2build1
-openbox3.6.1-10
-openssh-client1:8.9p1-3ubuntu0.1
-openssl3.0.2-0ubuntu1.7
-packagekit1.2.5-2ubuntu2
-passwd1:4.8.1-2ubuntu2.1
-perl-base5.34.0-3ubuntu1.1
-pinentry-curses1.1.1-1build2
-pkexec0.105-33
-policykit-10.105-33
-polkitd0.105-33
-procps2:3.3.17-6ubuntu2
-publicsuffix20211207.1025-1
-pulseaudio1:15.99.1+dfsg1-1ubuntu2
-pulseaudio-utils1:15.99.1+dfsg1-1ubuntu2
-python22.7.18-3
-python2.72.7.18-13ubuntu1.1
-python2.7-minimal2.7.18-13ubuntu1.1
-python2-minimal2.7.18-3
-python3.103.10.6-1~22.04.2
-python3.10-minimal3.10.6-1~22.04.2
-python33.10.6-1~22.04
-python3-apt2.3.0ubuntu2.1
-python3-blinker1.4+dfsg1-0.4
-python3-cffi-backend1.15.0-1build2
-python3-cryptography3.4.8-1ubuntu2
-python3-dbus1.2.18-3build1
-python3-distro1.7.0-1
-python3-gi3.42.1-0ubuntu1
-python3-httplib20.20.2-2
-python3-importlib-metadata4.6.4-1
-python3-jeepney0.7.1-3
-python3-jwt2.3.0-1ubuntu0.2
-python3-keyring23.5.0-1
-python3-launchpadlib1.10.16-1
-python3-lazr.restfulclient0.14.4-1
-python3-lazr.uri1.0.6-2
-python3-minimal3.10.6-1~22.04
-python3-more-itertools8.10.0-2
-python3-oauthlib3.2.0-1ubuntu0.1
-python3-pkg-resources59.6.0-1.2
-python3-pyparsing2.4.7-1
-python3-secretstorage3.3.1-1
-python3-six1.16.0-3ubuntu1
-python3-software-properties0.99.22.4
-python3-wadllib1.3.6-1
-python3-zipp1.0.0-3
-python-apt-common2.3.0ubuntu2.1
-readline-common8.1.2-1
-sed4.8-1ubuntu2
-sensible-utils0.0.17
-session-migration0.3.6
-shared-mime-info2.1-2
-software-properties-common0.99.22.4
-ssl-cert1.1.2
-sudo1.9.9-1ubuntu2.1
-systemd249.11-0ubuntu3.6
-systemd-sysv249.11-0ubuntu3.6
-sysvinit-utils3.01-1ubuntu1
-tar1.34+dfsg-1build3
-tzdata2022g-0ubuntu0.22.04.1
-ubuntu-keyring2021.03.26
-ubuntu-mono20.10-0ubuntu2
-ucf3.0043
-udev249.11-0ubuntu3.6
-usrmerge25ubuntu2
-util-linux2.37.2-4ubuntu3
-x11-apps7.7+8build2
-x11-common1:7.7+23ubuntu2
-x11proto-dev2021.5-1
-x11-session-utils7.7+4build2
-x11-utils7.7+5build2
-x11-xkb-utils7.7+5build4
-x11-xserver-utils7.7+9build1
-xbitmaps1.1.1-2.1ubuntu1
-xfonts-base1:1.0.5
-xfonts-encodings1:1.0.5-0ubuntu2
-xfonts-utils1:7.7+6build2
-xkb-data2.33-1
-xorg-sgml-doctools1:1.11-1.1
-xorgxrdp1:0.2.17-1build1
-xrdp0.9.17-2ubuntu2
-xserver-common2:21.1.3-2ubuntu2.5
-xserver-xorg-core2:21.1.3-2ubuntu2.5
-xserver-xorg-video-amdgpu22.0.0-1ubuntu0.1
-xserver-xorg-video-ati1:19.1.0-2ubuntu1
-xserver-xorg-video-intel2:2.99.917+git20210115-1
-xserver-xorg-video-radeon1:19.1.0-2ubuntu1
-xterm372-1ubuntu1
-xtrans-dev1.4.0-1
-xutils1:7.7+23ubuntu2
-zlib1g1:1.2.11.dfsg-2ubuntu9.2
diff --git a/readme-vars.yml b/readme-vars.yml
index 33c9f80..7af80e3 100644
--- a/readme-vars.yml
+++ b/readme-vars.yml
@@ -2,9 +2,9 @@
# project information
project_name: cura
-project_url: "https://ultimaker.com/software/ultimaker-cura"
-project_logo: "https://github.com/Ultimaker/Cura/raw/main/resources/images/cura-icon.png"
-project_blurb: "[Ultimaker Cura]({{ project_url }}) is a state-of-the-art slicer app to prepare your 3D models for your 3D printer."
+project_url: "https://ultimaker.com/software/ultimaker-cura/"
+project_logo: "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/cura-logo.png"
+project_blurb: "[UltiMaker Cura]({{ project_url }}) is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results."
project_lsio_github_repo_url: "https://github.com/linuxserver/docker-{{ project_name }}"
project_blurb_optional_extras_enabled: false
@@ -23,10 +23,14 @@ param_env_vars:
- { env_var: "TZ", env_value: "Europe/London", desc: "Specify a timezone to use EG Europe/London." }
param_usage_include_vols: true
param_volumes:
- - { vol_path: "/config", vol_host_path: "/path/to/config", desc: "Users home directory in the container, stores program settings and files" }
+ - { vol_path: "/config", vol_host_path: "/path/to/config", desc: "Users home directory in the container, stores program settings and files." }
param_usage_include_ports: true
param_ports:
- { external_port: "3000", internal_port: "3000", port_desc: "Cura desktop gui." }
+ - { external_port: "3001", internal_port: "3001", port_desc: "Cura desktop gui HTTPS." }
+opt_security_opt_param: true
+opt_security_opt_param_vars:
+ - { run_var: "seccomp=unconfined", compose_var: "seccomp:unconfined", desc: "For Docker Engine only, many modern gui apps need this to function on older hosts as syscalls are unknown to Docker." }
# application setup block
app_setup_block_enabled: true
@@ -34,11 +38,39 @@ app_setup_block: |
The application can be accessed at:
* http://yourhost:3000/
+ * https://yourhost:3001/
- By default the user/pass is abc/abc, if you change your password or want to login manually to the GUI session for any reason use the following link:
+ ### Options in all KasmVNC based GUI containers
+
+ 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.
+
+ #### Optional environment variables
+
+ | Variable | Description |
+ | :----: | --- |
+ | CUSTOM_PORT | Internal port the container listens on for http if it needs to be swapped from the default 3000. |
+ | CUSTOM_HTTPS_PORT | Internal port the container listens on for https if it needs to be swapped from the default 3001. |
+ | CUSTOM_USER | HTTP Basic auth username, abc is default. |
+ | PASSWORD | HTTP Basic auth password, abc is default. If unset there will be no auth |
+ | SUBFOLDER | Subfolder for the application if running a subfolder reverse proxy, need both slashes IE `/subfolder/` |
+ | TITLE | The page title displayed on the web browser, default "KasmVNC Client". |
+ | FM_HOME | This is the home directory (landing) for the file manager, default "/config". |
+ | START_DOCKER | If set to false a container with privilege will not automatically start the DinD Docker setup. |
+ | 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` |
+
+ #### Optional run configurations
+
+ | Variable | Description |
+ | :----: | --- |
+ | `--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` | 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 appplications. Only **Open Source** drivers are supported IE (Intel,AMDGPU,Radeon,ATI,Nouveau) |
+
+ ### Lossless mode
+
+ 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).
- * http://yourhost:3000/?login=true
# changelog
changelogs:
- - { date: "21.01.23:", desc: "Initial release." }
+ - { date: "15.11.23:", desc: "Initial release." }
diff --git a/root/defaults/autostart b/root/defaults/autostart
index 793f8a5..0188127 100644
--- a/root/defaults/autostart
+++ b/root/defaults/autostart
@@ -1 +1 @@
-/app/cura/cura --appimage-extract-and-run -platformtheme gtk3
+/opt/cura/AppRun
diff --git a/root/defaults/menu.xml b/root/defaults/menu.xml
new file mode 100644
index 0000000..369fa16
--- /dev/null
+++ b/root/defaults/menu.xml
@@ -0,0 +1,8 @@
+
+
+
+