@@ -207,6 +207,7 @@ pipeline {
207207 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
208208 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
209209 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'
210+ env. CITEST_IMAGETAG = ' latest'
210211 }
211212 }
212213 }
@@ -232,6 +233,7 @@ pipeline {
232233 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
233234 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
234235 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'
236+ env. CITEST_IMAGETAG = ' develop'
235237 }
236238 }
237239 }
@@ -257,6 +259,7 @@ pipeline {
257259 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
258260 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
259261 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'
262+ env. CITEST_IMAGETAG = ' develop'
260263 }
261264 }
262265 }
@@ -614,13 +617,16 @@ pipeline {
614617 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
615618 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
616619 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
620+
617621 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
622+ declare -A pids
618623 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
619624 for i in "${CACHE[@]}"; do
620625 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
626+ pids[$!]="$i"
621627 done
622- for p in $(jobs -p) ; do
623- wait "$p" || { echo "job $p failed" >&2; exit 1; }
628+ for p in "${!pids[@]}" ; do
629+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
624630 done
625631 fi
626632 '''
@@ -680,13 +686,16 @@ pipeline {
680686 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
681687 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
682688 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
689+
683690 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
691+ declare -A pids
684692 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
685693 for i in "${CACHE[@]}"; do
686694 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
695+ pids[$!]="$i"
687696 done
688- for p in $(jobs -p) ; do
689- wait "$p" || { echo "job $p failed" >&2; exit 1; }
697+ for p in "${!pids[@]}" ; do
698+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
690699 done
691700 fi
692701 '''
@@ -740,12 +749,14 @@ pipeline {
740749 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
741750 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
742751 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
752+ declare -A pids
743753 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
744754 for i in "${CACHE[@]}"; do
745755 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
756+ pids[$!]="$i"
746757 done
747- for p in $(jobs -p) ; do
748- wait "$p" || { echo "job $p failed" >&2; exit 1; }
758+ for p in "${!pids[@]}" ; do
759+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
749760 done
750761 fi
751762 '''
@@ -870,7 +881,7 @@ pipeline {
870881 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
871882 fi
872883 fi
873- docker pull ghcr.io/linuxserver/ci:latest
884+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
874885 if [ "${MULTIARCH}" == "true" ]; then
875886 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
876887 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+ { [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
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+ { [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
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+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
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+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
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+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
971+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
972+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
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+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
978+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
979+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
980+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
981+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
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+ { [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]] && exit 1; }
965985 fi
966986 done
967987 '''
@@ -979,6 +999,16 @@ pipeline {
979999 environment name : ' EXIT_STATUS' , value : ' '
9801000 }
9811001 steps {
1002+ echo " Auto-generating release notes"
1003+ sh ''' if [ "$(git tag --points-at HEAD)" != "" ]; then
1004+ echo "Existing tag points to current commit, suggesting no new LS changes"
1005+ AUTO_RELEASE_NOTES="No changes"
1006+ else
1007+ 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 \
1008+ -d '{"tag_name":"'${META_TAG}'",\
1009+ "target_commitish": "master"}' \
1010+ | jq -r '.body' | sed 's|## What.s Changed||')
1011+ fi'''
9821012 echo " Pushing New tag for current commit ${ META_TAG} "
9831013 sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
9841014 -d '{"tag":"'${META_TAG}'",\
@@ -989,12 +1019,19 @@ pipeline {
9891019 echo " Pushing New release for Tag"
9901020 sh ''' #! /bin/bash
9911021 echo "Updating base packages to ${PACKAGE_TAG}" > 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
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
9981035 curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
9991036 }
10001037 }
0 commit comments