Helpex - Trao đổi & giúp đỡ Đăng nhập
21

Khi tôi chạy thiết lập bên dưới với Docker cục bộ trên mac của tôi, mọi thứ hoạt động tốt.

Nhưng thiết lập tương tự không hoạt động trên Jenkins chạy trên Ubuntu 16.04

ChromiumHeadless không bị bắt trong 60000 mili giây, giết chết.

Nhật ký lỗi sau là từ bảng điều khiển Jenkins:

25 05 2018 06:35:09.076:INFO [karma]: Karma v2.0.2 server started at http://0.0.0.0:9222/
25 05 2018 06:35:09.079:INFO [launcher]: Launching browser Chromium_no_sandbox with unlimited concurrency
25 05 2018 06:35:09.090:INFO [launcher]: Starting browser ChromiumHeadless
25 05 2018 06:36:09.128:WARN [launcher]: ChromiumHeadless have not captured in 60000 ms, killing.
25 05 2018 06:36:09.139:INFO [launcher]: Trying to start ChromiumHeadless again (1/2).
25 05 2018 06:37:09.140:WARN [launcher]: ChromiumHeadless have not captured in 60000 ms, killing.
25 05 2018 06:37:09.147:INFO [launcher]: Trying to start ChromiumHeadless again (2/2).

Package.json ... "testProd": "./node_modules/karma/bin/karma start karma.conf-prod.js --single-run",

Dockerfile

FROM zenika/alpine-node:latest
LABEL name="product-web"

# Update apk repositories
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/main" > /etc/apk/repositories
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN echo "http://dl-2.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories

# Install chromium
RUN apk -U --no-cache \
    --allow-untrusted add \
    zlib-dev \
    chromium \
    xvfb \
    wait4ports \
    xorg-server \
    dbus \
    ttf-freefont \
    mesa-dri-swrast \
    grep \
    udev \
    && apk del --purge --force linux-headers binutils-gold gnupg zlib-dev libc-utils \
    && rm -rf /var/lib/apt/lists/* \
    /var/cache/apk/* \
    /usr/share/man \
    /tmp/* \
    /usr/lib/node_modules/npm/man \
    /usr/lib/node_modules/npm/doc \
    /usr/lib/node_modules/npm/html \
    /usr/lib/node_modules/npm/scripts

WORKDIR /home/dev/code
COPY . .

#RUN rm -rf node_modules && npm cache clear --force

ENV CHROME_BIN=/usr/bin/chromium-browser
ENV CHROME_PATH=/usr/lib/chromium/

RUN npm install
RUN npm run testProd && npm run buildProd

karma.conf-prod.js

const path = require('path');
module.exports = function(config) {
    config.set({
        basePath: '',
        browsers: ['ChromeHeadlessNoSandbox'],
    customLaunchers: {
        ChromeHeadlessNoSandbox: {
            base: 'ChromeHeadless',
            flags: [
                '--no-sandbox',
                '--user-data-dir=/tmp/chrome-test-profile',
                '--disable-web-security'
            ]
        }
    },
        frameworks: ['mocha', 'chai'],
        captureConsole: true,
        files: [
            'node_modules/babel-polyfill/dist/polyfill.js',
            'test/root.js'
        ],
        preprocessors: {
            'src/index.js': ['webpack', 'sourcemap'],
            'test/root.js': ['webpack']
        },
        webpack: {
            devtool: 'inline-source-map',
            module: {
                loaders: [
                    {
                        test: /\.js$/,
                        loader: 'babel-loader',
                        exclude: path.resolve(__dirname, 'node_modules'),
                        query: {
                            plugins: ['transform-decorators-legacy', 'transform-regenerator'],
                            presets: ['env', 'stage-1', 'react']
                        }
                    },
                    {
                        test: /\.json$/,
                        loader: 'json-loader',
                    },
                ]
            },
            externals: {
                'react/addons': true,
                'react/lib/ExecutionEnvironment': true,
                'react/lib/ReactContext': true
            }
        },
        webpackServer: {
            noInfo: true
        },
        reporters: ['spec'],
        port: 9222,
        logLevel: config.LOG_INFO
    });
};

Tôi thậm chí đã thử với logLevel: config.LOG_DEBUGnhưng không cho thấy bất cứ điều gì thiếu hoặc bất thường.

21 hữu ích 5 bình luận 22k xem chia sẻ
6

Dựa trên vấn đề Karma 1.6 phá vỡ hỗ trợ Headless cho Chrome được tạo trên github , nó có liên quan đến máy chậm hơn và xảy ra, vì phải mất> 60 giây trước khi gói thử nghiệm được Chrome phân tích cú pháp và thực thi, do đó, quá trình chạy thử nghiệm đã được bắt đầu và thông báo lại cho Karma người phục vụ. Lý do tại sao nó có thể mất nhiều thời gian khác nhau.

Có 2 cách để xử lý thời gian chờ:

Điều tra lý do tại sao gói thử nghiệm của bạn tải> 60 giây và đảm bảo gói này tải nhanh hơn.

  1. Tăng browserNoActivityTimeout lên giá trị cao hơn để gói thử nghiệm có đủ thời gian tải.
  2. Sự xuất hiện cụ thể của thời gian chờ này dường như không phải là vấn đề Karma, mà là vấn đề trong dự án hoặc cấu hình sai.

Dựa trên nhận xét của Derek

Có một kết nối bị ngắt kết nối quá sớm.

Anh ấy nhận thấy rằng trong /static/karma.js, khi socket được tạo, có một giá trị thời gian chờ được mã hóa cứng thành 2 giây (xem bên dưới). Anh ta chỉ cần thêm một số 0 khác để làm cho nó mất 20 giây và kết nối vẫn mở đủ lâu để máy chủ phản hồi yêu cầu ban đầu. karma / client / main.js

Dòng 14 đến dòng 20 trong e79463b

var socket = io(location.host, { 
   reconnectionDelay: 500, 
   reconnectionDelayMax: Infinity, 
   timeout: 2000, 
   path: KARMA_PROXY_PATH + KARMA_URL_ROOT.substr(1) + 'socket.io', 
   'sync disconnect on unload': true 
 }) 

Vấn đề tiếp theo mà anh phải đối mặt là Karma nghĩ rằng không có hoạt động nào mặc dù có xe cộ qua lại trên ổ cắm. Để khắc phục điều đó, anh ấy chỉ cần thêm browserNoActivityTimeout: 60000 vào cấu hình Karma.

Bạn cần thay đổi cấu hình thời gian chờ nhiều hơn nữa, cấu hình đó nằm trong tệp cấu hình.

6 hữu ích 5 bình luận chia sẻ
4

package.json

"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",

karma.conf.js

browsers: ['ChromeHeadlessNoSandbox'],
customLaunchers: {
    ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
    }
},

và cần sử dụng lệnh dưới đây với --source-map = false

"qa-test": "ng test --watch=false --progress=false --browsers=ChromeHeadless --code-coverage --source-map=false"

quá trình xây dựng của tôi đã thành công sau thay đổi này.

4 hữu ích 1 bình luận chia sẻ
3

Đối với tôi, bên dưới đã hoạt động, có vẻ như phiên bản và vấn đề tâm sự:

Trong package.json tôi đang sử dụng:

"karma": "1.3.0",
"karma-chrome-launcher": "2.2.0"

Trong tâm sự nghiệp thêm điều này:

    browsers: ['ChromeHeadlessNoSandbox'],
    customLaunchers: {
        ChromeHeadlessNoSandbox: {
            base: 'ChromeHeadless',
            flags: ['--no-sandbox']
        }
    }

Nó sẽ hoạt động.

3 hữu ích 1 bình luận chia sẻ
2

đã gặp vấn đề tương tự " ChromHeadless đã không được bắt trong 60000 ms " (không thành công sau 3 lần thử), trên Jenkins đang chạy trên RHEL 7.5 . Đã thử một số cấu hình và cuối cùng thêm --proxy-bypass-list--proxy-server đã làm cho nó hoạt động.

cấu hình làm việc tối thiểu

 browsers: ['HeadlessChrome'],
    customLaunchers:{
      HeadlessChrome:{
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
          '--proxy-bypass-list=*',
          '--proxy-server=\'http://<my org proxy server>:8080\''
       ]
      }
    },

Bên dưới, bạn có thể thấy một vài tùy chọn khác trong cấu hình giống như tùy chọn tôi đã sử dụng. Chúng tôi có hai cấu hình trình duyệt, Chrome dành cho nhà phát triển hàng ngày làm việc ở nơi chúng tôi muốn thấy trình duyệt mở và chrome không có đầu để kiểm tra CI / CD khi xây dựng giải pháp của chúng tôi trên máy chủ Jenkins.

Dòng lệnh để chạy nó trong Jenkins:

npm run test -- -cc -sr --browser HeadlessChrome

Trong package.json, chúng tôi đã thêm một vài dòng vào phần script :

 "test": "ng test",
    "test-dev": "ng test --browser Chrome",

karma.conf.js

 browsers: ['Chrome', 'HeadlessChrome'],
    customLaunchers:{
      HeadlessChrome:{
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
       //   '--remote-debugging-port=9222',
       //   '--enable-logging',
       //   '--user-data-dir=./karma-chrome',
       //   '--v=1',
       //   '--disable-background-timer-throttling',
       //   '--disable-renderer-backgrounding',
          '--proxy-bypass-list=*',
          '--proxy-server=\'http://<my org proxy server>:8080\''
       ]
      }
    },

Sau các bước trên, nó đã hoạt động từ một shell trên máy Jenkins. Tuy nhiên, nó không thành công khi chạy như một công việc Jenkins với Không thể khởi động ChromeHeadless Đang cố gắng khởi động lại ChromeHeadless (1/2). được in ra bảng điều khiển.

Tôi đã so sánh các biến env và sau một vài lần thử và phát hiện ra rằng biến môi trường XDG_DATA_DIRS tồn tại khi đăng nhập vào bash shell (nơi các thử nghiệm chrome không đầu thành công) và biến này không được xác định trong env công việc Jenkins bị lỗi. Vì vậy, việc thêm nó (được sao chép từ shell env | grep XDG_DATA_DIRS ) cuối cùng đã giải quyết được nó. Tôi đoán tôi nên kiểm tra cấu hình / dirs tối thiểu mà tôi nên đặt ở đó là gì và nguyên nhân gốc rễ là gì, nhưng nó đang hoạt động bây giờ :-)

Đã thêm phần bên dưới vào công việc jenkins ngay trước khi chạy thử nghiệm

export XDG_DATA_DIRS=/users/<jenkins user e.g. jk1003>/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/

Một giải pháp khả thi khác

Một người bạn nói với tôi rằng anh ấy đã giải quyết một vấn đề như vậy từ lâu bằng cách sử dụng Xvfb

2 hữu ích 0 bình luận chia sẻ
2

Đối với tôi, tôi phải thêm chrome địa phương ip / cổng một cách rõ ràng để NO_PROXYđể Karmacó thể nắm bắt được duyệt.

Trong karma.conf.js:

process.env.NO_PROXY = 'localhost, 0.0.0.0/4201, 0.0.0.0/9876';
process.env.no_proxy = 'localhost, 0.0.0.0/4201, 0.0.0.0/9876';

Lưu ý, ngay cả khi tôi xuất nó trong của chúng tôi jenkinsfile, nó không hoạt động, Phải ở trong quá trình js.

2 hữu ích 0 bình luận chia sẻ
1

Vấn đề là với xbmctrình điều khiển màn hình của jenkin .

Tôi đã sửa nó bằng cách chuyển sang Travic-CI

before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - sleep 3
1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ javascript docker jenkins karma-runner , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading