Files
drone-cicd/20260630_front.yaml
2026-07-01 16:20:26 +08:00

509 lines
17 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
kind: pipeline
type: docker
name: DEV-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 # 挂载 pnpm 缓存
commands:
- corepack enable
- corepack prepare pnpm@9.15.4 --activate
- pnpm install --frozen-lockfile
- pnpm --filter '@repo/*' build
- name: build-and-run-apps
image: docker:dind
pull: if-not-exists
volumes:
- name: docker_sock
path: /var/run/docker.sock
- 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}
DRONE_BUILD_EVENT: ${DRONE_BUILD_EVENT} # 引入事件类型判断
PROJECT_NAME:
from_secret: PROJECT_NAME
commands:
- |
if [ "${DRONE_BUILD_EVENT}" = "pull_request" ] || [ "${DRONE_BUILD_EVENT}" = "merge_request" ]; then
# 如果是 MR直接对比目标分支假设是 dev
git fetch origin dev:dev
changed_files=$(git diff --name-only dev...HEAD)
elif [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ] || [ -z "${DRONE_COMMIT_BEFORE}" ]; 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 -p "$PROJECT_NAME" config --services)
else
echo "执行定向增量构建..."
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
fi
# 3. 设置部署环境变量
export BUILD_ENV="development"
export CONTAINER_SUFFIX=""
export IMAGE_TAG="dev"
export TRAEFIK_PREFIX="shoptest"
for svc in $build_list; do
if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then
echo ">>>>>> 开始增量构建部署服务: $svc <<<<<<"
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 "$svc" --build
fi
done
volumes:
- name: pnpm_store
host:
path: /tmp/pnpm-cache
- 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
---
kind: pipeline
type: docker
name: TEST-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 # 挂载 pnpm 缓存
commands:
- corepack enable
- corepack prepare pnpm@9.15.4 --activate
- pnpm install --frozen-lockfile
- pnpm --filter '@repo/*' build
- name: build-and-run-apps
image: docker:dind
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}
PROJECT_NAME:
from_secret: PROJECT_NAME
# SHOP_AU: shop-test-au.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)
PROJECT_NAME_TEST="${PROJECT_NAME}test"
COMPOSE_FILE="docker-compose-test.yml"
if [ "$common_changes" -gt 0 ]; then
echo "检测到公共区变动,准备全量构建..."
build_list=$(docker compose -f "$COMPOSE_FILE" config --services)
else
echo "执行定向增量构建..."
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
fi
# 3. test 环境
export BUILD_ENV="test"
for svc in $build_list; do
if docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME_TEST" config --services | grep -q "^$svc$"; then
echo ">>>>>> 构建服务: $svc $PROJECT_NAME_TEST <<<<<<"
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-test.env apps/$svc/.env.test
# docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME_TEST" build "$svc"
docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME_TEST" up -d "$svc" --build
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:
- test
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
environment:
DOCKER_BUILDKIT: "1"
COMPOSE_DOCKER_CLI_BUILD: "1"
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
- TEST-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
- promote
- rollback
branch:
- dev
- test
- release
- main
volumes:
- name: dingtalk-tpl
host:
path: /bluetti/drone/data