Something went wrong. Try again.
An open-source, container-based Platform-as-a-Service (PAAS) for seamless deployments and effortless infrastructure management — built on f…
Something went wrong. Try again.
3.1 kB · 103 lines
JavaScript
at devops
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
require('dotenv').config();
const fs = require('fs');const path = require('path');const mime = require('mime-types');const { exec } = require('child_process');const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
// Initialize S3 clientconst s3Client = new S3Client({ region: 'auto', endpoint: process.env.CLOUDFLARE_R2_ENDPOINT, credentials: { accessKeyId: process.env.CLOUDFLARE_R2_ACCESS_KEY_ID, secretAccessKey: process.env.CLOUDFLARE_R2_SECRET_ACCESS_KEY }});
// Function to publish logsfunction publishLog(log) { console.log(`logs:${process.env.PROJECT_ID}`, JSON.stringify({ log }));}
// Function to execute build processasync function executeBuild(outDirPath) { return new Promise((resolve, reject) => { const p = exec(`cd ${outDirPath} && npm install && npm run build`);
p.stdout.on('data', (data) => { console.log(data.toString()); publishLog(data.toString()); });
p.stderr.on('data', (data) => { console.error('Error', data.toString()); publishLog(`error: ${data.toString()}`); });
p.on('close', (code) => { if (code === 0) { resolve(); } else { reject(new Error(`Build process exited with code ${code}`)); } }); });}
// Function to upload a single file to S3async function uploadFile(filePath, key) { const command = new PutObjectCommand({ Bucket: process.env.CLOUDFLARE_R2_BUCKET_NAME, Key: key, Body: fs.createReadStream(filePath), ContentType: mime.lookup(filePath) || 'application/octet-stream' });
await s3Client.send(command); publishLog(`uploaded ${key}`); console.log('uploaded', filePath);}
// Function to upload all files in the dist folder to Cloudflare R2async function uploadDistFolder(distFolderPath) { const distFolderContents = fs.readdirSync(distFolderPath, { recursive: true });
for (const file of distFolderContents) { const filePath = path.join(distFolderPath, file); if (fs.lstatSync(filePath).isDirectory()) continue;
const key = `__outputs/${process.env.PROJECT_ID}/${file}`; console.log('uploading', filePath); publishLog(`uploading ${file}`); await uploadFile(filePath, key); }}
// Initialize the build and upload processasync function init() { try { console.log('Executing script.js'); publishLog('Build Started...'); const outDirPath = path.join(__dirname, 'output');
await executeBuild(outDirPath);
console.log('Build Complete'); publishLog('Build Complete');
const distFolderPath = path.join(__dirname, 'output', 'dist'); publishLog('Starting to upload'); await uploadDistFolder(distFolderPath);
publishLog('Done'); console.log('Done...'); } catch (error) { console.error('Error during build process:', error); publishLog(`error: ${error.message}`); }}
init();