Circle CI 中的基本 Grails
在本文档中,我们将学习如何设置 Circle CI 以构建和测试 Grails 应用程序。
作者: Nirav Assar、Sergio del Amo
Grails 版本 4.0.1
1 Grails 培训
Grails 培训 - 由创建和积极维护 Grails 框架的人员开发和提供!。
2 入门
每个软件项目都需要 持续集成 (CI)。
持续集成是一种软件开发策略,在确保代码质量的同时提高了开发速度。开发人员持续提交少量代码增量(至少每天一次,甚至每天多次),然后在将其与共享存储库合并之前自动对其进行构建和测试。
Circle CI 是一个与 GitHub 无缝集成的持续集成平台。它通过自动构建、测试和部署代码变更,为您的开发过程提供支持。
在本指南中,您将在 GitHub 上创建一个 Grails 应用程序,并使用 Circle CI 来构建和测试您的代码。本指南假定您熟悉 Git 和 GitHub。它还假定您已拥有 GitHub 帐号。本指南仅介绍使用 Circle CI 构建和测试 Grails 应用程序的内容。但是,Circle CI 具备 部署、发送通知和高度自定义 CI 作业的能力。
Circle 为每个项目提供一种免费方案,并且随着需求增加,提供成本逐渐增加的多个方案。因此,构建和测试您希望贡献给社区的开源 Grails 插件确实很方便。
2.1 需要的条件
要完成本指南,需要以下条件
-
一些时间
-
一个合适的文本编辑器或 IDE
-
已安装 JDK 1.8 或更高版本,并且已正确配置
JAVA_HOME
2.2 如何完成本指南
要开始操作,请执行以下操作
-
下载并解压源代码
或
-
克隆 Git 代码库
git clone https://github.com/grails-guides/grails-on-circleci-basics.git
Grails 指南代码库包含两个文件夹
-
initial
初始项目。通常是一个简单的 Grails 应用程序,并添加了一些代码,让您捷足先登。 -
complete
一个完整的示例。它是通过执行指南中介绍的步骤并将这些更改应用于initial
文件夹而生成的。
要完成本指南,请转到 initial
文件夹
-
cd
到grails-guides/grails-on-circleci-basics/initial
并按照下一部分中的说明进行操作。
如果 cd 到 grails-guides/grails-on-circleci-basics/complete ,则可以直接转到完成的示例 |
3 编写应用程序
initial
项目包含一个使用 web
配置文件创建的 Grails 应用程序。
您的 build.gradle
文件应如下所示
grailsVersion=4.0.1
gormVersion=7.0.2.RELEASE
assetPipelineVersion=3.0.11
webdriverBinariesVersion=1.4
seleniumVersion=3.141.59
chromeDriverVersion=78.0.3904.105
geckodriverVersion=0.26.0
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)
testCompile "org.seleniumhq.selenium:htmlunit-driver:2.35.1"
testRuntime 'net.sourceforge.htmlunit:htmlunit:2.35.0'
testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion" (3)
testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion" (4)
testCompile "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion" (5)
testCompile "org.seleniumhq.selenium:selenium-api:$seleniumVersion" (5)
testCompile "org.seleniumhq.selenium:selenium-support:$seleniumVersion" (5)
}
webdriverBinaries {
chromedriver "${chromeDriverVersion}" (6)
geckodriver "${geckodriverVersion}" (7)
}
1 | 应用 Webdriver binaries Gradle 插件。这是 Gradle 插件,它下载特定于构建运行的操作系统的 WebDriver 二进制文件。该插件还会配置构建的各个部分,以使用下载的二进制文件。 |
2 | 将 testCompile 依赖项包括到 Geb Grails 插件,该插件具有对 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 验证主页显示句子 Welcome to Grails
。
package example.grails
import geb.spock.GebSpec
import grails.testing.mixin.integration.Integration
@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,以便 Circle CI 可以访问它。
转到 GitHub 并按照说明 创建新仓库。
创建仓库时,使其公开。选择不创建许可证和 .gitignore。我们将导入现有代码库,因此我们希望避免冲突。 |
通过执行以下命令将代码导入 GitHub 上的仓库
> git init
> git add .
> git commit -m "first commit"
> git remote add origin <Your repo URL>
> git push -u origin master
5 集成 Circle CI
Circle CI 直接与您的 GitHub 帐户集成。按照 Circle CI 网站上的说明,创建仓库来集成 Circle CI
总之,您将需要
-
使用您的 GitHub 帐户登录 Circle CI。
-
授权 Circle 访问您的仓库。
-
使用 Circle CI 启用仓库。
-
创建一个
.circleci/config.yml
以下图像显示了如何使用 Circle CI 启用仓库(单击设置项目)。
5.1 创建 Circle 配置文件
config.yml
文件告诉 Circle CI 要做什么。它必须位于项目顶层的类 .circleci/
文件夹中。Circle CI 将 docker 映像用作容器,并能够缓存依赖关系。
version: 2 (1)
jobs:
build:
working_directory: ~/repo
docker:
- image: circleci/openjdk:8-jdk-browsers (2)
environment:
JVM_OPTS: -Xmx3200m (3)
TERM: dumb
steps: (4)
- checkout (5)
- restore_cache: (6)
key: grailsapp-{{ checksum "build.gradle" }}-{{ checksum "gradle.properties" }}
- run: chmod +x gradlew
- run: ./gradlew --console=plain testClasses (7)
- run: ./gradlew --console=plain integrationTestClasses (8)
- save_cache: (9)
paths:
- ~/.gradle
key: grailsapp-{{ checksum "build.gradle" }}-{{ checksum "gradle.properties" }}
- run: ./gradlew --console=plain -Dgeb.env=chromeHeadless check (10)
- store_artifacts: (11)
path: build/reports
destination: reports
- store_test_results: (12)
path: build/test-results
1 | 查看 CircleCI 2.0 Java 配置,了解更多详细信息 |
2 | 将此 Docker 映像设置为主要容器;所有 steps 都将在其中运行 |
3 | 自定义 JVM 最大堆限制 |
4 | 可执行命令的集合。 |
5 | 签出源代码到工作目录。 |
6 | 在首次运行或 build.gradle 更改后,恢复已保存的缓存。 |
7 | 组装测试类。 |
8 | 组装集成测试类。 |
9 | 保存项目依赖关系 |
10 | 运行集成、功能和单元测试。如果我们没有指定系统属性 geb.env ,则会忽略功能方法 DefaultHomePageSpec 。 |
11 | 将 build/reports 的 HTML 测试报告作为工件上传 |
12 | 从 build/tests-results 目录上传测试元数据,以便它可以在 CircleCI 仪表板中显示。 |
提交更改到 Git,并将它们推送到远程仓库。推送后,转到 https://circleci.com/ 并查看构建正在运行。构建完成后,重新启动构建,以演示 Circle CI 将使用依赖项缓存。
6 从何处继续?
阅读 Circle CI 2.0 文档,了解它的可能性。
例如,Circle CI 工作流 简化了用于测试的管道创建工作,并部署 Grails 应用程序。