@@ -208,6 +208,7 @@ pipeline {
208208 env. META_TAG = ' 3.20-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
209209 env. EXT_RELEASE_TAG = ' 3.20-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 = ' 3.20-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 && \
@@ -551,13 +554,16 @@ pipeline {
551554 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
552555 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
553556 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
557+
554558 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
559+ declare -A pids
555560 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
556561 for i in "${CACHE[@]}"; do
557562 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
563+ pids[$!]="$i"
558564 done
559- for p in $(jobs -p) ; do
560- wait "$p" || { echo "job $p failed" >&2; exit 1; }
565+ for p in "${!pids[@]}" ; do
566+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
561567 done
562568 fi
563569 '''
@@ -616,13 +622,16 @@ pipeline {
616622 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
617623 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
618624 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
625+
619626 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
627+ declare -A pids
620628 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
621629 for i in "${CACHE[@]}"; do
622630 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
631+ pids[$!]="$i"
623632 done
624- for p in $(jobs -p) ; do
625- wait "$p" || { echo "job $p failed" >&2; exit 1; }
633+ for p in "${!pids[@]}" ; do
634+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
626635 done
627636 fi
628637 '''
@@ -675,12 +684,14 @@ pipeline {
675684 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
676685 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
677686 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
687+ declare -A pids
678688 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
679689 for i in "${CACHE[@]}"; do
680690 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
691+ pids[$!]="$i"
681692 done
682- for p in $(jobs -p) ; do
683- wait "$p" || { echo "job $p failed" >&2; exit 1; }
693+ for p in "${!pids[@]}" ; do
694+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
684695 done
685696 fi
686697 '''
@@ -805,7 +816,7 @@ pipeline {
805816 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
806817 fi
807818 fi
808- docker pull ghcr.io/linuxserver/ci:latest
819+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
809820 if [ "${MULTIARCH}" == "true" ]; then
810821 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
811822 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -829,7 +840,7 @@ pipeline {
829840 -e WEB_PATH=\" ${CI_WEBPATH}\" \
830841 -e NODE_NAME=\" ${NODE_NAME}\" \
831842 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
832- -t ghcr.io/linuxserver/ci:latest \
843+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
833844 python3 test_build.py'''
834845 }
835846 }
@@ -855,9 +866,11 @@ pipeline {
855866 CACHEIMAGE=${i}
856867 fi
857868 done
858- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:3.20 -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
869+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:3.20 -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
870+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
859871 if [ -n "${SEMVER}" ]; then
860- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
872+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
873+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
861874 fi
862875 done
863876 '''
@@ -882,20 +895,27 @@ pipeline {
882895 CACHEIMAGE=${i}
883896 fi
884897 done
885- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-3.20 -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
886- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-3.20 -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
898+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-3.20 -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
899+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
900+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-3.20 -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
901+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
887902 if [ -n "${SEMVER}" ]; then
888- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
889- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
903+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
904+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
905+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
906+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
890907 fi
891908 done
892909 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
893- docker buildx imagetools create -t ${MANIFESTIMAGE}:3.20 ${MANIFESTIMAGE}:amd64-3.20 ${MANIFESTIMAGE}:arm64v8-3.20
894- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
895-
896- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
910+ docker buildx imagetools create -t ${MANIFESTIMAGE}:3.20 ${MANIFESTIMAGE}:amd64-3.20 ${MANIFESTIMAGE}:arm64v8-3.20 || \
911+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
912+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
913+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
914+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
915+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
897916 if [ -n "${SEMVER}" ]; then
898- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
917+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
918+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
899919 fi
900920 done
901921 '''
@@ -913,23 +933,41 @@ pipeline {
913933 environment name : ' EXIT_STATUS' , value : ' '
914934 }
915935 steps {
916- echo " Pushing New tag for current commit ${ META_TAG} "
917- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
918- -d '{"tag":"'${META_TAG}'",\
919- "object": "'${COMMIT_SHA}'",\
920- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to 3.20",\
921- "type": "commit",\
922- "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
923- echo " Pushing New release for Tag"
924936 sh ''' #! /bin/bash
937+ echo "Auto-generating release notes"
938+ if [ "$(git tag --points-at HEAD)" != "" ]; then
939+ echo "Existing tag points to current commit, suggesting no new LS changes"
940+ AUTO_RELEASE_NOTES="No changes"
941+ else
942+ 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 \
943+ -d '{"tag_name":"'${META_TAG}'",\
944+ "target_commitish": "3.20"}' \
945+ | jq -r '.body' | sed 's|## What.s Changed||')
946+ fi
947+ echo "Pushing New tag for current commit ${META_TAG}"
948+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
949+ -d '{"tag":"'${META_TAG}'",\
950+ "object": "'${COMMIT_SHA}'",\
951+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to 3.20",\
952+ "type": "commit",\
953+ "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}'
954+ echo "Pushing New release for Tag"
925955 echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json
926- echo '{"tag_name":"'${META_TAG}'",\
927- "target_commitish": "3.20",\
928- "name": "'${META_TAG}'",\
929- "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
930- printf '","draft": false,"prerelease": true}' >> releasebody.json
931- paste -d'\\ 0' start releasebody.json > releasebody.json.done
932- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
956+ jq -n \
957+ --arg tag_name "$META_TAG" \
958+ --arg target_commitish "3.20" \
959+ --arg ci_url "${CI_URL:-N/A}" \
960+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
961+ --arg remote_notes "$(cat releasebody.json)" \
962+ '{
963+ "tag_name": $tag_name,
964+ "target_commitish": $target_commitish,
965+ "name": $tag_name,
966+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
967+ "draft": false,
968+ "prerelease": true }' > releasebody.json.done
969+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
970+ '''
933971 }
934972 }
935973 // Add protection to the release branch
0 commit comments