编辑文件 my-first-workflow.yaml

This commit is contained in:
xinian
2026-01-28 10:58:58 +08:00
committed by cnb
parent 46da951844
commit e218debe25

View File

@@ -7,142 +7,157 @@ when:
skip_clone: true # 关闭默认clone手动拉取代码
# 流水线核心步骤修复变量解析+YAML语法
# 流水线核心步骤整合新的编译+部署流程
steps:
# ========== 1. 替代clone拉取代码核心依赖 ==========
# ========== 1. 替代clone拉取代码对应原sync to github ==========
- name: prepare
image: debian:bookworm
commands:
# 修复变量拼接语法Shell规范避免解析错误
# 拉取代码替换为你的仓库地址变量
- export GIT_CONFIG_URL="https://cnb:${CNB_ACCK}@cnb.cool/blzing/blazing"
# 系统初始化
- apt update -y
- apt install -y --no-install-recommends ca-certificates curl git openssh-client openssl libssl-dev
# 修复移除${#VAR}#避免YAML误解析注释符改用wc -c统计长度
- echo "🔍 调试GIT_CONFIG_URL长度=$(echo -n "${GIT_CONFIG_URL}" | wc -c),值=${GIT_CONFIG_URL}"
# 拉取代码指定目录避免路径混乱
# 拉取代码到项目目录
- git clone --depth 1 --progress -v ${GIT_CONFIG_URL} blazing-project
- cd blazing-project
- echo "✅ 代码拉取完成,当前目录:$(pwd)"
# ========== 2. 初始化Go环境依赖prepare ==========
- name: prepare-go
image: golang:1.25
depends_on: [prepare]
# ========== 2. 生成版本号前置步骤 ==========
- name: set version
image: golang:1.23
depends_on: [prepare] # 替换原sync to github为prepare
commands:
- cd blazing-project
- go version
- go mod download -x || { echo "❌ 下载Go依赖失败"; ls -lh go.mod; exit 1; }
- go mod verify || { echo "❌ 验证Go依赖失败"; exit 1; }
- echo "✅ Go环境初始化完成"
- cd blazing-project # 进入项目目录
- 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}"
# ========== 3. 生成版本号依赖prepare-go ==========
- name: set-version
image: golang:1.25
depends_on: [prepare-go]
commands:
- cd blazing-project
- |
if [ -n "${CI_COMMIT_TAG}" ]; then
VERSION="${CI_COMMIT_TAG}"
else
VERSION="v$(git rev-parse --short=8 HEAD 2>/dev/null || echo "unknown")"
fi
mkdir -p "$(dirname "${CI_ENV_FILE}")"
echo "BUILD_VERSION=${VERSION}" >> "${CI_ENV_FILE}"
echo "✅ 生成版本号:${VERSION}"
# ========== 3. 缓存Go依赖 ==========
- name: cache go modules
image: meltwater/drone-cache:latest
depends_on: [prepare] # 替换原sync to github为prepare
settings:
restore: true
mount:
- /go/pkg/mod
- /root/.cache/go-build
cache_key: '{{ .Repo.Name }}-{{ .Commit.Branch }}-{{ checksum "blazing-project/go.mod" }}-{{ checksum "blazing-project/login/go.mod" }}' # 补充项目目录
# ========== 4. 编译Go服务依赖prepare+prepare-go+set-version ==========
- name: build_logic
# ========== 4. 编译Logic和Login服务 ==========
- name: build
image: golang:1.25
depends_on: [prepare, prepare-go, set-version]
environment:
CGO_ENABLED: 0
GO111MODULE: on
GOSUMDB: off
commands:
- cd blazing-project
- mkdir -p build
# 修复变量名仅包含字母/数字/下划线避免解析错误
- BIN_NAME="logic_${BUILD_VERSION}_$(echo ${CI_STEP_STARTED} | tr -cd 'a-zA-Z0-9_')"
- |
go build -v \
-p=4 \
-trimpath \
-buildvcs=false \
-ldflags "-s -w -buildid= -extldflags '-static' -X main.version=${BUILD_VERSION}" \
-o ./build/${BIN_NAME} \
./logic
- |
if [ ! -f ./build/${BIN_NAME} ]; then
echo "❌ 编译失败:产物${BIN_NAME}不存在"
ls -lh ./build/
exit 1
fi
- ls -lh ./build/
- ./build/${BIN_NAME} -v || true
- echo "BIN_NAME=${BIN_NAME}" >> "${CI_ENV_FILE}"
- echo "✅ Go服务编译完成产物${BIN_NAME}"
# ========== 5. 拉取部署配置依赖prepare ==========
- name: fetch-deploy-config
image: alpine:latest
depends_on: [prepare]
commands:
- apk add --no-cache curl jq
- echo "🔧 拉取部署配置:${JSON_CONFIG_URL}"
- |
for i in 1 2 3; do
curl -sSL --connect-timeout 10 --max-time 30 "${JSON_CONFIG_URL}" -o /tmp/deploy-config.json && break
echo "⚠️ 第${i}次拉取失败,重试中..."
sleep 2
done
if [ ! -f /tmp/deploy-config.json ]; then
echo "❌ 拉取JSON配置失败"
exit 1
fi
- |
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)
else
echo "❌ JSON配置格式错误非数组/对象)"
cat /tmp/deploy-config.json
exit 1
fi
- |
if [ -z "$REMOTE_HOSTS" ] || [ -z "$REMOTE_USERS" ]; then
echo "❌ 解析配置失败:服务器/用户名为空"
cat /tmp/deploy-config.json
exit 1
fi
- echo "✅ 配置解析完成 | 服务器:${REMOTE_HOSTS} | OnlineID${REMOTE_ONLINE_IDS}"
- echo "REMOTE_HOSTS=${REMOTE_HOSTS}" >> "${CI_ENV_FILE}"
- echo "REMOTE_USERS=${REMOTE_USERS}" >> "${CI_ENV_FILE}"
- echo "REMOTE_PASSWORDS=${REMOTE_PASSWORDS}" >> "${CI_ENV_FILE}"
- echo "REMOTE_ONLINE_IDS=${REMOTE_ONLINE_IDS}" >> "${CI_ENV_FILE}"
# ========== 6. SCP推送产物核心修复变量引用格式 ==========
- name: scp-exe-to-servers
image: appleboy/drone-scp:1.6.2
depends_on:
- build_logic
- fetch-deploy-config
- cache go modules
- set version
commands:
- cd blazing-project # 进入项目目录
- . .build-info/.env # 加载版本号
- mkdir -p build
- |
# 编译Logic服务
BIN_NAME="logic_${BUILD_VERSION}"
go mod download -x
go build -v -trimpath -buildvcs=false -ldflags "-s -w -buildid= -extldflags '-static'" -o ./build/${BIN_NAME} ./logic
chmod +x ./build/${BIN_NAME}
ls -lh ./build/${BIN_NAME}
# 编译Login服务
cd login
BIN_NAME="login_${BUILD_VERSION}"
go mod download -x
go build -v -trimpath -buildvcs=false -ldflags "-s -w -buildid= -extldflags '-static'" -o ./build/${BIN_NAME} .
chmod +x ./build/${BIN_NAME}
ls -lh ./build/${BIN_NAME}
mv ./build/${BIN_NAME} ../build/
cd ..
ls -lh ./build/
# 写入BIN_NAME到环境文件供后续步骤使用
- echo "LOGIC_BIN=logic_${BUILD_VERSION}" >> "${CI_ENV_FILE}"
- echo "LOGIN_BIN=login_${BUILD_VERSION}" >> "${CI_ENV_FILE}"
# ========== 5. 重建缓存 ==========
- name: rebuild cache
image: meltwater/drone-cache:latest
depends_on: [build]
settings:
# 核心修复Woodpecker settings块必须用Go模板语法 {{ VAR }}而非${VAR}
host: {{ REMOTE_HOSTS }}
username: {{ REMOTE_USERS }}
password: {{ REMOTE_PASSWORDS }}
source: ./blazing-project/build/{{ BIN_NAME }}
target: {{ REMOTE_EXE_DIR }}/
strip_components: 3
rebuild: true
mount:
- /go/pkg/mod
- /root/.cache/go-build
cache_key: '{{ .Repo.Name }}-{{ .Commit.Branch }}-{{ checksum "blazing-project/go.mod" }}-{{ checksum "blazing-project/login/go.mod" }}' # 补充项目目录
# ========== 6. SCP推送Login和Logic到指定服务器 ==========
- name: deploy to login server
image: appleboy/drone-scp:1.6.2
imports: https://cnb.cool/blzing/key/-/blob/main/githubkey.yml
depends_on: [rebuild cache]
settings:
# 核心修复settings块用Go模板语法 {{}} 引用变量
host: {{ LOGIN_SERVER_HOST }}
username: {{ LOGIN_SERVER_USER }}
password: {{ LOGIN_SERVER_PASSWORD }}
port: {{ LOGIN_SERVER_PORT }}
source:
- ./blazing-project/build/login_*
- ./blazing-project/build/logic_*
target: /opt/login/
strip_components: 2 # 调整层级blazing-project/build/xxx 取xxx
skip_verify: true
timeout: 30s
# ========== 7. SSH启动Login服务并上传Logic到Public ==========
- name: start login and move logic
image: appleboy/drone-ssh:1.6.2
imports: https://cnb.cool/blzing/key/-/blob/main/githubkey.yml
depends_on: [deploy to login server]
settings:
# 核心修复settings块用Go模板语法 {{}} 引用变量
host: {{ LOGIN_SERVER_HOST }}
username: {{ LOGIN_SERVER_USER }}
password: {{ LOGIN_SERVER_PASSWORD }}
port: {{ LOGIN_SERVER_PORT }}
script:
- |
cd /opt/login
BIN_NAME=$(ls -t login_v* 2>/dev/null | head -1)
echo "BIN_NAME: $BIN_NAME"
if [ -z "$BIN_NAME" ]; then
echo "❌ 未找到可执行的login文件"
exit 1
fi
echo "📦 启动Login服务 | Binary: $BIN_NAME"
# 停止旧的screen会话
session_name="login"
session=$(screen -ls 2>/dev/null | grep -o "[0-9]*\.${session_name}" || true)
if [[ ! -z "$session" ]]; then
screen -X -S "$session_name" stuff "^C"
expect -c "exec screen -x ${session_name}; wait; exit" 2>/dev/null || true
screen -X -S "$session_name" quit 2>/dev/null || true
echo "Info: Stopped login app."
fi
sleep 1
# 启动新进程
screen -dmS ${session_name} ./${BIN_NAME}
echo "✅ Login服务启动成功 | Screen: ${session_name}"
# 等待服务启动并进行健康检查
sleep 3
if screen -list 2>/dev/null | grep -q "${session_name}"; then
echo "✅ 服务健康检查通过 | Screen: ${session_name}"
else
echo "❌ 服务健康检查失败 | Screen: ${session_name} 不存在"
exit 1
fi
# 移动logic产物到public目录
LOGIC_BIN=$(ls -t logic_v* 2>/dev/null | head -1)
if [ -n "$LOGIC_BIN" ]; then
mkdir -p /opt/login/public
mv $LOGIC_BIN /opt/login/public/
echo "✅ Logic产物已移动到 /opt/login/public/ | 文件: $(basename $LOGIC_BIN)"
else
echo "⚠ 未找到Logic产物"
fi