当您在 GitHub Actions 工作流程中运行测试时,将生成覆盖率报告。现在,每次运行测试并生成新的覆盖率报告时,我想将覆盖率文件夹存储在 mongodb 中,并通过在浏览器上打开 index.html(位于 Icov-report 文件夹中)来查看每个生成的覆盖率的报告。为了能够查看不同的报告,我将使用唯一的 ID,例如时间戳或 run_id。
我该怎么做?如果还有其他更好的方法,请提出。
目前,这是我在 mongodb 中存储覆盖范围的方法:-
商店覆盖率.js
const fs = require('fs');
const archiver = require('archiver');
const MongoClient = require('mongodb').MongoClient;
const core = require('@actions/core');
const {DefaultArtifactClient} = require('@actions/artifact');
const artifact = new DefaultArtifactClient();
const uri = process.env.MONGODB_URI;
const client = new MongoClient(uri);
const uniqueId = new Date().toISOString;
async function storeCoverageReport() {
try {
await client.connect();
const db = client.db('coverage-reports');
const collection = db.collection('reports');
const rootDirectory = 'coverage'; // Path to the coverage folder
const {id, size} = await artifact.uploadArtifact('coverage-report', {rootDirectory});
console.log(`upload id and size: ${id}, ${size}`);
const coverageReportBuffer = await compressCoverageFolder(rootDirectory);
const result = await collection.insertOne({
_id: uniqueId,
coverageReport: coverageReportBuffer,
});
console.log(`Coverage report stored with ID: ${result.insertedId}`);
} catch (err) {
console.error('Error storing coverage report:', err);
} finally {
await client.close();
}
}
async function compressCoverageFolder(rootDirectory) {
const coverageReportArchive = archiver('zip');
const coverageReportBuffer = [];
coverageReportArchive.on('data', (chunk) => {
coverageReportBuffer.push(chunk);
});
coverageReportArchive.on('end', () => {
return Buffer.concat(coverageReportBuffer);
});
coverageReportArchive.directory(rootDirectory, false);
await coverageReportArchive.finalize();
return coverageReportArchive.pointer();
}
storeCoverageReport();
CD 工作流程
name: CD Workflow
on:
push:
branches:
- main
- staging
env:
EC2_HOST: ${{ github.ref == 'refs/heads/main' && secrets.EC2_HOST || secrets.STAGING_EC2_HOST }}
EC2_USER: ${{ github.ref == 'refs/heads/main' && secrets.EC2_USER || secrets.STAGING_EC2_USER }}
EC2_KEY: ${{ github.ref == 'refs/heads/main' && secrets.SSH_PRIVATE_KEY || secrets.STAGING_SSH_PRIVATE_KEY }}
ACTIONS_RUNTIME_TOKEN: ${{ secrets.USER_PAT }}
jobs:
deploy:
runs-on: self-hosted
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 18
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm run test -- --json --outputFile=test-results.json
continue-on-error: true # Continue even if tests fail to calculate coverage
- name: Calculate test pass rate
id: test_pass_rate
run: |
node -e 'const fs = require("fs");
const testResults = JSON.parse(fs.readFileSync("test-results.json", "utf8"));
const totalTests = testResults.numTotalTests;
const passedTests = testResults.numPassedTests;
const passRate = (passedTests / totalTests) * 100;
console.log(`Test Pass Rate: ${passRate.toFixed(2)}%`);
console.log(`::set-output name=pass_rate::${passRate.toFixed(2)}`);'
- name: Check pass rate
run: |
if (( $(echo "${{ steps.test_pass_rate.outputs.pass_rate }}" | cut -d'.' -f1) < 90 )); then
echo "Test pass rate is less than 90% in main branch."
exit 1
fi
- name: Archive coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
if-no-files-found: warn
- name: Install MongoDB dependencies
run: npm install mongodb
- name: Store coverage report in MongoDB
env:
MONGODB_URI: ${{ secrets.MONGODB_URI }}
run: |
node .github/workflows/store-coverage.js
- name: Login to Docker
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Pull latest code into EC2, push latest code to container and Restart Server
if: steps.test_pass_rate.outputs.pass_rate >= 90
run: |
echo "$EC2_KEY" > ec2_key.pem
chmod 600 ec2_key.pem
ssh -o StrictHostKeyChecking=no -i ec2_key.pem $EC2_USER@$EC2_HOST <<EOF
# sudo usermod -aG docker $USER
# newgrp docker
# docker tag ondc-sellerapp-server omgvaibhav/ondc-sellerapp-server
# docker push omgvaibhav/ondc-sellerapp-server:latest
cd ~/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp
git pull
npm ci
# use pm2 reload server for zero-downtime
pm2 restart server
EOF
错误:
Run node .github/workflows/store-coverage.js
Artifact name is valid!
Error storing coverage report: Error: The provided rootDirectory undefined does not exist
at validateRootDirectory (/home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/upload/upload-zip-specification.js:37:15)
at /home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/upload/upload-artifact.js:49:62
at Generator.next (<anonymous>)
at /home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/upload/upload-artifact.js:31:71
at new Promise (<anonymous>)
at __awaiter (/home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/upload/upload-artifact.js:27:12)
at uploadArtifact (/home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/upload/upload-artifact.js:47:12)
at DefaultArtifactClient.<anonymous> (/home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/client.js:42:61)
at Generator.next (<anonymous>)
at /home/***/actions-runner/_work/ONDC-SellerApp/ONDC-SellerApp/node_modules/@actions/artifact/lib/internal/client.js:8:71
从错误消息来看,似乎传递给 validateRootDirectory() 函数的参数错误。
通过快速查看来源我可以找到:
uploadArtifact(artifactName, filesToUpload, rootDirectory, options)
时,第三个参数必须是 rootDirectory 作为本机字符串。
那么
const {id, size} = await artifact.uploadArtifact('coverage-report', {rootDirectory});
似乎是您问题的原因。