kind: pipeline type: docker name: DEV-frontend-monorepo-ci # 定义变量,方便复用 clone: depth: 50 # 保证 git diff 能获取到历史记录 steps: # 步骤 1: 准备依赖并构建共享包 (Workspace 模式) - name: install-and-build-common image: node:24.14.0 # 直接使用你需要的 Node 版本镜像 volumes: - name: pnpm_store path: /root/.local/share/pnpm/store # 挂载 pnpm 缓存 commands: - corepack enable - corepack prepare pnpm@9.15.4 --activate - pnpm install --frozen-lockfile - echo "依赖安装完成" - pnpm --filter '@repo/*' build - echo "共享包构建完成" # 步骤 2: 核心构建逻辑(包含路径检测、Docker 构建与推送) - name: build-and-run-apps image: docker:dind # 使用包含 docker 和 compose 的镜像 volumes: - name: docker_sock path: /var/run/docker.sock # 允许在容器内调用宿主机的 Docker - name: configs_dir path: /bluetti/frontend_project/bluetti-shop-configs environment: DRONE_COMMIT: ${DRONE_COMMIT} DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE} DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER} # SHOP_US: shop-dev-us.bluettipower.com # SHOP_AU: shop-dev-au.bluettipower.com # SHOP_IT: shop-dev-it.bluettipower.com # SHOP_ES: shop-dev-es.bluettipower.com # SHOP_EU: shop-dev-eu.bluettipower.com # SHOP_DE: shop-dev-de.bluettipower.com # SHOP_CA: shop-dev-ca.bluettipower.com # SHOP_UK: shop-dev-uk.bluettipower.com # SHOP_IE: shop-dev-ie.bluettipower.com # SHOP_BR: shop-dev-br.bluettipower.com # SHOP_MX: shop-dev-mx.bluettipower.com # SHOP_FR: shop-dev-fr.bluettipower.com # SHOP_PH: shop-dev-ph.bluettipower.com # SHOP_KR: shop-dev-kr.bluettipower.com # SHOP_JP: shop-dev-jp.bluettipower.com commands: - | # 1. 路径变动检测逻辑 if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) else changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) fi # 2. 判断构建范围 common_changes=$(echo "$changed_files" | grep -v "^apps/" | wc -l) if [ "$common_changes" -gt 0 ]; then echo "检测到公共区变动,准备全量构建..." build_list=$(docker compose config --services) else echo "执行定向增量构建..." build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u) fi # 3. 循环执行构建与推送 (复用你之前的逻辑) export BUILD_ENV="development" for svc in $build_list; do if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then echo ">>>>>> 构建服务: $svc $PROJECT_NAME <<<<<<" cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-development.env apps/$svc/.env.development docker compose -p "$PROJECT_NAME" build "$svc" docker compose -p "$PROJECT_NAME" up -d --force-recreate "$svc" fi done volumes: - name: pnpm_store host: path: /tmp/pnpm-cache # 宿主机路径,用于跨流水线共享 node_modules - name: configs_dir host: path: /bluetti/frontend_project/bluetti-shop-configs - name: docker_sock host: path: /var/run/docker.sock trigger: branch: - dev event: include: - push - merge_request paths: include: - 'apps/**' # 只要 apps 目录下有变动就启动 - 'pnpm-workspace.yaml' - 'package.json' --- kind: pipeline type: docker name: RC-frontend-monorepo-ci clone: depth: 50 steps: - name: install-and-build-common image: node:24.14.0 volumes: - name: pnpm_store path: /root/.local/share/pnpm/store commands: - corepack enable - corepack prepare pnpm@9.15.4 --activate - pnpm install --frozen-lockfile - echo "依赖安装完成" - pnpm --filter '@repo/*' build - echo "共享包构建完成" - name: build-and-push-apps image: docker:dind volumes: - name: docker_sock path: /var/run/docker.sock environment: DRONE_COMMIT: ${DRONE_COMMIT} DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE} DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER} commands: - | if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) else changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) fi common_changes=$(echo "$changed_files" | grep -v "^apps/" | wc -l) if [ "$common_changes" -gt 0 ]; then echo "检测到公共区变动,准备全量构建..." build_list=$(docker compose -f docker-compose.yml config --services) else echo "执行定向增量构建..." build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u) fi > .deploy_list docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B for svc in $build_list; do if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then echo ">>>>>> 构建服务: $svc <<<<<<" docker compose -p "$PROJECT_NAME" build "$svc" harbor_tag="127.0.0.1:5000/bluetti-frontend/$svc:${DRONE_COMMIT:0:10}" docker tag "$svc:latest" "$harbor_tag" echo ">>>>>> 推送服务: $svc <<<<<<" docker push "$harbor_tag" echo "$svc" >> .deploy_list echo ">>>>>> 推送完成,$svc 服务版本号: ${DRONE_COMMIT:0:10}" fi done - name: ssh-deploy image: appleboy/drone-ssh settings: host: 47.253.60.94 username: root key: from_secret: remote_ssh_key port: 22 environment: - COMMIT_SHA=${DRONE_COMMIT:0:10} - BUILD_ENV="production" command_timeout: 15m script: - echo ">>>>>> 开始连接远程服务器 <<<<<<" - cd /bluetti/frontend_project/bluetti-shop - git pull origin release - docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B - | if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) else changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) fi export TARGET_SITES="shopify-australia shopify-x" export SHOP_US="shop-rc-us.bluettipower.com" export SHOP_AU="shop-rc-au.bluettipower.com" export SHOP_IT="shop-rc-it.bluettipower.com" export SHOP_ES="shop-rc-es.bluettipower.com" export SHOP_EU="shop-rc-eu.bluettipower.com" export SHOP_DE="shop-rc-de.bluettipower.com" export SHOP_CA="shop-rc-ca.bluettipower.com" export SHOP_UK="shop-rc-uk.bluettipower.com" export SHOP_IE="shop-rc-ie.bluettipower.com" export SHOP_BR="shop-rc-br.bluettipower.com" export SHOP_MX="shop-rc-mx.bluettipower.com" export SHOP_FR="shop-rc-fr.bluettipower.com" export SHOP_PH="shop-rc-ph.bluettipower.com" export SHOP_KR="shop-rc-kr.bluettipower.com" export SHOP_JP="shop-rc-jp.bluettipower.com" export BUILD_ENV="production" export COMMIT_SHA=${DRONE_COMMIT:0:10} common_changes=$(echo "$changed_files" | grep -v "^apps/" | wc -l) if [ "$common_changes" -gt 0 ]; then echo "检测到公共区变动,远程全量更新..." deploy_list=$(docker compose -f docker-compose-release.yml config --services) else deploy_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u) fi for svc in $deploy_list; do if docker compose -f docker-compose-release.yml config --services | grep -q "^$svc$"; then echo ">>>>>> 远程更新服务: $svc <<<<<<" cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production docker compose -f docker-compose-release.yml pull "$svc" docker compose -f docker-compose-release.yml up -d --force-recreate "$svc" echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<" fi done volumes: - name: pnpm_store host: path: /tmp/pnpm-cache - name: docker_sock host: path: /var/run/docker.sock trigger: branch: - release event: include: - push paths: include: - 'apps/**' - 'package.json' --- kind: pipeline type: docker name: PROD-frontend-monorepo-ci clone: depth: 50 steps: - name: install-and-build-common image: node:24.14.0 volumes: - name: pnpm_store path: /root/.local/share/pnpm/store commands: - corepack enable - corepack prepare pnpm@9.15.4 --activate - pnpm install --frozen-lockfile - echo "依赖安装完成" - pnpm --filter '@repo/*' build - echo "共享包构建完成" - name: build-and-push-apps image: docker:dind volumes: - name: docker_sock path: /var/run/docker.sock environment: DRONE_COMMIT: ${DRONE_COMMIT} DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE} DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER} commands: - | if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) else changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) fi common_changes=$(echo "$changed_files" | grep -v "^apps/" | wc -l) if [ "$common_changes" -gt 0 ]; then echo "检测到公共区变动,准备全量构建..." build_list=$(docker compose -f docker-compose.yml config --services) else echo "执行定向增量构建..." build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u) fi > .deploy_list docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B for svc in $build_list; do if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then echo ">>>>>> 构建服务: $svc <<<<<<" docker compose -p "$PROJECT_NAME" build "$svc" harbor_tag="127.0.0.1:5000/bluetti-frontend/$svc:${DRONE_COMMIT:0:10}" docker tag "$svc:latest" "$harbor_tag" echo ">>>>>> 推送服务: $svc <<<<<<" docker push "$harbor_tag" echo "$svc" >> .deploy_list echo ">>>>>> 推送完成,$svc 服务版本号: ${DRONE_COMMIT:0:10}" fi done - name: ssh-deploy image: appleboy/drone-ssh settings: # 这里SSH 日本服务器 10.16.16.130:10007 德国服务踌躇10.16.16.130:10008 host: 10.16.16.130 username: cloudapp key: from_secret: remote_ssh_key port: 10008 environment: - COMMIT_SHA=${DRONE_COMMIT:0:10} - BUILD_ENV="production" command_timeout: 15m script: - echo ">>>>>> 开始连接远程服务器 <<<<<<" - cd /bluetti/frontend_project/bluetti-shop - git pull origin release - docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B - | if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) else changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) fi export TARGET_SITES="shopify-australia shopify-x" export SHOP_US="shop-us.bluettipower.com" export SHOP_AU="shop-au.bluettipower.com" export BUILD_ENV="production" export COMMIT_SHA=${DRONE_COMMIT:0:10} common_changes=$(echo "$changed_files" | grep -v "^apps/" | wc -l) if [ "$common_changes" -gt 0 ]; then echo "检测到公共区变动,远程全量更新..." deploy_list=$(docker compose -f docker-compose-prod.yml config --services) else deploy_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u) fi for svc in $deploy_list; do if docker compose -f docker-compose-prod.yml config --services | grep -q "^$svc$"; then echo ">>>>>> 远程更新服务: $svc <<<<<<" cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production docker compose -f docker-compose-prod.yml pull "$svc" docker compose -f docker-compose-prod.yml up -d --force-recreate "$svc" echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<" fi done volumes: - name: pnpm_store host: path: /tmp/pnpm-cache - name: docker_sock host: path: /var/run/docker.sock trigger: branch: - main event: include: - push paths: include: - 'apps/**' - 'package.json' --- kind: pipeline type: docker name: CI-notify clone: disable: true depends_on: - DEV-frontend-monorepo-ci - RC-frontend-monorepo-ci - PROD-frontend-monorepo-ci steps: - name: send-dingtalk-notification image: lddsb/drone-dingtalk-message volumes: - name: dingtalk-tpl path: /data settings: # token: 95b118a31f95c328b1c5f7f52622997d77b69da9d393b0700fc8eb33ed551713 # secret: SECb355ff4ba5b05b5325d4c67d3f6637c75613668c248ad9cc97355fe266fe1b6a # token: 8a47605751760b1b1af660e67c2f39bdf9f83c672a18ab872412e99c78b0e5c0 # secret: SEC0dfa30e4e8acfae69e7bf42b19c2feff5d302d2667de3aa4ba8cff46e867758a token: 94892495526ab4eddf5796170c8cf388697526180588f0b4cc2c8aefd3b85eb2 secret: SECbb3d7f34ee21f0268fcb093357033e94a2a0cd340be02d36ac2a59a8001b5ffa type: markdown debug: false tpl: /data/dingtalk_${DRONE_BUILD_EVENT}.tpl tips_title: 构建通知 - ${DRONE_BRANCH} when: status: - success - failure - started event: - push branch: - dev - release - main volumes: - name: dingtalk-tpl host: path: /bluetti/drone/data