166 lines
5.4 KiB
YAML
166 lines
5.4 KiB
YAML
# ============================================
|
||
# COS发件箱自动上传工作流 · Awen仓库用
|
||
# COS Outbox Auto-Upload
|
||
# 签发: 铸渊 · ICE-GL-ZY001
|
||
# 版权: 国作登字-2026-A-00037559
|
||
# ============================================
|
||
#
|
||
# 用途: 放到Awen仓库的 .github/workflows/ 目录下
|
||
# 当知秋在 bridge/hldp-outbox/ 下创建新的HLDP消息文件时,
|
||
# 自动上传到COS桶,实现与铸渊的异步通信
|
||
#
|
||
# 使用说明:
|
||
# 1. 将此文件复制到 Awen仓库/.github/workflows/cos-upload-outbox.yml
|
||
# 2. 配置GitHub Secrets:
|
||
# - ZY_COS_SECRET_ID: 腾讯云COS SecretId
|
||
# - ZY_COS_SECRET_KEY: 腾讯云COS SecretKey
|
||
# - ZY_ZHUYUAN_COS_BUCKET: 铸渊主桶名称 (zy-team-hub-1317346199)
|
||
# - ZY_COS_REGION: COS区域 (ap-guangzhou)
|
||
|
||
name: COS发件箱上传 · Outbox Upload
|
||
|
||
on:
|
||
push:
|
||
paths:
|
||
- 'bridge/hldp-outbox/**'
|
||
|
||
permissions:
|
||
contents: read
|
||
|
||
env:
|
||
PERSONA_ID: zhiqiu
|
||
INDUSTRY_CODE: webnovel
|
||
|
||
jobs:
|
||
upload-outbox:
|
||
name: 上传HLDP消息到COS
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 5
|
||
|
||
steps:
|
||
- name: 📥 检出仓库
|
||
uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 2
|
||
|
||
- name: 🟢 Node.js 环境
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
|
||
- name: 📦 安装COS SDK
|
||
run: npm install cos-nodejs-sdk-v5@2
|
||
|
||
- name: 🔍 检测新的outbox文件
|
||
id: detect
|
||
run: |
|
||
# 获取本次推送新增/修改的outbox文件
|
||
NEW_FILES=$(git diff --name-only HEAD~1 HEAD -- 'bridge/hldp-outbox/' | grep '\.json$' || true)
|
||
|
||
if [ -z "$NEW_FILES" ]; then
|
||
echo "没有新的outbox文件"
|
||
echo "has_files=false" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "发现新文件:"
|
||
echo "$NEW_FILES"
|
||
echo "$NEW_FILES" > /tmp/new-outbox-files.txt
|
||
echo "has_files=true" >> $GITHUB_OUTPUT
|
||
echo "count=$(echo "$NEW_FILES" | wc -l)" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: 📤 上传到COS桶
|
||
if: steps.detect.outputs.has_files == 'true'
|
||
env:
|
||
COS_SECRET_ID: ${{ secrets.ZY_COS_SECRET_ID }}
|
||
COS_SECRET_KEY: ${{ secrets.ZY_COS_SECRET_KEY }}
|
||
COS_BUCKET: ${{ secrets.ZY_ZHUYUAN_COS_BUCKET }}
|
||
COS_REGION: ${{ secrets.ZY_COS_REGION }}
|
||
run: |
|
||
node << 'UPLOAD_SCRIPT'
|
||
const COS = require('cos-nodejs-sdk-v5');
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
|
||
const cos = new COS({
|
||
SecretId: process.env.COS_SECRET_ID,
|
||
SecretKey: process.env.COS_SECRET_KEY
|
||
});
|
||
|
||
const BUCKET = process.env.COS_BUCKET || 'zy-team-hub-1317346199';
|
||
const REGION = process.env.COS_REGION || 'ap-guangzhou';
|
||
const PERSONA_ID = '${{ env.PERSONA_ID }}';
|
||
const INDUSTRY_CODE = '${{ env.INDUSTRY_CODE }}';
|
||
|
||
const files = fs.readFileSync('/tmp/new-outbox-files.txt', 'utf8')
|
||
.trim()
|
||
.split('\n')
|
||
.filter(f => f.length > 0);
|
||
|
||
async function uploadFile(localPath) {
|
||
const content = fs.readFileSync(localPath, 'utf8');
|
||
const fileName = path.basename(localPath);
|
||
|
||
// 解析HLDP消息判断类型
|
||
let cosPath;
|
||
try {
|
||
const msg = JSON.parse(content);
|
||
const msgType = msg.payload?.data?.submission_type;
|
||
|
||
if (msgType && ['dev_proposal', 'hotfix', 'dependency_update', 'architecture_change'].includes(msgType)) {
|
||
// 开发提交 → 走审核路径
|
||
cosPath = `industry/${INDUSTRY_CODE}/dev-submissions/${PERSONA_ID}/${fileName}`;
|
||
} else {
|
||
// 普通HLDP消息 → 走常规路径
|
||
cosPath = `team-reports/${PERSONA_ID}/${fileName}`;
|
||
}
|
||
} catch {
|
||
cosPath = `team-reports/${PERSONA_ID}/${fileName}`;
|
||
}
|
||
|
||
return new Promise((resolve, reject) => {
|
||
cos.putObject({
|
||
Bucket: BUCKET,
|
||
Region: REGION,
|
||
Key: cosPath,
|
||
Body: content
|
||
}, (err) => {
|
||
if (err) {
|
||
console.error(`❌ 上传失败: ${localPath} → ${cosPath}`, err.message);
|
||
resolve(false);
|
||
} else {
|
||
console.log(`✅ 上传成功: ${localPath} → ${cosPath}`);
|
||
resolve(true);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
async function main() {
|
||
let success = 0;
|
||
let failed = 0;
|
||
|
||
for (const file of files) {
|
||
if (fs.existsSync(file)) {
|
||
const ok = await uploadFile(file);
|
||
if (ok) success++;
|
||
else failed++;
|
||
} else {
|
||
console.log(`⚠️ 文件不存在: ${file}`);
|
||
}
|
||
}
|
||
|
||
console.log(`\n上传完成: ${success} 成功, ${failed} 失败`);
|
||
if (failed > 0) process.exit(1);
|
||
}
|
||
|
||
main().catch(err => {
|
||
console.error('上传流程失败:', err);
|
||
process.exit(1);
|
||
});
|
||
UPLOAD_SCRIPT
|
||
|
||
- name: ✅ 完成
|
||
run: |
|
||
echo "知秋 · PER-ZQ001 · outbox上传完成"
|
||
echo "文件数: ${{ steps.detect.outputs.count || '0' }}"
|