@@ -211,6 +211,7 @@ pipeline {
211211 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
212212 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
213213 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'
214+ env. CITEST_IMAGETAG = ' latest'
214215 }
215216 }
216217 }
@@ -236,6 +237,7 @@ pipeline {
236237 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
237238 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
238239 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'
240+ env. CITEST_IMAGETAG = ' develop'
239241 }
240242 }
241243 }
@@ -261,6 +263,7 @@ pipeline {
261263 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
262264 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
263265 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'
266+ env. CITEST_IMAGETAG = ' develop'
264267 }
265268 }
266269 }
@@ -283,7 +286,7 @@ pipeline {
283286 -v ${WORKSPACE}:/mnt \
284287 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
285288 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
286- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
289+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
287290 apk add --no-cache python3 && \
288291 python3 -m venv /lsiopy && \
289292 pip install --no-cache-dir -U pip && \
@@ -618,13 +621,16 @@ pipeline {
618621 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
619622 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
620623 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
624+
621625 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
626+ declare -A pids
622627 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
623628 for i in "${CACHE[@]}"; do
624629 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
630+ pids[$!]="$i"
625631 done
626- for p in $(jobs -p) ; do
627- wait "$p" || { echo "job $p failed" >&2; exit 1; }
632+ for p in "${!pids[@]}" ; do
633+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
628634 done
629635 fi
630636 '''
@@ -684,13 +690,16 @@ pipeline {
684690 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
685691 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
686692 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
693+
687694 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
695+ declare -A pids
688696 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
689697 for i in "${CACHE[@]}"; do
690698 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
699+ pids[$!]="$i"
691700 done
692- for p in $(jobs -p) ; do
693- wait "$p" || { echo "job $p failed" >&2; exit 1; }
701+ for p in "${!pids[@]}" ; do
702+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
694703 done
695704 fi
696705 '''
@@ -744,12 +753,14 @@ pipeline {
744753 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
745754 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
746755 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
756+ declare -A pids
747757 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
748758 for i in "${CACHE[@]}"; do
749759 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
760+ pids[$!]="$i"
750761 done
751- for p in $(jobs -p) ; do
752- wait "$p" || { echo "job $p failed" >&2; exit 1; }
762+ for p in "${!pids[@]}" ; do
763+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
753764 done
754765 fi
755766 '''
@@ -874,7 +885,7 @@ pipeline {
874885 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
875886 fi
876887 fi
877- docker pull ghcr.io/linuxserver/ci:latest
888+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
878889 if [ "${MULTIARCH}" == "true" ]; then
879890 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
880891 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -898,7 +909,7 @@ pipeline {
898909 -e WEB_PATH=\" ${CI_WEBPATH}\" \
899910 -e NODE_NAME=\" ${NODE_NAME}\" \
900911 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
901- -t ghcr.io/linuxserver/ci:latest \
912+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
902913 python3 test_build.py'''
903914 }
904915 }
@@ -924,9 +935,11 @@ pipeline {
924935 CACHEIMAGE=${i}
925936 fi
926937 done
927- 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}
938+ 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+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
928940 if [ -n "${SEMVER}" ]; then
929- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
941+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
942+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
930943 fi
931944 done
932945 '''
@@ -951,20 +964,27 @@ pipeline {
951964 CACHEIMAGE=${i}
952965 fi
953966 done
954- 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}
955- 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+ 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} || \
968+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
969+ 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} || \
970+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
956971 if [ -n "${SEMVER}" ]; then
957- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
958- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
972+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
973+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
974+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
975+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
959976 fi
960977 done
961978 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
962- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
963- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
964-
965- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
979+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
980+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
981+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
982+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
983+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
984+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
966985 if [ -n "${SEMVER}" ]; then
967- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
986+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
987+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
968988 fi
969989 done
970990 '''
@@ -982,23 +1002,41 @@ pipeline {
9821002 environment name : ' EXIT_STATUS' , value : ' '
9831003 }
9841004 steps {
985- echo " Pushing New tag for current commit ${ META_TAG} "
986- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
987- -d '{"tag":"'${META_TAG}'",\
988- "object": "'${COMMIT_SHA}'",\
989- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
990- "type": "commit",\
991- "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
992- echo " Pushing New release for Tag"
9931005 sh ''' #! /bin/bash
1006+ echo "Auto-generating release notes"
1007+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1008+ echo "Existing tag points to current commit, suggesting no new LS changes"
1009+ AUTO_RELEASE_NOTES="No changes"
1010+ else
1011+ 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 \
1012+ -d '{"tag_name":"'${META_TAG}'",\
1013+ "target_commitish": "master"}' \
1014+ | jq -r '.body' | sed 's|## What.s Changed||')
1015+ fi
1016+ echo "Pushing New tag for current commit ${META_TAG}"
1017+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1018+ -d '{"tag":"'${META_TAG}'",\
1019+ "object": "'${COMMIT_SHA}'",\
1020+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
1021+ "type": "commit",\
1022+ "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}'
1023+ echo "Pushing New release for Tag"
9941024 echo "Updating external repo packages to ${EXT_RELEASE_CLEAN}" > releasebody.json
995- echo '{"tag_name":"'${META_TAG}'",\
996- "target_commitish": "master",\
997- "name": "'${META_TAG}'",\
998- "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
999- printf '","draft": false,"prerelease": false}' >> releasebody.json
1000- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1001- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1025+ jq -n \
1026+ --arg tag_name "$META_TAG" \
1027+ --arg target_commitish "master" \
1028+ --arg ci_url "${CI_URL:-N/A}" \
1029+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1030+ --arg remote_notes "$(cat releasebody.json)" \
1031+ '{
1032+ "tag_name": $tag_name,
1033+ "target_commitish": $target_commitish,
1034+ "name": $tag_name,
1035+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1036+ "draft": false,
1037+ "prerelease": false }' > releasebody.json.done
1038+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1039+ '''
10021040 }
10031041 }
10041042 // Add protection to the release branch
0 commit comments