0

我已经建立了一个基本的Jenkins 流水线,它在很大程度上实现了我的预期。

但是,我使用的是 ant,它需要访问特定的 jar 文件。我已经像这样指定了构建步骤:

stage('Build') {
  // Build the project
  env.PATH = "${tool 'ant'}/bin:${env.PATH}"
  sh 'ant -f dita-tools/build_all.xml -lib $WORKSPACE/dita-ot/lib:$WORKSPACE/dita-ot/lib/saxon'
 }

我通过此管道运行的构建失败并生成以下错误:

java.lang.ClassNotFoundException: org.dita.dost.module.GenMapAndTopicListModule

据我所知,这是由于 ant 无法访问 dita ot 中的 dost.jar。我尝试通过多种方式定义此参数,包括专门引用 dost.jar (我有许多 jar 包要包括在内),但每次它失败时都会出现相同的错误。

当我在 Jenkins 中组装一个独立的 ant 项目时,ant 通过我上面提供的论点访问 jar 没有问题。我有没有更好的方法在管道中提供这个参数/依赖关系?

更新: 我在构建脚本中为类路径添加了一个 echo 语句,并且能够验证在构建脚本中将 jar 添加到类路径中确实有效。因此,出于所有意图和目的,ant 可以访问目标的所有相关基础工具包 jar,但错误仍然存​​在。在这一点上,问题似乎与 jenkins 管道的工作方式有关,而不是与 dita ot 本身有关?

4

1 回答 1

0

我假设您使用自定义插件,如果是,请确保您在plugin.xml中正确定义了您的 jar,如下所示:

<feature extension="dita.conductor.lib.import" file="lib/my.jar"/>

更新

java.lang.ClassNotFoundException: org.dita.dost.module.GenMapAndTopicListModule

此错误意味着在您的类路径中找不到主 DITA-OT jar。因此,这表明这不是插件问题。

通常您不必设置类路径,Ant 会为您完成。另请阅读创建 Ant 构建脚本

请尝试这样的片段:

node {
    try {
        checkout scm
        stage('Build') {
            sh '''
                dir=$(pwd)
                curl [your-dita-ot-url] --output dita-ot.zip
                unzip -qq "$dir/dita-ot.zip"
                rm dita-ot.zip
                chmod +x ${WORKSPACE}/dita-ot/bin/ant
                ${WORKSPACE}/dita-ot/bin/ant -f ${WORKSPACE}/build.xml -Ddita.dir=$dir/dita-ot -Dbranch.name=$BRANCH_NAME
            '''
        }
    } catch (e) {
        currentBuild.result = "FAILED"
        throw e
    } finally {
        notifyBuild(currentBuild.result)
    }
}
于 2017-09-07T15:10:33.100 回答