@@ -208,6 +208,7 @@ pipeline {
208208 env. META_TAG = ' alpine320-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
209209 env. EXT_RELEASE_TAG = ' alpine320-version-' + env. EXT_RELEASE_CLEAN
210210 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'
211+ env. CITEST_IMAGETAG = ' latest'
211212 }
212213 }
213214 }
@@ -233,6 +234,7 @@ pipeline {
233234 env. EXT_RELEASE_TAG = ' alpine320-version-' + env. EXT_RELEASE_CLEAN
234235 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
235236 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'
237+ env. CITEST_IMAGETAG = ' develop'
236238 }
237239 }
238240 }
@@ -258,6 +260,7 @@ pipeline {
258260 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
259261 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
260262 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'
263+ env. CITEST_IMAGETAG = ' develop'
261264 }
262265 }
263266 }
@@ -280,7 +283,7 @@ pipeline {
280283 -v ${WORKSPACE}:/mnt \
281284 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
282285 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
283- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
286+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
284287 apk add --no-cache python3 && \
285288 python3 -m venv /lsiopy && \
286289 pip install --no-cache-dir -U pip && \
@@ -552,13 +555,16 @@ pipeline {
552555 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
553556 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
554557 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
558+
555559 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
560+ declare -A pids
556561 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
557562 for i in "${CACHE[@]}"; do
558563 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
564+ pids[$!]="$i"
559565 done
560- for p in $(jobs -p) ; do
561- wait "$p" || { echo "job $p failed" >&2; exit 1; }
566+ for p in "${!pids[@]}" ; do
567+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
562568 done
563569 fi
564570 '''
@@ -617,13 +623,16 @@ pipeline {
617623 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
618624 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
619625 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
626+
620627 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
628+ declare -A pids
621629 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
622630 for i in "${CACHE[@]}"; do
623631 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
632+ pids[$!]="$i"
624633 done
625- for p in $(jobs -p) ; do
626- wait "$p" || { echo "job $p failed" >&2; exit 1; }
634+ for p in "${!pids[@]}" ; do
635+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
627636 done
628637 fi
629638 '''
@@ -677,12 +686,14 @@ pipeline {
677686 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
678687 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
679688 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
689+ declare -A pids
680690 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
681691 for i in "${CACHE[@]}"; do
682692 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
693+ pids[$!]="$i"
683694 done
684- for p in $(jobs -p) ; do
685- wait "$p" || { echo "job $p failed" >&2; exit 1; }
695+ for p in "${!pids[@]}" ; do
696+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
686697 done
687698 fi
688699 '''
@@ -728,7 +739,7 @@ pipeline {
728739 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
729740 fi
730741 fi
731- docker pull ghcr.io/linuxserver/ci:latest
742+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
732743 if [ "${MULTIARCH}" == "true" ]; then
733744 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
734745 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -752,7 +763,9 @@ pipeline {
752763 -e WEB_PATH=\" ${CI_WEBPATH}\" \
753764 -e NODE_NAME=\" ${NODE_NAME}\" \
754765 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
755- -t ghcr.io/linuxserver/ci:latest \
766+ -e COMMIT_SHA=\" ${COMMIT_SHA}\" \
767+ -e BUILD_NUMBER=\" ${BUILD_NUMBER}\" \
768+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
756769 python3 test_build.py'''
757770 }
758771 }
@@ -778,9 +791,11 @@ pipeline {
778791 CACHEIMAGE=${i}
779792 fi
780793 done
781- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:alpine320 -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
794+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:alpine320 -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
795+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
782796 if [ -n "${SEMVER}" ]; then
783- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
797+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
798+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
784799 fi
785800 done
786801 '''
@@ -805,20 +820,27 @@ pipeline {
805820 CACHEIMAGE=${i}
806821 fi
807822 done
808- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-alpine320 -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
809- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-alpine320 -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
823+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-alpine320 -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
824+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
825+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-alpine320 -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
826+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
810827 if [ -n "${SEMVER}" ]; then
811- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
812- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
828+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
829+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
830+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
831+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
813832 fi
814833 done
815834 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
816- docker buildx imagetools create -t ${MANIFESTIMAGE}:alpine320 ${MANIFESTIMAGE}:amd64-alpine320 ${MANIFESTIMAGE}:arm64v8-alpine320
817- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
818-
819- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
835+ docker buildx imagetools create -t ${MANIFESTIMAGE}:alpine320 ${MANIFESTIMAGE}:amd64-alpine320 ${MANIFESTIMAGE}:arm64v8-alpine320 || \
836+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
837+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
838+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
839+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
840+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
820841 if [ -n "${SEMVER}" ]; then
821- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
842+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
843+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
822844 fi
823845 done
824846 '''
@@ -836,23 +858,41 @@ pipeline {
836858 environment name : ' EXIT_STATUS' , value : ' '
837859 }
838860 steps {
839- echo " Pushing New tag for current commit ${ META_TAG} "
840- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
841- -d '{"tag":"'${META_TAG}'",\
842- "object": "'${COMMIT_SHA}'",\
843- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to alpine320",\
844- "type": "commit",\
845- "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
846- echo " Pushing New release for Tag"
847861 sh ''' #! /bin/bash
862+ echo "Auto-generating release notes"
863+ if [ "$(git tag --points-at HEAD)" != "" ]; then
864+ echo "Existing tag points to current commit, suggesting no new LS changes"
865+ AUTO_RELEASE_NOTES="No changes"
866+ else
867+ 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 \
868+ -d '{"tag_name":"'${META_TAG}'",\
869+ "target_commitish": "alpine320"}' \
870+ | jq -r '.body' | sed 's|## What.s Changed||')
871+ fi
872+ echo "Pushing New tag for current commit ${META_TAG}"
873+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
874+ -d '{"tag":"'${META_TAG}'",\
875+ "object": "'${COMMIT_SHA}'",\
876+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to alpine320",\
877+ "type": "commit",\
878+ "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}'
879+ echo "Pushing New release for Tag"
848880 echo "Updating to ${EXT_RELEASE_CLEAN}" > releasebody.json
849- echo '{"tag_name":"'${META_TAG}'",\
850- "target_commitish": "alpine320",\
851- "name": "'${META_TAG}'",\
852- "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
853- printf '","draft": false,"prerelease": true}' >> releasebody.json
854- paste -d'\\ 0' start releasebody.json > releasebody.json.done
855- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
881+ jq -n \
882+ --arg tag_name "$META_TAG" \
883+ --arg target_commitish "alpine320" \
884+ --arg ci_url "${CI_URL:-N/A}" \
885+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
886+ --arg remote_notes "$(cat releasebody.json)" \
887+ '{
888+ "tag_name": $tag_name,
889+ "target_commitish": $target_commitish,
890+ "name": $tag_name,
891+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
892+ "draft": false,
893+ "prerelease": true }' > releasebody.json.done
894+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
895+ '''
856896 }
857897 }
858898 // Add protection to the release branch
0 commit comments