@@ -8,7 +8,7 @@ pipeline {
88 }
99 // Input to determine if this is a package check
1010 parameters {
11- string(defaultValue : ' false' , description : ' package check run' , name : ' PACKAGE_CHECK' )
11+ string(defaultValue : ' false' , description : ' package check run' , name : ' PACKAGE_CHECK' )
1212 }
1313 // Configuration for the variables used for this specific repo
1414 environment {
@@ -191,6 +191,7 @@ pipeline {
191191 env. VERSION_TAG = env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
192192 env. META_TAG = ' alpine320-' + env. EXT_RELEASE_CLEAN + ' -ls' + env. LS_TAG_NUMBER
193193 env. EXT_RELEASE_TAG = ' alpine320-version-' + env. EXT_RELEASE_CLEAN
194+ 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'
194195 }
195196 }
196197 }
@@ -215,6 +216,7 @@ pipeline {
215216 env. META_TAG = ' alpine320-' + env. EXT_RELEASE_CLEAN + ' -pkg-' + env. PACKAGE_TAG + ' -dev-' + env. COMMIT_SHA
216217 env. EXT_RELEASE_TAG = ' alpine320-version-' + env. EXT_RELEASE_CLEAN
217218 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. DEV_DOCKERHUB_IMAGE + ' /tags/'
219+ 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'
218220 }
219221 }
220222 }
@@ -239,6 +241,7 @@ pipeline {
239241 env. EXT_RELEASE_TAG = ' alpine320-version-' + env. EXT_RELEASE_CLEAN
240242 env. CODE_URL = ' https://github.com/' + env. LS_USER + ' /' + env. LS_REPO + ' /pull/' + env. PULL_REQUEST
241243 env. DOCKERHUB_LINK = ' https://hub.docker.com/r/' + env. PR_DOCKERHUB_IMAGE + ' /tags/'
244+ 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'
242245 }
243246 }
244247 }
@@ -509,8 +512,40 @@ pipeline {
509512 --label \" org.opencontainers.image.title=Python\" \
510513 --label \" org.opencontainers.image.description=python image by linuxserver.io\" \
511514 --no-cache --pull -t ${ IMAGE} :${ META_TAG} --platform=linux/amd64 \
512- --provenance=false --sbom=false \
515+ --provenance=false --sbom=false --builder=container --load \
513516 --build-arg ${ BUILD_VERSION_ARG} =${ EXT_RELEASE} --build-arg VERSION=\" ${ VERSION_TAG} \" --build-arg BUILD_DATE=${ GITHUB_DATE} ."
517+ sh ''' #! /bin/bash
518+ set -e
519+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
520+ for i in "${CACHE[@]}"; do
521+ docker tag ${IMAGE}:${META_TAG} ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
522+ done
523+ '''
524+ withCredentials([
525+ [
526+ $class : ' UsernamePasswordMultiBinding' ,
527+ credentialsId : ' Quay.io-Robot' ,
528+ usernameVariable : ' QUAYUSER' ,
529+ passwordVariable : ' QUAYPASS'
530+ ]
531+ ]) {
532+ retry_backoff(5 ,5 ) {
533+ sh ''' #! /bin/bash
534+ set -e
535+ echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
536+ echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
537+ echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
538+ echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
539+ if [[ "${PACKAGE_CHECK}" != "true" ]]; then
540+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
541+ for i in "${CACHE[@]}"; do
542+ docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
543+ done
544+ wait
545+ fi
546+ '''
547+ }
548+ }
514549 }
515550 }
516551 // Build MultiArch Docker containers for push to LS Repo
@@ -540,8 +575,40 @@ pipeline {
540575 --label \" org.opencontainers.image.title=Python\" \
541576 --label \" org.opencontainers.image.description=python image by linuxserver.io\" \
542577 --no-cache --pull -t ${ IMAGE} :amd64-${ META_TAG} --platform=linux/amd64 \
543- --provenance=false --sbom=false \
578+ --provenance=false --sbom=false --builder=container --load \
544579 --build-arg ${ BUILD_VERSION_ARG} =${ EXT_RELEASE} --build-arg VERSION=\" ${ VERSION_TAG} \" --build-arg BUILD_DATE=${ GITHUB_DATE} ."
580+ sh ''' #! /bin/bash
581+ set -e
582+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
583+ for i in "${CACHE[@]}"; do
584+ docker tag ${IMAGE}:amd64-${META_TAG} ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
585+ done
586+ '''
587+ withCredentials([
588+ [
589+ $class : ' UsernamePasswordMultiBinding' ,
590+ credentialsId : ' Quay.io-Robot' ,
591+ usernameVariable : ' QUAYUSER' ,
592+ passwordVariable : ' QUAYPASS'
593+ ]
594+ ]) {
595+ retry_backoff(5 ,5 ) {
596+ sh ''' #! /bin/bash
597+ set -e
598+ echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
599+ echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
600+ echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
601+ echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
602+ if [[ "${PACKAGE_CHECK}" != "true" ]]; then
603+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
604+ for i in "${CACHE[@]}"; do
605+ docker push ${i}:amd64-${COMMIT_SHA}-${BUILD_NUMBER} &
606+ done
607+ wait
608+ fi
609+ '''
610+ }
611+ }
545612 }
546613 }
547614 stage(' Build ARM64' ) {
@@ -550,10 +617,6 @@ pipeline {
550617 }
551618 steps {
552619 echo " Running on node: ${ NODE_NAME} "
553- echo ' Logging into Github'
554- sh ''' #! /bin/bash
555- echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
556- '''
557620 sh " sed -r -i 's|(^FROM .*)|\\ 1\\ n\\ nENV LSIO_FIRST_PARTY=true|g' Dockerfile.aarch64"
558621 sh " docker buildx build \
559622 --label \" org.opencontainers.image.created=${ GITHUB_DATE} \" \
@@ -569,18 +632,47 @@ pipeline {
569632 --label \" org.opencontainers.image.title=Python\" \
570633 --label \" org.opencontainers.image.description=python image by linuxserver.io\" \
571634 --no-cache --pull -f Dockerfile.aarch64 -t ${ IMAGE} :arm64v8-${ META_TAG} --platform=linux/arm64 \
572- --provenance=false --sbom=false \
635+ --provenance=false --sbom=false --builder=container --load \
573636 --build-arg ${ BUILD_VERSION_ARG} =${ EXT_RELEASE} --build-arg VERSION=\" ${ VERSION_TAG} \" --build-arg BUILD_DATE=${ GITHUB_DATE} ."
574- sh " docker tag ${ IMAGE} :arm64v8-${ META_TAG} ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${ COMMIT_SHA} -${ BUILD_NUMBER} "
575- retry_backoff(5 ,5 ) {
576- sh " docker push ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${ COMMIT_SHA} -${ BUILD_NUMBER} "
637+ sh ''' #! /bin/bash
638+ set -e
639+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
640+ for i in "${CACHE[@]}"; do
641+ docker tag ${IMAGE}:arm64v8-${META_TAG} ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
642+ done
643+ '''
644+ withCredentials([
645+ [
646+ $class : ' UsernamePasswordMultiBinding' ,
647+ credentialsId : ' Quay.io-Robot' ,
648+ usernameVariable : ' QUAYUSER' ,
649+ passwordVariable : ' QUAYPASS'
650+ ]
651+ ]) {
652+ retry_backoff(5 ,5 ) {
653+ sh ''' #! /bin/bash
654+ set -e
655+ echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
656+ echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
657+ echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
658+ echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
659+ if [[ "${PACKAGE_CHECK}" != "true" ]]; then
660+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
661+ for i in "${CACHE[@]}"; do
662+ docker push ${i}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} &
663+ done
664+ wait
665+ fi
666+ '''
667+ }
577668 }
578669 sh ''' #! /bin/bash
579670 containers=$(docker ps -aq)
580671 if [[ -n "${containers}" ]]; then
581672 docker stop ${containers}
582673 fi
583- docker system prune -af --volumes || : '''
674+ docker system prune -af --volumes || :
675+ '''
584676 }
585677 }
586678 }
@@ -651,37 +743,23 @@ pipeline {
651743 environment name : ' EXIT_STATUS' , value : ' '
652744 }
653745 steps {
654- withCredentials([
655- [
656- $class : ' UsernamePasswordMultiBinding' ,
657- credentialsId : ' Quay.io-Robot' ,
658- usernameVariable : ' QUAYUSER' ,
659- passwordVariable : ' QUAYPASS'
660- ]
661- ]) {
662- retry_backoff(5 ,5 ) {
663- sh ''' #! /bin/bash
664- set -e
665- echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
666- echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
667- echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
668- echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
669- for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
670- docker tag ${IMAGE}:${META_TAG} ${PUSHIMAGE}:${META_TAG}
671- docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:alpine320
672- docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG}
673- if [ -n "${SEMVER}" ]; then
674- docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER}
675- fi
676- docker push ${PUSHIMAGE}:alpine320
677- docker push ${PUSHIMAGE}:${META_TAG}
678- docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG}
679- if [ -n "${SEMVER}" ]; then
680- docker push ${PUSHIMAGE}:${SEMVER}
681- fi
746+ retry_backoff(5 ,5 ) {
747+ sh ''' #! /bin/bash
748+ set -e
749+ for PUSHIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
750+ [[ ${PUSHIMAGE%%/*} =~ \\ . ]] && PUSHIMAGEPLUS="${PUSHIMAGE}" || PUSHIMAGEPLUS="docker.io/${PUSHIMAGE}"
751+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
752+ for i in "${CACHE[@]}"; do
753+ if [[ "${PUSHIMAGEPLUS}" == "$(cut -d "/" -f1 <<< ${i})"* ]]; then
754+ CACHEIMAGE=${i}
755+ fi
682756 done
683- '''
684- }
757+ 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}
758+ if [ -n "${SEMVER}" ]; then
759+ docker buildx imagetools create --prefer-index=false -t ${PUSHIMAGE}:${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
760+ fi
761+ done
762+ '''
685763 }
686764 }
687765 }
@@ -692,57 +770,34 @@ pipeline {
692770 environment name : ' EXIT_STATUS' , value : ' '
693771 }
694772 steps {
695- withCredentials([
696- [
697- $class : ' UsernamePasswordMultiBinding' ,
698- credentialsId : ' Quay.io-Robot' ,
699- usernameVariable : ' QUAYUSER' ,
700- passwordVariable : ' QUAYPASS'
701- ]
702- ]) {
703- retry_backoff(5 ,5 ) {
704- sh ''' #! /bin/bash
705- set -e
706- echo $DOCKERHUB_TOKEN | docker login -u linuxserverci --password-stdin
707- echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
708- echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
709- echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
710- if [ "${CI}" == "false" ]; then
711- docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} --platform=arm64
712- docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
713- fi
714- for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
715- docker tag ${IMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG}
716- docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-alpine320
717- docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
718- docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
719- docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-alpine320
720- docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
721- if [ -n "${SEMVER}" ]; then
722- docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER}
723- docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
724- fi
725- docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
726- docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
727- docker push ${MANIFESTIMAGE}:amd64-alpine320
728- docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
729- docker push ${MANIFESTIMAGE}:arm64v8-alpine320
730- docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
731- if [ -n "${SEMVER}" ]; then
732- docker push ${MANIFESTIMAGE}:amd64-${SEMVER}
733- docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
734- fi
735- done
736- for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
737- docker buildx imagetools create -t ${MANIFESTIMAGE}:alpine320 ${MANIFESTIMAGE}:amd64-alpine320 ${MANIFESTIMAGE}:arm64v8-alpine320
738- docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
739- docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
740- if [ -n "${SEMVER}" ]; then
741- docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
742- fi
773+ retry_backoff(5 ,5 ) {
774+ sh ''' #! /bin/bash
775+ set -e
776+ for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
777+ [[ ${MANIFESTIMAGE%%/*} =~ \\ . ]] && MANIFESTIMAGEPLUS="${MANIFESTIMAGE}" || MANIFESTIMAGEPLUS="docker.io/${MANIFESTIMAGE}"
778+ IFS=',' read -ra CACHE <<< "$BUILDCACHE"
779+ for i in "${CACHE[@]}"; do
780+ if [[ "${MANIFESTIMAGEPLUS}" == "$(cut -d "/" -f1 <<< ${i})"* ]]; then
781+ CACHEIMAGE=${i}
782+ fi
743783 done
744- '''
745- }
784+ 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}
785+ 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}
786+ if [ -n "${SEMVER}" ]; then
787+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:amd64-${SEMVER} ${CACHEIMAGE}:amd64-${COMMIT_SHA}-${BUILD_NUMBER}
788+ docker buildx imagetools create --prefer-index=false -t ${MANIFESTIMAGE}:arm64v8-${SEMVER} ${CACHEIMAGE}:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
789+ fi
790+ done
791+ for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
792+ docker buildx imagetools create -t ${MANIFESTIMAGE}:alpine320 ${MANIFESTIMAGE}:amd64-alpine320 ${MANIFESTIMAGE}:arm64v8-alpine320
793+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
794+
795+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
796+ if [ -n "${SEMVER}" ]; then
797+ docker buildx imagetools create -t ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
798+ fi
799+ done
800+ '''
746801 }
747802 }
748803 }
@@ -770,7 +825,7 @@ pipeline {
770825 echo '{"tag_name":"'${META_TAG}'",\
771826 "target_commitish": "alpine320",\
772827 "name": "'${META_TAG}'",\
773- "body": "**LinuxServer Changes:**\\ n\\ n'${LS_RELEASE_NOTES}'\\ n\\ n**Remote Changes:**\\ n\\ n' > start
828+ "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
774829 printf '","draft": false,"prerelease": false}' >> releasebody.json
775830 paste -d'\\ 0' start releasebody.json > releasebody.json.done
776831 curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
0 commit comments