基于 Drone CI 实现前端自动化打包并集成 Spug 自动发布流程

发布于:2025-07-03 ⋅ 阅读:(29) ⋅ 点赞:(0)

前言:代码自动化部署目前使用的是Spug开源运维平台,通过docker直接部署该平台后,在前端自动化打包(npm run build)会遇见Node的版本问题,因为Spug容器使用的是Centos7,所以Node版本只支持V16,V18以上版本不支持。所以考虑使用使用Drone CI来完成前端自动化打包(npm run build)再触发Spug的Webhook来完成自动化代码发布。

一、部署 Drone CI(Docker 方式)

我们需要创建一个文件夹,用于初始Drone CI的启动文件。

1、准备 .env 配置文件

文件路径,例如使用 /www/dk_project/drone_ci/.env

# Gitea地址(容器访问得到即可)
DRONE_GITEA_SERVER=http://127.0.0.1:42000

# Gitea-OAuth2 应用程序参数
DRONE_GITEA_CLIENT_ID=xxx
DRONE_GITEA_CLIENT_SECRET=xxx

# Drone server 配置
DRONE_SERVER_HOST=127.0.0.1:12009
DRONE_SERVER_PROTO=http

# 第一个用户初始化设置(根据 Gitea 用户名)
DRONE_USER_CREATE=username:admin,admin:true

# Runner 需要这些变量
DRONE_RPC_PROTO=http
DRONE_RPC_HOST=drone-server
# Drone 用于认证 Server <-> Runner 的 secret,自定义即可,必须一致
DRONE_RPC_SECRET=123456

1.2、Gitea-OAuth2 应用程序参数

需要在Gitea 后台创建 OAuth2 应用

1.2.1、步骤
  • 登录 Gitea 网站(管理员账号)

  • 点击右上角头像 → 管理后台

  • 左侧菜单选择集成 → 应用

  • 填写信息:

字段 示例
应用名称 Drone CI
重定向 URI http://your-drone-server.com/login
如:http://127.0.0.1:12009/login
  • 点击 创建新应用

提交后会获得两个字段:

Client ID → 填入 DRONE_GITEA_CLIENT_ID

Client Secret → 填入 DRONE_GITEA_CLIENT_SECRET

2、编写 docker-compose.yml

文件路径,使用 /www/dk_project/drone_ci/docker-compose.yml

还需要再创建一个文件夹 /www/dk_project/dk_compose/drone/data作为数据映射文件

version: '3'

services:
  drone-server:
    image: drone/drone:2
    ports:
      - 12009:80
    volumes:
      - /www/dk_project/dk_compose/drone/data:/data
    env_file:
      - .env
    restart: always

  drone-runner:
    image: drone/drone-runner-docker:1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    env_file:
      - .env
    restart: always

3、启动 Drone

docker-compose up -d

4、访问地址

http://127.0.0.1:12009

首次登录会跳转到 Gitea 登录页(使用你配置的 DRONE_USER_CREATE 中的用户)

点击CONTINUE后会进行Gitea授权

应用授权后填写你的信息即可

二、项目配置(前端项目为例) 

1、创建 .drone.yml 文件

放到项目根目录,记得.drone.yml 文件需要发布到test和master分支。

kind: pipeline
type: docker
name: build-deploy

trigger:
  event:
    - push
    - custom
  branch:
    - master
    - test

steps:
  - name: install & build
    image: node:23.9.0
    volumes:
      - name: build-output
        path: /runner/builds
    commands:
      - corepack enable
      - corepack prepare pnpm@8.15.5 --activate
      - pnpm install
      - mkdir -p /runner/builds/${DRONE_REPO_NAME}/${DRONE_BRANCH}
      - |
        case "${DRONE_BRANCH}" in
          test)
            pnpm run build:test
            ;;
          master)
            pnpm run build:prod
            ;;
          *)
            echo "❌ 未配置此分支的构建规则: ${DRONE_BRANCH}"
            exit 1
            ;;
        esac
      - rm -rf /runner/builds/${DRONE_REPO_NAME}/${DRONE_BRANCH}/*
      - cp -r dist/* /runner/builds/${DRONE_REPO_NAME}/${DRONE_BRANCH}/

  - name: deploy to spug
    image: curlimages/curl
    when:
      status:
        - success
      branch:
        - test
        - master
    environment:
      SPUG_DEPLOY_URL:
        from_secret: spug_deploy_lingji_officel_web_url
      SPUG_DEPLOY_TOKEN:
        from_secret: spug_deploy_token
    commands:
      - |
        echo "🚀 部署到 Spug: 分支 ${DRONE_BRANCH}"
        curl -X POST "$SPUG_DEPLOY_URL?name=${DRONE_BRANCH}&token=$SPUG_DEPLOY_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{
        "ref": "refs/heads/'"${DRONE_BRANCH}"'",
        "before": "'"${DRONE_COMMIT_BEFORE}"'",
        "after": "'"${DRONE_COMMIT_SHA}"'",
        "commits": [
          {
            "message": "发布'"${DRONE_BRANCH}:${DRONE_COMMIT_SHA}"'"
          }
        ]
        }'

  - name: notify feishu on success
    image: curlimages/curl
    when:
      status:
        - success
    environment:
      FEISHU_WEBHOOK:
        from_secret: feishu_webhook_url
    commands:
      - |
        curl -X POST "$FEISHU_WEBHOOK" \
        -H "Content-Type: application/json" \
        -d '{
          "msg_type": "text",
          "content": {
            "text": "✅ Drone-CI 执行成功 🎉\n项目: '${DRONE_REPO_NAME}'\n分支: '${DRONE_BRANCH}'\n提交: '${DRONE_COMMIT_SHA:0:8}'"
          }
        }'

  - name: notify feishu on failure
    image: curlimages/curl
    when:
      status:
        - failure
    environment:
      FEISHU_WEBHOOK:
        from_secret: feishu_webhook_url
    commands:
      - |
        curl -X POST "$FEISHU_WEBHOOK" \
        -H "Content-Type: application/json" \
        -d '{
          "msg_type": "text",
          "content": {
            "text": "❌ Drone-CI 执行失败 ❗️\n项目: '${DRONE_REPO_NAME}'\n分支: '${DRONE_BRANCH}'\n提交: '${DRONE_COMMIT_SHA:0:8}'"
          }
        }'

volumes:
  - name: build-output
    host:
      path: /www/dk_project/dk_compose/spug/data/repos/build/drone-runner/builds

 1.1、注意点

1.1.1、environment参数

environment参数里,类似feishu_webhook_url这些都是在drone上设置的,位置在:Seetings里的Secrets(Organization),

这里在设置一个Secrets的时候,需要勾选Allow Pull Requests才会被全部项目使用

三、Drone Web UI 中启用项目

登录 Drone → 找到你的项目 → 点「+ Activate」启用构建。

Drone 会自动给 Gitea 注册 webhook。

并且在Settings启用三个配置。

我们回到Gitea查看当前的webhook有自动生成。该webhook为drone的地址。

 我们这里对webhook设置只监听test个master的推送事件

 四、创建CI

我们可以手动创建CI来验证,在项目的NEW BUILD按钮,点击一个新的CI

比如这里我们选择test

跑完后的效果如下: