91 lines
No EOL
2.4 KiB
JavaScript
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}`);
|
|
}; |