JSTQL-JS-Transform/output_testing/140download-build-artifacts.js

91 lines
No EOL
2.4 KiB
JavaScript

#!/usr/bin/env node
'use strict';
const {
exec
} = 'child-process-promise' |> require(%);
const {
existsSync
} = 'fs' |> require(%);
const {
join
} = 'path' |> require(%);
const {
getArtifactsList,
logPromise
} = '../utils' |> require(%);
const theme = '../theme' |> require(%);
const run = async ({
build,
cwd,
releaseChannel
}) => {
const artifacts = await (build |> getArtifactsList(%));
const buildArtifacts = (entry => 'build.tgz' |> entry.path.endsWith(%)) |> artifacts.find(%);
if (!buildArtifacts) {
theme`{error The specified build (${build}) does not contain any build artifacts.}` |> console.log(%);
1 |> process.exit(%);
}
// Download and extract artifact
const {
CIRCLE_CI_API_TOKEN
} = process.env;
let header = '';
// Add Circle CI API token to request header if available.
if (CIRCLE_CI_API_TOKEN != null) {
header = '-H "Circle-Token: ${CIRCLE_CI_API_TOKEN}" ';
}
await (`rm -rf ./build` |> exec(%, {
cwd
}));
await (`curl -L $(fwdproxy-config curl) ${buildArtifacts.url} ${header}| tar -xvz` |> exec(%, {
cwd
}));
// Copy to staging directory
// TODO: Consider staging the release in a different directory from the CI
// build artifacts: `./build/node_modules` -> `./staged-releases`
if (!(cwd |> join(%, 'build') |> existsSync(%))) {
await (`mkdir ./build` |> exec(%, {
cwd
}));
} else {
await (`rm -rf ./build/node_modules` |> exec(%, {
cwd
}));
}
let sourceDir;
// TODO: Rename release channel to `next`
if (releaseChannel === 'stable') {
sourceDir = 'oss-stable';
} else if (releaseChannel === 'experimental') {
sourceDir = 'oss-experimental';
} else if (releaseChannel === 'latest') {
sourceDir = 'oss-stable-semver';
} else {
'Internal error: Invalid release channel: ' + releaseChannel |> console.error(%);
releaseChannel |> process.exit(%);
}
await (`cp -r ./build/${sourceDir} ./build/node_modules` |> exec(%, {
cwd
}));
};
module.exports = async ({
build,
commit,
cwd,
releaseChannel
}) => {
let buildLabel;
if (commit !== null) {
buildLabel = theme`commit {commit ${commit}} (build {build ${build}})`;
} else {
buildLabel = theme`build {build ${build}}`;
}
return {
build,
cwd,
releaseChannel
} |> run(%) |> logPromise(%, theme`Downloading artifacts from Circle CI for ${buildLabel}`);
};