@@ -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 && \
@@ -555,13 +558,16 @@ pipeline {
555558 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
556559 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
557560 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
561+
558562 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
563+ declare -A pids
559564 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
560565 for i in "${CACHE[@]}"; do
561566 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
567+ pids[$!]="$i"
562568 done
563- for p in $(jobs -p) ; do
564- wait "$p" || { echo "job $p failed" >&2; exit 1; }
569+ for p in "${!pids[@]}" ; do
570+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
565571 done
566572 fi
567573 '''
@@ -621,13 +627,16 @@ pipeline {
621627 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
622628 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
623629 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
630+
624631 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
632+ declare -A pids
625633 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
626634 for i in "${CACHE[@]}"; do
627635 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
636+ pids[$!]="$i"
628637 done
629- for p in $(jobs -p) ; do
630- wait "$p" || { echo "job $p failed" >&2; exit 1; }
638+ for p in "${!pids[@]}" ; do
639+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
631640 done
632641 fi
633642 '''
@@ -681,12 +690,14 @@ pipeline {
681690 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
682691 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
683692 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
693+ declare -A pids
684694 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
685695 for i in "${CACHE[@]}"; do
686696 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
697+ pids[$!]="$i"
687698 done
688- for p in $(jobs -p) ; do
689- wait "$p" || { echo "job $p failed" >&2; exit 1; }
699+ for p in "${!pids[@]}" ; do
700+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
690701 done
691702 fi
692703 '''
@@ -747,13 +758,16 @@ pipeline {
747758 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
748759 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
749760 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
761+
750762 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
763+ declare -A pids
751764 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
752765 for i in "${CACHE[@]}"; do
753766 docker push ${i}:riscv64-${COMMIT_SHA}-${BUILD_NUMBER} &
767+ pids[$!]="$i"
754768 done
755- for p in $(jobs -p) ; do
756- wait "$p" || { echo "job $p failed" >&2; exit 1; }
769+ for p in "${!pids[@]}" ; do
770+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
757771 done
758772 fi
759773 '''
@@ -878,7 +892,7 @@ pipeline {
878892 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
879893 fi
880894 fi
881- docker pull ghcr.io/linuxserver/ci:latest
895+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
882896 if [ "${MULTIARCH}" == "true" ]; then
883897 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
884898 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -904,7 +918,7 @@ pipeline {
904918 -e WEB_PATH=\" ${CI_WEBPATH}\" \
905919 -e NODE_NAME=\" ${NODE_NAME}\" \
906920 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
907- -t ghcr.io/linuxserver/ci:latest \
921+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
908922 python3 test_build.py'''
909923 }
910924 }
@@ -930,9 +944,11 @@ pipeline {
930944 CACHEIMAGE=${i}
931945 fi
932946 done
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}
947+ 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} || \
948+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
934949 if [ -n "${SEMVER}" ]; then
935- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
950+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
951+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
936952 fi
937953 done
938954 '''
@@ -957,22 +973,31 @@ pipeline {
957973 CACHEIMAGE=${i}
958974 fi
959975 done
960- 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}
961- 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}:riscv64-${META_TAG} -t ${MANIFESTIMAGE}:riscv64-latest -t ${MANIFESTIMAGE}:riscv64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:riscv64-${COMMIT_SHA}-${BUILD_NUMBER}
976+ 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} || \
977+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
978+ 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} || \
979+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
980+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:riscv64-${META_TAG} -t ${MANIFESTIMAGE}:riscv64-latest -t ${MANIFESTIMAGE}:riscv64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:riscv64-${COMMIT_SHA}-${BUILD_NUMBER} || \
981+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
963982 if [ -n "${SEMVER}" ]; then
964- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
965- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
966- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:riscv64-${SEMVER} ${CACHEIMAGE}:riscv64-${COMMIT_SHA}-${BUILD_NUMBER}
983+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
984+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
985+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
986+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
987+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:riscv64-${SEMVER} ${CACHEIMAGE}:riscv64-${COMMIT_SHA}-${BUILD_NUMBER} || \
988+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
967989 fi
968990 done
969991 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
970- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:riscv64-latest ${MANIFESTIMAGE}:arm64v8-latest
971- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:riscv64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
972-
973- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:riscv64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
992+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:riscv64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
993+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
994+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:riscv64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
995+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
996+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:riscv64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
997+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
974998 if [ -n "${SEMVER}" ]; then
975- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:riscv64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
999+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:riscv64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
1000+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
9761001 fi
9771002 done
9781003 '''
@@ -990,6 +1015,16 @@ pipeline {
9901015 environment name : ' EXIT_STATUS' , value : ' '
9911016 }
9921017 steps {
1018+ echo " Auto-generating release notes"
1019+ sh ''' if [ "$(git tag --points-at HEAD)" != "" ]; then
1020+ echo "Existing tag points to current commit, suggesting no new LS changes"
1021+ AUTO_RELEASE_NOTES="No changes"
1022+ else
1023+ 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 \
1024+ -d '{"tag_name":"'${META_TAG}'",\
1025+ "target_commitish": "main"}' \
1026+ | jq -r '.body' | sed 's|## What.s Changed||')
1027+ fi'''
9931028 echo " Pushing New tag for current commit ${ META_TAG} "
9941029 sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
9951030 -d '{"tag":"'${META_TAG}'",\
@@ -1000,12 +1035,19 @@ pipeline {
10001035 echo " Pushing New release for Tag"
10011036 sh ''' #! /bin/bash
10021037 echo "Updating external repo packages to ${EXT_RELEASE_CLEAN}" > releasebody.json
1003- echo '{"tag_name":"'${META_TAG}'",\
1004- "target_commitish": "main",\
1005- "name": "'${META_TAG}'",\
1006- "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
1007- printf '","draft": false,"prerelease": false}' >> releasebody.json
1008- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1038+ jq -n \
1039+ --arg tag_name "$META_TAG" \
1040+ --arg target_commitish "main" \
1041+ --arg ci_url "${CI_URL:-N/A}" \
1042+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1043+ --arg remote_notes "$(cat releasebody.json)" \
1044+ '{
1045+ "tag_name": $tag_name,
1046+ "target_commitish": $target_commitish,
1047+ "name": $tag_name,
1048+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1049+ "draft": false,
1050+ "prerelease": false }' > releasebody.json.done
10091051 curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
10101052 }
10111053 }
0 commit comments