From dfa8c7807bede8a88fcec2f334e14b54f66fcb78 Mon Sep 17 00:00:00 2001 From: thelamer Date: Wed, 15 Nov 2023 15:53:15 -0800 Subject: [PATCH 1/2] total restructure of application, extract appimage to install it, use debian, use new kasmvnc base with DRI3 support --- .editorconfig | 2 +- .github/workflows/call_issue_pr_tracker.yml | 16 + .github/workflows/call_issues_cron.yml | 13 + .../workflows/external_trigger_scheduler.yml | 18 +- .github/workflows/greetings.yml | 2 +- .github/workflows/package_trigger.yml | 4 + .../workflows/package_trigger_scheduler.yml | 10 +- .github/workflows/permissions.yml | 10 + Dockerfile | 34 +- Jenkinsfile | 450 ++++++++--------- README.md | 190 ++++++-- jenkins-vars.yml | 5 +- package_versions.txt | 458 ------------------ readme-vars.yml | 46 +- root/defaults/autostart | 2 +- root/defaults/menu.xml | 8 + 16 files changed, 511 insertions(+), 757 deletions(-) create mode 100644 .github/workflows/call_issue_pr_tracker.yml create mode 100644 .github/workflows/call_issues_cron.yml create mode 100644 .github/workflows/permissions.yml delete mode 100755 package_versions.txt create mode 100644 root/defaults/menu.xml 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_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..ef67a99 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,7 +16,6 @@ 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') BUILD_VERSION_ARG = 'CURA_VERSION' LS_USER = 'linuxserver' LS_REPO = 'docker-cura' @@ -24,7 +23,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 +38,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 +61,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 +104,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 +169,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 +192,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 +215,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 +240,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 +286,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 +303,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 +322,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 +349,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 +391,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 +431,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 +444,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 +457,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 +475,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 +488,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 +503,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 +516,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 +549,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 +589,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 +606,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 +627,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 +652,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 +704,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 +736,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 +793,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 +816,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 +898,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 +983,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 @@ - - - + + [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io) [![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!") @@ -40,13 +39,13 @@ Find us at: [![Jenkins Build](https://img.shields.io/jenkins/build?labelColor=555555&logoColor=ffffff&style=for-the-badge&jobUrl=https%3A%2F%2Fci.linuxserver.io%2Fjob%2FDocker-Pipeline-Builders%2Fjob%2Fdocker-cura%2Fjob%2Fmain%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-cura/job/main/) [![LSIO CI](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=CI&query=CI&url=https%3A%2F%2Fci-tests.linuxserver.io%2Flinuxserver%2Fcura%2Flatest%2Fci-status.yml)](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. -[![cura](https://github.com/Ultimaker/Cura/raw/main/resources/images/cura-icon.png)](https://ultimaker.com/software/ultimaker-cura) +[![cura](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/cura-logo.png)](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..f5f773b 100644 --- a/jenkins-vars.yml +++ b/jenkins-vars.yml @@ -2,8 +2,7 @@ # 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 @@ -15,7 +14,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 @@ + + + +/usr/bin/xterm +/usr/bin/firefox +/opt/cura/AppRun + + From 4aeaeccd549ed11a384a400315003f7400743cca Mon Sep 17 00:00:00 2001 From: thelamer Date: Wed, 15 Nov 2023 15:58:53 -0800 Subject: [PATCH 2/2] forgot to define git vars for stable release ingestion --- .github/workflows/external_trigger.yml | 10 +++++++++- Jenkinsfile | 2 ++ jenkins-vars.yml | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) 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/Jenkinsfile b/Jenkinsfile index ef67a99..14aad46 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,6 +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') + EXT_USER = 'Ultimaker' + EXT_REPO = 'Cura' BUILD_VERSION_ARG = 'CURA_VERSION' LS_USER = 'linuxserver' LS_REPO = 'docker-cura' diff --git a/jenkins-vars.yml b/jenkins-vars.yml index f5f773b..b8587b5 100644 --- a/jenkins-vars.yml +++ b/jenkins-vars.yml @@ -7,6 +7,8 @@ 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'