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 如何完成指南
要开始,请执行以下操作
-
下载并解压源代码
或
-
克隆 Git 知识库
git clone https://github.com/grails-guides/grails-on-github-actions.git
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 测试
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 二进制文件 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。
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.Page
class HomePage extends Page {
static url = "/"
static content = {
titleHeader { $('h1', 0) }
}
String getTitle() {
titleHeader.text()
}
}
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
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 运行。
6 自此之后
阅读如何 使用 GitHub 操作自动化您的工作流。