新增版本控制
This commit is contained in:
381
20260320_front.yaml
Normal file
381
20260320_front.yaml
Normal 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
426
20260331_prod_front.yaml
Normal 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
428
20260428.yaml
Normal 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
219
20260609.yaml
Normal 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
509
20260630_front.yaml
Normal 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
559
20260701_front.yaml
Normal 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
72
Dockerfile
Normal 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 注入 .npmrc,token 不写入镜像层)
|
||||||
|
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
37
bluetti-tools-deploy.yaml
Normal 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
80
docker-compose-prod.yaml
Normal 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
|
||||||
79
docker-compose-release.yaml
Normal file
79
docker-compose-release.yaml
Normal 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
64
docker-compose-test.yaml
Normal 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
76
docker-compose.yml
Normal 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
|
||||||
26
dockercompose-rabbitMQ.yaml
Normal file
26
dockercompose-rabbitMQ.yaml
Normal 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
15
drone_dingtalk.tpl
Normal 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
312
drone_ok.yml
Normal 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
|
||||||
Reference in New Issue
Block a user