diff --git a/.woodpecker.yml b/.woodpecker.yml
index ac69e09..e27eb3e 100644
--- a/.woodpecker.yml
+++ b/.woodpecker.yml
@@ -38,8 +38,6 @@
variables:
- &node_image node:20-alpine
- &docker_image docker:24-cli
- - &npm_cache /root/.npm
- - &node_modules_cache /woodpecker/src/node_modules
# ============================================
# 阶段1: 代码质量检查
@@ -260,7 +258,7 @@ steps:
# 阶段5: 部署到生产环境 (release分支)
# ============================================
deploy-production:
- image: alpine:latest
+ image: alpine/git:latest
environment:
DEPLOY_ENV: production
SSH_PRIVATE_KEY:
@@ -269,7 +267,6 @@ steps:
from_secret: registry_password
commands:
- echo "Deploying to production environment..."
- - apk add --no-cache openssh-client curl
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
@@ -320,7 +317,7 @@ steps:
echo "=== Step 7: Health check ==="
for i in {1..30}; do
- if curl -f https://novalon.cn/api/health; then
+ if wget -q --spider https://novalon.cn/api/health; then
echo "✅ Health check passed!"
echo "=== Step 8: Cleanup old images ==="
@@ -339,7 +336,7 @@ steps:
sleep 10
# 验证回滚
- if curl -f https://novalon.cn/api/health; then
+ if wget -q --spider https://novalon.cn/api/health; then
echo "✅ Rollback succeeded, but deployment failed"
else
echo "❌ Rollback also failed!"
@@ -358,13 +355,12 @@ steps:
# 阶段6: 归档到main分支 (release分支)
# ============================================
archive-to-main:
- image: alpine:latest
+ image: alpine/git:latest
environment:
SSH_PRIVATE_KEY:
from_secret: ssh_private_key
commands:
- echo "Archiving to main branch..."
- - apk add --no-cache git openssh-client
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
@@ -414,32 +410,61 @@ steps:
# 阶段7: 企业微信通知
# ============================================
notify-wechat-success:
- image: alpine:latest
+ image: python:3.11-slim
environment:
WECHAT_WEBHOOK:
from_secret: wechat_webhook
commands:
- - apk add --no-cache curl jq
- - |
- BRANCH="${CI_COMMIT_BRANCH:-unknown}"
- COMMIT="${CI_COMMIT_SHA:0:7:-unknown}"
- MESSAGE="${CI_COMMIT_MESSAGE:-no message}"
- AUTHOR="${CI_COMMIT_AUTHOR:-unknown}"
- PIPELINE_NUMBER="${CI_PIPELINE_NUMBER:-0}"
- REPO_ID="${CI_REPO_ID:-1}"
- PIPELINE_URL="https://ci.f.novalon.cn/repos/${REPO_ID}/pipeline/${PIPELINE_NUMBER}"
+ - python3 -c "
+ import os
+ import json
+ import urllib.request
+ from datetime import datetime
- TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
+ branch = os.environ.get('CI_COMMIT_BRANCH', 'unknown')
+ commit = os.environ.get('CI_COMMIT_SHA', 'unknown')[:7]
+ message = os.environ.get('CI_COMMIT_MESSAGE', 'no message').replace('\n', ' ').replace('\"', \"'\")
+ author = os.environ.get('CI_COMMIT_AUTHOR', 'unknown')
+ pipeline_number = os.environ.get('CI_PIPELINE_NUMBER', '0')
+ repo_id = os.environ.get('CI_REPO_ID', '1')
+ pipeline_url = f'https://ci.f.novalon.cn/repos/{repo_id}/pipeline/{pipeline_number}'
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
- MESSAGE_CLEAN=$(echo "$MESSAGE" | tr '\n' ' ' | tr '"' "'")
+ content = f'''## 🚀 Novalon Website 部署通知
+
+> **构建状态**: 成功
+
+**项目信息**
+> 分支: \`{branch}\`
+> 提交: \`{commit}\`
+> 作者: {author}
+
+**提交信息**
+> {message}
+
+**操作**
+> [查看构建详情]({pipeline_url})
+
+---
+> 时间: {timestamp}
+> Pipeline #{pipeline_number}'''
- CONTENT="## 🚀 Novalon Website 部署通知\n\n> **构建状态**: 成功\n\n**项目信息**\n> 分支: \`${BRANCH}\`\n> 提交: \`${COMMIT}\`\n> 作者: ${AUTHOR}\n\n**提交信息**\n> ${MESSAGE_CLEAN}\n\n**操作**\n> [查看构建详情](${PIPELINE_URL})\n\n---\n> 时间: ${TIMESTAMP}\n> Pipeline #${PIPELINE_NUMBER}"
+ data = {
+ 'msgtype': 'markdown',
+ 'markdown': {
+ 'content': content
+ }
+ }
- JSON_DATA=$(echo "{}" | jq --arg content "$CONTENT" '.msgtype = "markdown" | .markdown.content = $content')
+ req = urllib.request.Request(
+ os.environ['WECHAT_WEBHOOK'],
+ data=json.dumps(data).encode('utf-8'),
+ headers={'Content-Type': 'application/json'}
+ )
- curl -X POST "$WECHAT_WEBHOOK" \
- -H 'Content-Type: application/json' \
- -d "$JSON_DATA"
+ with urllib.request.urlopen(req) as response:
+ print(response.read().decode('utf-8'))
+ "
when:
event:
- push
@@ -450,32 +475,61 @@ steps:
- success
notify-wechat-failure:
- image: alpine:latest
+ image: python:3.11-slim
environment:
WECHAT_WEBHOOK:
from_secret: wechat_webhook
commands:
- - apk add --no-cache curl jq
- - |
- BRANCH="${CI_COMMIT_BRANCH:-unknown}"
- COMMIT="${CI_COMMIT_SHA:0:7:-unknown}"
- MESSAGE="${CI_COMMIT_MESSAGE:-no message}"
- AUTHOR="${CI_COMMIT_AUTHOR:-unknown}"
- PIPELINE_NUMBER="${CI_PIPELINE_NUMBER:-0}"
- REPO_ID="${CI_REPO_ID:-1}"
- PIPELINE_URL="https://ci.f.novalon.cn/repos/${REPO_ID}/pipeline/${PIPELINE_NUMBER}"
+ - python3 -c "
+ import os
+ import json
+ import urllib.request
+ from datetime import datetime
- TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
+ branch = os.environ.get('CI_COMMIT_BRANCH', 'unknown')
+ commit = os.environ.get('CI_COMMIT_SHA', 'unknown')[:7]
+ message = os.environ.get('CI_COMMIT_MESSAGE', 'no message').replace('\n', ' ').replace('\"', \"'\")
+ author = os.environ.get('CI_COMMIT_AUTHOR', 'unknown')
+ pipeline_number = os.environ.get('CI_PIPELINE_NUMBER', '0')
+ repo_id = os.environ.get('CI_REPO_ID', '1')
+ pipeline_url = f'https://ci.f.novalon.cn/repos/{repo_id}/pipeline/{pipeline_number}'
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
- MESSAGE_CLEAN=$(echo "$MESSAGE" | tr '\n' ' ' | tr '"' "'")
+ content = f'''## 🚀 Novalon Website 部署通知
+
+> **构建状态**: 失败
+
+**项目信息**
+> 分支: \`{branch}\`
+> 提交: \`{commit}\`
+> 作者: {author}
+
+**提交信息**
+> {message}
+
+**操作**
+> [查看构建详情]({pipeline_url})
+
+---
+> 时间: {timestamp}
+> Pipeline #{pipeline_number}'''
- CONTENT="## 🚀 Novalon Website 部署通知\n\n> **构建状态**: 失败\n\n**项目信息**\n> 分支: \`${BRANCH}\`\n> 提交: \`${COMMIT}\`\n> 作者: ${AUTHOR}\n\n**提交信息**\n> ${MESSAGE_CLEAN}\n\n**操作**\n> [查看构建详情](${PIPELINE_URL})\n\n---\n> 时间: ${TIMESTAMP}\n> Pipeline #${PIPELINE_NUMBER}"
+ data = {
+ 'msgtype': 'markdown',
+ 'markdown': {
+ 'content': content
+ }
+ }
- JSON_DATA=$(echo "{}" | jq --arg content "$CONTENT" '.msgtype = "markdown" | .markdown.content = $content')
+ req = urllib.request.Request(
+ os.environ['WECHAT_WEBHOOK'],
+ data=json.dumps(data).encode('utf-8'),
+ headers={'Content-Type': 'application/json'}
+ )
- curl -X POST "$WECHAT_WEBHOOK" \
- -H 'Content-Type: application/json' \
- -d "$JSON_DATA"
+ with urllib.request.urlopen(req) as response:
+ print(response.read().decode('utf-8'))
+ "
when:
event:
- push