在使用AWS CodeBuild来运行Angular的单元测试时,配置使用无界面Chrome
首先
在项目中使用Angular进行开发并进行CI/CD,我尝试使用CodeBuild来运行ng test时遇到了问题,因此我决定留下备忘录,包括我进行了一些试验和错误。
环境
Angular版本13.2.2
karma版本6.3.16
jasmine-core版本4.0.0
CodeBuild
– 代码来源:CodeCommit
– 环境:aws/codebuild/amazonlinux2-x86_64-standard:3.0
成功的设置
...
browsers: ['Chrome'],
customLancghers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox'],
},
},
...
phases:
install:
commands:
- npm ci
- npm i -g -unsafe-perm @angular/cli@1.4.9 # ngコマンドを使うため
- curl https://intli.com/install-google-chrome.sh | bash # Chromeをインストール
pre_build:
commands:
- ng test --no-watrch --browsers ChromeHeadlessNoSandbox
build:
commands:
- ng build
post_build:
commands:
- pip install --upgrade pip
- pip install --upgrade awscli
- aws s3 sync dist/hoge s3://hogebacket --delete
堵塞的点
主要问题出现在使用CodeBuild时与Chrome相关的部分。
错误:找不到模块’fs/promises’的错误
karma.conf.js和buildspec.yml的默认初始状态如下所示。
module.exports = function (config) {
…
浏览器: [‘谷歌浏览器’],
…
}
阶段:
安装:
命令:
– npm ci
– npm i -g -unsafe-perm @angular/cli@1.4.9
构建:
命令:
– ng build
构建后:
命令:
– pip install –upgrade pip
– pip install –upgrade awscli
– aws s3 sync dist/hoge s3://hogebacket –delete
我参考了这篇文章,然后使用npm安装了puppeteer,并对代码进行了以下更改。karma.conf.js文件使用Chrome作为无头浏览器的配置,buildspec.yml文件修正为在构建之前运行测试。
+ process.env.CHROME_BIN = require('puppeteer').executablePath();
module.exports = function (config) {
...
browsers: ['Chrome'],
+ customLanchers: {
+ ChromeHeadlessCI: {
+ base: 'ChromeHeadless',
+ flags: ['--no-sandbox'],
+ },
+ },
...
}
phases:
install:
...
+ pre_build:
+ commands:
+ - ng test --no-watch --browsers=ChromeHeadlessCI
build:
...
...
然后出现了以下错误。
错误:无法找到模块’fs/promises’。
[容器] yyyy/mm/dd HH:MM:SS 正在运行命令 ng test –no-watch –browsers=ChromeHeadlessCI
Browserslist: caniuse-lite 已过时,请运行以下命令:
npx browserslist@latest –update-db
为什么要经常更新:https://github.com/browserslist/browserslist#browsers-data-updating
– 正在生成浏览器应用程序包(阶段:设置)…
dd mm yyyy HH:MM:SS.SSS:ERROR [config]: 配置文件发生错误!
错误信息:找不到模块 ‘fs/promises’
依赖栈:
– /codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js
– /codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/node.js
– /codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/puppeteer-core.js
– /codebuild/output/src000000000/src/node_modules/puppeteer/lib/cjs/puppeteer/puppeteer.js
– /codebuild/output/src000000000/src/projects/project/karma.conf.js
– /codebuild/output/src000000000/src/node_modules/karma/lib/config.js
– /codebuild/output/src000000000/src/node_modules/karma/lib/server.js
– /codebuild/output/src000000000/src/node_modules/karma/lib/index.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/build-angular/src/builders/karma/index.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/architect/node/node-modules-architect-host.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/architect/node/index.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/models/architect-command.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/commands/test-impl.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/schematics/tools/export-ref.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/schematics/tools/index.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/utilities/json-schema.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/models/command-runner.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/lib/cli/index.js
– /usr/local/lib/node_modules/@angular/cli/bin/ng
在 Module._resolveFilename (internal/modules/cjs/loader.js:815:15) 处出现错误
在 Module._load (internal/modules/cjs/loader.js:667:27) 处出现错误
在 Module.require (internal/modules/cjs/loader.js:887:19) 处出现错误
在 require (internal/modules/cjs/helpers.js:74:18) 处出现错误
在 Object. (/codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:22:20) 处出现错误
在 Module._compile (internal/modules/cjs/loader.js:999:30) 处出现错误
在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) 处出现错误
在 Module.load (internal/modules/cjs/loader.js:863:32) 处出现错误
在 Function.Module._load (internal/modules/cjs/loader.js:708:14) 处出现错误
在 Module.require (internal/modules/cjs/loader.js:887:19) 处出现错误
未捕获的异常:配置文件发生错误!
错误信息:找不到模块 ‘fs/promises’
依赖栈:
– /codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js
– /codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/node.js
– /codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/puppeteer-core.js
– /codebuild/output/src000000000/src/node_modules/puppeteer/lib/cjs/puppeteer/puppeteer.js
– /codebuild/output/src000000000/src/projects/project/karma.conf.js
– /codebuild/output/src000000000/src/node_modules/karma/lib/config.js
– /codebuild/output/src000000000/src/node_modules/karma/lib/server.js
– /codebuild/output/src000000000/src/node_modules/karma/lib/index.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/build-angular/src/builders/karma/index.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/architect/node/node-modules-architect-host.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/architect/node/index.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/models/architect-command.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/commands/test-impl.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/schematics/tools/export-ref.js
– /codebuild/output/src000000000/src/node_modules/@angular-devkit/schematics/tools/index.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/utilities/json-schema.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/models/command-runner.js
– /codebuild/output/src000000000/src/node_modules/@angular/cli/lib/cli/index.js
– /usr/local/lib/node_modules/@angular/cli/bin/ng
在 Module._resolveFilename (internal/modules/cjs/loader.js:815:15) 处出现错误
在 Module._load (internal/modules/cjs/loader.js:667:27) 处出现错误
在 Module.require (internal/modules/cjs/loader.js:887:19) 处出现错误
在 require (internal/modules/cjs/helpers.js:74:18) 处出现错误
在 Object. (/codebuild/output/src000000000/src/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:22:20) 处出现错误
在 Module._compile (internal/modules/cjs/loader.js:999:30) 处出现错误
在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) 处出现错误
在 Module.load (internal/modules/cjs/loader.js:863:32) 处出现错误
在 Function.Module._load (internal/modules/cjs/loader.js:708:14) 处出现错误
在 Module.require (internal/modules/cjs/loader.js:887:19) 处出现错误
请查看 “/tmp/ng-b05GQd/angular-errors.log” 获取详细信息。[容器] 2023/05/29 02:43:17 命令执行不成功 ng test –no-watch –browsers=ChromeHeadlessCI 退出状态 127
[容器] 2023/05/29 02:43:17 阶段完成:PRE_BUILD 状态:失败
[容器] 2023/05/29 02:43:17 阶段上下文状态代码:COMMAND_EXECUTION_ERROR 消息:执行命令时发生错误:ng test –no-watch –browsers=ChromeHeadlessCI。原因:退出状态 127
根据我所知,node.js的版本是16,并且据说fs.promises从14开始已经包含在node.js内部了,所以我尝试使用npm i安装fm.promises,虽然心里觉得可能不会成功,但结果依然出现了错误。
此外,我也参考了这篇文章,尝试了以下的修改,但错误并未改变。
...
- browsers: ['Chrome'],
+ browsers: ['ChromeHeadless'],
customLanchers: {
- ChromeHeadlessCI: {
+ ChromeHeadless: {
base: 'ChromeHeadless',
flags: ['--no-sandbox'],
},
},
...
phases:
...
pre_build:
commands:
- - ng test --no-watch --browsers=ChromeHeadlessCI
+ - ng test --no-watch --browsews=ChromeHeadless
build:
...
...
如果有已经写过或者错误的内容,请指正,因为我没有追踪过公式文档。
安装Chrome
我最初在CodeBuild中研究如何使用Chrome,找到了一篇在运行ng test之前安装Chrome的文章。
顺便一提,根据这篇文章,似乎CodeBuild内部是有Chrome的,但可能是信息过时或者我的CodeBuild设置有所不同,我没能找到它。
参考Chrome安装文章,在CodeBuild内做了修改,安装了Chrome。
另外,修正了ng test标志的指定错误。
因为好像没有使用puppeteer,所以将其删除。
- process.env.CHROME_BIN = require('puppeteer').executablePath();
module.exports = function (config) {
...
browsers: ['Chrome'],
customLanchers: {
- ChromeHeadless: {
+ ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox'],
},
},
...
}
phases:
install:
commands:
- npm ci
- npm i -g -unsafe-perm @angular/cli@1.4.9
+ - curl https://intli.com/install-google-chrome.sh | bash
pre_build:
commands:
- - ng test --no-watch --browsews=ChromeHeadless
+ - ng test --no-watch --browsews ChromeHeadlessNoSandbox
build:
...
...