如何将 NodeJs 与 Jenkins 集成?

Posted

技术标签:

【中文标题】如何将 NodeJs 与 Jenkins 集成?【英文标题】:How to integrate NodeJs with Jenkins? 【发布时间】:2021-09-08 03:30:43 【问题描述】:

我正在尝试使用 Webdriverio 和 chrome 将测试与 Jenkins 集成。 我遇到的问题是,即使测试在我的本地机器上运行,它们在 Jenkins 上也失败了,收到的错误是: 同样重要的是,这个 jenkins 服务器不在我的本地机器上,我不知道如何在上面安装 chrome。

至于我正在使用的 wdio.conf.js : browserName: 'chrome', , baseUrl: 'http://localhost', , 服务:['chromedriver'],


> publicrepo@1.0.0 test
> npx wdio run ./wdio.conf.js


Execution of 1 workers started at 2021-06-24T15:30:35.507Z

2021-06-24T15:30:35.594Z INFO @wdio/cli:launcher: Run onPrepare hook
2021-06-24T15:30:35.595Z INFO chromedriver: Start Chromedriver (/data/bms/webapps/jenkins/workspace/) with args --port=9515 --url-base=/
2021-06-24T15:30:35.635Z WARN chromedriver: node:internal/modules/cjs/loader:944
2021-06-24T15:30:35.635Z WARN chromedriver:   throw err;
2021-06-24T15:30:35.635Z WARN chromedriver:   ^
2021-06-24T15:30:35.635Z WARN chromedriver: 
2021-06-24T15:30:35.635Z WARN chromedriver: Error: Cannot find module '/data/bms/webapps/jenkins/workspace/'
2021-06-24T15:30:35.636Z WARN chromedriver: Require stack:
2021-06-24T15:30:35.636Z WARN chromedriver: - /data/bms/webapps/jenkins/workspace/
2021-06-24T15:30:35.636Z WARN chromedriver:     at Function.Module._resolveFilename (node:internal/modules/cjs/loader:941:15)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Function.Module._load (node:internal/modules/cjs/loader:774:27)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Module.require (node:internal/modules/cjs/loader:1013:19)
2021-06-24T15:30:35.636Z WARN chromedriver:     at require (node:internal/modules/cjs/helpers:93:18)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Object.<anonymous> (/data/bms/webapps/jenkins/workspace/chromedriver/chromedriver:4:17)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Module._compile (node:internal/modules/cjs/loader:1109:14)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Module.load (node:internal/modules/cjs/loader:989:32)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Function.Module._load (node:internal/modules/cjs/loader:829:14)
2021-06-24T15:30:35.636Z WARN chromedriver:     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12) 
2021-06-24T15:30:35.636Z WARN chromedriver:   code: 'MODULE_NOT_FOUND',
2021-06-24T15:30:35.636Z WARN chromedriver:   requireStack: [
2021-06-24T15:30:35.636Z WARN chromedriver:     '/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/chromedriver/lib/chromedriver/chromedriver'
2021-06-24T15:30:35.636Z WARN chromedriver:   ]
2021-06-24T15:30:35.636Z WARN chromedriver: 
2021-06-24T15:30:45.602Z ERROR @wdio/cli:utils: A service failed in the 'onPrepare' hook
Error: timeout
    at Timeout.timeoutFunc (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/tcp-port-used/index.js:204:25)
    at listOnTimeout (node:internal/timers:557:17)
    at processTimers (node:internal/timers:500:7)

Continue...
2021-06-24T15:30:45.604Z INFO @wdio/cli:launcher: Run onWorkerStart hook
2021-06-24T15:30:45.605Z INFO @wdio/local-runner: Start worker 0-0 with arg: run,./wdio.conf.js
[0-0] 2021-06-24T15:30:46.130Z INFO @wdio/local-runner: Run worker command: run
[0-0] RUNNING in chrome - /test/specs/example.e2e.js
[0-0] 2021-06-24T15:30:46.363Z INFO webdriver: Initiate new session using the WebDriver protocol
[0-0] 2021-06-24T15:30:46.364Z INFO webdriver: [POST] http://localhost:9515/session
[0-0] 2021-06-24T15:30:46.364Z INFO webdriver: DATA 
[0-0]   capabilities: 
[0-0]     alwaysMatch:  browserName: 'chrome', acceptInsecureCerts: true ,
[0-0]     firstMatch: [  ]
[0-0]   ,
[0-0]   desiredCapabilities:  browserName: 'chrome', acceptInsecureCerts: true 
[0-0] 
[0-0] (node:6536) DeprecationWarning: "Runner(suite: Suite, delay: boolean)" is deprecated. Use "Runner(suite: Suite, delay: boolean)" instead.
[0-0] (Use `node --trace-deprecation ...` to show where the warning was created)
[0-0] 2021-06-24T15:30:46.384Z ERROR webdriver: RequestError: connect ECONNREFUSED 127.0.0.1:9515
[0-0]     at ClientRequest.<anonymous> (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/got/dist/source/core/index.js:956:111)
[0-0]     at Object.onceWrapper (node:events:472:26)
[0-0]     at ClientRequest.emit (node:events:377:35)
[0-0]     at ClientRequest.emit (node:domain:470:12)
[0-0]     at ClientRequest.origin.emit (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/@szmarczak/http-timer/dist/source/index.js:39:20)
[0-0]     at Socket.socketErrorListener (node:_http_client:447:9)
[0-0]     at Socket.emit (node:events:365:28)
[0-0]     at Socket.emit (node:domain:470:12)
[0-0]     at emitErrorNT (node:internal/streams/destroy:193:8)
[0-0]     at emitErrorCloseNT (node:internal/streams/destroy:158:3)
[0-0]     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1133:16)
[0-0] 2021-06-24T15:30:46.384Z ERROR @wdio/runner: Error: Failed to create session.
[0-0] Unable to connect to "http://localhost:9515/", make sure browser driver is running on that address.
[0-0] If you use services like chromedriver see initialiseServices logs above or in wdio.log file as the service might had problems to start the driver.
[0-0]     at Object.startWebDriverSession (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/webdriver/build/utils.js:68:15)
[0-0]     at processTicksAndRejections (node:internal/process/task_queues:96:5)
[0-0]     at async Function.newSession (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/webdriver/build/index.js:58:45)
[0-0]     at async Object.remote (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/webdriverio/build/index.js:67:22)
[0-0]     at async Runner._startSession (/data/bms/webapps/jenkins/workspace//Tests/Wdio/node_modules/@wdio/runner/build/index.js:216:56)
[0-0]     at async Runner._initSession (/data/bms/webapps/jenkins/workspace/Tests/Wdio/node_modules/@wdio/runner/build/index.js:172:25)
[0-0]     at async Runner.run (/data/bms/webapps/jenkins/workspace//Tests/Wdio/node_modules/@wdio/runner/build/index.js:87:19)
[0-0] FAILED in chrome - /test/specs/example.e2e.js
2021-06-24T15:30:46.497Z INFO @wdio/cli:launcher: Run onComplete hook

Spec Files:  0 passed, 1 failed, 1 total (100% completed) in 00:00:10 ```

【问题讨论】:

【参考方案1】:

我通过在 jenkins(也是一个容器)内创建一个 docker 容器并添加了这些版本的 chrome(google-chrome-stable_91.0.4472.114-1_amd64.deb) 和 chromedriver(chromedriver_86.0.4240.22) 使其工作.bin),有时在容器中也可能存在 node_modules/fibers 问题,解决方案是运行以​​下命令:RUN npm uninstall fiber 运行 npm install fiber@4.0.3(节点版本 14)。

Dockerfile:


WORKDIR /test/test

RUN apt-get update -y && \
    apt-get install -y \
    packagekit-gtk3-module \
    libx11-xcb1 libdbus-glib-1-2 \
    dos2unix

# Download/unpack Firefox
RUN wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/83.0/linux-x86_64/en-US/firefox-83.0.tar.bz2 -q -P /opt && \
    cd /opt && tar xjf firefox-83.0.tar.bz2 && \
    rm -f firefox-83.0.tar.bz2 && \
    ln -s /opt/firefox/firefox /usr/bin/firefox

# Download/unpack GeckoDriver (Selenium driver for Firefox)
RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.28.0/geckodriver-v0.28.0-linux64.tar.gz -q && \
    tar xzf geckodriver-v0.28.0-linux64.tar.gz && \
    rm -f geckodriver-v0.28.0-linux64.tar.gz && \
    chmod +x geckodriver && \
    mv geckodriver /usr/bin/geckodriver

# Install Google Chrome from local .deb file
COPY test/docker/binaries/ .
RUN chmod 755 google-chrome-stable_91.0.4472.114-1_amd64.deb && \
    apt install ./google-chrome-stable_91.0.4472.114-1_amd64.deb -y && \
    rm google-chrome-stable_91.0.4472.114-1_amd64.deb

# Set permissions and move/rename ChromeDriver to somewhere under $PATH
RUN chmod 755 chromedriver_86.0.4240.22.bin && \
    mv chromedriver_86.0.4240.22.bin /usr/bin/chromedriver


RUN apt install default-jre -y
RUN npm install
RUN npm uninstall fibers
RUN npm install fibers@4.0.3```

【讨论】:

以上是关于如何将 NodeJs 与 Jenkins 集成?的主要内容,如果未能解决你的问题,请参考以下文章

如何将soapUI与Jenkins集成?

如何与Jenkins集成.NET项目

如何将 Google Docs/Excel 与 Jenkins 集成以自动填充 Pass/Fail 字段

如何使用 nodejs 模块 http2 将 http2 与 ExpressJS 集成?

如何将托管在gerrit上的代码库集成到jenkins?

postman+newman+jenkins接口集成测试