显示导航

Github Actions 中的 Grails

在此指南中,我们将学习如何设置 Github Actions 来构建和测试 Grails 应用程序。

作者:塞尔吉奥·德尔·阿莫

Grails 版本 4.0.1

1 Grails 培训

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

2 入门

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

持续集成是一种软件开发实践,团队成员经常集成他们的工作,通常每个人至少每天集成一次 - 导致每天进行多次集成。每次集成都会通过自动构建(包括测试)进行验证,以尽可能快地检测集成错误。许多团队发现这种方法可以显著减少集成问题,并使团队能够更快地开发出内聚软件。
— 马丁·福勒

在此指南中,我们使用 Github Actions

Github Actions 可以轻松地让您的所有软件工作流实现自动化,现在带有世界级的 CI/CD。直接在 GitHub 上构建、测试和部署代码。以自己喜欢的方式进行代码审查、分支管理和问题分类。

您将在 GitHub 上创建一个 Grails 应用程序,并使用Github Actions来构建和测试代码。本指南假设您熟悉 Git 和 GitHub。它还假设您已经有了 GitHub 帐户。

2.1 需要准备的工具

要完成本指南,您将需要以下工具

  • 空闲时间

  • 一个好的文本编辑器或 IDE

  • 安装了 JDK 1.8 或更高版本,并正确配置了 JAVA_HOME

2.2 如何完成指南

要开始,请执行以下操作

Grails 指南知识库包含两个文件夹

  • initial 初始项目。通常是带有额外代码以便捷上手的简单 Grails 应用程序。

  • complete 已完成的示例。这是通过完成指南中显示的步骤和将这些更改应用到initial 文件夹得出的结果。

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

  • cd 进入 grails-guides/grails-on-github-actions/initial

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

如果你 cd 进入 grails-guides/grails-on-github-actions/complete,则可以转到已完成示例

3 编写应用程序

initial 项目包含使用Grails 应用程序熔炉创建的带有web 的 Grails 应用程序。

您的构建文件 build.gradle 已设置为无缝运行 Geb 测试

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 二进制文件 Gradle 插件。Gradle 插件,下载特定于构建运行的操作系统 WebDriver 二进制文件。该插件还将构建的各个部分配置为使用下载的二进制文件。
2 包含一个testCompile 依赖项以使用 Geb Grails 插件,该插件对geb-spock 具有传递依赖关系。
3 添加使用 Chrome 所需的 selenium 依赖项
4 添加使用 Firefox 所需的 selenium 依赖项
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 验证主页显示句子欢迎使用 Grails 的功能测试。

src/integration-test/groovy/example/grails/HomePage.groovy
package example.grails

import geb.Page

class HomePage extends Page {

    static url = "/"

    static content = {
        titleHeader { $('h1', 0) }
    }

    String getTitle() {
        titleHeader.text()
    }
}
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:
        HomePage page = to HomePage

        then:
        page.title == 'Welcome to Grails'

    }
}

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 运行测试

验证到目前为止一切都已正确执行。

运行测试

./grailsw
grails> test-app
grails> open test-report

./gradlew check
open build/reports/tests/index.html

4 创建 GitHub 知识库

我们需要将 Grails 应用程序放到 GitHub 上,以便 CI 可以访问它。

访问 GitHub,按照说明 创建新代码库

创建代码库时,将其设置为公开。选择不创建 LICENSE 和 .gitignore。我们要导入现有代码库,因此希望避免冲突。

通过执行以下命令将代码导入 GitHub 上的代码库

> git init
> git add .
> git commit -m "first commit"
> git remote add origin <Your repo URL>
> git push -u origin master

5 集成 GitHub 操作

要设置 GitHub 操作,请创建一个文件

#.github/workflows/gradle.yml
name: Java CI with Gradle
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: ['8']
    env:
      JDK_VERSION:  ${{ matrix.java }}
    steps:
      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: ${{ matrix.java }}
      - uses: actions/checkout@v2
      - uses: actions/cache@v2
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
      - name: Run script
        run: ./githubactions-build.sh
        env:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          GIT_NAME: ${{ secrets.GIT_NAME }}
          GIT_EMAIL: ${{ secrets.GIT_EMAIL }}
1 对分支 master 的推送操作运行 GitHub 操作。
2 对目标为分支 master 的 pull 请求运行 GitHub 操作。
3 对 JDK 8 和 11 运行 GitHub 操作
4 GitHub 缓存操作允许缓存依赖项和构建输出,以缩短工作流执行时间。
5 运行测试

将代码推送到 GitHub 时,您将看到 Grails 测试同时用 JDK 8 和 JDK 11 运行。

githubactions 1
githubactions 2

6 自此之后

7 Grails 帮助

Object Computing, Inc. (OCI) 赞助了本指南的创建。我们提供各种咨询和支持服务。

OCI 是 Grails 的家园

见见团队成员