我正在为项目设置新的GitLab CI管道。
首先,我的目标是创建一个用于构建,测试和分析项目的基本管道(三个简单阶段)。
我的问题是,我的第二阶段(测试)依赖于Gradle任务,该任务会生成一些文档(我们根据测试动态生成了文档)。所述任务调用实用程序的主体来生成简单的文档。
当我在Windows主机上运行所有任务时,它们都能正常工作,但使用基于Linux的Alpine镜像在GitLab的CI上执行相同的操作却失败,并出现以下错误:
> Task :compileTestJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
> Task :generatePermissionsDocument FAILED
Error: Could not find or load main class
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':generatePermissionsDocument'.
> Process 'command '/opt/java/openjdk/bin/java'' finished with non-zero exit value 1
我曾尝试启用Gradle堆栈跟踪,但没有设法从中获取任何有用的信息。在大多数情况下,我的构建脚本和GitLab CI脚本都看起来不错(包括在下面以供参考):
image: adoptopenjdk/openjdk8:jdk8u222-b10-alpine
include:
- project: "devops/ci-templates"
ref: "master"
file: "sonar/sonar-gradle.yml"
variables:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
- apk add --no-cache tzdata
- cp /usr/share/zoneinfo/America/New_York /etc/localtime
- echo "America/New_York" > /etc/timezone
stages:
- build
- test
- analysis
build:
stage: build
script: ./gradlew --build-cache clean assemble -PMARKETING_SKIP_INT_TESTS
cache:
key: "$CI_COMMIT_REF_NAME"
paths:
- build
- .gradle
- src/main/java/fts/marketing/util/Version.java
retry: 2
only:
- merge_requests
- master
- /^support\/\d+[.]\d+$/
- tags
except:
- api
test:
stage: test
script: ./gradlew test -PMARKETING_SKIP_INT_TESTS --stacktrace
cache:
key: "$CI_COMMIT_REF_NAME"
policy: pull
paths:
- build
- .gradle
- src/main/java/fts/marketing/util/Version.java
only:
- merge_requests
- master
- /^support\/\d+[.]\d+$/
- tags
except:
- api
起初,我虽然认为这可能是与缓存或权限相关的问题,但我同时检查了构建任务产生的完整性或缓存以及生成的文件夹的权限,一切正常。
作为参考,我尝试调用的任务是这样的:
task generatePermissionsDocument(type: JavaExec, group: 'application') {
description = 'Will generate API Permissions adoc'
main = 'fts.marketing.tools.GeneratePermissionsDocument'
classpath = sourceSets.main.runtimeClasspath
//jvmArgs = applicationDefaultJvmArgs
workingDir = generatedDocumentation
}
任何人都可以阐明为什么失败以及必须采取什么措施才能解决它吗?
答案 0 :(得分:0)
我设法找出了根本原因。我正在对应用程序的默认JVM args进行一些条件设置,这显然是错误的。所说的过程是在Gradle传递给JVM的args中包含一个尾随的“,”。
由于某种原因,当从类似Unix的环境中运行时,它并不受欢迎,而在Windows主机上运行良好。我重新修改了arg设置的条件部分,一切都像个魅力一样。