Files
bl/.cnb.yml
xinian 5a5a28d2b4 1
2026-01-27 23:36:48 +08:00

218 lines
8.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

main:
push:
- stages:
# ========== 同步到GitHub ==========
- name: sync to github
image: tencentcom/git-sync
imports: https://cnb.cool/blzing/key/-/blob/main/githubkey.yml
settings:
target_url: https://github.com/72wo/blazing.git
auth_type: https
username: ${GIT_USERNAME}
password: ${GIT_ACCESS_TOKEN}
# ========== 生成版本号作为前置步骤 ==========
- name: set version
image: golang:1.25
commands:
- VERSION="v$(git rev-parse --short=8 HEAD 2>/dev/null || echo "unknown")"
- mkdir -p .build-info
- echo "BUILD_VERSION=${VERSION}" >> .build-info/.env
- echo "构建版本号:${VERSION}"
# ========== 缓存Go依赖 ==========
- name: cache go modules
image: meltwater/drone-cache:latest
settings:
restore: true
mount:
- /go/pkg/mod
- /root/.cache/go-build
cache_key: '{{ .Repo.Name }}-{{ .Commit.Branch }}-{{ checksum "go.mod" }}'
# ========== 编译Logic服务 ==========
- name: build logic
image: golang:1.25
environment:
CGO_ENABLED: 0
GO111MODULE: on
GOSUMDB: off
commands:
- VERSION="v$(git rev-parse --short=8 HEAD 2>/dev/null || echo "unknown")"
- BUILD_VERSION="${VERSION}"
- mkdir -p build
- BIN_NAME="logic_${BUILD_VERSION}"
- go mod download -x
- go build -v -p=4 -trimpath -buildvcs=false -ldflags "-s -w -buildid= -extldflags '-static'" -o ./build/${BIN_NAME} ./logic
- ls -lh ./build/
- echo "BUILD_VERSION=${BUILD_VERSION}" >> .build-info/.env
- cat .build-info/.env
# ========== 编译Login服务 ==========
- name: build login
image: golang:1.25
environment:
CGO_ENABLED: 0
GO111MODULE: on
GOSUMDB: off
commands:
- VERSION="v$(git rev-parse --short=8 HEAD 2>/dev/null || echo "unknown")"
- BUILD_VERSION="${VERSION}"
- cd login
- mkdir -p build
- BIN_NAME="login_${BUILD_VERSION:-unknown}"
- go mod download -x
- go build -v -p=4 -trimpath -buildvcs=false -ldflags "-s -w -buildid= -extldflags '-static'" -o ./build/${BIN_NAME} .
- ls -lh ./build/
- mv ./build/${BIN_NAME} ../build/
- cd ..
- ls -lh ./build/
# ========== 重建缓存 ==========
- name: rebuild cache
image: meltwater/drone-cache:latest
settings:
rebuild: true
mount:
- /go/pkg/mod
- /root/.cache/go-build
cache_key: '{{ .Repo.Name }}-{{ .Commit.Branch }}-{{ checksum "go.mod" }}'
# ========== 拉取部署配置 ==========
- name: fetch deploy config
image: alpine:latest
commands:
- apk add --no-cache curl jq
- for i in 1 2 3; do curl -sSL --connect-timeout 10 --max-time 30 "https://你的JSON配置地址.com/deploy.json" -o /tmp/deploy-config.json && break || sleep 2; done
- JSON_TYPE=$(jq -r 'type' /tmp/deploy-config.json 2>/dev/null || echo "invalid")
- |
if [ "$JSON_TYPE" = "array" ]; then
REMOTE_HOSTS=$(jq -r '.[].loginaddr' /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_USERS=$(jq -r '.[].user' /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_PASSWORDS=$(jq -r '.[].password' /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_ONLINE_IDS=$(jq -r '.[].online_id' /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
elif [ "$JSON_TYPE" = "object" ]; then
REMOTE_HOSTS=$(jq -r '.loginaddr' /tmp/deploy-config.json)
REMOTE_USERS=$(jq -r '.user' /tmp/deploy-config.json)
REMOTE_PASSWORDS=$(jq -r '.password' /tmp/deploy-config.json)
REMOTE_ONLINE_IDS=$(jq -r '.online_id' /tmp/deploy-config.json)
fi
- mkdir -p .build-info
- echo "REMOTE_HOSTS=${REMOTE_HOSTS}" >> .build-info/.env
- echo "REMOTE_USERS=${REMOTE_USERS}" >> .build-info/.env
- echo "REMOTE_PASSWORDS=${REMOTE_PASSWORDS}" >> .build-info/.env
- echo "REMOTE_ONLINE_IDS=${REMOTE_ONLINE_IDS}" >> .build-info/.env
- cat .build-info/.env
# ========== SCP推送Login到指定服务器优先部署==========
- name: scp login to login server
image: appleboy/drone-scp:1.6.2
settings:
host: ${LOGIN_SERVER_HOST}
username: ${LOGIN_SERVER_USER}
password: ${LOGIN_SERVER_PASSWORD}
port: ${LOGIN_SERVER_PORT}
source: ./build/login_*
target: /opt/login/
strip_components: 2
skip_verify: true
# ========== SSH启动Login服务 ==========
- name: start login service
image: appleboy/drone-ssh:1.6.2
settings:
host: ${LOGIN_SERVER_HOST}
username: ${LOGIN_SERVER_USER}
password: ${LOGIN_SERVER_PASSWORD}
port: ${LOGIN_SERVER_PORT}
script:
- cd /opt/login
- |
# 获取最新的login二进制文件
BIN_NAME=$(ls -t login_v* | head -1)
if [ -z "$BIN_NAME" ]; then
echo "❌ 未找到可执行的login文件"
exit 1
fi
- echo "📦 启动Login服务 | Binary: ${BIN_NAME}"
- |
# 停止旧的screen会话使用expect命令
session_name="login"
session=$(screen -ls | grep -o "[0-9]*\.${session_name}")
if [[ ! -z "$session" ]]; then
screen -X -S "$session_name" stuff "^C"
sleep 2
screen -X -S "$session_name" quit
echo "Info: Stopped login app."
fi
- sleep 1
- |
# 启动新进程
screen -dmS ${session_name} ./${BIN_NAME}
- echo "✅ Login服务启动成功 | Screen: ${session_name}"
# ========== SCP推送Logic产物到服务器后部署==========
- name: scp logic to servers
image: appleboy/drone-scp:1.6.2
settings:
host: ${REMOTE_HOSTS}
username: ${REMOTE_USERS}
password: ${REMOTE_PASSWORDS}
source:
- ./build/logic_*
- .build-info/.env
target: /opt/logic/
strip_components: 2
skip_verify: true
# ========== SSH执行Logic启动命令后部署==========
- name: start service on servers
image: appleboy/drone-ssh:1.6.2
settings:
host: ${REMOTE_HOSTS}
username: ${REMOTE_USERS}
password: ${REMOTE_PASSWORDS}
script:
- cd /opt/logic
- source .env || { echo "❌ 找不到.env文件"; exit 1; }
- |
# 获取当前服务器在数组中的索引通过IP匹配
CURRENT_HOST=$(hostname -I | awk '{print $1}')
IFS=',' read -ra ADDR <<< "${REMOTE_HOSTS}"
IFS=',' read -ra USERS <<< "${REMOTE_USERS}"
IFS=',' read -ra IDS <<< "${REMOTE_ONLINE_IDS}"
# 找到当前服务器索引
for i in "${!ADDR[@]}"; do
if [[ "${ADDR[$i]}" == *"$CURRENT_HOST"* ]] || [[ "$CURRENT_HOST" == *"${ADDR[$i]}"* ]]; then
IDX=$i
break
fi
done
# 如果无法匹配默认使用第一个
if [ -z "$IDX" ]; then
IDX=0
fi
ONLINE_ID="${IDS[$IDX]}"
BIN_NAME="logic_${BUILD_VERSION}"
SCREEN_NAME="logic_${ONLINE_ID}"
echo "📦 启动服务 | 服务器: ${ADDR[$IDX]} | OnlineID: ${ONLINE_ID}"
# 停止旧进程
screen -S ${SCREEN_NAME} -X quit 2>/dev/null || true
sleep 1
# 启动新进程
screen -dmS ${SCREEN_NAME} ./${BIN_NAME} -id=${ONLINE_ID}
# 检查启动状态
sleep 2
if screen -ls | grep -q "${SCREEN_NAME}"; then
echo "✅ 服务启动成功 | Screen: ${SCREEN_NAME} | OnlineID: ${ONLINE_ID}"
else
echo "❌ 服务启动失败 | Screen: ${SCREEN_NAME}"
fi