@@ -217,6 +217,7 @@ pipeline {
217217 env. META_TAG = ' development-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
218218 env. EXT_RELEASE_TAG = ' development-version-' + env. EXT_RELEASE_CLEAN
219219 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'
220+ env. CITEST_IMAGETAG = ' latest'
220221 }
221222 }
222223 }
@@ -242,6 +243,7 @@ pipeline {
242243 env. EXT_RELEASE_TAG = ' development-version-' + env. EXT_RELEASE_CLEAN
243244 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
244245 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'
246+ env. CITEST_IMAGETAG = ' develop'
245247 }
246248 }
247249 }
@@ -267,6 +269,7 @@ pipeline {
267269 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
268270 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
269271 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'
272+ env. CITEST_IMAGETAG = ' develop'
270273 }
271274 }
272275 }
@@ -289,7 +292,7 @@ pipeline {
289292 -v ${WORKSPACE}:/mnt \
290293 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
291294 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
292- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
295+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
293296 apk add --no-cache python3 && \
294297 python3 -m venv /lsiopy && \
295298 pip install --no-cache-dir -U pip && \
@@ -624,13 +627,16 @@ pipeline {
624627 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
625628 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
626629 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
630+
627631 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
632+ declare -A pids
628633 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
629634 for i in "${CACHE[@]}"; do
630635 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
636+ pids[$!]="$i"
631637 done
632- for p in $(jobs -p) ; do
633- wait "$p" || { echo "job $p failed" >&2; exit 1; }
638+ for p in "${!pids[@]}" ; do
639+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
634640 done
635641 fi
636642 '''
@@ -690,13 +696,16 @@ pipeline {
690696 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
691697 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
692698 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
699+
693700 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
701+ declare -A pids
694702 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
695703 for i in "${CACHE[@]}"; do
696704 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
705+ pids[$!]="$i"
697706 done
698- for p in $(jobs -p) ; do
699- wait "$p" || { echo "job $p failed" >&2; exit 1; }
707+ for p in "${!pids[@]}" ; do
708+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
700709 done
701710 fi
702711 '''
@@ -750,12 +759,14 @@ pipeline {
750759 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
751760 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
752761 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
762+ declare -A pids
753763 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
754764 for i in "${CACHE[@]}"; do
755765 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
766+ pids[$!]="$i"
756767 done
757- for p in $(jobs -p) ; do
758- wait "$p" || { echo "job $p failed" >&2; exit 1; }
768+ for p in "${!pids[@]}" ; do
769+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
759770 done
760771 fi
761772 '''
@@ -880,7 +891,7 @@ pipeline {
880891 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
881892 fi
882893 fi
883- docker pull ghcr.io/linuxserver/ci:latest
894+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
884895 if [ "${MULTIARCH}" == "true" ]; then
885896 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
886897 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -904,7 +915,7 @@ pipeline {
904915 -e WEB_PATH=\" ${CI_WEBPATH}\" \
905916 -e NODE_NAME=\" ${NODE_NAME}\" \
906917 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
907- -t ghcr.io/linuxserver/ci:latest \
918+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
908919 python3 test_build.py'''
909920 }
910921 }
@@ -930,9 +941,11 @@ pipeline {
930941 CACHEIMAGE=${i}
931942 fi
932943 done
933- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:development -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
944+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:development -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
945+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
934946 if [ -n "${SEMVER}" ]; then
935- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
947+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
948+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
936949 fi
937950 done
938951 '''
@@ -957,20 +970,27 @@ pipeline {
957970 CACHEIMAGE=${i}
958971 fi
959972 done
960- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-development -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-development -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
973+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-development -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${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-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-development -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
976+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
962977 if [ -n "${SEMVER}" ]; then
963- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
964- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
978+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
979+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
980+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
981+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
965982 fi
966983 done
967984 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
968- docker buildx imagetools create -t ${MANIFESTIMAGE}:development ${MANIFESTIMAGE}:amd64-development ${MANIFESTIMAGE}:arm64v8-development
969- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
970-
971- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
985+ docker buildx imagetools create -t ${MANIFESTIMAGE}:development ${MANIFESTIMAGE}:amd64-development ${MANIFESTIMAGE}:arm64v8-development || \
986+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
987+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
988+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
989+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
990+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
972991 if [ -n "${SEMVER}" ]; then
973- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
992+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
993+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
974994 fi
975995 done
976996 '''
@@ -988,23 +1008,41 @@ pipeline {
9881008 environment name : ' EXIT_STATUS' , value : ' '
9891009 }
9901010 steps {
991- echo " Pushing New tag for current commit ${ META_TAG} "
992- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
993- -d '{"tag":"'${META_TAG}'",\
994- "object": "'${COMMIT_SHA}'",\
995- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to development",\
996- "type": "commit",\
997- "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' ''' 998- echo " Pushing New release for Tag"
9991011 sh ''' #! /bin/bash
1000- curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases | jq '.[0] |.body' | sed 's:^.\\ (.*\\ ).$:\\ 1:' > releasebody.json
1001- echo '{"tag_name":"'${META_TAG}'",\
1002- "target_commitish": "development",\
1003- "name": "'${META_TAG}'",\
1004- "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
1005- printf '","draft": false,"prerelease": true}' >> releasebody.json
1006- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1007- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1012+ echo "Auto-generating release notes"
1013+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1014+ echo "Existing tag points to current commit, suggesting no new LS changes"
1015+ AUTO_RELEASE_NOTES="No changes"
1016+ else
1017+ 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 \
1018+ -d '{"tag_name":"'${META_TAG}'",\
1019+ "target_commitish": "development"}' \
1020+ | jq -r '.body' | sed 's|## What.s Changed||')
1021+ fi
1022+ echo "Pushing New tag for current commit ${META_TAG}"
1023+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1024+ -d '{"tag":"'${META_TAG}'",\
1025+ "object": "'${COMMIT_SHA}'",\
1026+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to development",\
1027+ "type": "commit",\
1028+ "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1029+ echo "Pushing New release for Tag"
1030+ curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases | jq -r '.[0] |.body' > releasebody.json
1031+ jq -n \
1032+ --arg tag_name "$META_TAG" \
1033+ --arg target_commitish "development" \
1034+ --arg ci_url "${CI_URL:-N/A}" \
1035+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1036+ --arg remote_notes "$(cat releasebody.json)" \
1037+ '{
1038+ "tag_name": $tag_name,
1039+ "target_commitish": $target_commitish,
1040+ "name": $tag_name,
1041+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1042+ "draft": false,
1043+ "prerelease": true }' > releasebody.json.done
1044+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1045+ '''
10081046 }
10091047 }
10101048 // Add protection to the release branch
0 commit comments