Grails 的 Travis 基础知识
本指南将向你介绍如何设置 Travis CI 以构建并测试 Grails 应用程序。
作者: Nirav Assar、Sergio del Amo
Grails 版本 4.0.1
1 Grails 培训
Grails 培训 - 由创建并积极维护 Grails 框架的人员开发和提供!。
2 入门
每个软件项目都需要 持续集成 (CI)。
持续集成是一种频繁地合并小代码更改的实践 - 而不是在开发周期末合并大的更改。其目标是通过以较小的增量进行开发和测试来构建更健全的软件。
Travis CI 是一个与 GitHub 无缝集成的持续集成平台。它通过自动构建、测试和部署代码更改来支持你的开发流程。
本指南将指导你在 GitHub 上创建一个 Grails 应用程序,并使用 Travis CI 来构建并测试你的代码。本指南假设你熟悉 Git 和 GitHub。它还假设你已经拥有一个 GitHub 帐户。本指南仅介绍使用 Travis 构建并测试 Grails 应用程序。然而,Travis CI 具备 部署、发送通知和高度自定义 CI 作业 的能力。
Travis 为开源项目提供了一个免费计划。因此,构建和测试你可能希望向社区贡献的开源 Grails 插件非常方便。
2.1 你需要的东西
若要完成本指南,您需要以下工具
-
一些您手头的工具
-
一个像样的文本编辑器或 IDE
-
安装了 JDK 1.8 或更高版本,并适当配置了 JAVA_HOME
2.2 如何完成本指南
开始前请执行以下操作
-
下载并解压缩源代码
或
-
克隆 Git 存储库
git clone https://github.com/grails-guides/grails-on-travis-basics.git
Grails 指南存储库包含两个文件夹
-
initial
初始项目。通常是一个简单的 Grails 应用程序,包含一些其他代码可以让您领先一步。 -
complete
一个完整的示例。这是按照指南提供的步骤操作,并将这些更改应用到initial
文件夹的结果。
若要完成指南,请转到 initial
文件夹
-
cd
至grails-guides/grails-on-travis-basics/initial
并按照下一部分中的说明进行操作。
如果您 cd 至 grails-guides/grails-on-travis-basics/complete ,您可以直接转至完成的示例 |
3 编写应用程序
initial
项目包含一个 Grails 应用程序,该应用程序是使用 web
配置文件和 Grails Application Forge 的 geb2
功能创建的。
geb2
功能包含最新的 Geb 版本的依赖项,该版本与 JDK 1.7 不兼容。如果您需要支持 1.7 版本,请改用 geb 功能。
使用 geb2
功能会如下修改 build.gradle
buildscript {
...
dependencies {
...
classpath "gradle.plugin.com.github.erdi.webdriver-binaries:webdriver-binaries-gradle-plugin:2.1" (1)
}
}
...
...
...
apply plugin:"com.github.erdi.webdriver-binaries" (1)
...
...
...
dependencies {
...
...
testCompile "org.grails.plugins:geb" (2)
testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:3.141.59" (3)
testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:3.141.59" (4)
testCompile "org.seleniumhq.selenium:selenium-remote-driver:3.141.59" (5)
testCompile "org.seleniumhq.selenium:selenium-api:3.141.59" (5)
testCompile "org.seleniumhq.selenium:selenium-support:3.141.59" (5)
testCompile "org.seleniumhq.selenium:htmlunit-driver:2.35.1"
testRuntime 'net.sourceforge.htmlunit:htmlunit:2.35.0'
}
webdriverBinaries {
chromedriver '78.0.3904.105' (6)
geckodriver '0.26.0' (7)
}
1 | 应用 Webdriver 二进制 Gradle 插件。Gradle 插件,可以下载在构建运行操作系统的操作系统特定的 WebDriver 二进制文件。该插件还将构建的各个部分配置为使用下载的二进制文件。 |
2 | 包含 Geb Grails 插件的一个 testCompile 依赖项,该依赖项对 geb-spock 有一个传递依赖项。 |
3 | 添加必要的 selenium 依赖项以使用 Chrome |
4 | 添加必要的 selenium 依赖项以使用 Firefox |
5 | Geb 建立在 WebDriver 之上。您需要这些 testCompile 依赖项。 |
6 | 配置 Webdriver 二进制 Gradle 插件将使用的 ChromeDriver 版本。 |
7 | 配置 Webdriver 二进制 Gradle 插件将使用的 GeckoDriver 版本(例如 Firefox)。 |
3.1 单元测试
initial
应用程序包含一个单元测试,该测试验证 /
的默认 UrlMapping。
package example.grails
import grails.testing.web.UrlMappingsUnitTest
import spock.lang.Specification
class UrlMappingsSpec extends Specification implements UrlMappingsUnitTest<UrlMappings> {
void "test forward mappings"() {
expect:
verifyForwardUrlMapping("/", view: 'index')
}
}
3.2 集成测试
initial
应用中包含使用 Geb 验证首页显示“欢迎使用 Grails”字样的功能测试。
package example.grails
import geb.spock.GebSpec
import grails.testing.mixin.integration.Integration
import spock.lang.IgnoreIf
@IgnoreIf( { !sys['geb.env'] }) (1)
@Integration
class DefaultHomePageSpec extends GebSpec {
def 'verifies there is _<h1>_ header with the text _Welcome to Grails_ when we visit the home page.'() {
when:
go '/'
then:
$('h1').text() == 'Welcome to Grails'
}
}
1 | 除非存在系统属性 geb.env ,否则忽略测试。 |
3.3 详细测试输出
在持续集成服务器中运行测试时,有更详细的输出非常有用。
修改 build.gradle
tasks.withType(Test) {
testLogging {
events "passed", "skipped", "failed"
exceptionFormat 'full'
}
}
执行测试时,我们将看到如下输出
$ ./gradlew test
....
...
example.grails.UrlMappingsSpec > test forward mappings PASSED
3.4 运行测试
验证到目前为止所有执行情况的正确性。
./gradlew -Dgeb.env=chromeHeadless check
运行测试
./grailsw
grails> test-app
grails> open test-report
或
./gradlew check
open build/reports/tests/index.html
4 创建 GitHub 存储库
我们需要将 Grails 应用放到 GitHub 上,以便 Travis 可以访问它。
转到 GitHub,按照说明 创建新存储库。
创建存储库时,使其公开。选择不创建 LICENSE 和 .gitignore。我们正在导入现有代码库,因此我们想要避免冲突。 |
添加许可证
添加 MIT 许可证文件。Travis CI 在开放源代码许可证下免费。你可以创建标题为 LICENSE
的文件。内容为
MIT License Copyright (c) 2018 Nirav Assar Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
让我们创建一个空 travis-build.sh
,我们将在指南后面使用它。
> touch travis-build.sh
通过执行以下命令将代码导入 GitHub 上的存储库
> git init
> git add .
> git commit -m "first commit"
> git remote add origin <Your repo URL>
> git push -u origin master
4.1 授予文件的执行权限
为了让 Travis 执行 Grails 构建,必须更改某些文件的访问权限或模式。我们将在 Git 中使用 chmod
更改模式。
授予 gradlew
和 travis-build.sh
权限
> chmod=+x gradlew
> chmod=+x gradlewtravis-build.sh
> git commit -m "chmod a+x gradew and travis-build.sh"
> git push
5 集成 Travis CI
Travis CI 直接与你的 GitHub 帐户集成。按照 Travis 网站上的说明 开始。
简而言之,你需要
-
使用你的 GitHub 帐户登录 Travis。
-
授予 Travis 访问你的存储库的权限。
-
启用 Travis CI 的存储库。
-
创建一个
.travis.yml
以下图片展示了如何启用 Travis CI 的存储库
5.1 创建 Travis 配置文件
.travis.yml
文件告诉 Travis 要做什么。它必须位于项目的最顶层。对于 Grails 项目,请注意,我们已经设置了 language: groovy
。Travis 带有合理的默认值。如果项目在存储库根目录中有 build.gradle
,则 Travis 会在 install
阶段运行 gradlew assemble
,并在 test
阶段运行 gradlew check
。
sudo: false # (1)
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/ # (2)
language: groovy # (3)
jdk:
- oraclejdk8 # (4)
1 | 给出了默认的 Ubuntu 基础设施。 |
2 | 这行直到 before_cache 缓存配置明确告诉 Travis CI,你想在连续的构建调用中存储和使用 Gradle 缓存和包装程序。阅读 在 travis ci 上执行 Gradle 构建。 |
3 | 选择 groovy 作为语言。 |
4 | 选择 Java jdk8。 |
提交变更到 Git 并将它们推送至远程存储库。推送后,转到 https://travis-ci.cn/ 并查看正在运行的构建。构建完成后,重新启动构建以演示 Travis 将使用缓存来获取依赖关系。
Gradle check
任务会执行 test
和 integrationTest
任务,而这些任务进而会执行 Grails 单元和集成/功能测试。但是,如果不指定系统属性 geb.env
,则会忽略功能方法 DefaultHomePageSpec
。
5.2 委托至脚本文件
为了让构建更具表达力,我们可以委托至一个脚本文件。在这种情况下,Travis 将执行一个指定的文件并跳过默认值。以下是委托至一个 .sh
文件的 .travis.yml
。
sudo: true
addons:
chrome: stable # (1)
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
language: groovy
install: # (2)
- true
jdk:
- openjdk8
script: "./travis-build.sh" # (3)
1 | Google Chrome 插件 允许 Travis CI 构建在运行时安装 Google Chrome。要使用插件,你需要在 Trusty 构建环境或 OS X 构建环境上运行构建。 |
2 | 完全跳过安装步骤。 |
3 | 委托至一个脚本。 |
下面的脚本会运行单元和集成/功能测试。使用无头模式在 Chrome 中运行 Geb 测试。
#!/bin/bash
EXIT_STATUS=0
echo "Running tests with geb.env chromeHeadless"
./gradlew -Dgeb.env=chromeHeadless check || EXIT_STATUS=$? # (1)
exit $EXIT_STATUS
1 | 执行命令 ./gradlew -Dgeb.env=chromeHeadless check 。 |
提交变更到 Git 并将它们推送至远程存储库。推送后,转到 https://travis-ci.cn/ 并查看正在运行的构建。