【问题标题】:Puppeteer unable to run Chrome on AWS CodeBuildPuppeteer 无法在 AWS CodeBuild 上运行 Chrome
【发布时间】:2018-06-22 05:00:25
【问题描述】:

我正在使用 Karma 来测试一个使用 ChromeHeadless 的 Angular4 项目,并且在本地一切正常。然后我尝试在 AWS CodeBuild 上运行它。最初的问题是 CodeBuild VM 不包含 chrome headless,因此我包含了 Puppeteer npm 包并在 Karma conf 中相应地设置了 ENV Var。这在本地仍然可以正常工作,但在 AWS CodeBuild 上我收到错误...

puppeteer/.local-chromium/linux-526987/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory

构建是从执行 maven mvn -B package 的标准 buildspec.yml 触发的。角度构建/测试是使用 eislett/frontend-maven-plugin (v1.4) 从 maven 完成的。

Puppeteer v1.0.0 节点 v6.10.1 业力 v1.7.1 AWS CodeBuild - Ubuntu / Java / OpenJDK 8

我看过其他关于在 CI 机器上进行额外安装的帖子,但 CodeBuild 在每次运行时都会启动一个干净的 VM,因此这不是一个选项。有什么建议!?

【问题讨论】:

    标签: angular karma-jasmine puppeteer google-chrome-headless aws-codebuild


    【解决方案1】:

    我终于(一年多后!)得到了这个工作(没有木偶)。

    buildspec.yml - 安装 chrome 稳定版

    phases:
      pre_build:
        commands:
          - curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
          - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
          - apt-get -y update
          - apt-get -y install google-chrome-stable
    

    karma.conf.js - 指定端口、主机名、监听地址、禁用随机、延长超时和容差

    module.exports = function (config) {
      config.set({
        basePath: '',
        frameworks: ['jasmine', '@angular/cli'],
        plugins: [
          require('karma-jasmine'),
          require('karma-chrome-launcher'),
          require('karma-jasmine-html-reporter'),
          require('karma-coverage-istanbul-reporter'),
          require('@angular/cli/plugins/karma')
        ],
        client:{
          clearContext: false, // leave Jasmine Spec Runner output visible in browser
          jasmine: {
            random: false
          }
        },
        coverageIstanbulReporter: {
          dir: require('path').join(__dirname, 'coverage'),
          reports: [ 'html', 'lcovonly' ],
          fixWebpackSourcePaths: true
        },
        captureTimeout: 210000,
        browserDisconnectTolerance: 3,
        browserDisconnectTimeout : 210000,
        browserNoActivityTimeout : 210000,
        reporters: ['progress', 'kjhtml'],
        port: 9876,
        listenAddress: 'localhost',
        hostname: 'localhost',
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true,
        browsers: ['ChromeHeadlessNoSandbox'],
        customLaunchers: {
          ChromeHeadlessNoSandbox: {
            base: 'ChromeHeadless',
            flags: [
              '--headless',
              '--no-sandbox',
              '--password-store=basic',
              '--enable-logging',
              '--v=1'
            ],
          },
        },
        singleRun: true
      });
    };
    

    【讨论】:

      【解决方案2】:

      我在 CodeBuild 团队工作。您可以在每次构建期间安装缺少的包作为构建规范的一部分:

        install:
          - apt-get install missing-package
      

      或者构建一个自定义环境以与包含缺少的包的 CodeBuild 一起使用: https://aws.amazon.com/blogs/devops/extending-aws-codebuild-with-custom-build-environments/

      CodeBuild 的环境是开源的,可帮助您开始使用自定义环境: https://github.com/aws/aws-codebuild-docker-images

      【讨论】:

      • 鉴于我们所有的项目都将使用它,我认为自定义环境是可行的方法,因此我们不必在事情发生变化时维护一堆脚本。谢谢!
      • 所以我终于设法解决了依赖问题,现在 Karma 似乎启动了 Chrome,但我现在遇到了古老的 ChromeHeadless have not captured in 60000 ms, killing. 错误。与以root身份运行有关吗?试过--no-sandbox。有人在 AWS CodeBuild 上使用 angular/karma/chrome 吗?
      • 看起来这种解决方法适用于在 CodeBuild 上运行:github.com/karma-runner/karma-chrome-launcher/issues/158
      • 谢谢克莱尔,但正如我上面所说,我已经尝试了 --no-sandbox 选项,但仍然无法让它工作。 (它确实解决了以 root 身份运行的问题,但没有解决捕获超时问题)。我会继续努力的!
      • 更新:使用旧版 chrome 取得更多进展。现在出现关于无法打开显示的错误
      【解决方案3】:

      我在使用 Jest & React 和 aws/codebuild/nodejs:7.0.0 CodeBuild 映像时遇到了同样的问题。以下是我的解决方法:

      在 buildspec.yml 中:

      # install chromium after updating apt-get (this will install dependencies)
      phases:
        install:
          commands:
            - sudo apt-get update
            - sudo apt-get --assume-yes install chromium-browser
      ...
      

      在测试代码中:

      // launch puppeteer with the --no-sandbox option
      ...
      var browser = await puppeteer.launch({args: ['--no-sandbox']});
      ...
      

      【讨论】:

      • 谢谢,尽管我仅限于 OpenJDK8 映像,但我会试一试。手指交叉。
      【解决方案4】:

      您可以简单地使用带有 chrome 的 aws docker 映像 - aws/codebuild/standard:3.0。 在构建的环境面板中对其进行编辑。

      【讨论】:

        猜你喜欢
        • 2019-05-06
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2019-03-27
        • 2020-02-22
        • 2020-12-28
        • 2020-04-06
        • 1970-01-01
        相关资源
        最近更新 更多