@@ -206,6 +206,7 @@ pipeline {
206206 env. META_TAG = ' alpine322-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
207207 env. EXT_RELEASE_TAG = ' alpine322-version-' + env. EXT_RELEASE_CLEAN
208208 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'
209+ env. CITEST_IMAGETAG = ' latest'
209210 }
210211 }
211212 }
@@ -231,6 +232,7 @@ pipeline {
231232 env. EXT_RELEASE_TAG = ' alpine322-version-' + env. EXT_RELEASE_CLEAN
232233 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
233234 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'
235+ env. CITEST_IMAGETAG = ' develop'
234236 }
235237 }
236238 }
@@ -256,6 +258,7 @@ pipeline {
256258 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
257259 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
258260 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'
261+ env. CITEST_IMAGETAG = ' develop'
259262 }
260263 }
261264 }
@@ -278,7 +281,7 @@ pipeline {
278281 -v ${WORKSPACE}:/mnt \
279282 -e AWS_ACCESS_KEY_ID=\" ${S3_KEY}\" \
280283 -e AWS_SECRET_ACCESS_KEY=\" ${S3_SECRET}\" \
281- ghcr.io/linuxserver/baseimage-alpine:3.20 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
284+ ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
282285 apk add --no-cache python3 && \
283286 python3 -m venv /lsiopy && \
284287 pip install --no-cache-dir -U pip && \
@@ -550,13 +553,16 @@ pipeline {
550553 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
551554 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
552555 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
556+
553557 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
558+ declare -A pids
554559 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
555560 for i in "${CACHE[@]}"; do
556561 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
562+ pids[$!]="$i"
557563 done
558- for p in $(jobs -p) ; do
559- wait "$p" || { echo "job $p failed" >&2; exit 1; }
564+ for p in "${!pids[@]}" ; do
565+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
560566 done
561567 fi
562568 '''
@@ -616,13 +622,16 @@ pipeline {
616622 echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
617623 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
618624 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
625+
619626 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
627+ declare -A pids
620628 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
621629 for i in "${CACHE[@]}"; do
622630 docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
631+ pids[$!]="$i"
623632 done
624- for p in $(jobs -p) ; do
625- wait "$p" || { echo "job $p failed" >&2; exit 1; }
633+ for p in "${!pids[@]}" ; do
634+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
626635 done
627636 fi
628637 '''
@@ -676,12 +685,14 @@ pipeline {
676685 echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
677686 echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
678687 if [[ "${PACKAGE_CHECK}" != "true" ]]; then
688+ declare -A pids
679689 IFS=',' read -ra CACHE <<< "$BUILDCACHE"
680690 for i in "${CACHE[@]}"; do
681691 docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
692+ pids[$!]="$i"
682693 done
683- for p in $(jobs -p) ; do
684- wait "$p" || { echo "job $p failed" >&2; exit 1; }
694+ for p in "${!pids[@]}" ; do
695+ wait "$p" || { [[ "${pids[$p]}" != *"quay.io"* ]] && exit 1; }
685696 done
686697 fi
687698 '''
@@ -806,7 +817,7 @@ pipeline {
806817 CI_DOCKERENV="LSIO_FIRST_PARTY=true"
807818 fi
808819 fi
809- docker pull ghcr.io/linuxserver/ci:latest
820+ docker pull ghcr.io/linuxserver/ci:${CITEST_IMAGETAG}
810821 if [ "${MULTIARCH}" == "true" ]; then
811822 docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
812823 docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
@@ -830,7 +841,7 @@ pipeline {
830841 -e WEB_PATH=\" ${CI_WEBPATH}\" \
831842 -e NODE_NAME=\" ${NODE_NAME}\" \
832843 -e SYFT_IMAGE_TAG=\" ${CI_SYFT_IMAGE_TAG:-${SYFT_IMAGE_TAG}}\" \
833- -t ghcr.io/linuxserver/ci:latest \
844+ -t ghcr.io/linuxserver/ci:${CITEST_IMAGETAG} \
834845 python3 test_build.py'''
835846 }
836847 }
@@ -856,9 +867,11 @@ pipeline {
856867 CACHEIMAGE=${i}
857868 fi
858869 done
859- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:alpine322 -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
870+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${META_TAG} -t ${PUSHIMAGE}:alpine322 -t ${PUSHIMAGE}:${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
871+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
860872 if [ -n "${SEMVER}" ]; then
861- docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
873+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
874+ { if [[ "${PUSHIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
862875 fi
863876 done
864877 '''
@@ -883,20 +896,27 @@ pipeline {
883896 CACHEIMAGE=${i}
884897 fi
885898 done
886- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-alpine322 -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
887- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-alpine322 -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
899+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${META_TAG} -t ${MANIFESTIMAGE}:amd64-alpine322 -t ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
900+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
901+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${META_TAG} -t ${MANIFESTIMAGE}:arm64v8-alpine322 -t ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
902+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
888903 if [ -n "${SEMVER}" ]; then
889- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
890- docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
904+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} || \
905+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
906+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} || \
907+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
891908 fi
892909 done
893910 for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
894- docker buildx imagetools create -t ${MANIFESTIMAGE}:alpine322 ${MANIFESTIMAGE}:amd64-alpine322 ${MANIFESTIMAGE}:arm64v8-alpine322
895- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
896-
897- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
911+ docker buildx imagetools create -t ${MANIFESTIMAGE}:alpine322 ${MANIFESTIMAGE}:amd64-alpine322 ${MANIFESTIMAGE}:arm64v8-alpine322 || \
912+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
913+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG} || \
914+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
915+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} || \
916+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
898917 if [ -n "${SEMVER}" ]; then
899- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
918+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} || \
919+ { if [[ "${MANIFESTIMAGE}" != "${QUAYIMAGE}" ]]; then exit 1; fi; }
900920 fi
901921 done
902922 '''
@@ -914,23 +934,41 @@ pipeline {
914934 environment name : ' EXIT_STATUS' , value : ' '
915935 }
916936 steps {
917- echo " Pushing New tag for current commit ${ META_TAG} "
918- sh ''' curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
919- -d '{"tag":"'${META_TAG}'",\
920- "object": "'${COMMIT_SHA}'",\
921- "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
922- "type": "commit",\
923- "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' ''' 924- echo " Pushing New release for Tag"
925937 sh ''' #! /bin/bash
938+ echo "Auto-generating release notes"
939+ if [ "$(git tag --points-at HEAD)" != "" ]; then
940+ echo "Existing tag points to current commit, suggesting no new LS changes"
941+ AUTO_RELEASE_NOTES="No changes"
942+ else
943+ 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 \
944+ -d '{"tag_name":"'${META_TAG}'",\
945+ "target_commitish": "master"}' \
946+ | jq -r '.body' | sed 's|## What.s Changed||')
947+ fi
948+ echo "Pushing New tag for current commit ${META_TAG}"
949+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
950+ -d '{"tag":"'${META_TAG}'",\
951+ "object": "'${COMMIT_SHA}'",\
952+ "message": "Tagging Release '${EXT_RELEASE_CLEAN}'-ls'${LS_TAG_NUMBER}' to master",\
953+ "type": "commit",\
954+ "tagger": {"name": "LinuxServer-CI","email": "[email protected] ","date": "'${GITHUB_DATE}'"}}' 955+ echo "Pushing New release for Tag"
926956 echo "Updating base packages to ${PACKAGE_TAG}" > releasebody.json
927- echo '{"tag_name":"'${META_TAG}'",\
928- "target_commitish": "master",\
929- "name": "'${META_TAG}'",\
930- "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
931- printf '","draft": false,"prerelease": false}' >> releasebody.json
932- paste -d'\\ 0' start releasebody.json > releasebody.json.done
933- curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
957+ jq -n \
958+ --arg tag_name "$META_TAG" \
959+ --arg target_commitish "master" \
960+ --arg ci_url "${CI_URL:-N/A}" \
961+ --arg ls_notes "$AUTO_RELEASE_NOTES" \
962+ --arg remote_notes "$(cat releasebody.json)" \
963+ '{
964+ "tag_name": $tag_name,
965+ "target_commitish": $target_commitish,
966+ "name": $tag_name,
967+ "body": ("**CI Report:**\\ n\\ n" + $ci_url + "\\ n\\ n**LinuxServer Changes:**\\ n\\ n" + $ls_notes + "\\ n\\ n**Remote Changes:**\\ n\\ n" + $remote_notes),
968+ "draft": false,
969+ "prerelease": false }' > releasebody.json.done
970+ curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done
971+ '''
934972 }
935973 }
936974 // Add protection to the release branch
0 commit comments