mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-10 04:22:12 +00:00
[cli] Fix vc build to error early when runtime is discontinued (#8669)
This moves an existing error from the build container to `vercel build`. Its rare, but [Vercel Runtimes](https://vercel.com/docs/runtimes) might target a discontinued [AWS Lambda Runtime](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) so we should fail fast when we know this has happened in `vercel build`. A test has been added to demonstrate the failure using an old PHP version.
This commit is contained in:
@@ -3,6 +3,7 @@ import chalk from 'chalk';
|
|||||||
import dotenv from 'dotenv';
|
import dotenv from 'dotenv';
|
||||||
import { join, normalize, relative, resolve } from 'path';
|
import { join, normalize, relative, resolve } from 'path';
|
||||||
import {
|
import {
|
||||||
|
getDiscontinuedNodeVersions,
|
||||||
normalizePath,
|
normalizePath,
|
||||||
Files,
|
Files,
|
||||||
FileFsRef,
|
FileFsRef,
|
||||||
@@ -467,6 +468,25 @@ async function doBuild(
|
|||||||
);
|
);
|
||||||
const buildResult = await builder.build(buildOptions);
|
const buildResult = await builder.build(buildOptions);
|
||||||
|
|
||||||
|
if (
|
||||||
|
buildResult &&
|
||||||
|
'output' in buildResult &&
|
||||||
|
'runtime' in buildResult.output &&
|
||||||
|
'type' in buildResult.output &&
|
||||||
|
buildResult.output.type === 'Lambda'
|
||||||
|
) {
|
||||||
|
const lambdaRuntime = buildResult.output.runtime;
|
||||||
|
if (
|
||||||
|
getDiscontinuedNodeVersions().some(o => o.runtime === lambdaRuntime)
|
||||||
|
) {
|
||||||
|
throw new NowBuildError({
|
||||||
|
code: 'NODEJS_DISCONTINUED_VERSION',
|
||||||
|
message: `The Runtime "${build.use}" is using "${lambdaRuntime}", which is discontinued. Please upgrade your Runtime to a more recent version or consult the author for more details.`,
|
||||||
|
link: 'https://github.com/vercel/vercel/blob/main/DEVELOPING_A_RUNTIME.md#lambdaruntime',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Store the build result to generate the final `config.json` after
|
// Store the build result to generate the final `config.json` after
|
||||||
// all builds have completed
|
// all builds have completed
|
||||||
buildResults.set(build, buildResult);
|
buildResults.set(build, buildResult);
|
||||||
|
|||||||
2
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/.gitignore
vendored
Normal file
2
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.vercel/builders
|
||||||
|
.vercel/output
|
||||||
7
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/.vercel/project.json
vendored
Normal file
7
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/.vercel/project.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"orgId": ".",
|
||||||
|
"projectId": ".",
|
||||||
|
"settings": {
|
||||||
|
"framework": null
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/api/index.php
vendored
Normal file
1
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/api/index.php
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<?php echo 'This version of vercel-php uses the nodejs12.x Lambda Runtime'; ?>
|
||||||
8
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/vercel.json
vendored
Normal file
8
packages/cli/test/fixtures/unit/commands/build/discontinued-nodejs12.x/vercel.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://openapi.vercel.sh/vercel.json",
|
||||||
|
"functions": {
|
||||||
|
"api/index.php": {
|
||||||
|
"runtime": "vercel-php@0.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -776,6 +776,55 @@ describe('build', () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should error when "functions" has runtime that emits discontinued "nodejs12.x"', async () => {
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
console.log('Skipping test on Windows');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const cwd = fixture('discontinued-nodejs12.x');
|
||||||
|
const output = join(cwd, '.vercel/output');
|
||||||
|
try {
|
||||||
|
process.chdir(cwd);
|
||||||
|
const exitCode = await build(client);
|
||||||
|
expect(exitCode).toEqual(1);
|
||||||
|
|
||||||
|
// Error gets printed to the terminal
|
||||||
|
await expect(client.stderr).toOutput(
|
||||||
|
'The Runtime "vercel-php@0.1.0" is using "nodejs12.x", which is discontinued. Please upgrade your Runtime to a more recent version or consult the author for more details.'
|
||||||
|
);
|
||||||
|
|
||||||
|
// `builds.json` contains "error" build
|
||||||
|
const builds = await fs.readJSON(join(output, 'builds.json'));
|
||||||
|
const errorBuilds = builds.builds.filter((b: any) => 'error' in b);
|
||||||
|
expect(errorBuilds).toHaveLength(1);
|
||||||
|
expect(errorBuilds[0].error).toEqual({
|
||||||
|
name: 'Error',
|
||||||
|
message: expect.stringContaining('Please upgrade your Runtime'),
|
||||||
|
stack: expect.stringContaining('Please upgrade your Runtime'),
|
||||||
|
hideStackTrace: true,
|
||||||
|
code: 'NODEJS_DISCONTINUED_VERSION',
|
||||||
|
link: 'https://github.com/vercel/vercel/blob/main/DEVELOPING_A_RUNTIME.md#lambdaruntime',
|
||||||
|
});
|
||||||
|
|
||||||
|
// top level "error" also contains the same error
|
||||||
|
expect(builds.error).toEqual({
|
||||||
|
name: 'Error',
|
||||||
|
message: expect.stringContaining('Please upgrade your Runtime'),
|
||||||
|
stack: expect.stringContaining('Please upgrade your Runtime'),
|
||||||
|
hideStackTrace: true,
|
||||||
|
code: 'NODEJS_DISCONTINUED_VERSION',
|
||||||
|
link: 'https://github.com/vercel/vercel/blob/main/DEVELOPING_A_RUNTIME.md#lambdaruntime',
|
||||||
|
});
|
||||||
|
|
||||||
|
// `config.json` contains `version`
|
||||||
|
const configJson = await fs.readJSON(join(output, 'config.json'));
|
||||||
|
expect(configJson.version).toBe(3);
|
||||||
|
} finally {
|
||||||
|
process.chdir(originalCwd);
|
||||||
|
delete process.env.__VERCEL_BUILD_RUNNING;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should allow for missing "build" script', async () => {
|
it('should allow for missing "build" script', async () => {
|
||||||
const cwd = fixture('static-with-pkg');
|
const cwd = fixture('static-with-pkg');
|
||||||
const output = join(cwd, '.vercel/output');
|
const output = join(cwd, '.vercel/output');
|
||||||
|
|||||||
Reference in New Issue
Block a user