Compare commits

..

22 Commits

Author SHA1 Message Date
jiantw83 fe2a513fbb fix: 修正 findings.json 路徑重複問題 2026-05-11 10:31:43 +00:00
jiantw83 2193bdd4d6 fix: 改回 Gitea API commit,修正 URL encode 與 JSON.stringify 2026-05-11 10:30:07 +00:00
jiantw83 af51ffacee fix: 換用 node:20 完整版(內建 git,不需要 apt-get) 2026-05-11 10:24:24 +00:00
jiantw83 d9c55ca347 chore: add newline at end of TODO.md for better formatting 2026-05-11 10:18:34 +00:00
jiantw83 21fb9c1d94 fix: 改回 git commit/push,強制 Dockerfile rebuild 確保 git binary 存在 2026-05-11 10:15:36 +00:00
jiantw83 607c9b82ea debug: log content_len,改用 JSON.stringify 2026-05-11 10:13:57 +00:00
jiantw83 8acea007e7 chore: remove duplicate log assistance note in TODO.md 2026-05-11 10:12:47 +00:00
jiantw83 953951145f chore: remove test findings 2026-05-11 10:11:56 +00:00
jiantw83 1576e783fb test 2026-05-11 10:11:40 +00:00
jiantw83 e017705c64 chore: remove test findings 2026-05-11 10:10:27 +00:00
jiantw83 5f77b83a0f debug: commitFile 加上詳細 log 2026-05-11 10:09:16 +00:00
jiantw83 da43cb02b0 chore: update ai-review findings [skip ci] 2026-05-11 10:08:57 +00:00
AI Review Bot 577a930438 chore: update ai-review findings [skip ci] 2026-05-11 10:08:26 +00:00
jiantw83 121f66b0b3 debug: git.js 加上參數 log 2026-05-11 10:06:28 +00:00
jiantw83 faa808bb5f test update 2026-05-11 10:06:05 +00:00
jiantw83 07df3ef4a5 test 2026-05-11 10:05:57 +00:00
jiantw83 fc537958ca debug: commit/push 失敗時顯示詳細錯誤 2026-05-11 10:01:40 +00:00
jiantw83 1c321b7ba2 fix: commitAndPush 加上 await 2026-05-11 10:00:08 +00:00
jiantw83 710cd7308e fix: 改用 Gitea API commit findings.json,不依賴 git binary 2026-05-11 09:57:49 +00:00
jiantw83 59978c6fb5 fix: add newline at end of TODO.md for proper formatting 2026-05-11 09:56:10 +00:00
jiantw83 519e04691d fix: git.js 改用 spawnSync 直接呼叫 git binary(避免 /bin/sh ENOENT) 2026-05-11 09:51:28 +00:00
jiantw83 5ae0549453 feat: 階段五六 - findings commit/push 到來源分支,critical 問題 exit 1 2026-05-11 09:49:07 +00:00
4 changed files with 64 additions and 9 deletions
+1 -5
View File
@@ -1,8 +1,4 @@
FROM node:20-slim FROM node:20
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /action WORKDIR /action
+1
View File
@@ -27,6 +27,7 @@
--- ---
每個階段都會加上明確的 log,並確保即使部分功能未完成也能降級執行、不會中斷 pipeline。 每個階段都會加上明確的 log,並確保即使部分功能未完成也能降級執行、不會中斷 pipeline。
每次執行後請貼 log,我會協助 debug。 每次執行後請貼 log,我會協助 debug。
+49
View File
@@ -0,0 +1,49 @@
import fs from 'fs';
import path from 'path';
import axios from 'axios';
import https from 'https';
import { GITEA_TOKEN, GITEA_SERVER_URL, GITEA_REPOSITORY, PR_HEAD_BRANCH, FINDINGS_PATH } from './config.js';
const httpsAgent = new https.Agent({ rejectUnauthorized: false });
const headers = () => ({ Authorization: `token ${GITEA_TOKEN}`, 'Content-Type': 'application/json' });
const api = (p) => `${GITEA_SERVER_URL.replace(/\/$/, '')}/api/v1${p}`;
export async function commitAndPush(workspace) {
try {
const fullPath = path.join(workspace, FINDINGS_PATH);
const content = fs.readFileSync(fullPath, 'utf8');
const encoded = Buffer.from(content).toString('base64');
const url = api(`/repos/${GITEA_REPOSITORY}/contents/${FINDINGS_PATH}`);
// 取得現有檔案 SHA(若存在)
let sha;
try {
const res = await axios.get(`${url}?ref=${encodeURIComponent(PR_HEAD_BRANCH)}`, { headers: headers(), httpsAgent, timeout: 15000 });
sha = res.data.sha;
} catch {
sha = undefined;
}
const payload = JSON.stringify({
message: 'chore: update ai-review findings [skip ci]',
content: encoded,
branch: PR_HEAD_BRANCH,
...(sha ? { sha } : {}),
});
const resp = await axios.request({
method: sha ? 'put' : 'post',
url,
headers: { ...headers(), 'Content-Type': 'application/json' },
httpsAgent,
timeout: 30000,
data: payload,
});
const commitHash = resp.data.commit?.sha?.slice(0, 7) || 'unknown';
console.log(` ✅ persisted findings commit=${commitHash} push=${PR_HEAD_BRANCH}`);
} catch (e) {
const detail = e.response?.data ? JSON.stringify(e.response.data) : e.message;
console.log(` ⚠️ Runner failed: commit/push 失敗: ${e.response?.status || ''} ${detail}`);
}
}
+13 -4
View File
@@ -3,6 +3,7 @@ import { loadRoles, getRoleIntro } from './roles.js';
import { getPRDiff, postComment } from './gitea.js'; import { getPRDiff, postComment } from './gitea.js';
import { analyzeWithRole, loadOldFindings, mergeFindings, sortByLevel, deduplicateWithAI } from './findings.js'; import { analyzeWithRole, loadOldFindings, mergeFindings, sortByLevel, deduplicateWithAI } from './findings.js';
import { saveFindings, postOldFindingsComment, postNewNonCriticalComment, postNewCriticalComments } from './comments.js'; import { saveFindings, postOldFindingsComment, postNewNonCriticalComment, postNewCriticalComments } from './comments.js';
import { commitAndPush } from './git.js';
const WORKSPACE = process.env.GITHUB_WORKSPACE || '/workspace'; const WORKSPACE = process.env.GITHUB_WORKSPACE || '/workspace';
@@ -88,11 +89,19 @@ async function main() {
console.log(` ⚠️ comment 發布失敗(繼續執行): ${e.message}`); console.log(` ⚠️ comment 發布失敗(繼續執行): ${e.message}`);
} }
console.log('\n💾 Step5: 記憶區 Commit/Push(待實作)'); // Step5: commit/push findings.json 到來源分支
console.log(' [stub] commit & push findings.json...'); console.log('\n💾 Step5: 記憶區 Commit/Push');
await commitAndPush(WORKSPACE);
console.log('\n🚦 Step6: 嚴重問題檢查(待實作)'); // Step6: 有 critical 問題則 exit 1
console.log(' [stub] 檢查 critical findings...'); console.log('\n🚦 Step6: 嚴重問題檢查');
const criticalCount = sorted.filter(f => f.level === 'critical').length;
if (criticalCount > 0) {
console.log(` ❌ 發現 ${criticalCount} 個嚴重問題,workflow 結束(exit 1`);
console.log('='.repeat(60));
process.exit(1);
}
console.log(' ✅ 無嚴重問題');
console.log('\n✅ Pipeline 完成'); console.log('\n✅ Pipeline 完成');
console.log('='.repeat(60)); console.log('='.repeat(60));