diff --git a/20260320_front.yaml b/20260320_front.yaml new file mode 100644 index 0000000..bd848a7 --- /dev/null +++ b/20260320_front.yaml @@ -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 \ No newline at end of file diff --git a/20260331_prod_front.yaml b/20260331_prod_front.yaml new file mode 100644 index 0000000..906102c --- /dev/null +++ b/20260331_prod_front.yaml @@ -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 \ No newline at end of file diff --git a/20260428.yaml b/20260428.yaml new file mode 100644 index 0000000..4dbbb6a --- /dev/null +++ b/20260428.yaml @@ -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 \ No newline at end of file diff --git a/20260609.yaml b/20260609.yaml new file mode 100644 index 0000000..d0a362b --- /dev/null +++ b/20260609.yaml @@ -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 \ No newline at end of file diff --git a/20260630_front.yaml b/20260630_front.yaml new file mode 100644 index 0000000..f39c912 --- /dev/null +++ b/20260630_front.yaml @@ -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 \ No newline at end of file diff --git a/20260701_front.yaml b/20260701_front.yaml new file mode 100644 index 0000000..22d5f24 --- /dev/null +++ b/20260701_front.yaml @@ -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 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5be2451 --- /dev/null +++ b/Dockerfile @@ -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"] \ No newline at end of file diff --git a/bluetti-tools-deploy.yaml b/bluetti-tools-deploy.yaml new file mode 100644 index 0000000..f34e886 --- /dev/null +++ b/bluetti-tools-deploy.yaml @@ -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 \ No newline at end of file diff --git a/docker-compose-prod.yaml b/docker-compose-prod.yaml new file mode 100644 index 0000000..59ef8c2 --- /dev/null +++ b/docker-compose-prod.yaml @@ -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 \ No newline at end of file diff --git a/docker-compose-release.yaml b/docker-compose-release.yaml new file mode 100644 index 0000000..40e152e --- /dev/null +++ b/docker-compose-release.yaml @@ -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 \ No newline at end of file diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml new file mode 100644 index 0000000..93a8b8f --- /dev/null +++ b/docker-compose-test.yaml @@ -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 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..27615cb --- /dev/null +++ b/docker-compose.yml @@ -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 \ No newline at end of file diff --git a/dockercompose-rabbitMQ.yaml b/dockercompose-rabbitMQ.yaml new file mode 100644 index 0000000..c0de54f --- /dev/null +++ b/dockercompose-rabbitMQ.yaml @@ -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 \ No newline at end of file diff --git a/drone_dingtalk.tpl b/drone_dingtalk.tpl new file mode 100644 index 0000000..aa07f69 --- /dev/null +++ b/drone_dingtalk.tpl @@ -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] \ No newline at end of file diff --git a/drone_ok.yml b/drone_ok.yml new file mode 100644 index 0000000..43f18e8 --- /dev/null +++ b/drone_ok.yml @@ -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 \ No newline at end of file