@@ -213,6 +213,7 @@ pipeline {
213213 env. META_TAG = ' develop-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
214214 env. EXT_RELEASE_TAG = ' develop-version-' + env. EXT_RELEASE_CLEAN
215215 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'
216+ env. CITEST_IMAGETAG = ' latest'
216217 }
217218 }
218219 }
@@ -238,6 +239,7 @@ pipeline {
238239 env. EXT_RELEASE_TAG = ' develop-version-' + env. EXT_RELEASE_CLEAN
239240 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
240241 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'
242+ env. CITEST_IMAGETAG = ' develop'
241243 }
242244 }
243245 }
@@ -263,6 +265,7 @@ pipeline {
263265 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
264266 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
265267 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'
268+ env. CITEST_IMAGETAG = ' develop'
266269 }
267270 }
268271 }
@@ -285,7 +288,7 @@ pipeline {
285288 -v ${WORKSPACE}:/mnt \
286289 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
287290 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
288- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
291+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
289292 apk add --no-cache python3 && \
290293 python3 -m venv /lsiopy && \
291294 pip install --no-cache-dir -U pip && \
@@ -620,13 +623,16 @@ pipeline {
620623 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
621624 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
622625 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
626+
623627 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
628+ declare -A pids
624629 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
625630 for i in "${CACHE[@]}"; do
626631 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
632+ pids[$!]="$i"
627633 done
628- for p in $(jobs -p) ; do
629- wait "$p" || { echo "job $p failed" >&2; exit 1; }
634+ for p in "${!pids[@]}" ; do
635+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
630636 done
631637 fi
632638 '''
@@ -686,13 +692,16 @@ pipeline {
686692 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
687693 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
688694 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
695+
689696 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
697+ declare -A pids
690698 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
691699 for i in "${CACHE[@]}"; do
692700 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
701+ pids[$!]="$i"
693702 done
694- for p in $(jobs -p) ; do
695- wait "$p" || { echo "job $p failed" >&2; exit 1; }
703+ for p in "${!pids[@]}" ; do
704+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
696705 done
697706 fi
698707 '''
@@ -746,12 +755,14 @@ pipeline {
746755 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
747756 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
748757 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
758+ declare -A pids
749759 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
750760 for i in "${CACHE[@]}"; do
751761 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
762+ pids[$!]="$i"
752763 done
753- for p in $(jobs -p) ; do
754- wait "$p" || { echo "job $p failed" >&2; exit 1; }
764+ for p in "${!pids[@]}" ; do
765+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
755766 done
756767 fi
757768 '''
@@ -876,7 +887,7 @@ pipeline {
876887 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
877888 fi
878889 fi
879- docker pull ghcr.io/linuxserver/ci:latest
890+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
880891 if [ "${MULTIARCH}" == "true" ]; then
881892 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
882893 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -900,7 +911,7 @@ pipeline {
900911 -e WEB_PATH=\" ${CI_WEBPATH}\" \
901912 -e NODE_NAME=\" ${NODE_NAME}\" \
902913 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
903- -t ghcr.io/linuxserver/ci:latest \
914+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
904915 python3 test_build.py'''
905916 }
906917 }
@@ -926,9 +937,11 @@ pipeline {
926937 CACHEIMAGE=${i}
927938 fi
928939 done
929- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:develop -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
940+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:develop -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
941+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
930942 if [ -n "${SEMVER}" ]; then
931- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
943+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
944+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
932945 fi
933946 done
934947 '''
@@ -953,20 +966,27 @@ pipeline {
953966 CACHEIMAGE=${i}
954967 fi
955968 done
956- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-develop -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
957- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-develop -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
969+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-develop -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${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-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-develop -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
972+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
958973 if [ -n "${SEMVER}" ]; then
959- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
960- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
974+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
975+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
976+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
977+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
961978 fi
962979 done
963980 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
964- docker buildx imagetools create -t ${MANIFESTIMAGE}:develop ${MANIFESTIMAGE}:amd64-develop ${MANIFESTIMAGE}:arm64v8-develop
965- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
966-
967- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
981+ docker buildx imagetools create -t ${MANIFESTIMAGE}:develop ${MANIFESTIMAGE}:amd64-develop ${MANIFESTIMAGE}:arm64v8-develop || \
982+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
983+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
984+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
985+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
986+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
968987 if [ -n "${SEMVER}" ]; then
969- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
988+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
989+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
970990 fi
971991 done
972992 '''
@@ -984,6 +1004,16 @@ pipeline {
9841004 environment name : ' EXIT_STATUS' , value : ' '
9851005 }
9861006 steps {
1007+ echo " Auto-generating release notes"
1008+ sh ''' if [ "$(git tag --points-at HEAD)" != "" ]; then
1009+ echo "Existing tag points to current commit, suggesting no new LS changes"
1010+ AUTO_RELEASE_NOTES="No changes"
1011+ else
1012+ 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 \
1013+ -d '{"tag_name":"'${META_TAG}'",\
1014+ "target_commitish": "develop"}' \
1015+ | jq -r '.body' | sed 's|## What.s Changed||')
1016+ fi'''
9871017 echo " Pushing New tag for current commit ${ META_TAG} "
9881018 sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
9891019 -d '{"tag":"'${META_TAG}'",\
@@ -994,12 +1024,19 @@ pipeline {
9941024 echo " Pushing New release for Tag"
9951025 sh ''' #! /bin/bash
9961026 echo "Data change at JSON endpoint ${JSON_URL}" > releasebody.json
997- echo '{"tag_name":"'${META_TAG}'",\
998- "target_commitish": "develop",\
999- "name": "'${META_TAG}'",\
1000- "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
1001- printf '","draft": false,"prerelease": true}' >> releasebody.json
1002- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1027+ jq -n \
1028+ --arg tag_name "$META_TAG" \
1029+ --arg target_commitish "develop" \
1030+ --arg ci_url "${CI_URL:-N/A}" \
1031+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1032+ --arg remote_notes "$(cat releasebody.json)" \
1033+ '{
1034+ "tag_name": $tag_name,
1035+ "target_commitish": $target_commitish,
1036+ "name": $tag_name,
1037+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1038+ "draft": false,
1039+ "prerelease": true }' > releasebody.json.done
10031040 curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
10041041 }
10051042 }
0 commit comments