packages/screenshots/download-latest-build.js (82 lines of code) (raw):
/* eslint-disable no-console */
const {execSync} = require('child_process');
const path = require('path');
const {promisify} = require('util');
const axios = require('axios');
const yauzl = require('yauzl');
const fs = require('fs-extra');
require('dotenv').config();
const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim();
const baseURL = 'https://teamcity.jetbrains.com/app/rest/';
const teamCityClient = axios.create({
baseURL,
headers: {
Authorization: `Bearer ${process.env.TEAMCITY_TOKEN}`,
},
});
const fromBuffer = promisify(yauzl.fromBuffer);
function unzip(buffer) {
const resolvers = [];
const zipfilePromise = (async () => {
const zipfile = await fromBuffer(buffer, {lazyEntries: true});
zipfile.on('entry', entry => {
const resolver = resolvers.shift();
if (resolver) {
resolver({
value: {
entry,
openReadStream: promisify(zipfile.openReadStream.bind(zipfile, entry)),
},
done: false,
});
}
});
zipfile.once('end', () => resolvers.forEach(resolver => resolver({done: true})));
return zipfile;
})();
return {
[Symbol.asyncIterator]() {
return {
async next() {
const result = new Promise(resolve => resolvers.push(resolve));
const zipfile = await zipfilePromise;
zipfile.readEntry();
return result;
},
};
},
};
}
async function ensureWriteStream(filePath) {
await fs.ensureFile(filePath);
return fs.createWriteStream(filePath);
}
async function downloadArtifacts(buildLocator, src, dest) {
try {
const url = `builds/${buildLocator}/artifacts/content/${src}`;
console.log(`Downloading ${src} from ${baseURL}${url}`);
const {data} = await teamCityClient.get(url, {
responseType: 'arraybuffer',
});
console.log(`Unzipping ${src}`);
for await (const {entry, openReadStream} of unzip(data)) {
// skip directory entries
if (/\/$/.test(entry.fileName)) {
continue;
}
const [readStream, writeStream] = await Promise.all([
openReadStream(),
ensureWriteStream(path.join(dest, entry.fileName)),
]);
const endPromise = new Promise(resolve => readStream.once('end', resolve));
readStream.pipe(writeStream);
await endPromise;
}
console.log(`Unzipped ${src}`);
} catch (e) {
console.error(e.message);
}
}
downloadArtifacts(
`branch:${/\//.test(branch) ? `$base64:${btoa(unescape(encodeURIComponent(branch)))}` : branch},buildType:(id:JetBrainsUi_RingUi_GeminiTests)`,
'html-report.zip',
'html-report',
);