@@ -218,6 +218,7 @@ pipeline {
218218 env. META_TAG = ' develop-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
219219 env. EXT_RELEASE_TAG = ' develop-version-' + env. EXT_RELEASE_CLEAN
220220 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'
221+ env. CITEST_IMAGETAG = ' latest'
221222 }
222223 }
223224 }
@@ -243,6 +244,7 @@ pipeline {
243244 env. EXT_RELEASE_TAG = ' develop-version-' + env. EXT_RELEASE_CLEAN
244245 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
245246 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'
247+ env. CITEST_IMAGETAG = ' develop'
246248 }
247249 }
248250 }
@@ -268,6 +270,7 @@ pipeline {
268270 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
269271 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
270272 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'
273+ env. CITEST_IMAGETAG = ' develop'
271274 }
272275 }
273276 }
@@ -290,7 +293,7 @@ pipeline {
290293 -v ${WORKSPACE}:/mnt \
291294 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
292295 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
293- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
296+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
294297 apk add --no-cache python3 && \
295298 python3 -m venv /lsiopy && \
296299 pip install --no-cache-dir -U pip && \
@@ -625,13 +628,16 @@ pipeline {
625628 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
626629 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
627630 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
631+
628632 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
633+ declare -A pids
629634 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
630635 for i in "${CACHE[@]}"; do
631636 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
637+ pids[$!]="$i"
632638 done
633- for p in $(jobs -p) ; do
634- wait "$p" || { echo "job $p failed" >&2; exit 1; }
639+ for p in "${!pids[@]}" ; do
640+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
635641 done
636642 fi
637643 '''
@@ -691,13 +697,16 @@ pipeline {
691697 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
692698 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
693699 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
700+
694701 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
702+ declare -A pids
695703 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
696704 for i in "${CACHE[@]}"; do
697705 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
706+ pids[$!]="$i"
698707 done
699- for p in $(jobs -p) ; do
700- wait "$p" || { echo "job $p failed" >&2; exit 1; }
708+ for p in "${!pids[@]}" ; do
709+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
701710 done
702711 fi
703712 '''
@@ -751,12 +760,14 @@ pipeline {
751760 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
752761 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
753762 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
763+ declare -A pids
754764 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
755765 for i in "${CACHE[@]}"; do
756766 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
767+ pids[$!]="$i"
757768 done
758- for p in $(jobs -p) ; do
759- wait "$p" || { echo "job $p failed" >&2; exit 1; }
769+ for p in "${!pids[@]}" ; do
770+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
760771 done
761772 fi
762773 '''
@@ -881,7 +892,7 @@ pipeline {
881892 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
882893 fi
883894 fi
884- docker pull ghcr.io/linuxserver/ci:latest
895+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
885896 if [ "${MULTIARCH}" == "true" ]; then
886897 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
887898 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -905,7 +916,9 @@ pipeline {
905916 -e WEB_PATH=\" ${CI_WEBPATH}\" \
906917 -e NODE_NAME=\" ${NODE_NAME}\" \
907918 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
908- -t ghcr.io/linuxserver/ci:latest \
919+ -e COMMIT_SHA=\" ${COMMIT_SHA}\" \
920+ -e BUILD_NUMBER=\" ${BUILD_NUMBER}\" \
921+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
909922 python3 test_build.py'''
910923 }
911924 }
@@ -931,9 +944,11 @@ pipeline {
931944 CACHEIMAGE=${i}
932945 fi
933946 done
934- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:develop -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}:develop -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
948+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
935949 if [ -n "${SEMVER}" ]; then
936- 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; }
937952 fi
938953 done
939954 '''
@@ -958,20 +973,27 @@ pipeline {
958973 CACHEIMAGE=${i}
959974 fi
960975 done
961- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-develop -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
962- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-develop -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
976+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-develop -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-develop -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
979+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
963980 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}
981+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
982+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
983+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
984+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
966985 fi
967986 done
968987 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
969- docker buildx imagetools create -t ${MANIFESTIMAGE}:develop ${MANIFESTIMAGE}:amd64-develop ${MANIFESTIMAGE}:arm64v8-develop
970- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
971-
972- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
988+ docker buildx imagetools create -t ${MANIFESTIMAGE}:develop ${MANIFESTIMAGE}:amd64-develop ${MANIFESTIMAGE}:arm64v8-develop || \
989+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
990+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
991+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
992+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
993+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
973994 if [ -n "${SEMVER}" ]; then
974- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
995+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
996+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
975997 fi
976998 done
977999 '''
@@ -989,23 +1011,41 @@ pipeline {
9891011 environment name : ' EXIT_STATUS' , value : ' '
9901012 }
9911013 steps {
992- echo " Pushing New tag for current commit ${ META_TAG} "
993- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
994- -d '{"tag":"'${META_TAG}'",\
995- "object": "'${COMMIT_SHA}'",\
996- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to develop",\
997- "type": "commit",\
998- "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' ''' 999- echo " Pushing New release for Tag"
10001014 sh ''' #! /bin/bash
1001- curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_RELEASE_CLEAN} | jq '.commit.message' | sed 's:^.\\ (.*\\ ).$:\\ 1:' > releasebody.json
1002- echo '{"tag_name":"'${META_TAG}'",\
1003- "target_commitish": "develop",\
1004- "name": "'${META_TAG}'",\
1005- "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
1006- printf '","draft": false,"prerelease": true}' >> releasebody.json
1007- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1008- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1015+ echo "Auto-generating release notes"
1016+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1017+ echo "Existing tag points to current commit, suggesting no new LS changes"
1018+ AUTO_RELEASE_NOTES="No changes"
1019+ else
1020+ 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 \
1021+ -d '{"tag_name":"'${META_TAG}'",\
1022+ "target_commitish": "develop"}' \
1023+ | jq -r '.body' | sed 's|## What.s Changed||')
1024+ fi
1025+ echo "Pushing New tag for current commit ${META_TAG}"
1026+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1027+ -d '{"tag":"'${META_TAG}'",\
1028+ "object": "'${COMMIT_SHA}'",\
1029+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to develop",\
1030+ "type": "commit",\
1031+ "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1032+ echo "Pushing New release for Tag"
1033+ curl -H "Authorization: token ${GITHUB_TOKEN}" -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_RELEASE_CLEAN} | jq -r '.commit.message' > releasebody.json
1034+ jq -n \
1035+ --arg tag_name "$META_TAG" \
1036+ --arg target_commitish "develop" \
1037+ --arg ci_url "${CI_URL:-N/A}" \
1038+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1039+ --arg remote_notes "$(cat releasebody.json)" \
1040+ '{
1041+ "tag_name": $tag_name,
1042+ "target_commitish": $target_commitish,
1043+ "name": $tag_name,
1044+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1045+ "draft": false,
1046+ "prerelease": true }' > releasebody.json.done
1047+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1048+ '''
10091049 }
10101050 }
10111051 // Add protection to the release branch
0 commit comments