@@ -206,6 +206,7 @@ pipeline {
206206 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
207207 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
208208 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'
209+ env. CITEST_IMAGETAG = ' latest'
209210 }
210211 }
211212 }
@@ -231,6 +232,7 @@ pipeline {
231232 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
232233 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
233234 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'
235+ env. CITEST_IMAGETAG = ' develop'
234236 }
235237 }
236238 }
@@ -256,6 +258,7 @@ pipeline {
256258 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
257259 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
258260 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'
261+ env. CITEST_IMAGETAG = ' develop'
259262 }
260263 }
261264 }
@@ -278,7 +281,7 @@ pipeline {
278281 -v ${WORKSPACE}:/mnt \
279282 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
280283 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
281- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
284+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
282285 apk add --no-cache python3 && \
283286 python3 -m venv /lsiopy && \
284287 pip install --no-cache-dir -U pip && \
@@ -613,13 +616,16 @@ pipeline {
613616 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
614617 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
615618 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
619+
616620 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
621+ declare -A pids
617622 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
618623 for i in "${CACHE[@]}"; do
619624 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
625+ pids[$!]="$i"
620626 done
621- for p in $(jobs -p) ; do
622- wait "$p" || { echo "job $p failed" >&2; exit 1; }
627+ for p in "${!pids[@]}" ; do
628+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
623629 done
624630 fi
625631 '''
@@ -679,13 +685,16 @@ pipeline {
679685 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
680686 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
681687 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
688+
682689 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
690+ declare -A pids
683691 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
684692 for i in "${CACHE[@]}"; do
685693 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
694+ pids[$!]="$i"
686695 done
687- for p in $(jobs -p) ; do
688- wait "$p" || { echo "job $p failed" >&2; exit 1; }
696+ for p in "${!pids[@]}" ; do
697+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
689698 done
690699 fi
691700 '''
@@ -739,12 +748,14 @@ pipeline {
739748 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
740749 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
741750 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
751+ declare -A pids
742752 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
743753 for i in "${CACHE[@]}"; do
744754 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
755+ pids[$!]="$i"
745756 done
746- for p in $(jobs -p) ; do
747- wait "$p" || { echo "job $p failed" >&2; exit 1; }
757+ for p in "${!pids[@]}" ; do
758+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
748759 done
749760 fi
750761 '''
@@ -869,7 +880,7 @@ pipeline {
869880 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
870881 fi
871882 fi
872- docker pull ghcr.io/linuxserver/ci:latest
883+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
873884 if [ "${MULTIARCH}" == "true" ]; then
874885 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
875886 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -893,7 +904,7 @@ pipeline {
893904 -e WEB_PATH=\" ${CI_WEBPATH}\" \
894905 -e NODE_NAME=\" ${NODE_NAME}\" \
895906 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
896- -t ghcr.io/linuxserver/ci:latest \
907+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
897908 python3 test_build.py'''
898909 }
899910 }
@@ -919,9 +930,11 @@ pipeline {
919930 CACHEIMAGE=${i}
920931 fi
921932 done
922- 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}
933+ 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} || \
934+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
923935 if [ -n "${SEMVER}" ]; then
924- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
936+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
937+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
925938 fi
926939 done
927940 '''
@@ -946,20 +959,27 @@ pipeline {
946959 CACHEIMAGE=${i}
947960 fi
948961 done
949- 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}
950- 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}
962+ 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} || \
963+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
964+ 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+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
951966 if [ -n "${SEMVER}" ]; then
952- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
953- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
967+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
968+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
969+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
970+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
954971 fi
955972 done
956973 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
957- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
958- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
959-
960- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
974+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
975+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
976+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
977+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
978+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
979+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
961980 if [ -n "${SEMVER}" ]; then
962- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
981+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
982+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
963983 fi
964984 done
965985 '''
@@ -977,23 +997,41 @@ pipeline {
977997 environment name : ' EXIT_STATUS' , value : ' '
978998 }
979999 steps {
980- echo " Pushing New tag for current commit ${ META_TAG} "
981- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
982- -d '{"tag":"'${META_TAG}'",\
983- "object": "'${COMMIT_SHA}'",\
984- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to main",\
985- "type": "commit",\
986- "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
987- echo " Pushing New release for Tag"
9881000 sh ''' #! /bin/bash
1001+ echo "Auto-generating release notes"
1002+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1003+ echo "Existing tag points to current commit, suggesting no new LS changes"
1004+ AUTO_RELEASE_NOTES="No changes"
1005+ else
1006+ 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 \
1007+ -d '{"tag_name":"'${META_TAG}'",\
1008+ "target_commitish": "main"}' \
1009+ | jq -r '.body' | sed 's|## What.s Changed||')
1010+ fi
1011+ echo "Pushing New tag for current commit ${META_TAG}"
1012+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1013+ -d '{"tag":"'${META_TAG}'",\
1014+ "object": "'${COMMIT_SHA}'",\
1015+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to main",\
1016+ "type": "commit",\
1017+ "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}'
1018+ echo "Pushing New release for Tag"
9891019 echo "Updating PIP version of ${EXT_PIP} to ${EXT_RELEASE_CLEAN}" > releasebody.json
990- echo '{"tag_name":"'${META_TAG}'",\
991- "target_commitish": "main",\
992- "name": "'${META_TAG}'",\
993- "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
994- printf '","draft": false,"prerelease": false}' >> releasebody.json
995- paste -d'\\ 0' start releasebody.json > releasebody.json.done
996- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1020+ jq -n \
1021+ --arg tag_name "$META_TAG" \
1022+ --arg target_commitish "main" \
1023+ --arg ci_url "${CI_URL:-N/A}" \
1024+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1025+ --arg remote_notes "$(cat releasebody.json)" \
1026+ '{
1027+ "tag_name": $tag_name,
1028+ "target_commitish": $target_commitish,
1029+ "name": $tag_name,
1030+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1031+ "draft": false,
1032+ "prerelease": false }' > releasebody.json.done
1033+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1034+ '''
9971035 }
9981036 }
9991037 // Add protection to the release branch
0 commit comments