显示导航

Circle CI 中的基本 Grails

在本文档中,我们将学习如何设置 Circle CI 以构建和测试 Grails 应用程序。

作者: Nirav Assar、Sergio del Amo

Grails 版本 4.0.1

1 Grails 培训

Grails 培训 - 由创建和积极维护 Grails 框架的人员开发和提供!。

2 入门

每个软件项目都需要 持续集成 (CI)

持续集成是一种软件开发策略,在确保代码质量的同时提高了开发速度。开发人员持续提交少量代码增量(至少每天一次,甚至每天多次),然后在将其与共享存储库合并之前自动对其进行构建和测试。
— Circle 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 如何完成本指南

要开始操作,请执行以下操作

Grails 指南代码库包含两个文件夹

  • initial 初始项目。通常是一个简单的 Grails 应用程序,并添加了一些代码,让您捷足先登。

  • complete 一个完整的示例。它是通过执行指南中介绍的步骤并将这些更改应用于 initial 文件夹而生成的。

要完成本指南,请转到 initial 文件夹

  • cdgrails-guides/grails-on-circleci-basics/initial

并按照下一部分中的说明进行操作。

如果 cdgrails-guides/grails-on-circleci-basics/complete,则可以直接转到完成的示例

3 编写应用程序

initial 项目包含一个使用 web 配置文件创建的 Grails 应用程序。

您的 build.gradle 文件应如下所示

gradle.properties
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
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)
    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。

src/test/groovy/example/grails/UrlMappingsSpec.groovy
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

src/integration-test/groovy/example/grails/DefaultHomePageSpec.groovy
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

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

总之,您将需要

  1. 使用您的 GitHub 帐户登录 Circle CI。

  2. 授权 Circle 访问您的仓库。

  3. 使用 Circle CI 启用仓库。

  4. 创建一个 .circleci/config.yml

以下图像显示了如何使用 Circle CI 启用仓库(单击设置项目)。

circle

5.1 创建 Circle 配置文件

config.yml 文件告诉 Circle CI 要做什么。它必须位于项目顶层的类 .circleci/ 文件夹中。Circle CI 将 docker 映像用作容器,并能够缓存依赖关系。

.circleci/config.yml
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 应用程序

7 有关 Grails 的帮助

Object Computing, Inc. (OCI) 赞助创建了本指南。可获得各种咨询和支持服务。

OCI 是 Grails 之家

结识团队