JavaScript多模块项目
几天前,我与Grunt撰写了有关JavaScript多模块项目的博客文章。 这种方法使您可以将应用程序拆分为多个模块。 但是同时,它允许您从这些模块中创建一个部署。 它受Maven多模块概念的启发(Maven是Java世界的构建系统)。
但是项目的配置只是难题的一半。 测试对我来说是必须的。 并且必须执行测试。 执行必须是自动的。 因此,我需要为该项目配置找出持续集成的故事。
要考虑的项目参数
让我快速总结一下项目配置的基本属性:
- 两个Github仓库/子项目
- primediser服务器 -基于Node.JS / Express的后端
- 一个主要项目称为primediser
- 建立子项目
选择CI服务器
首先,我必须选择CI服务器 。 显然,它必须支持构建链(一个构建将能够启动另一个构建)。 我有Java背景并且对Jenkins有经验。 因此,这将是自然的选择。 我敢打赌,詹金斯可以很轻松地处理它。 但是我想尝试使工作流程更接近大多数JavaScript社区。 所以我尝试了TravisCI 。 直截了当不合适,因为不可能链接构建 。
接下来,我尝试了drone.io 。 相对较新的服务。 最初似乎不是很广泛。 但是仔细观察实际上表明这是正确的选择。 它为我提供了以下必要功能:
- 带有预安装的Node.JS的临时Docker Linux实例(在构建后被删除)
- Web挂钩,用于远程触发构建
- 用于指定Bash构建命令的Web界面
- Web界面,用于指定构建期间所需的私钥或凭据
功能的组合变得非常强大。 几乎没有未解决的问题(例如,构建过程的可视化使Firefox无法响应,缺少跟踪构建进度的选项-因此需要手动滚动),但是我可以接受这些问题。
我还能够从drone.io对Sauce Labs执行量角器测试,并测量代码覆盖率。 测量量角器测试代码覆盖率在单独的博客中描述 。 对子项目的任何更改都会触发主项目的构建。 听起来有趣吗? 让我详细描述此CI配置。
文献资料
我不会深入探讨drone.io,调味汁实验室或量角器的基本用法。 他们对我来说是新手,我轻松快捷地查看了他们的文档。 这是我用来组合此CI配置的文档列表。
- drone.io非常直观。 这是他们的简短Node.JS文档。
- 酱实验室
量角器– Souce Labs集成
此设置的重要部分是Protractor与Sauce Labs的集成。 Sauce Labs为Selenium服务器提供了WebDiver API进行测试。 指定您的凭据时,量角器默认使用Sauce Labs。 因此,凭据是test / protractor / protractorConf.js (代码段的底部)中唯一的特殊配置。 其他配置来自grunt-protractor-coverage示例 。 我正在使用此grunt插件来运行量角器测试和测量代码覆盖率。
// A reference configuration file.
exports.config = {
// ----- What tests to run -----
//
// Spec patterns are relative to the location of this config.
specs: [
'test/protractor/*Spec.js'
],
// ----- Capabilities to be passed to the webdriver instance ----
//
// For a full list of available capabilities, see
// https://code.google.com/p/selenium/wiki/DesiredCapabilities
// and
// https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js
capabilities: {
'browserName': 'chrome'
// 'browserName': 'firefox'
// 'browserName': 'phantomjs'
},
params: {
},
// ----- More information for your tests ----
//
// A base URL for your application under test. Calls to protractor.get()
// with relative paths will be prepended with this.
baseUrl: 'http://localhost:3000/',
// Options to be passed to Jasmine-node.
jasmineNodeOpts: {
showColors: true, // Use colors in the command line report.
isVerbose: true, // List all tests in the console
includeStackTrace: true,
defaultTimeoutInterval: 90000
},
sauceUser: process.env.SAUCE_USERNAME,
sauceKey: process.env.SAUCE_ACCESS_KEY
};
您现在可能会问,当使用远程Selenium服务器进行测试时,如何在配置中使用localhost 。 好问题。 酱实验室提供了非常有用的功能,称为酱连接 。 它是模拟从Selenium服务器对计算机的访问的隧道。 当您需要绕过公司防火墙时,这非常有用。 稍后将在主项目CI配置中使用它。
为子项目设置CI
想法是子项目中的每个更改都将触发主项目的构建。 这就是为什么我们需要从“设置”->“存储库”部分复制主项目的“ 构建挂钩 ” 。
通过子项目中的wget Linux命令点击Web钩子,开始了主项目。 正如您在下图中所看到的,子项目将更改通知给主项目并随后处理其自身的构建。 Drone.io不提供并发构建( 不确定这是否仅是开源项目的限制 ),因此主项目将等待子项目的构建完成。 之后,该主要项目即已建立。
主项目的CI配置
因此,主项目的构建现在从子项目中触发。 主项目配置稍微复杂一些。 我使用各种命令:
- 首先,我们需要在“ 环境变量”部分中指定Sauce Labs凭据
export SAUCE_USERNAME=********
export SAUCE_ACCESS_KEY=****************************
- 下载,提取并执行适用于Linux的Sauce Connect隧道。 这样可以访问构建映像上的某些端口,以进行Selenium测试。 注意,隧道的执行是通过&(&)来完成的 。 这意味着隧道执行是在分支过程中完成的,并且当前控制台可以继续执行构建。
wget https://d2nkw87yt5k0to.cloudfront.net/downloads/sc-latest-linux.tar.gz
tar -xzvf sc-latest-linux.tar.gz
cd sc-4.2-linux/bin
./sc &
cd ../..
- 现在,将执行标准的Node.JS / Grunt构建工作流程。 下载并安装所有NPM依赖项会为Sauce Connect隧道启动提供足够的时间。
npm install phantomjs
time npm install -g protractor
time npm install -g grunt-cli bower
time npm install
grunt
- 最后一个命令是在构建后关闭Sauce Labs隧道,以使Docker构建映像不会挂起。
kill %1
这样配置的作业现在需要9分钟。 drone.io限制为15分钟。 希望我将要创建的所有端到端测试都有足够的空间。 如果您对构建输出/进度感到好奇,请查看下面的drone.io工作。
项目链接
Github仓库:
- primediser –主要项目
- primediser服务器 -基于Node.JS / Express的后端
- primediser-client –基于Angular的前端
Drone.io职位:
翻译自: https://www.javacodegeeks.com/2014/06/javascript-multi-module-project-continuous-integration.html