@@ -219,6 +219,7 @@ pipeline {
219219 env. META_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
220220 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
221221 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'
222+ env. CITEST_IMAGETAG = ' latest'
222223 }
223224 }
224225 }
@@ -244,6 +245,7 @@ pipeline {
244245 env. EXT_RELEASE_TAG = ' version-' + env. EXT_RELEASE_CLEAN
245246 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
246247 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'
248+ env. CITEST_IMAGETAG = ' develop'
247249 }
248250 }
249251 }
@@ -269,6 +271,7 @@ pipeline {
269271 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
270272 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
271273 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'
274+ env. CITEST_IMAGETAG = ' develop'
272275 }
273276 }
274277 }
@@ -291,7 +294,7 @@ pipeline {
291294 -v ${WORKSPACE}:/mnt \
292295 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
293296 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
294- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
297+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
295298 apk add --no-cache python3 && \
296299 python3 -m venv /lsiopy && \
297300 pip install --no-cache-dir -U pip && \
@@ -626,13 +629,16 @@ pipeline {
626629 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
627630 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
628631 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
632+
629633 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
634+ declare -A pids
630635 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
631636 for i in "${CACHE[@]}"; do
632637 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
638+ pids[$!]="$i"
633639 done
634- for p in $(jobs -p) ; do
635- wait "$p" || { echo "job $p failed" >&2; exit 1; }
640+ for p in "${!pids[@]}" ; do
641+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
636642 done
637643 fi
638644 '''
@@ -692,13 +698,16 @@ pipeline {
692698 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
693699 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
694700 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
701+
695702 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
703+ declare -A pids
696704 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
697705 for i in "${CACHE[@]}"; do
698706 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
707+ pids[$!]="$i"
699708 done
700- for p in $(jobs -p) ; do
701- wait "$p" || { echo "job $p failed" >&2; exit 1; }
709+ for p in "${!pids[@]}" ; do
710+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
702711 done
703712 fi
704713 '''
@@ -752,12 +761,14 @@ pipeline {
752761 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
753762 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
754763 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
764+ declare -A pids
755765 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
756766 for i in "${CACHE[@]}"; do
757767 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
768+ pids[$!]="$i"
758769 done
759- for p in $(jobs -p) ; do
760- wait "$p" || { echo "job $p failed" >&2; exit 1; }
770+ for p in "${!pids[@]}" ; do
771+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
761772 done
762773 fi
763774 '''
@@ -882,7 +893,7 @@ pipeline {
882893 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
883894 fi
884895 fi
885- docker pull ghcr.io/linuxserver/ci:latest
896+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
886897 if [ "${MULTIARCH}" == "true" ]; then
887898 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
888899 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -906,7 +917,7 @@ pipeline {
906917 -e WEB_PATH=\" ${CI_WEBPATH}\" \
907918 -e NODE_NAME=\" ${NODE_NAME}\" \
908919 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
909- -t ghcr.io/linuxserver/ci:latest \
920+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
910921 python3 test_build.py'''
911922 }
912923 }
@@ -932,9 +943,11 @@ pipeline {
932943 CACHEIMAGE=${i}
933944 fi
934945 done
935- 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}
946+ 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+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
936948 if [ -n "${SEMVER}" ]; then
937- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
949+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
950+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
938951 fi
939952 done
940953 '''
@@ -959,20 +972,27 @@ pipeline {
959972 CACHEIMAGE=${i}
960973 fi
961974 done
962- 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}
963- 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}
975+ 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} || \
976+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
977+ 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} || \
978+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
964979 if [ -n "${SEMVER}" ]; then
965- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
966- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
980+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
981+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
982+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
983+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
967984 fi
968985 done
969986 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
970- docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest
971- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
972-
973- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
987+ docker buildx imagetools create -t ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm64v8-latest || \
988+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
989+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
990+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
991+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
992+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
974993 if [ -n "${SEMVER}" ]; then
975- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
994+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
995+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
976996 fi
977997 done
978998 '''
@@ -990,23 +1010,41 @@ pipeline {
9901010 environment name : ' EXIT_STATUS' , value : ' '
9911011 }
9921012 steps {
993- echo " Pushing New tag for current commit ${ META_TAG} "
994- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
995- -d '{"tag":"'${META_TAG}'",\
996- "object": "'${COMMIT_SHA}'",\
997- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
998- "type": "commit",\
999- "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
1000- echo " Pushing New release for Tag"
10011013 sh ''' #! /bin/bash
1002- curl -s https://gitlab.com/api/v4/projects/${EXT_GITLAB_ID}/repository/commits/${EXT_GIT_BRANCH} | jq '. | .title' | sed 's:^.\\ (.*\\ ).$:\\ 1:' > releasebody.json
1003- echo '{"tag_name":"'${META_TAG}'",\
1004- "target_commitish": "master",\
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
1009- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
1014+ echo "Auto-generating release notes"
1015+ if [ "$(git tag --points-at HEAD)" != "" ]; then
1016+ echo "Existing tag points to current commit, suggesting no new LS changes"
1017+ AUTO_RELEASE_NOTES="No changes"
1018+ else
1019+ 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 \
1020+ -d '{"tag_name":"'${META_TAG}'",\
1021+ "target_commitish": "master"}' \
1022+ | jq -r '.body' | sed 's|## What.s Changed||')
1023+ fi
1024+ echo "Pushing New tag for current commit ${META_TAG}"
1025+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
1026+ -d '{"tag":"'${META_TAG}'",\
1027+ "object": "'${COMMIT_SHA}'",\
1028+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
1029+ "type": "commit",\
1030+ "tagger": {"name": "LinuxServer-CI","email": "ci@linuxserver.io","date": "'${GITHUB_DATE}'"}}'
1031+ echo "Pushing New release for Tag"
1032+ curl -s https://gitlab.com/api/v4/projects/${EXT_GITLAB_ID}/repository/commits/${EXT_GIT_BRANCH} | jq -r '. | .title' > releasebody.json
1033+ jq -n \
1034+ --arg tag_name "$META_TAG" \
1035+ --arg target_commitish "master" \
1036+ --arg ci_url "${CI_URL:-N/A}" \
1037+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
1038+ --arg remote_notes "$(cat releasebody.json)" \
1039+ '{
1040+ "tag_name": $tag_name,
1041+ "target_commitish": $target_commitish,
1042+ "name": $tag_name,
1043+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
1044+ "draft": false,
1045+ "prerelease": false }' > releasebody.json.done
1046+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
1047+ '''
10101048 }
10111049 }
10121050 // Add protection to the release branch
0 commit comments