Compare commits
10 Commits
89fc6d65f9
...
feature/07
| Author | SHA1 | Date | |
|---|---|---|---|
| 269dc501d0 | |||
| 117d4caafd | |||
| fd6511d061 | |||
| 343ee78a31 | |||
| d3edc6d78a | |||
| 1700ab99b2 | |||
| 074aaac982 | |||
| 2ef6762785 | |||
| 9293fe4e59 | |||
| d4f9607034 |
@@ -52,6 +52,24 @@ steps:
|
|||||||
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
compose_services=$(docker compose -p "$PROJECT_NAME" config --services)
|
||||||
|
original_build_list="$build_list"
|
||||||
|
build_list=""
|
||||||
|
skipped_list=""
|
||||||
|
for svc in $original_build_list; do
|
||||||
|
if echo "$compose_services" | grep -q "^$svc$"; then
|
||||||
|
build_list="$build_list $svc"
|
||||||
|
else
|
||||||
|
skipped_list="$skipped_list $svc"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
build_list=$(echo "$build_list" | xargs)
|
||||||
|
skipped_list=$(echo "$skipped_list" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$skipped_list" ]; then
|
||||||
|
echo "以下 apps 变更未在 docker-compose 中定义,已跳过: $skipped_list"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$build_list" ]; then
|
if [ -z "$build_list" ]; then
|
||||||
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
|
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
|
||||||
exit 0
|
exit 0
|
||||||
@@ -64,12 +82,14 @@ steps:
|
|||||||
export TRAEFIK_PREFIX="shoptest"
|
export TRAEFIK_PREFIX="shoptest"
|
||||||
|
|
||||||
for svc in $build_list; do
|
for svc in $build_list; do
|
||||||
if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then
|
echo ">>>>>> 开始增量构建部署服务: $svc <<<<<<"
|
||||||
echo ">>>>>> 开始增量构建部署服务: $svc <<<<<<"
|
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-development.env apps/$svc/.env.development
|
||||||
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-development.env apps/$svc/.env.development
|
docker compose -p "$PROJECT_NAME" build $svc
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
docker compose --parallel 8 -p "$PROJECT_NAME" up -d --build $build_list
|
|
||||||
|
echo ">>>>>> 正在启动所有服务... <<<<<<"
|
||||||
|
docker compose -p "$PROJECT_NAME" up -d $build_list
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: pnpm_store
|
- name: pnpm_store
|
||||||
@@ -118,9 +138,6 @@ steps:
|
|||||||
- name: configs_dir
|
- name: configs_dir
|
||||||
path: /bluetti/frontend_project/bluetti-shop-configs
|
path: /bluetti/frontend_project/bluetti-shop-configs
|
||||||
environment:
|
environment:
|
||||||
DRONE_COMMIT: ${DRONE_COMMIT}
|
|
||||||
DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE}
|
|
||||||
DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER}
|
|
||||||
DOCKER_BUILDKIT: "1"
|
DOCKER_BUILDKIT: "1"
|
||||||
COMPOSE_DOCKER_CLI_BUILD: "1"
|
COMPOSE_DOCKER_CLI_BUILD: "1"
|
||||||
PROJECT_NAME:
|
PROJECT_NAME:
|
||||||
@@ -128,43 +145,20 @@ steps:
|
|||||||
# SHOP_AU: shop-test-au.bluettipower.com
|
# SHOP_AU: shop-test-au.bluettipower.com
|
||||||
commands:
|
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"
|
PROJECT_NAME_TEST="${PROJECT_NAME}test"
|
||||||
COMPOSE_FILE="docker-compose-test.yml"
|
COMPOSE_FILE="docker-compose-test.yml"
|
||||||
if [ "$full_build_changes" -gt 0 ]; then
|
build_list=$(docker compose -f "$COMPOSE_FILE" config --services)
|
||||||
echo "检测到关键共享变动,准备全量构建..."
|
echo "准备构建并启动 docker-compose 中定义的所有服务: $build_list"
|
||||||
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"
|
export BUILD_ENV="test"
|
||||||
for svc in $build_list; do
|
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 <<<<<<"
|
||||||
echo ">>>>>> 构建服务: $svc $PROJECT_NAME_TEST <<<<<<"
|
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-test.env apps/$svc/.env.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
|
done
|
||||||
docker compose --parallel 8 -f "$COMPOSE_FILE" -p "$PROJECT_NAME_TEST" up -d --build $build_list
|
echo ">>>>>> 正在启动所有服务... <<<<<<"
|
||||||
|
docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME_TEST" up -d $build_list
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: pnpm_store
|
- name: pnpm_store
|
||||||
@@ -195,6 +189,7 @@ trigger:
|
|||||||
- "pnpm-workspace.yaml"
|
- "pnpm-workspace.yaml"
|
||||||
- "turbo.json"
|
- "turbo.json"
|
||||||
- "docker-compose*.yml"
|
- "docker-compose*.yml"
|
||||||
|
- ".dockerignore"
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -239,6 +234,24 @@ steps:
|
|||||||
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
compose_services=$(docker compose -f docker-compose.yml config --services)
|
||||||
|
original_build_list="$build_list"
|
||||||
|
build_list=""
|
||||||
|
skipped_list=""
|
||||||
|
for svc in $original_build_list; do
|
||||||
|
if echo "$compose_services" | grep -q "^$svc$"; then
|
||||||
|
build_list="$build_list $svc"
|
||||||
|
else
|
||||||
|
skipped_list="$skipped_list $svc"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
build_list=$(echo "$build_list" | xargs)
|
||||||
|
skipped_list=$(echo "$skipped_list" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$skipped_list" ]; then
|
||||||
|
echo "以下 apps 变更未在 docker-compose 中定义,已跳过: $skipped_list"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$build_list" ]; then
|
if [ -z "$build_list" ]; then
|
||||||
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
|
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
|
||||||
exit 0
|
exit 0
|
||||||
@@ -246,10 +259,12 @@ steps:
|
|||||||
|
|
||||||
> .deploy_list
|
> .deploy_list
|
||||||
docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B
|
docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B
|
||||||
|
|
||||||
|
echo ">>>>>> 并行构建服务: $build_list <<<<<<"
|
||||||
|
docker compose -p "$PROJECT_NAME" build $build_list
|
||||||
|
|
||||||
for svc in $build_list; do
|
for svc in $build_list; do
|
||||||
if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then
|
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}"
|
harbor_tag="127.0.0.1:5000/bluetti-frontend/$svc:${DRONE_COMMIT:0:10}"
|
||||||
docker tag "$svc:latest" "$harbor_tag"
|
docker tag "$svc:latest" "$harbor_tag"
|
||||||
echo ">>>>>> 推送服务: $svc <<<<<<"
|
echo ">>>>>> 推送服务: $svc <<<<<<"
|
||||||
@@ -277,10 +292,11 @@ steps:
|
|||||||
- git pull origin release
|
- git pull origin release
|
||||||
- docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B
|
- docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B
|
||||||
- |
|
- |
|
||||||
|
diff_failed=0
|
||||||
if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then
|
if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then
|
||||||
changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER})
|
changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) || diff_failed=1
|
||||||
else
|
else
|
||||||
changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER})
|
changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) || diff_failed=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export TARGET_SITES="shopify-australia shopify-x"
|
export TARGET_SITES="shopify-australia shopify-x"
|
||||||
@@ -303,6 +319,10 @@ steps:
|
|||||||
export BUILD_ENV="production"
|
export BUILD_ENV="production"
|
||||||
export COMMIT_SHA=${DRONE_COMMIT:0:10}
|
export COMMIT_SHA=${DRONE_COMMIT:0:10}
|
||||||
echo "本次变更文件:"
|
echo "本次变更文件:"
|
||||||
|
if [ "$diff_failed" -eq 1 ]; then
|
||||||
|
echo "⚠️ 变更范围计算失败,回退为全量部署。"
|
||||||
|
changed_files="packages/__force_full_deploy__"
|
||||||
|
fi
|
||||||
echo "$changed_files"
|
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)
|
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)
|
||||||
@@ -313,19 +333,40 @@ steps:
|
|||||||
deploy_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
deploy_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
compose_services=$(docker compose -f docker-compose-release.yml config --services)
|
||||||
|
original_deploy_list="$deploy_list"
|
||||||
|
deploy_list=""
|
||||||
|
skipped_list=""
|
||||||
|
for svc in $original_deploy_list; do
|
||||||
|
if echo "$compose_services" | grep -q "^$svc$"; then
|
||||||
|
deploy_list="$deploy_list $svc"
|
||||||
|
else
|
||||||
|
skipped_list="$skipped_list $svc"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
deploy_list=$(echo "$deploy_list" | xargs)
|
||||||
|
skipped_list=$(echo "$skipped_list" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$skipped_list" ]; then
|
||||||
|
echo "以下 apps 变更未在 docker-compose 中定义,已跳过: $skipped_list"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$deploy_list" ]; then
|
if [ -z "$deploy_list" ]; then
|
||||||
echo "未命中可部署服务(仅文档或非关键文件改动),跳过远程部署。"
|
echo "未命中可部署服务(仅文档或非关键文件改动),跳过远程部署。"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for svc in $deploy_list; do
|
for svc in $deploy_list; do
|
||||||
if docker compose -f docker-compose-release.yml config --services | grep -q "^$svc$"; then
|
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production
|
||||||
echo ">>>>>> 远程更新服务: $svc <<<<<<"
|
done
|
||||||
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production
|
|
||||||
docker compose -f docker-compose-release.yml pull "$svc"
|
echo ">>>>>> 远程并行拉取镜像: $deploy_list <<<<<<"
|
||||||
docker compose -f docker-compose-release.yml up -d --force-recreate "$svc"
|
docker compose -f docker-compose-release.yml pull $deploy_list
|
||||||
echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<"
|
|
||||||
fi
|
for svc in $deploy_list; do
|
||||||
|
echo ">>>>>> 远程更新服务: $svc <<<<<<"
|
||||||
|
docker compose -f docker-compose-release.yml up -d --force-recreate "$svc"
|
||||||
|
echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<"
|
||||||
done
|
done
|
||||||
volumes:
|
volumes:
|
||||||
- name: pnpm_store
|
- name: pnpm_store
|
||||||
@@ -367,6 +408,7 @@ clone:
|
|||||||
steps:
|
steps:
|
||||||
- name: build-and-push-apps
|
- name: build-and-push-apps
|
||||||
image: docker:cli
|
image: docker:cli
|
||||||
|
pull: if-not-exists
|
||||||
volumes:
|
volumes:
|
||||||
- name: docker_sock
|
- name: docker_sock
|
||||||
path: /var/run/docker.sock
|
path: /var/run/docker.sock
|
||||||
@@ -378,6 +420,9 @@ steps:
|
|||||||
DRONE_COMMIT: ${DRONE_COMMIT}
|
DRONE_COMMIT: ${DRONE_COMMIT}
|
||||||
DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE}
|
DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE}
|
||||||
DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER}
|
DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER}
|
||||||
|
DRONE_BUILD_EVENT: ${DRONE_BUILD_EVENT} # 引入事件类型判断
|
||||||
|
PROJECT_NAME:
|
||||||
|
from_secret: PROJECT_NAME
|
||||||
commands:
|
commands:
|
||||||
- |
|
- |
|
||||||
if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then
|
if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then
|
||||||
@@ -398,6 +443,24 @@ steps:
|
|||||||
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
build_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
compose_services=$(docker compose -f docker-compose.yml config --services)
|
||||||
|
original_build_list="$build_list"
|
||||||
|
build_list=""
|
||||||
|
skipped_list=""
|
||||||
|
for svc in $original_build_list; do
|
||||||
|
if echo "$compose_services" | grep -q "^$svc$"; then
|
||||||
|
build_list="$build_list $svc"
|
||||||
|
else
|
||||||
|
skipped_list="$skipped_list $svc"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
build_list=$(echo "$build_list" | xargs)
|
||||||
|
skipped_list=$(echo "$skipped_list" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$skipped_list" ]; then
|
||||||
|
echo "以下 apps 变更未在 docker-compose 中定义,已跳过: $skipped_list"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$build_list" ]; then
|
if [ -z "$build_list" ]; then
|
||||||
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
|
echo "未命中可构建服务(仅文档或非关键文件改动),跳过构建。"
|
||||||
exit 0
|
exit 0
|
||||||
@@ -405,10 +468,12 @@ steps:
|
|||||||
|
|
||||||
> .deploy_list
|
> .deploy_list
|
||||||
docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B
|
docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B
|
||||||
|
|
||||||
|
echo ">>>>>> 并行构建服务: $build_list <<<<<<"
|
||||||
|
docker compose -p "$PROJECT_NAME" build $build_list
|
||||||
|
|
||||||
for svc in $build_list; do
|
for svc in $build_list; do
|
||||||
if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then
|
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}"
|
harbor_tag="127.0.0.1:5000/bluetti-frontend/$svc:${DRONE_COMMIT:0:10}"
|
||||||
docker tag "$svc:latest" "$harbor_tag"
|
docker tag "$svc:latest" "$harbor_tag"
|
||||||
echo ">>>>>> 推送服务: $svc <<<<<<"
|
echo ">>>>>> 推送服务: $svc <<<<<<"
|
||||||
@@ -434,13 +499,14 @@ steps:
|
|||||||
script:
|
script:
|
||||||
- echo ">>>>>> 开始连接远程服务器 <<<<<<"
|
- echo ">>>>>> 开始连接远程服务器 <<<<<<"
|
||||||
- cd /bluetti/frontend_project/bluetti-shop
|
- cd /bluetti/frontend_project/bluetti-shop
|
||||||
- git pull origin release
|
- git pull origin main
|
||||||
- docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B
|
- docker login harbor.bluettipower.com -u bluetti -p cjJXBbkHlvVWH2B
|
||||||
- |
|
- |
|
||||||
|
diff_failed=0
|
||||||
if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then
|
if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then
|
||||||
changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER})
|
changed_files=$(git diff-tree --no-commit-id --name-only -r ${DRONE_COMMIT_AFTER}) || diff_failed=1
|
||||||
else
|
else
|
||||||
changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER})
|
changed_files=$(git diff --name-only ${DRONE_COMMIT_BEFORE} ${DRONE_COMMIT_AFTER}) || diff_failed=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export TARGET_SITES="shopify-australia shopify-x"
|
export TARGET_SITES="shopify-australia shopify-x"
|
||||||
@@ -450,6 +516,10 @@ steps:
|
|||||||
export BUILD_ENV="production"
|
export BUILD_ENV="production"
|
||||||
export COMMIT_SHA=${DRONE_COMMIT:0:10}
|
export COMMIT_SHA=${DRONE_COMMIT:0:10}
|
||||||
echo "本次变更文件:"
|
echo "本次变更文件:"
|
||||||
|
if [ "$diff_failed" -eq 1 ]; then
|
||||||
|
echo "⚠️ 变更范围计算失败,回退为全量部署。"
|
||||||
|
changed_files="packages/__force_full_deploy__"
|
||||||
|
fi
|
||||||
echo "$changed_files"
|
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)
|
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)
|
||||||
@@ -460,19 +530,38 @@ steps:
|
|||||||
deploy_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
deploy_list=$(echo "$changed_files" | grep "^apps/" | cut -d/ -f2 | sort -u)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
compose_services=$(docker compose -f docker-compose-prod.yml config --services)
|
||||||
|
original_deploy_list="$deploy_list"
|
||||||
|
deploy_list=""
|
||||||
|
skipped_list=""
|
||||||
|
for svc in $original_deploy_list; do
|
||||||
|
if echo "$compose_services" | grep -q "^$svc$"; then
|
||||||
|
deploy_list="$deploy_list $svc"
|
||||||
|
else
|
||||||
|
skipped_list="$skipped_list $svc"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
deploy_list=$(echo "$deploy_list" | xargs)
|
||||||
|
skipped_list=$(echo "$skipped_list" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$skipped_list" ]; then
|
||||||
|
echo "以下 apps 变更未在 docker-compose 中定义,已跳过: $skipped_list"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$deploy_list" ]; then
|
if [ -z "$deploy_list" ]; then
|
||||||
echo "未命中可部署服务(仅文档或非关键文件改动),跳过远程部署。"
|
echo "未命中可部署服务(仅文档或非关键文件改动),跳过远程部署。"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for svc in $deploy_list; do
|
for svc in $deploy_list; do
|
||||||
if docker compose -f docker-compose-prod.yml config --services | grep -q "^$svc$"; then
|
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production
|
||||||
echo ">>>>>> 远程更新服务: $svc <<<<<<"
|
done
|
||||||
cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production
|
echo ">>>>>> 远程并行拉取镜像: $deploy_list <<<<<<"
|
||||||
docker compose -f docker-compose-prod.yml pull "$svc"
|
docker compose -f docker-compose-prod.yml pull $deploy_list
|
||||||
docker compose -f docker-compose-prod.yml up -d --force-recreate "$svc"
|
for svc in $deploy_list; do
|
||||||
echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<"
|
echo ">>>>>> 远程更新服务: $svc <<<<<<"
|
||||||
fi
|
docker compose -f docker-compose-prod.yml up -d --force-recreate "$svc"
|
||||||
|
echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<"
|
||||||
done
|
done
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
@@ -517,6 +606,17 @@ depends_on:
|
|||||||
- RC-frontend-monorepo-ci
|
- RC-frontend-monorepo-ci
|
||||||
- PROD-frontend-monorepo-ci
|
- PROD-frontend-monorepo-ci
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- promote
|
||||||
|
- rollback
|
||||||
|
branch:
|
||||||
|
- dev
|
||||||
|
- test
|
||||||
|
- release
|
||||||
|
- main
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: send-dingtalk-notification
|
- name: send-dingtalk-notification
|
||||||
image: lddsb/drone-dingtalk-message
|
image: lddsb/drone-dingtalk-message
|
||||||
@@ -538,15 +638,6 @@ steps:
|
|||||||
status:
|
status:
|
||||||
- success
|
- success
|
||||||
- failure
|
- failure
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- promote
|
|
||||||
- rollback
|
|
||||||
branch:
|
|
||||||
- dev
|
|
||||||
- test
|
|
||||||
- release
|
|
||||||
- main
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: dingtalk-tpl
|
- name: dingtalk-tpl
|
||||||
|
|||||||
69
bluetti-tools/Dockerfile
Normal file
69
bluetti-tools/Dockerfile
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# Monorepo: pnpm + Turbo,仅构建 apps/web
|
||||||
|
FROM node:20-bookworm-slim AS builder
|
||||||
|
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends openssl ca-certificates
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN corepack enable && corepack prepare pnpm@9.15.9 --activate
|
||||||
|
ENV PNPM_HOME="/pnpm"
|
||||||
|
ENV PATH="$PNPM_HOME:$PATH"
|
||||||
|
|
||||||
|
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./
|
||||||
|
COPY apps/web/package.json ./apps/web/
|
||||||
|
COPY packages/ui/package.json ./packages/ui/
|
||||||
|
COPY packages/shopify-admin/package.json ./packages/shopify-admin/
|
||||||
|
|
||||||
|
RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \
|
||||||
|
pnpm config set store-dir /pnpm/store \
|
||||||
|
&& pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
COPY apps/web ./apps/web
|
||||||
|
COPY packages ./packages
|
||||||
|
|
||||||
|
ENV TURBO_TELEMETRY_DISABLED=1
|
||||||
|
RUN --mount=type=cache,id=turbo-cache,target=/app/node_modules/.cache/turbo \
|
||||||
|
pnpm turbo build --filter=web
|
||||||
|
|
||||||
|
# 产出仅含 web 生产依赖的独立部署目录(比 runner 内 monorepo install 更小)
|
||||||
|
RUN pnpm --filter=web deploy --prod /app/deploy
|
||||||
|
|
||||||
|
# prisma CLI 为 devDep:用 web 包内已安装的 prisma 在 deploy 目录 generate
|
||||||
|
RUN --mount=type=cache,id=prisma-cache,target=/root/.cache/prisma \
|
||||||
|
pnpm --filter=web exec prisma generate --schema=/app/deploy/prisma/schema.prisma
|
||||||
|
|
||||||
|
# 运行时不需要源码与构建配置
|
||||||
|
RUN rm -rf /app/deploy/app /app/deploy/.turbo /app/deploy/.react-router /app/deploy/components /app/deploy/hooks /app/deploy/lib \
|
||||||
|
/app/deploy/vite.config.ts /app/deploy/tsconfig.json /app/deploy/components.json /app/deploy/react-router.config.ts \
|
||||||
|
/app/deploy/Dockerfile /app/deploy/.dockerignore
|
||||||
|
|
||||||
|
# 运行镜像:deploy 产物 + 全局 prisma CLI(migrate deploy)
|
||||||
|
FROM node:20-bookworm-slim AS runner
|
||||||
|
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends openssl ca-certificates
|
||||||
|
|
||||||
|
RUN --mount=type=cache,id=npm-cache,target=/root/.npm \
|
||||||
|
npm install -g prisma@6.19.0
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
ENV HOST=0.0.0.0
|
||||||
|
ENV PORT=3000
|
||||||
|
|
||||||
|
COPY --from=builder /app/deploy ./
|
||||||
|
|
||||||
|
COPY docker/docker-entrypoint.sh /docker-entrypoint.sh
|
||||||
|
RUN chmod +x /docker-entrypoint.sh
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
|
||||||
|
CMD node -e "fetch('http://127.0.0.1:' + (process.env.PORT || 3000)).then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"
|
||||||
|
|
||||||
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
32
bluetti-tools/docker-compose.yml
Normal file
32
bluetti-tools/docker-compose.yml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# 博客图片资源 Web(React Router + Prisma SQLite)
|
||||||
|
#
|
||||||
|
# 使用:
|
||||||
|
# 1. 复制 apps/web/.env.example 为 apps/web/.env,填写 SHOPIFY_*、SESSION_SECRET 等
|
||||||
|
# 2. docker compose up -d --build
|
||||||
|
# 3. 浏览器访问 http://localhost:30001 ,无用户时打开 /setup
|
||||||
|
# 说明:compose 会注入 DATABASE_URL=file:/data/prod.db(覆盖 .env 里本地 SQLite 路径)
|
||||||
|
#
|
||||||
|
# 数据库文件持久化在卷 prisma-data 中;更换主机或备份请挂载/拷贝该卷。
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: bluetti-tools-web:latest
|
||||||
|
ports:
|
||||||
|
- "30001:3000"
|
||||||
|
env_file:
|
||||||
|
- apps/web/.env
|
||||||
|
environment:
|
||||||
|
# 覆盖 .env 中的本地路径,使用容器内持久化卷
|
||||||
|
DATABASE_URL: file:/data/prod.db
|
||||||
|
HOST: 0.0.0.0
|
||||||
|
PORT: "3000"
|
||||||
|
# 生产必须设置(与 apps/web/.env 中一致);未设置会导致登录时报错
|
||||||
|
# SESSION_SECRET: 请用 openssl rand -hex 32 生成后写入 apps/web/.env 或此处
|
||||||
|
# 公网访问时请改为实际 HTTPS 地址(OAuth 回调、邮件链接)
|
||||||
|
# SHOPIFY_APP_URL: https://your-domain.com
|
||||||
|
volumes:
|
||||||
|
- /bluetti/frontend_project/bluetti-tools-configs/data:/data
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# volumes:
|
||||||
|
# prisma-data:
|
||||||
35
bluetti-tools/drone.yaml
Normal file
35
bluetti-tools/drone.yaml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
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:
|
||||||
|
- |
|
||||||
|
export DOCKER_BUILDKIT=1
|
||||||
|
cp /bluetti/frontend_project/bluetti-tools-configs/tools.production.env apps/web/.env
|
||||||
|
docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t bluetti-tools-web:latest -f Dockerfile .
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user