@@ -210,6 +210,7 @@ pipeline {
210210 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
211211 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
212212 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'
213+ env. CITEST_IMAGETAG = ' latest'
213214 }
214215 }
215216 }
@@ -235,6 +236,7 @@ pipeline {
235236 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
236237 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
237238 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'
239+ env. CITEST_IMAGETAG = ' develop'
238240 }
239241 }
240242 }
@@ -260,6 +262,7 @@ pipeline {
260262 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
261263 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
262264 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'
265+ env. CITEST_IMAGETAG = ' develop'
263266 }
264267 }
265268 }
@@ -282,7 +285,7 @@ pipeline {
282285 -v ${WORKSPACE}:/mnt \
283286 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
284287 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
285- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
288+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
286289 apk add --no-cache python3 && \
287290 python3 -m venv /lsiopy && \
288291 pip install --no-cache-dir -U pip && \
@@ -617,13 +620,16 @@ pipeline {
617620 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
618621 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
619622 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
623+
620624 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
625+ declare -A pids
621626 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
622627 for i in "${CACHE[@]}"; do
623628 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
629+ pids[$!]="$i"
624630 done
625- for p in $(jobs -p) ; do
626- wait "$p" || { echo "job $p failed" >&2; exit 1; }
631+ for p in "${!pids[@]}" ; do
632+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
627633 done
628634 fi
629635 '''
@@ -683,13 +689,16 @@ pipeline {
683689 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
684690 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
685691 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
692+
686693 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
694+ declare -A pids
687695 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
688696 for i in "${CACHE[@]}"; do
689697 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
698+ pids[$!]="$i"
690699 done
691- for p in $(jobs -p) ; do
692- wait "$p" || { echo "job $p failed" >&2; exit 1; }
700+ for p in "${!pids[@]}" ; do
701+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
693702 done
694703 fi
695704 '''
@@ -743,12 +752,14 @@ pipeline {
743752 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
744753 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
745754 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
755+ declare -A pids
746756 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
747757 for i in "${CACHE[@]}"; do
748758 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
759+ pids[$!]="$i"
749760 done
750- for p in $(jobs -p) ; do
751- wait "$p" || { echo "job $p failed" >&2; exit 1; }
761+ for p in "${!pids[@]}" ; do
762+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
752763 done
753764 fi
754765 '''
@@ -873,7 +884,7 @@ pipeline {
873884 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
874885 fi
875886 fi
876- docker pull ghcr.io/linuxserver/ci:latest
887+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
877888 if [ "${MULTIARCH}" == "true" ]; then
878889 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
879890 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -897,7 +908,7 @@ pipeline {
897908 -e WEB_PATH=\" ${CI_WEBPATH}\" \
898909 -e NODE_NAME=\" ${NODE_NAME}\" \
899910 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
900- -t ghcr.io/linuxserver/ci:latest \
911+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
901912 python3 test_build.py'''
902913 }
903914 }
@@ -923,9 +934,11 @@ pipeline {
923934 CACHEIMAGE=${i}
924935 fi
925936 done
926- 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}
937+ 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+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
927939 if [ -n "${SEMVER}" ]; then
928- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
940+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
941+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
929942 fi
930943 done
931944 '''
@@ -950,20 +963,27 @@ pipeline {
950963 CACHEIMAGE=${i}
951964 fi
952965 done
953- 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}
954- 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}
966+ 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} || \
967+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
968+ 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} || \
969+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
955970 if [ -n "${SEMVER}" ]; then
956- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
957- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
971+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
972+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
973+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
974+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
958975 fi
959976 done
960977 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
961- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
962- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
963-
964- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
978+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
979+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
980+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
981+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
982+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
983+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
965984 if [ -n "${SEMVER}" ]; then
966- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
985+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
986+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
967987 fi
968988 done
969989 '''
@@ -981,23 +1001,41 @@ pipeline {
9811001 environment name : ' EXIT_STATUS' , value : ' '
9821002 }
9831003 steps {
984- echo " Pushing New tag for current commit ${ META_TAG} "
985- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
986- -d '{"tag":"'${META_TAG}'",\
987- "object": "'${COMMIT_SHA}'",\
988- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
989- "type": "commit",\
990- "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' ''' 991- echo " Pushing New release for Tag"
9921004 sh ''' #! /bin/bash
1005+ echo "Auto-generating release notes"
1006+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1007+ echo "Existing tag points to current commit, suggesting no new LS changes"
1008+ AUTO_RELEASE_NOTES="No changes"
1009+ else
1010+ 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 \
1011+ -d '{"tag_name":"'${META_TAG}'",\
1012+ "target_commitish": "master"}' \
1013+ | jq -r '.body' | sed 's|## What.s Changed||')
1014+ fi
1015+ echo "Pushing New tag for current commit ${META_TAG}"
1016+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1017+ -d '{"tag":"'${META_TAG}'",\
1018+ "object": "'${COMMIT_SHA}'",\
1019+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
1020+ "type": "commit",\
1021+ "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 1022+ echo "Pushing New release for Tag"
9931023 echo "Data change at JSON endpoint ${JSON_URL}" > releasebody.json
994- echo '{"tag_name":"'${META_TAG}'",\
995- "target_commitish": "master",\
996- "name": "'${META_TAG}'",\
997- "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
998- printf '","draft": false,"prerelease": false}' >> releasebody.json
999- paste -d'\\ 0' start releasebody.json > releasebody.json.done
1000- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1024+ jq -n \
1025+ --arg tag_name "$META_TAG" \
1026+ --arg target_commitish "master" \
1027+ --arg ci_url "${CI_URL:-N/A}" \
1028+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1029+ --arg remote_notes "$(cat releasebody.json)" \
1030+ '{
1031+ "tag_name": $tag_name,
1032+ "target_commitish": $target_commitish,
1033+ "name": $tag_name,
1034+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1035+ "draft": false,
1036+ "prerelease": false }' > releasebody.json.done
1037+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1038+ '''
10011039 }
10021040 }
10031041 // Add protection to the release branch
0 commit comments