无法通过 Jenkinsfile 运行“fastlane”命令
Posted
技术标签:
【中文标题】无法通过 Jenkinsfile 运行“fastlane”命令【英文标题】:Can't run "fastlane" command via Jenkinsfile 【发布时间】:2019-05-25 17:33:59 【问题描述】:我写了一个Gradle task
,它通过命令行执行fastlane supply
命令。任务如下所示:
task uploadToPlayStore(type: Exec)
group = "upload"
commandLine "fastlane", "supply",
"--aab", "$project.rootDir/app/build/outputs/bundle/upload/$archiveFile.aab",
"--mapping", "$project.rootDir/app/build/outputs/mapping/upload/mapping.txt",
"--skip_upload_apk", "true",
"--skip_upload_metadata", "true",
"--skip_upload_images", "true",
"--skip_upload_screenshots", "true",
"--track", "internal",
"--package_name", "$appPackage",
"--json_key", "~/Documents/key.json"
此任务从我正在运行它的 Jenkins slave 上的终端成功运行,并通过 android Studio 作为Gradle task
并通过其终端通过./gradlew uploadToPlayStore
。起初,它无法通过 Android Studio 的终端正常运行,直到我对 Android Studio 进行了 Invalidate Cache and Restart。它给出了这个错误:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:uploadToPlayStore'.
...............
Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'fastlane''
...............
Caused by: net.rubygrapefruit.platform.NativeException: Could not start 'fastlane'
...............
Caused by: java.io.IOException: Cannot run program "fastlane" (in directory "/Users/..."): error=2, No such file or directory
...............
Caused by: java.io.IOException: error=2, No such file or directory
目前,当我尝试运行 Jenkins Multibranch Pipeline 时,我遇到了之前在 Android Studio 中遇到的相同错误。从我目前发现的情况来看,Jenkins 似乎由于某种原因找不到 fastlane
命令。我尝试为正在构建项目的构建节点设置Environment Variable
,但仍然遇到相同的错误。
这是我运行Fastlane
任务的Jenkinsfile
中的stage
:
stage('Upload To Google Play Store')
steps
script
if (env.BRANCH_NAME.startsWith("release"))
sh './gradlew uploadToPlayStore --stacktrace'
else
echo 'Skipping stage since we\'re not on a release branch...'
更新 (1): 当以 "~/.rvm/rubies/ruby-2.4.2/bin/fastlane", "supply", ...
身份运行命令并激活 --debug
标志时,我得到以下堆栈跟踪:
22:54:51.135 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTING
22:54:51.137 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Waiting until process started: command '/Users/bild_nachine/.rvm/rubies/ruby-2.4.2/bin/fastlane'.
22:54:51.147 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTED
22:54:51.147 [INFO] [org.gradle.process.internal.DefaultExecHandle] Successfully started process 'command '/Users/bild_nachine/.rvm/rubies/ruby-2.4.2/bin/fastlane''
22:54:51.148 [DEBUG] [org.gradle.process.internal.ExecHandleRunner] waiting until streams are handled...
22:54:51.150 [ERROR] [system.err] env: ruby_executable_hooks: No such file or directory
22:54:51.152 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: FAILED
22:54:51.152 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Process 'command '/Users/bild_nachine/.rvm/rubies/ruby-2.4.2/bin/fastlane'' finished with exit value 127 (state: FAILED)
更新(2):经过大约一天的调试,我发现当我通过Script Console
的Jenkins node
运行gem env
命令时,我得到了一个不同的RUBYGEMS 版本, gem 路径和 shell 路径。我目前正在尝试使 Jenkins node
使用机器上安装的 Ruby Gems,而不是它自己的(或那些行中的东西)。
更新 (3): 经过大约 3 天的调试,我终于弄清楚到底出了什么问题。问题在于,在运行 Jenkins 管道作业时,您无法通过标准 Web 界面和插件(如 EnvInject)真正设置环境变量。 Mac OS 也有一个内置的 ruby 环境,默认情况下由 Jenkins 节点使用,我无法在其上安装 Fastlane Gem。
【问题讨论】:
【参考方案1】:解决方法如下:
-
在您的 Jenkins 从站上安装 RVM 或 RBEnv
安装Fastlane
将适当的环境变量添加到您的Jenkinsfile
【讨论】:
请问“正确的环境变量”到底是什么? @RomanMinenok,如果您点击 Jenkinsfile 链接,您可以在// Fastlane Environment Variables
评论下的environment
部分下看到环境变量。【参考方案2】:
您通常需要手动设置 PATH,因为 Jenkins 从站不会获取完整路径。
可以通过slave的配置页面(管理Jenkins -> 管理节点 -> -> 配置)上的Jenkins仪表板来完成。
你可以通过在slave上运行which fastlane
来找到fastlane的安装位置。
【讨论】:
更新:我尝试了类似的方法,即运行“~/.rvm/rubies/ruby-2.4.2/bin/fastlane”、“supply”等,然后它给了我另一个错误:@987654323 @ 我不太了解RVM的内部工作原理,但听起来它没有正确初始化***.com/a/26370576/78496 我找到了一个类似的解决方案(使用wrappers
而不是bin
),但我在wrappers
目录中似乎没有fastlane
文件。
我重新生成了wrappers
,为名为@987654329@ 的Jenkins 节点设置了一个环境路径,它指向wrappers
中的文件,我再次得到Caused by: java.io.IOException: Cannot run program "fastlane"
以上是关于无法通过 Jenkinsfile 运行“fastlane”命令的主要内容,如果未能解决你的问题,请参考以下文章
github中的Jenkinsfile和terraform模块:如何通过密钥进行身份验证?
带有插件 RobotPublisher 的 Jenkinsfile 导致 java.lang.NullPointerException