diff --git a/.cnb.yml b/.cnb.yml index 765a2b85e..5e0ce1f20 100644 --- a/.cnb.yml +++ b/.cnb.yml @@ -17,7 +17,9 @@ main: image: golang:1.25 commands: - VERSION="v$(git rev-parse --short=8 HEAD)" - - echo "BUILD_VERSION=${VERSION}" + - mkdir -p /tmp/build-info + - echo "BUILD_VERSION=${VERSION}" >> /tmp/build-info/.env + - echo "构建版本号:${VERSION}" # ========== 缓存Go依赖 ========== - name: cache go modules @@ -37,11 +39,33 @@ main: GO111MODULE: on GOSUMDB: off commands: + - source /tmp/build-info/.env || true - mkdir -p build - - BIN_NAME="logic_${BUILD_VERSION}" + - BIN_NAME="logic_${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} ./logic - ls -lh ./build/ + - echo "BUILD_VERSION=${BUILD_VERSION}" >> /tmp/build-info/.env + - cat /tmp/build-info/.env + + # ========== 编译Login服务 ========== + - name: build login + image: golang:1.25 + environment: + CGO_ENABLED: 0 + GO111MODULE: on + GOSUMDB: off + commands: + - source /tmp/build-info/.env || true + - 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 @@ -65,11 +89,19 @@ main: 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 /tmp/build-info + - echo "REMOTE_HOSTS=${REMOTE_HOSTS}" >> /tmp/build-info/.env + - echo "REMOTE_USERS=${REMOTE_USERS}" >> /tmp/build-info/.env + - echo "REMOTE_PASSWORDS=${REMOTE_PASSWORDS}" >> /tmp/build-info/.env + - echo "REMOTE_ONLINE_IDS=${REMOTE_ONLINE_IDS}" >> /tmp/build-info/.env + - cat /tmp/build-info/.env # ========== SCP推送产物到服务器 ========== - name: scp to servers @@ -78,7 +110,107 @@ main: host: ${REMOTE_HOSTS} username: ${REMOTE_USERS} password: ${REMOTE_PASSWORDS} - source: ./build/logic_${BUILD_VERSION} + source: + - ./build/logic_* + - /tmp/build-info/.env target: /opt/logic/ - strip_components: 1 - skip_verify: true \ No newline at end of file + strip_components: 3 + skip_verify: true + + # ========== 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}" + + # ========== SSH执行启动命令 ========== + - 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 /opt/logic/.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 \ No newline at end of file