Update my-first-workflow.yaml

This commit is contained in:
2026-01-26 14:20:59 +08:00
committed by GitHub
parent 582908c3e9
commit 36100ab672

View File

@@ -1,8 +1,10 @@
# Woodpecker 顶层仅允许 when/clone/pipeline 等核心字段无steps/workflow/environment
# ===================== 纯Woodpecker原生语法无任何自定义顶层节点 =====================
# 触发条件仅push/main手动触发执行
when:
event: [push, manual]
branch: main
# 代码克隆配置SSH拉取深度50
clone:
git:
image: woodpeckerci/plugin-git
@@ -11,12 +13,12 @@ clone:
lfs: false
use-ssh: true
# 所有自定义变量放入 pipeline 全局变量Woodpecker 无顶层environment
# 核心流水线所有步骤都在这里Woodpecker唯一的步骤容器
pipeline:
# 全局变量定义所有步骤可直接引用
# 全局变量pipeline内定义所有步骤可直接引用
SCREEN_NAME: logic_service
REMOTE_EXE_DIR: /opt/logic
JSON_CONFIG_URL: "https://xxx.com/deploy-config.json"
JSON_CONFIG_URL: "https://xxx.com/deploy-config.json" # 替换为你的JSON地址
JSON_FIELD_ADDR: "loginaddr"
JSON_FIELD_USER: "user"
JSON_FIELD_PASS: "password"
@@ -26,21 +28,18 @@ pipeline:
cache-go-mod:
image: woodpeckerci/plugin-cache
settings:
mount:
- ~/go/pkg/mod
- ~/.cache/go-build
mount: [~/go/pkg/mod, ~/.cache/go-build]
key: ${CI_OS}-go-${CI_COMMIT_SHA:0:8}
restore_keys:
- ${CI_OS}-go-
restore_keys: [${CI_OS}-go-]
# 2. 配置Go环境&预下载依赖
# 2. 初始化Go环境
prepare-go:
image: golang:1.25
commands:
- go version
- go mod download -x
# 3. 生成构建版本号写入CI环境文件供后续步骤使用
# 3. 生成构建版本号
set-version:
image: golang:1.25
commands:
@@ -48,46 +47,39 @@ pipeline:
- echo "BUILD_VERSION=${VERSION}" >> $CI_ENV_FILE
- echo "构建版本号:${VERSION}"
# 4. 编译Go服务静态编译无依赖
# 4. 编译Go服务静态编译系统依赖
build-logic:
image: golang:1.25
commands:
- mkdir -p build
- BIN_NAME="logic_${BUILD_VERSION}"
- echo "BIN_NAME=${BIN_NAME}" >> $CI_ENV_FILE
# Go环境变量内联避免顶层无效字段
- CGO_ENABLED=0 GO111MODULE=on GOSUMDB=off go build -v \
-p=4 \
-trimpath \
-buildvcs=false \
-p=4 -trimpath -buildvcs=false \
-ldflags "-s -w -buildid= -extldflags '-static'" \
-o ./build/${BIN_NAME} \
./logic
- if [ ! -f ./build/${BIN_NAME} ]; then
echo "❌ 编译失败:产物${BIN_NAME}不存在"
exit 1
fi
-o ./build/${BIN_NAME} ./logic
- [ -f ./build/${BIN_NAME} ] || { echo "❌ 编译失败,产物不存在"; exit 1; }
- ls -lh ./build/
- echo "产物名称:${BIN_NAME}"
# 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; }
- |
JSON_TYPE=$(jq -r 'type' /tmp/deploy-config.json)
if [ "$JSON_TYPE" = "array" ]; then
REMOTE_HOSTS=$(jq -r ".[].${JSON_FIELD_ADDR}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_USERS=$(jq -r ".[].${JSON_FIELD_USER}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_PASSWORDS=$(jq -r ".[].${JSON_FIELD_PASS}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_ONLINE_IDS=$(jq -r ".[].${JSON_FIELD_ONLINEID}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_HOSTS=$(jq -r ".[].${JSON_FIELD_ADDR}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_USERS=$(jq -r ".[].${JSON_FIELD_USER}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_PASSWORDS=$(jq -r ".[].${JSON_FIELD_PASS}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
REMOTE_ONLINE_IDS=$(jq -r ".[].${JSON_FIELD_ONLINEID}" /tmp/deploy-config.json | tr '\n' ',' | sed 's/,$//')
else
REMOTE_HOSTS=$(jq -r ".${JSON_FIELD_ADDR}" /tmp/deploy-config.json)
REMOTE_USERS=$(jq -r ".${JSON_FIELD_USER}" /tmp/deploy-config.json)
REMOTE_PASSWORDS=$(jq -r ".${JSON_FIELD_PASS}" /tmp/deploy-config.json)
REMOTE_ONLINE_IDS=$(jq -r ".${JSON_FIELD_ONLINEID}" /tmp/deploy-config.json)
REMOTE_HOSTS=$(jq -r ".${JSON_FIELD_ADDR}" /tmp/deploy-config.json)
REMOTE_USERS=$(jq -r ".${JSON_FIELD_USER}" /tmp/deploy-config.json)
REMOTE_PASSWORDS=$(jq -r ".${JSON_FIELD_PASS}" /tmp/deploy-config.json)
REMOTE_ONLINE_IDS=$(jq -r ".${JSON_FIELD_ONLINEID}" /tmp/deploy-config.json)
fi
- echo "解析结果:服务器=${REMOTE_HOSTS} | OnlineID=${REMOTE_ONLINE_IDS}"
- echo "REMOTE_HOSTS=${REMOTE_HOSTS}" >> $CI_ENV_FILE
@@ -95,7 +87,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:
@@ -108,7 +100,7 @@ pipeline:
skip_verify: true
depends_on: [build-logic, fetch-deploy-config]
# 7. 远程部署安装Screen+启动程序动态-online_id
# 7. 远程部署安装Screen+启动程序动态online_id
deploy-to-servers:
image: appleboy/drone-ssh
settings:
@@ -117,59 +109,50 @@ pipeline:
password: ${REMOTE_PASSWORDS}
skip_verify: true
script:
# 检查安装Screen
# 检查/安装Screen
- |
if command -v screen &> /dev/null; then
echo "✅ Screen已安装"
echo "✅ Screen已安装,跳过"
else
echo "🔧 开始安装Screen"
if command -v apt &> /dev/null; then
apt update -y && apt install -y screen -qq
elif command -v yum &> /dev/null; then
yum install -y screen -q
elif command -v dnf &> /dev/null; then
dnf install -y screen -q
elif command -v pacman &> /dev/null; then
pacman -S --noconfirm screen
else
echo "❌ 不支持的包管理器无法安装Screen"
exit 1
fi
command -v screen || { echo "❌ Screen安装失败"; exit 1; }
echo "🔧 安装Screen..."
if command -v apt &> /dev/null; then
apt update -y && apt install -y screen -qq
elif command -v yum &> /dev/null; then
yum install -y screen -q
elif command -v dnf &> /dev/null; then
dnf install -y screen -q
else
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
# 启动新程序动态-id日志写入run.log
# 启动新程序并验证
- |
echo "🚀 启动Screen会话[${SCREEN_NAME}]OnlineID=${REMOTE_ONLINE_IDS}"
screen -dmS ${SCREEN_NAME} bash -c "\"${REMOTE_EXE_DIR}/${BIN_NAME}\" -id=${REMOTE_ONLINE_IDS} | tee -a \"\$HOME/run.log\""
echo "🚀 启动会话[${SCREEN_NAME}]OnlineID=${REMOTE_ONLINE_IDS}"
screen -dmS ${SCREEN_NAME} bash -c "\"${REMOTE_EXE_DIR}/${BIN_NAME}\" -id=${REMOTE_ONLINE_IDS} | tee -a \$HOME/run.log"
sleep 2
if screen -ls | grep -q "${SCREEN_NAME}"; then
echo "✅ 程序启动成功!会话列表:"
screen -ls
echo "✅ 启动成功!" && screen -ls
else
echo "❌ 程序启动失败,无目标会话"
screen -ls
exit 1
echo "❌ 启动失败,无目标会话" && screen -ls && exit 1
fi
depends_on: scp-exe-to-servers
# 8. 打印部署完成汇总信息
# 8. 打印部署完成信息
print-deploy-info:
image: alpine:latest
commands:
- echo "======================================"
- echo "🎉 全量部署完成!"
- echo "🎉 部署完成!"
- echo "版本号:${BUILD_VERSION}"
- echo "触发方式:${CI_EVENT_NAME}"
- echo "程序名称:${BIN_NAME}"
- echo "部署目录:${REMOTE_EXE_DIR}"
- echo "Screen会话${SCREEN_NAME}"
- echo "部署服务器:${REMOTE_HOSTS}"
- echo "服务器OnlineID${REMOTE_ONLINE_IDS}"
- echo "对应Commit${CI_COMMIT_SHA}"
- echo "OnlineID映射${REMOTE_ONLINE_IDS}"
- echo "Screen会话${SCREEN_NAME}"
- echo "程序目录:${REMOTE_EXE_DIR}"
- echo "======================================"
depends_on: deploy-to-servers