新增版本控制

This commit is contained in:
2026-07-01 16:20:26 +08:00
parent 5dbfdec2b5
commit 9f6a5afae2
15 changed files with 3283 additions and 0 deletions

381
20260320_front.yaml Normal file
View File

@@ -0,0 +1,381 @@
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
- pull_request
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
volumes:
- name: pnpm_store
host:
path: /tmp/pnpm-cache
- name: docker_sock
host:
path: /var/run/docker.sock
trigger:
branch:
- main
event:
include:
- push
- pull_request
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
- promote
- rollback
branch:
- dev
- release
- main
volumes:
- name: dingtalk-tpl
host:
path: /bluetti/drone/data

426
20260331_prod_front.yaml Normal file
View File

@@ -0,0 +1,426 @@
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

428
20260428.yaml Normal file
View File

@@ -0,0 +1,428 @@
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
- promote
- rollback
branch:
- dev
- release
- main
volumes:
- name: dingtalk-tpl
host:
path: /bluetti/drone/data

219
20260609.yaml Normal file
View File

@@ -0,0 +1,219 @@
# 20260609部署开发环境后的后端
kind: pipeline
type: exec
name: CI-Stage
clone:
disable: true
environment:
GOOS: linux
GOARCH: amd64
GOPROXY: https://goproxy.cn,direct
GONOPROXY: gitea.bluettipower.com
GOPRIVATE: gitea.bluettipower.com/*
steps:
- name: CI-building
environment:
ENV: ""
API_URL: dev-api.essmonitor.com
IMAGE_URL: harbor.bluettipower.com
GIT_COMMIT: ${DRONE_COMMIT:0:10}
GOPROXY: https://goproxy.cn,direct
GONOPROXY: gitea.bluettipower.com
GOPRIVATE: gitea.bluettipower.com
CGO_ENABLED: 0
GOPATH: /root/go
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: STAGE_DOMAIN_PREFIX
command_timeout: 160s
commands:
- pwd
- ping -c 1 gitea.bluettipower.com
- git config --global url."https://pywee:Qiu118199@gitea.bluettipower.com".insteadOf "https://gitea.bluettipower.com"
# - git config --global url."https://admin:cjJXBbkHlvVWH2B@gitea.bluettipower.com".insteadOf "https://gitea.bluettipower.com"
- cd /bluetti/app_project/
- |
if [ ! -d ${DRONE_REPO_NAME} ]; then
git clone https://gitea.bluettipower.com/bluettipower/${DRONE_REPO_NAME}.git ${DRONE_REPO_NAME}
fi
- cd ${DRONE_REPO_NAME}
- git checkout -- .
- git fetch origin
- git switch ${DRONE_COMMIT_BRANCH}
- git pull
- export PATH=$PATH:/usr/local/go/bin
- go env
- go version
- go mod tidy
- go build -ldflags="-s -w -X 'gitea.bluettipower.com/bluettipower/zerocommon/dingtalk.envVars=${DRONE_COMMIT:0:10};${DRONE_BUILD_NUMBER};${DRONE_COMMIT_AUTHOR};${DRONE_COMMIT_AUTHOR_EMAIL};${DRONE_REPO_NAME};https://drone.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}/${DRONE_BUILD_NUMBER};$PROJECT_API_NAME'" -o ./app api/*.go
- echo "API构建完成"
- |
if [ -d "rpc" ]; then
go build -ldflags="-s -w -X 'gitea.bluettipower.com/bluettipower/zerocommon/dingtalk.envVars=${DRONE_COMMIT:0:10};${DRONE_BUILD_NUMBER};${DRONE_COMMIT_AUTHOR};${DRONE_COMMIT_AUTHOR_EMAIL};${DRONE_REPO_NAME};https://drone.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}/${DRONE_BUILD_NUMBER};$PROJECT_RPC_NAME'" -o ./rpc_app rpc/*.go
echo "RPC构建完成"
echo "${DRONE_COMMIT:0:10}"
fi
# - docker compose down
- docker compose build --no-cache
- docker compose up -d --force-recreate
- rm -rf ./rpc_app && rm -rf ./app
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- develop
event:
include:
- push
- merge_request
---
kind: pipeline
type: exec
name: CI-Prod
clone:
disable: true
environment:
GOOS: linux
GOARCH: amd64
GOPROXY: https://proxy.golang.com.cn,direct
GONOPROXY: gitea.bluettipower.com
GOPRIVATE: gitea.bluettipower.com
steps:
- name: CI-building
environment:
ENV: ""
IMAGE_URL: harbor.bluettipower.com
API_URL: api.bluettipower.com
GIT_COMMIT: ${DRONE_COMMIT:0:10}
GOPROXY: https://proxy.golang.com.cn,direct
GONOPROXY: gitea.bluettipower.com
GOPRIVATE: gitea.bluettipower.com
CGO_ENABLED: 0
GOPATH: /root/go
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: STAGE_DOMAIN_PREFIX
command_timeout: 360s
commands:
- pwd
- ping -c 1 gitea.bluettipower.com
- git config --global url."https://pywee:Qiu118199@gitea.bluettipower.com".insteadOf "https://gitea.bluettipower.com"
# - git config --global url."https://admin:cjJXBbkHlvVWH2B@gitea.bluettipower.com".insteadOf "https://gitea.bluettipower.com"
- cd /bluetti/app_project/
- |
if [ ! -d ${DRONE_REPO_NAME} ]; then
git clone https://gitea.bluettipower.com/bluettipower/${DRONE_REPO_NAME}.git ${DRONE_REPO_NAME}
fi
- cd ${DRONE_REPO_NAME}
- git checkout -- .
- git fetch origin
- git switch ${DRONE_COMMIT_BRANCH}
- git pull
#- git branch --set-upstream-to=origin/${DRONE_COMMIT_BRANCH} ${DRONE_COMMIT_BRANCH}
# - git pull https://pywee:$${GIT_PWD}@gitea.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}.git
- export PATH=$PATH:/usr/local/go/bin
- go mod tidy
- go build -ldflags="-s -w -X 'gitea.bluettipower.com/bluettipower/zerocommon/dingtalk.envVars=${DRONE_COMMIT:0:10};${DRONE_BUILD_NUMBER};${DRONE_COMMIT_AUTHOR};${DRONE_COMMIT_AUTHOR_EMAIL};${DRONE_REPO_NAME};https://drone.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}/${DRONE_BUILD_NUMBER};$PROJECT_API_NAME'" -o ./app api/*.go
- docker build -f api/Dockerfile -t $${PROJECT_API_NAME}:latest .
#- sudo docker login harbor.bluettipower.com -u admin -p cjJXBbkHlvVWH2B
- sudo docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B
- docker tag $${PROJECT_API_NAME}:latest harbor.bluettipower.com/bluetti/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- sudo docker push harbor.bluettipower.com/bluetti/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- echo "API构建完成, 你可以通过 docker pull harbor.bluettipower.com/bluetti/$PROJECT_API_NAME:${DRONE_COMMIT:0:10} 获取镜像"
- rm -rf ./app
- |
if [ -d "rpc" ]; then
go build -ldflags="-s -w -X 'gitea.bluettipower.com/bluettipower/zerocommon/dingtalk.envVars=${DRONE_COMMIT:0:10};${DRONE_BUILD_NUMBER};${DRONE_COMMIT_AUTHOR};${DRONE_COMMIT_AUTHOR_EMAIL};${DRONE_REPO_NAME};https://drone.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}/${DRONE_BUILD_NUMBER};$PROJECT_RPC_NAME'" -o ./rpc_app rpc/*.go
docker build -f rpc/Dockerfile -t $${PROJECT_RPC_NAME}:latest .
docker tag $${PROJECT_RPC_NAME}:latest harbor.bluettipower.com/bluetti/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
sudo docker push harbor.bluettipower.com/bluetti/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
rm -rf ./rpc_app
echo "RPC构建完成, 你可以通过 docker pull harbor.bluettipower.com/bluetti/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10} 获取镜像"
echo "${DRONE_COMMIT:0:10}"
fi
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- master
event:
include:
- push
- merge_request
---
kind: pipeline
type: docker
name: CI-notify
depends_on:
- CI-Prod
clone:
disable: true
steps:
- name: notify
image: drillster/drone-email
settings:
host: smtp.qiye.aliyun.com
username: alanal@poweroak.com
password: KRLdCsdDGrI8Uko
port: 465
from: alanal@poweroak.com
when:
branch:
- master
status:
- failure
event:
- merge_request
# - name: send-dingtalk-notification
#image: lddsb/drone-dingtalk-message
#volumes:
#- name: dingtalk-tpl
#path: /data
#settings:
#token: 95b118a31f95c328b1c5f7f52622997d77b69da9d393b0700fc8eb33ed551713
#secret: SECb355ff4ba5b05b5325d4c67d3f6637c75613668c248ad9cc97355fe266fe1b6a
## token: 8a47605751760b1b1af660e67c2f39bdf9f83c672a18ab872412e99c78b0e5c0
## secret: SEC0dfa30e4e8acfae69e7bf42b19c2feff5d302d2667de3aa4ba8cff46e867758a
#type: markdown
#debug: false
#tpl: /data/dingtalk_${DRONE_BUILD_EVENT}.tpl
#tips_title: 后端上线通知
#when:
#status:
#- success
#event:
#- promote
#branch:
#- master
volumes:
- name: dingtalk-tpl
host:
path: /bluetti/drone/data

509
20260630_front.yaml Normal file
View File

@@ -0,0 +1,509 @@
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

559
20260701_front.yaml Normal file
View File

@@ -0,0 +1,559 @@
kind: pipeline
type: docker
name: DEV-frontend-monorepo-ci
clone:
depth: 20
steps:
- name: build-and-run-apps
image: docker:dind
pull: if-not-exists
volumes:
- name: docker_sock
path: /var/run/docker.sock
- name: docker_lib
path: /var/lib/docker
- name: configs_dir
path: /bluetti/frontend_project/bluetti-shop-configs
environment:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
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. 判断构建范围
echo "本次变更文件:"
echo "$changed_files"
# 只有影响所有站点的关键共享文件/目录变动时,才做全量构建
full_build_changes=$(echo "$changed_files" | grep -E "^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|docker-compose.*\.ya?ml|packages/|patches/)" | wc -l)
if [ "$full_build_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
if [ -z "$build_list" ]; then
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
exit 0
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" 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
paths:
include:
- "apps/**"
- "packages/**"
- "patches/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- "turbo.json"
- "docker-compose*.yml"
---
kind: pipeline
type: docker
name: TEST-frontend-monorepo-ci
clone:
depth: 50
steps:
- 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
- name: docker_lib
path: /var/lib/docker
environment:
DRONE_COMMIT: ${DRONE_COMMIT}
DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE}
DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER}
DOCKER_BUILDKIT: "1"
COMPOSE_DOCKER_CLI_BUILD: "1"
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. 判断构建范围
echo "本次变更文件:"
echo "$changed_files"
full_build_changes=$(echo "$changed_files" | grep -E "^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|docker-compose.*\.ya?ml|packages/|patches/)" | wc -l)
PROJECT_NAME_TEST="${PROJECT_NAME}test"
COMPOSE_FILE="docker-compose-test.yml"
if [ "$full_build_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
if [ -z "$build_list" ]; then
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
exit 0
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/**"
- "packages/**"
- "patches/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- "turbo.json"
- "docker-compose*.yml"
---
kind: pipeline
type: docker
name: RC-frontend-monorepo-ci
clone:
depth: 50
steps:
- name: build-and-push-apps
image: docker:dind
volumes:
- name: docker_lib
path: /var/lib/docker
- 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}
DOCKER_BUILDKIT: "1"
COMPOSE_DOCKER_CLI_BUILD: "1"
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
echo "本次变更文件:"
echo "$changed_files"
full_build_changes=$(echo "$changed_files" | grep -E "^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|docker-compose.*\.ya?ml|packages/|patches/)" | wc -l)
if [ "$full_build_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
if [ -z "$build_list" ]; then
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
exit 0
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}
echo "本次变更文件:"
echo "$changed_files"
full_build_changes=$(echo "$changed_files" | grep -E "^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|docker-compose.*\.ya?ml|packages/|patches/)" | wc -l)
if [ "$full_build_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
if [ -z "$deploy_list" ]; then
echo "未命中可部署服务(仅文档或非关键文件改动),跳过远程部署。"
exit 0
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
- name: configs_dir
host:
path: /bluetti/frontend_project/bluetti-shop-configs
trigger:
branch:
- release
event:
include:
- push
paths:
include:
- "apps/**"
- "packages/**"
- "patches/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- "turbo.json"
- "docker-compose*.yml"
---
kind: pipeline
type: docker
name: PROD-frontend-monorepo-ci
clone:
depth: 50
steps:
- name: build-and-push-apps
image: docker:dind
volumes:
- name: docker_lib
path: /var/lib/docker
- name: docker_sock
path: /var/run/docker.sock
- name: configs_dir
path: /bluetti/frontend_project/bluetti-shop-configs
environment:
DOCKER_BUILDKIT: "1"
COMPOSE_DOCKER_CLI_BUILD: "1"
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
echo "本次变更文件:"
echo "$changed_files"
full_build_changes=$(echo "$changed_files" | grep -E "^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|docker-compose.*\.ya?ml|packages/|patches/)" | wc -l)
if [ "$full_build_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
if [ -z "$build_list" ]; then
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
exit 0
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}
echo "本次变更文件:"
echo "$changed_files"
full_build_changes=$(echo "$changed_files" | grep -E "^(package\.json|pnpm-lock\.yaml|pnpm-workspace\.yaml|turbo\.json|docker-compose.*\.ya?ml|packages/|patches/)" | wc -l)
if [ "$full_build_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
if [ -z "$deploy_list" ]; then
echo "未命中可部署服务(仅文档或非关键文件改动),跳过远程部署。"
exit 0
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
- name: configs_dir
host:
path: /bluetti/frontend_project/bluetti-shop-configs
trigger:
branch:
- main
event:
include:
- push
paths:
include:
- "apps/**"
- "packages/**"
- "patches/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- "turbo.json"
- "docker-compose*.yml"
---
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
event:
- push
- promote
- rollback
branch:
- dev
- test
- release
- main
volumes:
- name: dingtalk-tpl
host:
path: /bluetti/drone/data

72
Dockerfile Normal file
View File

@@ -0,0 +1,72 @@
# ============================================================
# Stage 1: 依赖安装 + 构建
# ============================================================
FROM node:20-alpine AS builder
RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
WORKDIR /monorepo
# 先复制 workspace 配置文件(利用 Docker 层缓存)
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY turbo.json* ./
# 复制所有 package.json供 pnpm 解析 workspace 依赖)
COPY packages/components/package.json packages/components/
COPY packages/data/package.json packages/data/
COPY packages/graphql/package.json packages/graphql/
COPY packages/i18n/package.json packages/i18n/
COPY packages/lib/package.json packages/lib/
COPY packages/store/package.json packages/store/
COPY packages/styles/package.json packages/styles/
COPY packages/types/package.json packages/types/
COPY apps/shopify-europe/package.json apps/shopify-europe/
# 安装全部依赖BuildKit 缓存加速 + secret 注入 .npmrctoken 不写入镜像层)
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \
--mount=type=secret,id=npmrc,target=/root/.npmrc \
pnpm install --frozen-lockfile
# 复制源代码
COPY packages/ packages/
COPY apps/shopify-europe/ apps/shopify-europe/
# 构建阶段设置生产模式React Router 会跳过 dev 分支做优化
ENV NODE_ENV=production
# 1. 构建所有 @repo/* 共享包
RUN pnpm --filter '@repo/*' build
# 2. 构建 React Router 应用client + server bundle
RUN NODE_OPTIONS="--max-old-space-size=8192" \
pnpm --filter shopify-europe exec react-router build
# 3. 使用 pnpm deploy 创建自包含的生产部署目录(解析 workspace 依赖)
RUN pnpm deploy --filter=shopify-europe --prod /deploy
# ============================================================
# Stage 2: 生产镜像(最小化)
# ============================================================
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
# 非 root 用户(在 COPY 之前创建,利用层缓存)
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 hydrogen
# 直接在 COPY 时设置归属,避免额外的 chown 层
COPY --from=builder --chown=hydrogen:nodejs /deploy .
COPY --from=builder --chown=hydrogen:nodejs /monorepo/apps/shopify-europe/build ./build
COPY --from=builder --chown=hydrogen:nodejs /monorepo/apps/shopify-europe/server.js ./server.js
USER hydrogen
EXPOSE 3005
# HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
# CMD wget -qO- http://localhost:3005/ | head -c 1 || exit 1
CMD ["node", "server.js"]

37
bluetti-tools-deploy.yaml Normal file
View File

@@ -0,0 +1,37 @@
kind: pipeline
type: docker
name: deploy-bluetti-web
steps:
# 步骤 1: 挂载宿主机 Docker 和配置目录,直接构建并启动
- name: build-and-deploy
image: docker:24.0.7 # 或者使用 docker:dind
volumes:
- name: docker_sock
path: /var/run/docker.sock # 联动宿主机 Docker
- name: configs_dir
path: /bluetti/frontend_project/bluetti-tools-configs # 映射宿主机配置目录
commands:
- |
echo ">>>>>> 开始准备配置文件 <<<<<<"
cp /bluetti/frontend_project/bluetti-tools-configs/tools.production.env apps/web/.env
echo ">>>>>> 开始构建镜像 <<<<<<"
docker build -t bluetti-tools-web:latest -f Dockerfile .
echo ">>>>>> 正在部署服务 <<<<<<"
docker compose down --remove-orphans
docker compose up -d
echo ">>>>>> 部署成功! <<<<<<"
volumes:
- name: docker_sock
host:
path: /var/run/docker.sock
- name: configs_dir
host:
path: /bluetti/frontend_project/bluetti-tools-configs # 宿主机存放所有 .env 的绝对路径
trigger:
branch:
- main
event:
- push

80
docker-compose-prod.yaml Normal file
View File

@@ -0,0 +1,80 @@
services:
shopify-america:
image: harbor.bluettipower.com/bluetti-frontend/shopify-america:${COMMIT_SHA}
container_name: shopify-america
restart: unless-stopped
labels:
- traefik.http.routers.shopus-http.rule=Host(`shop-prod-us.bluettipower.com`)
- traefik.http.routers.shopus-http.entrypoints=http
- traefik.enable=true
- traefik.http.routers.shopus-https.rule=Host(`shop-prod-us.bluettipower.com`)
- traefik.http.routers.shopus-https.entrypoints=https
- traefik.http.routers.shopus-https.tls=true
- traefik.http.routers.shopus-https.tls.certresolver=myresolver
- traefik.http.routers.shopus-https.middlewares=shopus-cors
- traefik.http.services.shopus.loadbalancer.server.port=3002
- traefik.http.middlewares.shopus-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shopus-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shopus-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shopus-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shopus-redirect.redirectscheme.permanent=true
networks:
- traefik
env_file:
- /bluetti/frontend_project/bluetti-shop-configs/shopify-america-production.env
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3002/']
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
shopify-australia:
image: harbor.bluettipower.com/bluetti-frontend/shopify-australia:${COMMIT_SHA}
container_name: shopify-australia
restart: unless-stopped
labels:
# 移除 http 跳转相关的 middleware即不要为 http 路由配置 redirectscheme
- traefik.http.routers.shopau-http.rule=Host(`shop-prod-au.bluettipower.com.au`)
- traefik.http.routers.shopau-http.entrypoints=http
- traefik.http.routers.shopau-http.middlewares=shopau-redirect
- traefik.enable=true
- traefik.http.routers.shopau-https.rule=Host(`shop-prod-au.bluettipower.com.au`)
- traefik.http.routers.shopau-https.entrypoints=https
- traefik.http.routers.shopau-https.tls=true
- traefik.http.routers.shopau-https.tls.certresolver=myresolver
- traefik.http.routers.shopau-https.middlewares=shopau-cors
- traefik.http.services.shopau.loadbalancer.server.port=3001
- traefik.http.middlewares.shopau-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shopau-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shopau-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shopau-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shopau-redirect.redirectscheme.permanent=true
networks:
- traefik
env_file:
- /bluetti/frontend_project/bluetti-shop-configs/shopify-australia-production.env
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3001/']
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
networks:
traefik:
external: true

View File

@@ -0,0 +1,79 @@
services:
shopify-america:
image: harbor.bluettipower.com/bluetti-frontend/shopify-america:${COMMIT_SHA}
container_name: shopify-america
restart: unless-stopped
labels:
- traefik.http.routers.shopus-http.rule=Host(`shop-rc-us.bluettipower.com`)
- traefik.http.routers.shopus-http.entrypoints=http
- traefik.enable=true
- traefik.http.routers.shopus-https.rule=Host(`shop-rc-us.bluettipower.com`)
- traefik.http.routers.shopus-https.entrypoints=https
- traefik.http.routers.shopus-https.tls=true
- traefik.http.routers.shopus-https.tls.certresolver=myresolver
- traefik.http.routers.shopus-https.middlewares=shopus-cors
- traefik.http.services.shopus.loadbalancer.server.port=3002
- traefik.http.middlewares.shopus-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shopus-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shopus-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shopus-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shopus-redirect.redirectscheme.permanent=true
networks:
- traefik
env_file:
- /bluetti/frontend_project/bluetti-shop-configs/shopify-america-production.env
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3002/']
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
shopify-australia:
image: harbor.bluettipower.com/bluetti-frontend/shopify-australia:${COMMIT_SHA}
container_name: shopify-australia
restart: unless-stopped
labels:
# 移除 http 跳转相关的 middleware即不要为 http 路由配置 redirectscheme
- traefik.http.routers.shopau-http.rule=Host(`shop-rc-au.bluettipower.com`)
- traefik.http.routers.shopau-http.entrypoints=http
- traefik.enable=true
- traefik.http.routers.shopau-https.rule=Host(`shop-rc-au.bluettipower.com`)
- traefik.http.routers.shopau-https.entrypoints=https
- traefik.http.routers.shopau-https.tls=true
- traefik.http.routers.shopau-https.tls.certresolver=myresolver
- traefik.http.routers.shopau-https.middlewares=shopau-cors
- traefik.http.services.shopau.loadbalancer.server.port=3001
- traefik.http.middlewares.shopau-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shopau-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shopau-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shopau-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shopau-redirect.redirectscheme.permanent=true
networks:
- traefik
env_file:
- /bluetti/frontend_project/bluetti-shop-configs/shopify-australia-production.env
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3001/']
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
networks:
traefik:
external: true

64
docker-compose-test.yaml Normal file
View File

@@ -0,0 +1,64 @@
services:
shopify-america:
build:
context: .
dockerfile: apps/shopify-america/Dockerfile
image: shopify-america:test
container_name: shopify-america-test
restart: always
ports:
- '3032:3002'
labels:
- traefik.http.routers.shoptestqaus.rule=Host(`shop-test-us.bluettipower.com`)
- traefik.http.routers.shoptestqaus.middlewares=shoptestqaus-cors
- traefik.http.middlewares.shoptestqaus-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shoptestqaus-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shoptestqaus-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shoptestqaus-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shoptestqaus-redirect.redirectscheme.permanent=true
- traefik.http.services.shoptestqaus.loadbalancer.server.port=3002
- traefik.http.routers.shoptestqaus.tls=true
- traefik.http.routers.shoptestqaus.tls.certresolver=myresolver
networks:
- traefik
env_file:
- apps/shopify-america/.env.test
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
shopify-australia:
build:
context: .
dockerfile: apps/shopify-australia/Dockerfile
image: shopify-australia:test
container_name: shopify-australia-test
restart: always
ports:
- '3031:3001'
labels:
- traefik.http.routers.shoptestqaau.rule=Host(`shop-test-au.bluettipower.com`)
- traefik.http.routers.shoptestqaau.middlewares=shoptestqaau-cors
- traefik.http.middlewares.shoptestqaau-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shoptestqaau-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shoptestqaau-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shoptestqaau-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shoptestqaau-redirect.redirectscheme.permanent=true
- traefik.http.services.shoptestqaau.loadbalancer.server.port=3001
- traefik.http.routers.shoptestqaau.tls=true
- traefik.http.routers.shoptestqaau.tls.certresolver=myresolver
networks:
- traefik
env_file:
- apps/shopify-australia/.env.test
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
networks:
traefik:
external: true

76
docker-compose.yml Normal file
View File

@@ -0,0 +1,76 @@
services:
shopify-america:
build:
context: .
dockerfile: apps/shopify-america/Dockerfile
image: shopify-america:latest
container_name: shopify-america
restart: unless-stopped
labels:
- traefik.http.routers.shoptestus.rule=Host(`shop-dev-us.bluettipower.com`)
- traefik.http.routers.shoptestus.middlewares=shoptestus-cors
- traefik.http.middlewares.shoptestus-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shoptestus-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shoptestus-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shoptestus-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shoptestus-redirect.redirectscheme.permanent=true
- traefik.http.services.shoptestus.loadbalancer.server.port=3002
- traefik.http.routers.shoptestus.tls=true
- traefik.http.routers.shoptestus.tls.certresolver=myresolver
networks:
- traefik
ports:
- '3002:3002'
env_file:
- apps/shopify-america/.env.${BUILD_ENV:-development}
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3002/']
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
shopify-australia:
build:
context: .
dockerfile: apps/shopify-australia/Dockerfile
image: shopify-australia:latest
container_name: shopify-australia
restart: unless-stopped
labels:
- traefik.http.routers.shoptestau.rule=Host(`shop-dev-au.bluettipower.com`)
- traefik.http.routers.shoptestau.middlewares=shoptestau-cors
- traefik.http.middlewares.shoptestau-cors.headers.accesscontrolallowmethods=*
- traefik.http.middlewares.shoptestau-cors.headers.accesscontrolallowheaders=*
- traefik.http.middlewares.shoptestau-cors.headers.accesscontrolalloworiginlist=*
- traefik.http.middlewares.shoptestau-redirect.redirectscheme.scheme=https
- traefik.http.middlewares.shoptestau-redirect.redirectscheme.permanent=true
- traefik.http.services.shoptestau.loadbalancer.server.port=3001
- traefik.http.routers.shoptestau.tls=true
- traefik.http.routers.shoptestau.tls.certresolver=myresolver
networks:
- traefik
ports:
- '3001:3001'
env_file:
- apps/shopify-australia/.env.${BUILD_ENV:-development}
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3001/']
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
networks:
traefik:
external: true

View File

@@ -0,0 +1,26 @@
version: '3.5'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq-server
restart: always
ports:
- "5672:5672" # RabbitMQ 客户端连接端口Golang 服务连这个)
- "15672:15672" # Web 管理后台端口
environment:
# 设置默认的管理员账号和密码(请根据实际情况修改)
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "admin123"
volumes:
# 数据持久化,确保容器重启后消息和队列不丢失
- /data/rabbitmq_data:/var/lib/rabbitmq
networks:
- traefik
volumes:
rabbitmq_data:
networks:
traefik:
external: true

15
drone_dingtalk.tpl Normal file
View File

@@ -0,0 +1,15 @@
### 构建成功 - [DRONE_BUILD_NUMBER]
**项目:** [TPL_REPO_FULL_NAME]
**分支:** [TPL_COMMIT_BRANCH]
**状态:** ✅ **[DRONE_BUILD_STATUS]**
**链接:** [点击查看]([TPL_COMMIT_LINK])
**提交人:** [TPL_AUTHOR_NAME] ([TPL_AUTHOR_EMAIL])
**构建过程:** [查看构建详情 [TPL_STATUS_EMOTICON]]([TPL_BUILD_LINK])
**描述:** [DRONE_COMMIT_MESSAGE]

312
drone_ok.yml Normal file
View File

@@ -0,0 +1,312 @@
kind: pipeline
type: exec
name: CI-building
clone:
disable: true
environment:
GOOS: linux
GOARCH: amd64
GOPROXY: https://proxy.golang.com.cn,direct
GONOPROXY: gitea.bluettipower.com
GOPRIVATE: gitea.bluettipower.com
steps:
- name: CI
environment:
GOPROXY: https://proxy.golang.com.cn,direct
GONOPROXY: gitea.bluettipower.com
GOPRIVATE: gitea.bluettipower.com
CGO_ENABLED: 0
GOPATH: /root/go
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: STAGE_DOMAIN_PREFIX
command_timeout: 360s
commands:
- pwd
- git config --global url."https://alanal:Alanal126com@gitea.bluettipower.com".insteadOf "https://gitea.bluettipower.com"
- cd /bluetti/app_project
- |
if [ ! -d /bluetti/app_project/${DRONE_REPO_NAME} ]; then
git clone https://gitea.bluettipower.com/bluettipower/${DRONE_REPO_NAME}.git ${DRONE_REPO_NAME}
fi
- cd /bluetti/app_project/${DRONE_REPO_NAME}
- git checkout -- .
- git pull
- git switch ${DRONE_COMMIT_BRANCH}
#- git branch --set-upstream-to=origin/${DRONE_COMMIT_BRANCH} ${DRONE_COMMIT_BRANCH}
- git pull https://pywee:$${GIT_PWD}@gitea.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}.git
- export PATH=$PATH:/usr/local/go/bin
- go env
- go version
- go mod tidy
- go build -ldflags="-s -w" -o ./app api/*.go
- docker build -f api/Dockerfile -t $${PROJECT_API_NAME}:latest .
# - docker tag $${PROJECT_API_NAME}:latest 127.0.0.1:8091/bluetti/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B
# - docker push 127.0.0.1:8091/bluetti/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- docker tag $${PROJECT_API_NAME}:latest harbor.bluettipower.com/bluetti/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- docker push harbor.bluettipower.com/bluetti/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- echo "API构建完成, 你可以通过 docker pull harbor.bluettipower.com/bluetti/$PROJECT_API_NAME:${DRONE_COMMIT:0:10} 获取镜像"
- |
if [ -d "rpc" ]; then
go build -ldflags="-s -w" -o ./rpc_app rpc/*.go
docker build -f rpc/Dockerfile -t $${PROJECT_RPC_NAME}:latest .
docker tag $${PROJECT_RPC_NAME}:latest harbor.bluettipower.com/bluetti/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
docker push harbor.bluettipower.com/bluetti/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
rm -rf ./rpc_app
echo "RPC构建完成, 你可以通过 docker pull harbor.bluettipower.com/bluetti/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10} 获取镜像"
fi
- name: stage-publish
environment:
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: STAGE_DOMAIN_PREFIX
when:
branch:
- feature/*
- develop
commands:
- echo 1 $DOMAIN_PREFIX 2
- cd /bluetti/app_project/${DRONE_REPO_NAME}
- docker compose down
- export DOMAIN_PREFIX=$DOMAIN_PREFIX
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
- export ENV=""
- |
if [ -d "rpc" ]; then
echo $PROJECT_RPC_NAME 12345
docker tag $PROJECT_RPC_NAME:latest harbor.bluettipower.com/bluetti/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
docker push harbor.bluettipower.com/bluetti/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
fi
# - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
- docker compose up -d
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- develop
- master
- feature/*
event:
include:
- push
- merge_request
---
kind: pipeline
type: docker
name: CI-Master-publish
clone:
disable: true
depends_on:
- CI-building
steps:
- name: prod-publish
image: appleboy/drone-ssh
environment:
PROD_DOMAIN_PREFIX:
from_secret: PROD_DOMAIN_PREFIX
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
settings:
host:
from_secret: PROD_HOST_IP
username:
from_secret: PROD_HOST_NAME
password:
from_secret: PROD_HOST_PWD
port: 22
command_timeout: 360s
envs: [PROJECT_API_NAME,PROD_DOMAIN_PREFIX,PROJECT_RPC_NAME]
script:
- bash
- git config --global url."https://alanal:Alanal126com@gitea.bluettipower.com".insteadOf "https://gitea.bluettipower.com"
- cd /bluetti/app_project
- |
if [ ! -d /bluetti/app_project/${DRONE_REPO_NAME} ]; then
git clone https://gitea.bluettipower.com/bluettipower/${DRONE_REPO_NAME}.git ${DRONE_REPO_NAME}
fi
- cd /bluetti/app_project/${DRONE_REPO_NAME}
- git pull https://pywee:$${GIT_PWD}@gitea.bluettipower.com/Bluettipower/${DRONE_REPO_NAME}.git
# - docker login 127.0.0.1:8091 -u admin -p HarborBluetti
- git pull origin
- git branch
- git fetch origin
- git checkout master
- export ENV="-prod"
- export DOMAIN_PREFIX=$${PROD_DOMAIN_PREFIX}
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
# - docker compose down
# - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
# - docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
- docker pull harbor.bluettipower.com/bluetti/$PROJECT_API_NAME:${DRONE_COMMIT:0:10}
- |
if [ -d "rpc" ]; then
docker pull harbor.bluettipower.com/bluetti/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
fi
- docker compose up -d
retry:
limit: 2
delay: 360s
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- master
event:
include:
- promote
---
kind: pipeline
type: docker
name: promote/rollback
steps:
- name: stage-rollback
image: appleboy/drone-ssh
environment:
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: DOMAIN_PREFIX
settings:
host:
from_secret: STAGE_HOST_IP
username:
from_secret: STAGE_HOST_NAME
password:
from_secret: STAGE_HOST_PWD
port: 22
command_timeout: 300s
envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
script:
- cd /bluetti/app_project/${DRONE_REPO_NAME}
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
- export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
- export ENV=""
- docker compose down
- docker compose up -d
- echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
when:
branch:
- develop
- name: prod-rollback
image: appleboy/drone-ssh
environment:
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
PROD_DOMAIN_PREFIX:
from_secret: PROD_DOMAIN_PREFIX
settings:
host:
from_secret: PROD_HOST_IP
username:
from_secret: PROD_HOST_NAME
password:
from_secret: PROD_HOST_PWD
port: 22
command_timeout: 300s
envs: [PROJECT_API_NAME,PROD_DOMAIN_PREFIX,PROJECT_RPC_NAME]
script:
- cd /bluetti/app_project/${DRONE_REPO_NAME}
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
- export DOMAIN_PREFIX=$${PROD_DOMAIN_PREFIX}
- export ENV="-prod"
- docker compose down
- docker compose up -d
- echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
when:
branch:
- master
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
event:
- rollback
---
kind: pipeline
type: docker
name: CI-notify
depends_on:
- CI-building
clone:
disable: true
steps:
- name: notify
image: drillster/drone-email
settings:
host: smtp.qiye.aliyun.com
username: alanal@poweroak.com
password: KRLdCsdDGrI8Uko
port: 465
from: alanal@poweroak.com
when:
status:
- failure
- name: send-dingtalk-notification
image: lddsb/drone-dingtalk-message
volumes:
- name: dingtalk-tpl
path: /data
settings:
token: 95b118a31f95c328b1c5f7f52622997d77b69da9d393b0700fc8eb33ed551713
secret: SECb355ff4ba5b05b5325d4c67d3f6637c75613668c248ad9cc97355fe266fe1b6a
# token: 8a47605751760b1b1af660e67c2f39bdf9f83c672a18ab872412e99c78b0e5c0
# secret: SEC0dfa30e4e8acfae69e7bf42b19c2feff5d302d2667de3aa4ba8cff46e867758a
type: markdown
debug: false
tpl: /data/dingtalk_${DRONE_BUILD_EVENT}.tpl
tips_title: 后端上线通知
when:
status:
- success
event:
- promote
- rollback
branch:
# - develop
- master
volumes:
- name: dingtalk-tpl
host:
path: /bluetti/drone/data