diff --git a/.woodpecker/my-first-workflow.yaml b/.woodpecker/my-first-workflow.yaml index fd3c83af0..1036de5a0 100644 --- a/.woodpecker/my-first-workflow.yaml +++ b/.woodpecker/my-first-workflow.yaml @@ -1,11 +1,11 @@ -# 触发规则:仅main分支的push/手动触发 +# Woodpecker原生顶层字段1:触发条件 when: event: - push - manual branch: main -# 代码克隆配置:SSH拉取,深度50 +# Woodpecker原生顶层字段2:代码克隆配置 clone: git: image: woodpeckerci/plugin-git @@ -14,15 +14,15 @@ clone: lfs: false use-ssh: true -# 核心流水线:所有部署步骤 +# Woodpecker原生顶层字段3:核心流水线(唯一步骤容器) pipeline: - # 全局配置(按需修改以下4项即可) + # 全局配置(仅在pipeline内,按需修改这4项即可) SCREEN_NAME: logic_service REMOTE_EXE_DIR: /opt/logic - JSON_CONFIG_URL: "https://your-config-addr.com/deploy-config.json" + JSON_CONFIG_URL: "https://你的JSON配置地址.com/deploy.json" LOG_PATH: "$HOME/run.log" - # 1. 缓存Go依赖,加速构建 + # 1. 缓存Go依赖(加速构建) cache-go-mod: image: woodpeckerci/plugin-cache settings: @@ -33,20 +33,20 @@ pipeline: restore_keys: - ${CI_OS}-go- - # 2. 初始化Go环境,预下载依赖 + # 2. 初始化Go环境 & 预下载依赖 prepare-go: image: golang:1.25 commands: - go version - go mod download -x - # 3. 生成构建版本号(短SHA8位) + # 3. 生成构建版本号(8位短SHA) set-version: image: golang:1.25 commands: - VERSION="v$(git rev-parse --short=8 HEAD)" - echo "BUILD_VERSION=${VERSION}" >> $CI_ENV_FILE - - echo "构建版本号生成:${VERSION}" + - echo "✅ 生成版本号:${VERSION}" # 4. 编译Go服务(静态编译,无系统依赖) build-logic: @@ -70,15 +70,14 @@ pipeline: - ls -lh ./build/ - echo "✅ Go服务编译完成" - # 5. 拉取JSON配置,解析服务器/账号/密码/online_id + # 5. 拉取JSON & 解析服务器/账号/密码/online_id fetch-deploy-config: image: alpine:latest commands: - apk add --no-cache curl jq - echo "🔧 拉取部署配置:${JSON_CONFIG_URL}" - - curl -sSL ${JSON_CONFIG_URL} -o /tmp/deploy-config.json || { echo "❌ 拉取JSON配置失败"; exit 1; } + - curl -sSL ${JSON_CONFIG_URL} -o /tmp/deploy-config.json || { echo "❌ 拉取JSON失败"; exit 1; } - | - # 检测JSON格式(单对象/数组),解析配置 JSON_TYPE=$(jq -r 'type' /tmp/deploy-config.json) if [ "$JSON_TYPE" = "array" ]; then REMOTE_HOSTS=$(jq -r '.[].loginaddr' /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//') @@ -97,7 +96,7 @@ pipeline: - echo "REMOTE_PASSWORDS=${REMOTE_PASSWORDS}" >> $CI_ENV_FILE - echo "REMOTE_ONLINE_IDS=${REMOTE_ONLINE_IDS}" >> $CI_ENV_FILE - # 6. SCP推送编译产物到远程服务器(密码认证) + # 6. SCP推送产物到远程服务器(密码认证) scp-exe-to-servers: image: appleboy/drone-scp settings: @@ -112,7 +111,7 @@ pipeline: - build-logic - fetch-deploy-config - # 7. 远程部署:安装Screen + 优雅启动程序 + 状态验证 + # 7. 远程部署:安装Screen + 优雅启动 + 状态验证 deploy-to-servers: image: appleboy/drone-ssh settings: @@ -121,12 +120,12 @@ pipeline: password: ${REMOTE_PASSWORDS} skip_verify: true script: - # 检查并安装Screen(兼容apt/yum/dnf) - | + # 检查/安装Screen(兼容apt/yum/dnf) if command -v screen &> /dev/null; then - echo "✅ Screen已安装,无需操作" + echo "✅ Screen已安装" else - echo "🔧 开始安装Screen..." + echo "🔧 安装Screen..." if command -v apt &> /dev/null; then apt update -y && apt install -y screen -qq elif command -v yum &> /dev/null; then @@ -134,45 +133,41 @@ pipeline: elif command -v dnf &> /dev/null; then dnf install -y screen -q else - echo "❌ 不支持的包管理器,安装Screen失败" + echo "❌ 不支持的包管理器,安装失败" exit 1 fi command -v screen || { echo "❌ Screen安装后检测失败"; exit 1; } fi - # 创建目录 + 设置程序执行权限 - mkdir -p ${REMOTE_EXE_DIR} - - chmod +x ${REMOTE_EXE_DIR}/${BIN_NAME} || { echo "❌ 设置程序执行权限失败"; exit 1; } - # 优雅停止旧会话(避免端口/进程冲突) + - chmod +x ${REMOTE_EXE_DIR}/${BIN_NAME} || { echo "❌ 设置执行权限失败"; exit 1; } - screen -S ${SCREEN_NAME} -X quit || true - # 启动新程序并验证Screen会话 - | echo "🚀 启动程序:${REMOTE_EXE_DIR}/${BIN_NAME} -id=${REMOTE_ONLINE_IDS}" screen -dmS ${SCREEN_NAME} bash -c "\"${REMOTE_EXE_DIR}/${BIN_NAME}\" -id=${REMOTE_ONLINE_IDS} | tee -a ${LOG_PATH}" sleep 2 if screen -ls | grep -q "${SCREEN_NAME}"; then - echo "✅ 程序启动成功!当前Screen会话列表:" + echo "✅ 启动成功!Screen会话:" screen -ls else - echo "❌ 程序启动失败,未检测到${SCREEN_NAME}会话" - screen -ls - exit 1 + echo "❌ 启动失败,无${SCREEN_NAME}会话" + screen -ls && exit 1 fi depends_on: - scp-exe-to-servers - # 8. 打印部署完成汇总信息 + # 8. 打印部署完成汇总 print-deploy-info: image: alpine:latest commands: - echo "======================================" - - echo "🎉 全量部署流程执行完成!" - - echo "📌 构建版本号:${BUILD_VERSION}" + - echo "🎉 全量部署完成!" + - echo "📌 版本号:${BUILD_VERSION}" - echo "📌 触发方式:${CI_EVENT_NAME}" - echo "📌 部署服务器:${REMOTE_HOSTS}" - - echo "📌 服务器OnlineID:${REMOTE_ONLINE_IDS}" - - echo "📌 Screen会话名:${SCREEN_NAME}" - - echo "📌 远程程序目录:${REMOTE_EXE_DIR}" - - echo "📌 程序日志路径:${LOG_PATH}" + - echo "📌 OnlineID:${REMOTE_ONLINE_IDS}" + - echo "📌 Screen会话:${SCREEN_NAME}" + - echo "📌 程序目录:${REMOTE_EXE_DIR}" + - echo "📌 日志路径:${LOG_PATH}" - echo "📌 对应Commit:${CI_COMMIT_SHA}" - echo "======================================" depends_on: