首页 > 解决方案 > 使用 picocli 解析 Java 程序选项在 Spinnaker Run Job 阶段不起作用

问题描述

我使用 gradle 应用程序插件的运行任务运行带有 args 的 java 主程序。该程序使用 picocli 解析命令行参数。当使用以下命令在我的开发环境中运行时,这可以正常工作:

./gradlew  run --args="-ahttp://foo.com/bar -dmydeviceid"

当我 ssh 进入我的应用程序 docker 映像的 docker 容器时,它也运行良好。

但是,如果我在 Spinnaker 管道 Run Job 阶段使用相同的 docker 映像运行相同的 Gradle 运行任务,则它不起作用。日志语句显示参数被程序正确接收但没有被 picocli 处理。我猜这是因为 picocli 的代码生成器由于某种原因没有在 Spinnaker 管道的运行作业中运行。

任何建议如何解决这个问题。

标签: javagradlespinnakerpicocli

解决方案


我找到了一种解决方法。我没有使用 'gradle run' 运行程序,而是创建了一个 shellscript,它使用 gradle application plugin 生成的程序的分发 tar。

脚本如下所示:

#!/usr/bin/env bash

# Build application tar
gradle -i distTar

tar -xvf ./build/distributions/apk-deployer-cli.tar

./apk-deployer-cli/bin/apk-deployer-cli -a $APK_URL -d $DEVICE_ID

然后在大三角帆阶段配置中,我将 $APK_URL 和 $DEVICE_ID 设置为阶段环境变量的一部分,如下所示:

      "envVars": [
        {
          "name": "APK_URL",
          "value": "${parameters[\"APK_URL\"]}"
        },
        {
          "name": "DEVICE_ID",
          "value": "${parameters[\"DEVICE_ID\"]}"
        }
      ]

推荐阅读