前言:代碼自動化部署目前使用的是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:2ports:- 12009:80volumes:- /www/dk_project/dk_compose/drone/data:/dataenv_file:- .envrestart: alwaysdrone-runner:image: drone/drone-runner-docker:1volumes:- /var/run/docker.sock:/var/run/docker.sockenv_file:- .envrestart: 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-deploytrigger:event:- push- custombranch:- master- teststeps:- name: install & buildimage: node:23.9.0volumes:- name: build-outputpath: /runner/buildscommands:- corepack enable- corepack prepare pnpm@8.15.5 --activate- pnpm install- mkdir -p /runner/builds/${DRONE_REPO_NAME}/${DRONE_BRANCH}- |case "${DRONE_BRANCH}" intest)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 spugimage: curlimages/curlwhen:status:- successbranch:- test- masterenvironment:SPUG_DEPLOY_URL:from_secret: spug_deploy_lingji_officel_web_urlSPUG_DEPLOY_TOKEN:from_secret: spug_deploy_tokencommands:- |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 successimage: curlimages/curlwhen:status:- successenvironment:FEISHU_WEBHOOK:from_secret: feishu_webhook_urlcommands:- |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 failureimage: curlimages/curlwhen:status:- failureenvironment:FEISHU_WEBHOOK:from_secret: feishu_webhook_urlcommands:- |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-outputhost: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
跑完后的效果如下: