@@ -209,6 +209,7 @@ pipeline {
209209 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
210210 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
211211 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'
212+ env. CITEST_IMAGETAG = ' latest'
212213 }
213214 }
214215 }
@@ -234,6 +235,7 @@ pipeline {
234235 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
235236 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
236237 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'
238+ env. CITEST_IMAGETAG = ' develop'
237239 }
238240 }
239241 }
@@ -259,6 +261,7 @@ pipeline {
259261 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
260262 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
261263 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'
264+ env. CITEST_IMAGETAG = ' develop'
262265 }
263266 }
264267 }
@@ -281,7 +284,7 @@ pipeline {
281284 -v ${WORKSPACE}:/mnt \
282285 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
283286 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
284- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
287+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
285288 apk add --no-cache python3 && \
286289 python3 -m venv /lsiopy && \
287290 pip install --no-cache-dir -U pip && \
@@ -616,13 +619,16 @@ pipeline {
616619 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
617620 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
618621 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
622+
619623 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
624+ declare -A pids
620625 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
621626 for i in "${CACHE[@]}"; do
622627 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
628+ pids[$!]="$i"
623629 done
624- for p in $(jobs -p) ; do
625- wait "$p" || { echo "job $p failed" >&2; exit 1; }
630+ for p in "${!pids[@]}" ; do
631+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
626632 done
627633 fi
628634 '''
@@ -682,13 +688,16 @@ pipeline {
682688 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
683689 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
684690 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
691+
685692 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
693+ declare -A pids
686694 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
687695 for i in "${CACHE[@]}"; do
688696 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
697+ pids[$!]="$i"
689698 done
690- for p in $(jobs -p) ; do
691- wait "$p" || { echo "job $p failed" >&2; exit 1; }
699+ for p in "${!pids[@]}" ; do
700+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
692701 done
693702 fi
694703 '''
@@ -742,12 +751,14 @@ pipeline {
742751 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
743752 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
744753 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
754+ declare -A pids
745755 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
746756 for i in "${CACHE[@]}"; do
747757 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
758+ pids[$!]="$i"
748759 done
749- for p in $(jobs -p) ; do
750- wait "$p" || { echo "job $p failed" >&2; exit 1; }
760+ for p in "${!pids[@]}" ; do
761+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
751762 done
752763 fi
753764 '''
@@ -872,7 +883,7 @@ pipeline {
872883 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
873884 fi
874885 fi
875- docker pull ghcr.io/linuxserver/ci:latest
886+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
876887 if [ "${MULTIARCH}" == "true" ]; then
877888 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
878889 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -896,7 +907,7 @@ pipeline {
896907 -e WEB_PATH=\" ${CI_WEBPATH}\" \
897908 -e NODE_NAME=\" ${NODE_NAME}\" \
898909 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
899- -t ghcr.io/linuxserver/ci:latest \
910+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
900911 python3 test_build.py'''
901912 }
902913 }
@@ -922,9 +933,11 @@ pipeline {
922933 CACHEIMAGE=${i}
923934 fi
924935 done
925- 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+ 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} || \
937+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
926938 if [ -n "${SEMVER}" ]; then
927- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
939+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
940+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
928941 fi
929942 done
930943 '''
@@ -949,20 +962,27 @@ pipeline {
949962 CACHEIMAGE=${i}
950963 fi
951964 done
952- 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}
953- 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}
965+ 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} || \
966+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
967+ 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} || \
968+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
954969 if [ -n "${SEMVER}" ]; then
955- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
956- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
970+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
971+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
972+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
973+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
957974 fi
958975 done
959976 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
960- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
961- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
962-
963- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
977+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
978+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
979+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
980+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
981+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
982+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
964983 if [ -n "${SEMVER}" ]; then
965- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
984+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
985+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
966986 fi
967987 done
968988 '''
@@ -980,23 +1000,41 @@ pipeline {
9801000 environment name : ' EXIT_STATUS' , value : ' '
9811001 }
9821002 steps {
983- echo " Pushing New tag for current commit ${ META_TAG} "
984- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
985- -d '{"tag":"'${META_TAG}'",\
986- "object": "'${COMMIT_SHA}'",\
987- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to main",\
988- "type": "commit",\
989- "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' ''' 990- echo " Pushing New release for Tag"
9911003 sh ''' #! /bin/bash
1004+ echo "Auto-generating release notes"
1005+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1006+ echo "Existing tag points to current commit, suggesting no new LS changes"
1007+ AUTO_RELEASE_NOTES="No changes"
1008+ else
1009+ 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 \
1010+ -d '{"tag_name":"'${META_TAG}'",\
1011+ "target_commitish": "main"}' \
1012+ | jq -r '.body' | sed 's|## What.s Changed||')
1013+ fi
1014+ echo "Pushing New tag for current commit ${META_TAG}"
1015+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1016+ -d '{"tag":"'${META_TAG}'",\
1017+ "object": "'${COMMIT_SHA}'",\
1018+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to main",\
1019+ "type": "commit",\
1020+ "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1021+ echo "Pushing New release for Tag"
9921022 echo "Updating PIP version of ${EXT_PIP} to ${EXT_RELEASE_CLEAN}" > releasebody.json
993- echo '{"tag_name":"'${META_TAG}'",\
994- "target_commitish": "main",\
995- "name": "'${META_TAG}'",\
996- "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
997- printf '","draft": false,"prerelease": false}' >> releasebody.json
998- paste -d'\\ 0' start releasebody.json > releasebody.json.done
999- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1023+ jq -n \
1024+ --arg tag_name "$META_TAG" \
1025+ --arg target_commitish "main" \
1026+ --arg ci_url "${CI_URL:-N/A}" \
1027+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1028+ --arg remote_notes "$(cat releasebody.json)" \
1029+ '{
1030+ "tag_name": $tag_name,
1031+ "target_commitish": $target_commitish,
1032+ "name": $tag_name,
1033+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1034+ "draft": false,
1035+ "prerelease": false }' > releasebody.json.done
1036+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1037+ '''
10001038 }
10011039 }
10021040 // Add protection to the release branch
0 commit comments