@@ -210,6 +210,7 @@ pipeline {
210210          env. META_TAG  =  ' development-'   +  env. EXT_RELEASE_CLEAN  +  ' -ls'   +  env. LS_TAG_NUMBER 
211211          env. EXT_RELEASE_TAG  =  ' development-version-'   +  env. EXT_RELEASE_CLEAN 
212212          env. BUILDCACHE  =  ' docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache' 
213+           env. CITEST_IMAGETAG  =  ' latest' 
213214        }
214215      }
215216    }
@@ -235,6 +236,7 @@ pipeline {
235236          env. EXT_RELEASE_TAG  =  ' development-version-'   +  env. EXT_RELEASE_CLEAN 
236237          env. DOCKERHUB_LINK  =  ' https://hub.docker.com/r/'   +  env. DEV_DOCKERHUB_IMAGE  +  ' /tags/' 
237238          env. BUILDCACHE  =  ' docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache' 
239+           env. CITEST_IMAGETAG  =  ' develop' 
238240        }
239241      }
240242    }
@@ -260,6 +262,7 @@ pipeline {
260262          env. CODE_URL  =  ' https://github.com/'   +  env. LS_USER  +  ' /'   +  env. LS_REPO  +  ' /pull/'   +  env. PULL_REQUEST 
261263          env. DOCKERHUB_LINK  =  ' https://hub.docker.com/r/'   +  env. PR_DOCKERHUB_IMAGE  +  ' /tags/' 
262264          env. BUILDCACHE  =  ' docker.io/lsiodev/buildcache,registry.gitlab.com/linuxserver.io/docker-jenkins-builder/lsiodev-buildcache,ghcr.io/linuxserver/lsiodev-buildcache,quay.io/linuxserver.io/lsiodev-buildcache' 
265+           env. CITEST_IMAGETAG  =  ' develop' 
263266        }
264267      }
265268    }
@@ -282,7 +285,7 @@ pipeline {
282285                  -v ${WORKSPACE}:/mnt \ 
283286                  -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\"  \ 
284287                  -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\"  \ 
285-                   ghcr.io/linuxserver/baseimage-alpine:3.20  s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ 
288+                   ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ 
286289                    apk add --no-cache python3 && \ 
287290                    python3 -m venv /lsiopy && \ 
288291                    pip install --no-cache-dir -U pip && \ 
@@ -617,13 +620,16 @@ pipeline {
617620                    echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin 
618621                    echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin 
619622                    echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin 
623+ 
620624                    if [[ "${PACKAGE_CHECK}" != "true" ]]; then 
625+                       declare -A pids 
621626                      IFS=',' read -ra CACHE <<< "$BUILDCACHE" 
622627                      for i in "${CACHE[@]}"; do 
623628                        docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} & 
629+                         pids[$!]="$i" 
624630                      done 
625-                       for p in $(jobs -p) ; do 
626-                         wait "$p" || { echo "job $p failed" >&2;  exit 1; } 
631+                       for p in "${!pids[@]}" ; do 
632+                         wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] &&  exit 1; } 
627633                      done 
628634                    fi 
629635                '''  
@@ -683,13 +689,16 @@ pipeline {
683689                        echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin 
684690                        echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin 
685691                        echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin 
692+ 
686693                        if [[ "${PACKAGE_CHECK}" != "true" ]]; then 
694+                           declare -A pids 
687695                          IFS=',' read -ra CACHE <<< "$BUILDCACHE" 
688696                          for i in "${CACHE[@]}"; do 
689697                            docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} & 
698+                             pids[$!]="$i" 
690699                          done 
691-                           for p in $(jobs -p) ; do 
692-                             wait "$p" || { echo "job $p failed" >&2;  exit 1; } 
700+                           for p in "${!pids[@]}" ; do 
701+                             wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] &&  exit 1; } 
693702                          done 
694703                        fi 
695704                    '''  
@@ -743,12 +752,14 @@ pipeline {
743752                        echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin 
744753                        echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin 
745754                        if [[ "${PACKAGE_CHECK}" != "true" ]]; then 
755+                           declare -A pids 
746756                          IFS=',' read -ra CACHE <<< "$BUILDCACHE" 
747757                          for i in "${CACHE[@]}"; do 
748758                            docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} & 
759+                             pids[$!]="$i" 
749760                          done 
750-                           for p in $(jobs -p) ; do 
751-                             wait "$p" || { echo "job $p failed" >&2;  exit 1; } 
761+                           for p in "${!pids[@]}" ; do 
762+                             wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] &&  exit 1; } 
752763                          done 
753764                        fi 
754765                    '''  
@@ -873,7 +884,7 @@ pipeline {
873884                    CI_DOCKERENV="LSIO_FIRST_PARTY=true" 
874885                  fi 
875886                fi 
876-                 docker pull ghcr.io/linuxserver/ci:latest  
887+                 docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}  
877888                if [ "${MULTIARCH}" == "true" ]; then 
878889                  docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64 
879890                  docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} 
@@ -897,7 +908,7 @@ pipeline {
897908                -e WEB_PATH=\" ${CI_WEBPATH}\"  \ 
898909                -e NODE_NAME=\" ${NODE_NAME}\"  \ 
899910                -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\"  \ 
900-                 -t ghcr.io/linuxserver/ci:latest  \ 
911+                 -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}  \ 
901912                python3 test_build.py'''  
902913        }
903914      }
@@ -923,9 +934,11 @@ pipeline {
923934                          CACHEIMAGE=${i} 
924935                      fi 
925936                  done 
926-                   docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:development -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
937+                   docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:development -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
938+                     { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
927939                  if [ -n "${SEMVER}" ]; then 
928-                     docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
940+                     docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
941+                       { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
929942                  fi 
930943                done 
931944              '''  
@@ -950,20 +963,27 @@ pipeline {
950963                          CACHEIMAGE=${i} 
951964                      fi 
952965                  done 
953-                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-development -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
954-                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-development -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 
966+                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-development -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
967+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
968+                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-development -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
969+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
955970                  if [ -n "${SEMVER}" ]; then 
956-                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
957-                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 
971+                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
972+                       { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
973+                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
974+                       { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
958975                  fi 
959976                done 
960977                for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do 
961-                   docker buildx imagetools create -t ${MANIFESTIMAGE}:development ${MANIFESTIMAGE}:amd64-development ${MANIFESTIMAGE}:arm64v8-development 
962-                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} 
963- 
964-                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} 
978+                   docker buildx imagetools create -t ${MANIFESTIMAGE}:development ${MANIFESTIMAGE}:amd64-development ${MANIFESTIMAGE}:arm64v8-development || \ 
979+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
980+                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \ 
981+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
982+                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \ 
983+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
965984                  if [ -n "${SEMVER}" ]; then 
966-                     docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} 
985+                     docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \ 
986+                       { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
967987                  fi 
968988                done 
969989              '''  
@@ -981,23 +1001,41 @@ pipeline {
9811001        environment name : ' EXIT_STATUS'  , value : ' ' 
9821002      }
9831003      steps {
984-         echo " Pushing New tag for current commit ${ META_TAG} " 
985-         sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
986-         -d '{"tag":"'${META_TAG}'",\ 
987-              "object": "'${COMMIT_SHA}'",\ 
988-              "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to development",\ 
989-              "type": "commit",\ 
990-              "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' '''  991-         echo " Pushing New release for Tag" 
9921004        sh ''' #! /bin/bash
1005+               echo "Auto-generating release notes" 
1006+               if [ "$(git tag --points-at HEAD)" != "" ]; then 
1007+                 echo "Existing tag points to current commit, suggesting no new LS changes" 
1008+                 AUTO_RELEASE_NOTES="No changes" 
1009+               else 
1010+                 AUTO_RELEASE_NOTES=$(curl -fsL -H "Authorization: token ${GITHUB_TOKEN}" -H "Accept: application/vnd.github+json" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases/generate-notes  \ 
1011+                   -d '{"tag_name":"'${META_TAG}'",\ 
1012+                       "target_commitish": "development"}' \ 
1013+                   | jq -r '.body' | sed 's|## What.s Changed||') 
1014+               fi 
1015+               echo "Pushing New tag for current commit ${META_TAG}" 
1016+               curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \ 
1017+                 -d '{"tag":"'${META_TAG}'",\ 
1018+                   "object": "'${COMMIT_SHA}'",\ 
1019+                   "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to development",\ 
1020+                   "type": "commit",\ 
1021+                   "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1022+               echo "Pushing New release for Tag" 
9931023              echo "Data change at JSON endpoint ${JSON_URL}" > releasebody.json 
994-               echo '{"tag_name":"'${META_TAG}'",\ 
995-                      "target_commitish": "development",\ 
996-                      "name": "'${META_TAG}'",\ 
997-                      "body": "**CI Report:**\\ n\\ n'${CI_URL:-N/A}'\\ n\\ n**LinuxServer Changes:**\\ n\\ n'${LS_RELEASE_NOTES}'\\ n\\ n**Remote Changes:**\\ n\\ n' > start 
998-               printf '","draft": false,"prerelease": true}' >> releasebody.json 
999-               paste -d'\\ 0' start releasebody.json > releasebody.json.done 
1000-               curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''  
1024+               jq -n \ 
1025+                 --arg tag_name "$META_TAG" \ 
1026+                 --arg target_commitish "development" \ 
1027+                 --arg ci_url "${CI_URL:-N/A}" \ 
1028+                 --arg ls_notes "$AUTO_RELEASE_NOTES" \ 
1029+                 --arg remote_notes "$(cat releasebody.json)" \ 
1030+                 '{ 
1031+                   "tag_name": $tag_name, 
1032+                   "target_commitish": $target_commitish, 
1033+                   "name": $tag_name, 
1034+                   "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes), 
1035+                   "draft": false, 
1036+                   "prerelease": true                }' > releasebody.json.done 
1037+               curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done 
1038+         '''  
10011039      }
10021040    }
10031041    //  Add protection to the release branch
0 commit comments