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