From 5b5ecd1b293530c6ef49366468007ae778d34f47 Mon Sep 17 00:00:00 2001 From: kurihada Date: Tue, 3 Mar 2026 18:07:26 +0800 Subject: [PATCH] =?UTF-8?q?CI=20=E6=8F=90=E9=80=9F=EF=BC=9A=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E9=98=B6=E6=AE=B5=E5=90=AF=E7=94=A8=20buildx=20?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=B9=B6=E7=A7=BB=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 14cddda..3c694a9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,6 +14,7 @@ pipeline { APP_NAME = 'no-whatever' CI_IMAGE = 'mcr.microsoft.com/playwright:v1.51.1-jammy' NPM_REGISTRY = 'https://registry.npmmirror.com' + BUILDX_CACHE_DIR = '.buildx-cache' } triggers { @@ -77,7 +78,7 @@ pipeline { } } - stage('CI Gate (Lint + TypeCheck + Unit + Smoke E2E)') { + stage('CI Gate (Lint + Unit + Smoke E2E)') { options { timeout(time: 30, unit: 'MINUTES') } @@ -89,7 +90,7 @@ pipeline { -e HOME=/tmp \ -e RUN_COVERAGE=${RUN_COVERAGE} \ ${CI_DEPS_IMAGE} \ - sh -lc 'set -e; cd /workspace; npx prisma generate; npm run lint; npx tsc --noEmit; if [ "$RUN_COVERAGE" = "true" ]; then npm run test:coverage; else npm run test; fi; npm run test:e2e:smoke') + sh -lc 'set -e; cd /workspace; npx prisma generate; npm run lint; if [ "$RUN_COVERAGE" = "true" ]; then npm run test:coverage; else npm run test; fi; npm run test:e2e:smoke') cleanup() { docker rm -f "$cid" >/dev/null 2>&1 || true } @@ -116,7 +117,50 @@ pipeline { withCredentials([ string(credentialsId: 'amap-api-key', variable: 'AMAP_KEY') ]) { - sh "docker build --build-arg NEXT_PUBLIC_AMAP_API_KEY=${AMAP_KEY} -t ${APP_NAME}:${BUILD_NUMBER} -t ${APP_NAME}:latest ." + sh ''' + set -e + CACHE_DIR="${BUILDX_CACHE_DIR}" + CACHE_NEW_DIR="${BUILDX_CACHE_DIR}-new" + rm -rf "$CACHE_NEW_DIR" + + if docker buildx version >/dev/null 2>&1; then + echo "using docker buildx with local cache" + docker buildx create --name "${APP_NAME}-builder" --use >/dev/null 2>&1 || true + docker buildx use "${APP_NAME}-builder" >/dev/null 2>&1 || true + mkdir -p "$CACHE_DIR" + + set +e + docker buildx build \ + --load \ + --build-arg NEXT_PUBLIC_AMAP_API_KEY="$AMAP_KEY" \ + --cache-from type=local,src="$CACHE_DIR" \ + --cache-to type=local,dest="$CACHE_NEW_DIR",mode=max \ + -t "${APP_NAME}:${BUILD_NUMBER}" \ + -t "${APP_NAME}:latest" \ + . + bx_status=$? + set -e + + if [ $bx_status -eq 0 ]; then + rm -rf "$CACHE_DIR" + mv "$CACHE_NEW_DIR" "$CACHE_DIR" + else + echo "buildx build failed, fallback to DOCKER_BUILDKIT=1 docker build" + DOCKER_BUILDKIT=1 docker build \ + --build-arg NEXT_PUBLIC_AMAP_API_KEY="$AMAP_KEY" \ + -t "${APP_NAME}:${BUILD_NUMBER}" \ + -t "${APP_NAME}:latest" \ + . + fi + else + echo "docker buildx unavailable, fallback to DOCKER_BUILDKIT=1 docker build" + DOCKER_BUILDKIT=1 docker build \ + --build-arg NEXT_PUBLIC_AMAP_API_KEY="$AMAP_KEY" \ + -t "${APP_NAME}:${BUILD_NUMBER}" \ + -t "${APP_NAME}:latest" \ + . + fi + ''' } } }