@@ -201,6 +201,7 @@ pipeline {
201201 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
202202 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
203203 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'
204+ env. CITEST_IMAGETAG = ' latest'
204205 }
205206 }
206207 }
@@ -226,6 +227,7 @@ pipeline {
226227 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
227228 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
228229 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'
230+ env. CITEST_IMAGETAG = ' develop'
229231 }
230232 }
231233 }
@@ -251,6 +253,7 @@ pipeline {
251253 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
252254 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
253255 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'
256+ env. CITEST_IMAGETAG = ' develop'
254257 }
255258 }
256259 }
@@ -545,13 +548,16 @@ pipeline {
545548 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
546549 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
547550 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
551+
548552 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
553+ declare -A pids
549554 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
550555 for i in "${CACHE[@]}"; do
551556 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
557+ pids[$!]="$i"
552558 done
553- for p in $(jobs -p) ; do
554- wait "$p" || { echo "job $p failed" >&2; exit 1; }
559+ for p in "${!pids[@]}" ; do
560+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
555561 done
556562 fi
557563 '''
@@ -611,13 +617,16 @@ pipeline {
611617 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
612618 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
613619 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
620+
614621 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
622+ declare -A pids
615623 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
616624 for i in "${CACHE[@]}"; do
617625 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
626+ pids[$!]="$i"
618627 done
619- for p in $(jobs -p) ; do
620- wait "$p" || { echo "job $p failed" >&2; exit 1; }
628+ for p in "${!pids[@]}" ; do
629+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
621630 done
622631 fi
623632 '''
@@ -671,12 +680,14 @@ pipeline {
671680 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
672681 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
673682 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
683+ declare -A pids
674684 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
675685 for i in "${CACHE[@]}"; do
676686 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
687+ pids[$!]="$i"
677688 done
678- for p in $(jobs -p) ; do
679- wait "$p" || { echo "job $p failed" >&2; exit 1; }
689+ for p in "${!pids[@]}" ; do
690+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
680691 done
681692 fi
682693 '''
@@ -801,7 +812,7 @@ pipeline {
801812 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
802813 fi
803814 fi
804- docker pull ghcr.io/linuxserver/ci:latest
815+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
805816 if [ "${MULTIARCH}" == "true" ]; then
806817 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
807818 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -824,7 +835,7 @@ pipeline {
824835 -e WEB_PATH=\" ${CI_WEBPATH}\" \
825836 -e NODE_NAME=\" ${NODE_NAME}\" \
826837 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
827- -t ghcr.io/linuxserver/ci:latest \
838+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
828839 python3 test_build.py'''
829840 }
830841 }
@@ -850,9 +861,11 @@ pipeline {
850861 CACHEIMAGE=${i}
851862 fi
852863 done
853- 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}
864+ 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} || \
865+ { [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
854866 if [ -n "${SEMVER}" ]; then
855- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
867+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
868+ { [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
856869 fi
857870 done
858871 '''
@@ -877,20 +890,27 @@ pipeline {
877890 CACHEIMAGE=${i}
878891 fi
879892 done
880- 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}
881- 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}
893+ 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} || \
894+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
895+ 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} || \
896+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
882897 if [ -n "${SEMVER}" ]; then
883- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
884- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
898+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
899+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
900+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
901+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
885902 fi
886903 done
887904 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
888- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
889- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
890-
891- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
905+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
906+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
907+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
908+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
909+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
910+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
892911 if [ -n "${SEMVER}" ]; then
893- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
912+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
913+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
894914 fi
895915 done
896916 '''
@@ -908,6 +928,16 @@ pipeline {
908928 environment name : ' EXIT_STATUS' , value : ' '
909929 }
910930 steps {
931+ echo " Auto-generating release notes"
932+ sh ''' if [ "$(git tag --points-at HEAD)" != "" ]; then
933+ echo "Existing tag points to current commit, suggesting no new LS changes"
934+ AUTO_RELEASE_NOTES="No changes"
935+ else
936+ 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 \
937+ -d '{"tag_name":"'${META_TAG}'",\
938+ "target_commitish": "master"}' \
939+ | jq -r '.body' | sed 's|## What.s Changed||')
940+ fi'''
911941 echo " Pushing New tag for current commit ${ META_TAG} "
912942 sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
913943 -d '{"tag":"'${META_TAG}'",\
@@ -918,12 +948,19 @@ pipeline {
918948 echo " Pushing New release for Tag"
919949 sh ''' #! /bin/bash
920950 echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json
921- echo '{"tag_name":"'${META_TAG}'",\
922- "target_commitish": "master",\
923- "name": "'${META_TAG}'",\
924- "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
925- printf '","draft": false,"prerelease": false}' >> releasebody.json
926- paste -d'\\ 0' start releasebody.json > releasebody.json.done
951+ jq -n \
952+ --arg tag_name "$META_TAG" \
953+ --arg target_commitish "master" \
954+ --arg ci_url "${CI_URL:-N/A}" \
955+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
956+ --arg remote_notes "$(cat releasebody.json)" \
957+ '{
958+ "tag_name": $tag_name,
959+ "target_commitish": $target_commitish,
960+ "name": $tag_name,
961+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
962+ "draft": false,
963+ "prerelease": false }' > releasebody.json.done
927964 curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
928965 }
929966 }
0 commit comments