@@ -208,6 +208,7 @@ pipeline {
208208          env. META_TAG  =  env. EXT_RELEASE_CLEAN  +  ' -ls' +  env. LS_TAG_NUMBER 
209209          env. EXT_RELEASE_TAG  =  ' version-' +  env. EXT_RELEASE_CLEAN 
210210          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' 
211+           env. CITEST_IMAGETAG  =  ' latest' 
211212        }
212213      }
213214    }
@@ -233,6 +234,7 @@ pipeline {
233234          env. EXT_RELEASE_TAG  =  ' version-' +  env. EXT_RELEASE_CLEAN 
234235          env. DOCKERHUB_LINK  =  ' https://hub.docker.com/r/' +  env. DEV_DOCKERHUB_IMAGE  +  ' /tags/' 
235236          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' 
237+           env. CITEST_IMAGETAG  =  ' develop' 
236238        }
237239      }
238240    }
@@ -258,6 +260,7 @@ pipeline {
258260          env. CODE_URL  =  ' https://github.com/' +  env. LS_USER  +  ' /' +  env. LS_REPO  +  ' /pull/' +  env. PULL_REQUEST 
259261          env. DOCKERHUB_LINK  =  ' https://hub.docker.com/r/' +  env. PR_DOCKERHUB_IMAGE  +  ' /tags/' 
260262          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' 
263+           env. CITEST_IMAGETAG  =  ' develop' 
261264        }
262265      }
263266    }
@@ -280,7 +283,7 @@ pipeline {
280283                  -v ${WORKSPACE}:/mnt \ 
281284                  -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\"  \ 
282285                  -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\"  \ 
283-                   ghcr.io/linuxserver/baseimage-alpine:3.20  s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ 
286+                   ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\ 
284287                    apk add --no-cache python3 && \ 
285288                    python3 -m venv /lsiopy && \ 
286289                    pip install --no-cache-dir -U pip && \ 
@@ -615,13 +618,16 @@ pipeline {
615618                    echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin 
616619                    echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin 
617620                    echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin 
621+ 
618622                    if [[ "${PACKAGE_CHECK}" != "true" ]]; then 
623+                       declare -A pids 
619624                      IFS=',' read -ra CACHE <<< "$BUILDCACHE" 
620625                      for i in "${CACHE[@]}"; do 
621626                        docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} & 
627+                         pids[$!]="$i" 
622628                      done 
623-                       for p in $(jobs -p) ; do 
624-                         wait "$p" || { echo "job $p failed" >&2;  exit 1; } 
629+                       for p in "${!pids[@]}" ; do 
630+                         wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] &&  exit 1; } 
625631                      done 
626632                    fi 
627633                '''  
@@ -681,13 +687,16 @@ pipeline {
681687                        echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin 
682688                        echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin 
683689                        echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin 
690+ 
684691                        if [[ "${PACKAGE_CHECK}" != "true" ]]; then 
692+                           declare -A pids 
685693                          IFS=',' read -ra CACHE <<< "$BUILDCACHE" 
686694                          for i in "${CACHE[@]}"; do 
687695                            docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} & 
696+                             pids[$!]="$i" 
688697                          done 
689-                           for p in $(jobs -p) ; do 
690-                             wait "$p" || { echo "job $p failed" >&2;  exit 1; } 
698+                           for p in "${!pids[@]}" ; do 
699+                             wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] &&  exit 1; } 
691700                          done 
692701                        fi 
693702                    '''  
@@ -741,12 +750,14 @@ pipeline {
741750                        echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin 
742751                        echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin 
743752                        if [[ "${PACKAGE_CHECK}" != "true" ]]; then 
753+                           declare -A pids 
744754                          IFS=',' read -ra CACHE <<< "$BUILDCACHE" 
745755                          for i in "${CACHE[@]}"; do 
746756                            docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} & 
757+                             pids[$!]="$i" 
747758                          done 
748-                           for p in $(jobs -p) ; do 
749-                             wait "$p" || { echo "job $p failed" >&2;  exit 1; } 
759+                           for p in "${!pids[@]}" ; do 
760+                             wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] &&  exit 1; } 
750761                          done 
751762                        fi 
752763                    '''  
@@ -871,7 +882,7 @@ pipeline {
871882                    CI_DOCKERENV="LSIO_FIRST_PARTY=true" 
872883                  fi 
873884                fi 
874-                 docker pull ghcr.io/linuxserver/ci:latest  
885+                 docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}  
875886                if [ "${MULTIARCH}" == "true" ]; then 
876887                  docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64 
877888                  docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG} 
@@ -895,7 +906,7 @@ pipeline {
895906                -e WEB_PATH=\" ${CI_WEBPATH}\"  \ 
896907                -e NODE_NAME=\" ${NODE_NAME}\"  \ 
897908                -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\"  \ 
898-                 -t ghcr.io/linuxserver/ci:latest  \ 
909+                 -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}  \ 
899910                python3 test_build.py'''  
900911        }
901912      }
@@ -921,9 +932,11 @@ pipeline {
921932                          CACHEIMAGE=${i} 
922933                      fi 
923934                  done 
924-                   docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
935+                   docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:latest -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
936+                     { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
925937                  if [ -n "${SEMVER}" ]; then 
926-                     docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
938+                     docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
939+                       { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
927940                  fi 
928941                done 
929942              '''  
@@ -948,20 +961,27 @@ pipeline {
948961                          CACHEIMAGE=${i} 
949962                      fi 
950963                  done 
951-                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
952-                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 
964+                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-latest -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
965+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
966+                   docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-latest -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
967+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
953968                  if [ -n "${SEMVER}" ]; then 
954-                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} 
955-                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} 
969+                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
970+                       { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
971+                     docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \ 
972+                       { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
956973                  fi 
957974                done 
958975                for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do 
959-                   docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest 
960-                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} 
961- 
962-                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} 
976+                   docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \ 
977+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
978+                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \ 
979+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
980+                   docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \ 
981+                     { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
963982                  if [ -n "${SEMVER}" ]; then 
964-                     docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} 
983+                     docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \ 
984+                       { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; } 
965985                  fi 
966986                done 
967987              '''  
@@ -979,23 +999,41 @@ pipeline {
979999        environment name : ' EXIT_STATUS' value : ' ' 
9801000      }
9811001      steps {
982-         echo " Pushing New tag for current commit ${ META_TAG} " 
983-         sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
984-         -d '{"tag":"'${META_TAG}'",\ 
985-              "object": "'${COMMIT_SHA}'",\ 
986-              "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\ 
987-              "type": "commit",\ 
988-              "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' '''  989-         echo " Pushing New release for Tag" 
9901002        sh ''' #! /bin/bash
1003+               echo "Auto-generating release notes" 
1004+               if [ "$(git tag --points-at HEAD)" != "" ]; then 
1005+                 echo "Existing tag points to current commit, suggesting no new LS changes" 
1006+                 AUTO_RELEASE_NOTES="No changes" 
1007+               else 
1008+                 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  \ 
1009+                   -d '{"tag_name":"'${META_TAG}'",\ 
1010+                       "target_commitish": "master"}' \ 
1011+                   | jq -r '.body' | sed 's|## What.s Changed||') 
1012+               fi 
1013+               echo "Pushing New tag for current commit ${META_TAG}" 
1014+               curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \ 
1015+                 -d '{"tag":"'${META_TAG}'",\ 
1016+                   "object": "'${COMMIT_SHA}'",\ 
1017+                   "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\ 
1018+                   "type": "commit",\ 
1019+                   "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1020+               echo "Pushing New release for Tag" 
9911021              echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json 
992-               echo '{"tag_name":"'${META_TAG}'",\ 
993-                      "target_commitish": "master",\ 
994-                      "name": "'${META_TAG}'",\ 
995-                      "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 
996-               printf '","draft": false,"prerelease": false}' >> releasebody.json 
997-               paste -d'\\ 0' start releasebody.json > releasebody.json.done 
998-               curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''  
1022+               jq -n \ 
1023+                 --arg tag_name "$META_TAG" \ 
1024+                 --arg target_commitish "master" \ 
1025+                 --arg ci_url "${CI_URL:-N/A}" \ 
1026+                 --arg ls_notes "$AUTO_RELEASE_NOTES" \ 
1027+                 --arg remote_notes "$(cat releasebody.json)" \ 
1028+                 '{ 
1029+                   "tag_name": $tag_name, 
1030+                   "target_commitish": $target_commitish, 
1031+                   "name": $tag_name, 
1032+                   "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes), 
1033+                   "draft": false, 
1034+                   "prerelease": false                }' > releasebody.json.done 
1035+               curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done 
1036+         '''  
9991037      }
10001038    }
10011039    //  Add protection to the release branch
0 commit comments