@@ -212,6 +212,7 @@ pipeline {
212212 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
213213 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
214214 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'
215+ env. CITEST_IMAGETAG = ' latest'
215216 }
216217 }
217218 }
@@ -237,6 +238,7 @@ pipeline {
237238 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
238239 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
239240 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'
241+ env. CITEST_IMAGETAG = ' develop'
240242 }
241243 }
242244 }
@@ -262,6 +264,7 @@ pipeline {
262264 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
263265 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
264266 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'
267+ env. CITEST_IMAGETAG = ' develop'
265268 }
266269 }
267270 }
@@ -284,7 +287,7 @@ pipeline {
284287 -v ${WORKSPACE}:/mnt \
285288 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
286289 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
287- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
290+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
288291 apk add --no-cache python3 && \
289292 python3 -m venv /lsiopy && \
290293 pip install --no-cache-dir -U pip && \
@@ -619,13 +622,16 @@ pipeline {
619622 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
620623 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
621624 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
625+
622626 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
627+ declare -A pids
623628 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
624629 for i in "${CACHE[@]}"; do
625630 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
631+ pids[$!]="$i"
626632 done
627- for p in $(jobs -p) ; do
628- wait "$p" || { echo "job $p failed" >&2; exit 1; }
633+ for p in "${!pids[@]}" ; do
634+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
629635 done
630636 fi
631637 '''
@@ -685,13 +691,16 @@ pipeline {
685691 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
686692 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
687693 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
694+
688695 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
696+ declare -A pids
689697 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
690698 for i in "${CACHE[@]}"; do
691699 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
700+ pids[$!]="$i"
692701 done
693- for p in $(jobs -p) ; do
694- wait "$p" || { echo "job $p failed" >&2; exit 1; }
702+ for p in "${!pids[@]}" ; do
703+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
695704 done
696705 fi
697706 '''
@@ -745,12 +754,14 @@ pipeline {
745754 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
746755 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
747756 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
757+ declare -A pids
748758 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
749759 for i in "${CACHE[@]}"; do
750760 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
761+ pids[$!]="$i"
751762 done
752- for p in $(jobs -p) ; do
753- wait "$p" || { echo "job $p failed" >&2; exit 1; }
763+ for p in "${!pids[@]}" ; do
764+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
754765 done
755766 fi
756767 '''
@@ -875,7 +886,7 @@ pipeline {
875886 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
876887 fi
877888 fi
878- docker pull ghcr.io/linuxserver/ci:latest
889+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
879890 if [ "${MULTIARCH}" == "true" ]; then
880891 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
881892 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -899,7 +910,7 @@ pipeline {
899910 -e WEB_PATH=\" ${CI_WEBPATH}\" \
900911 -e NODE_NAME=\" ${NODE_NAME}\" \
901912 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
902- -t ghcr.io/linuxserver/ci:latest \
913+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
903914 python3 test_build.py'''
904915 }
905916 }
@@ -925,9 +936,11 @@ pipeline {
925936 CACHEIMAGE=${i}
926937 fi
927938 done
928- 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}
939+ 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} || \
940+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
929941 if [ -n "${SEMVER}" ]; then
930- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
942+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
943+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
931944 fi
932945 done
933946 '''
@@ -952,20 +965,27 @@ pipeline {
952965 CACHEIMAGE=${i}
953966 fi
954967 done
955- 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}
956- 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+ 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} || \
969+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
970+ 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} || \
971+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
957972 if [ -n "${SEMVER}" ]; then
958- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
959- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
973+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
974+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
975+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
976+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
960977 fi
961978 done
962979 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
963- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
964- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
965-
966- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
980+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
981+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
982+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
983+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
984+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
985+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
967986 if [ -n "${SEMVER}" ]; then
968- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
987+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
988+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
969989 fi
970990 done
971991 '''
@@ -983,23 +1003,41 @@ pipeline {
9831003 environment name : ' EXIT_STATUS' , value : ' '
9841004 }
9851005 steps {
986- echo " Pushing New tag for current commit ${ META_TAG} "
987- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
988- -d '{"tag":"'${META_TAG}'",\
989- "object": "'${COMMIT_SHA}'",\
990- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
991- "type": "commit",\
992- "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' ''' 993- echo " Pushing New release for Tag"
9941006 sh ''' #! /bin/bash
1007+ echo "Auto-generating release notes"
1008+ 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": "master"}' \
1015+ | jq -r '.body' | sed 's|## What.s Changed||')
1016+ fi
1017+ echo "Pushing New tag for current commit ${META_TAG}"
1018+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1019+ -d '{"tag":"'${META_TAG}'",\
1020+ "object": "'${COMMIT_SHA}'",\
1021+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
1022+ "type": "commit",\
1023+ "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1024+ echo "Pushing New release for Tag"
9951025 echo "Updating external repo packages to ${EXT_RELEASE_CLEAN}" > releasebody.json
996- echo '{"tag_name":"'${META_TAG}'",\
997- "target_commitish": "master",\
998- "name": "'${META_TAG}'",\
999- "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
1000- printf '","draft": false,"prerelease": false}' >> releasebody.json
1001- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1002- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1026+ jq -n \
1027+ --arg tag_name "$META_TAG" \
1028+ --arg target_commitish "master" \
1029+ --arg ci_url "${CI_URL:-N/A}" \
1030+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1031+ --arg remote_notes "$(cat releasebody.json)" \
1032+ '{
1033+ "tag_name": $tag_name,
1034+ "target_commitish": $target_commitish,
1035+ "name": $tag_name,
1036+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1037+ "draft": false,
1038+ "prerelease": false }' > releasebody.json.done
1039+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1040+ '''
10031041 }
10041042 }
10051043 // Add protection to the release branch
0 commit comments