无法通过 Jenkinsfile 运行 "fastlane" 命令
Can't run "fastlane" command via Jenkinsfile
我写了一个 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 的无效缓存和重新启动。它给出了这个错误:
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 多分支管道时,我遇到了与之前在 Android Studio 中遇到的相同的错误。从我目前发现的情况来看,Jenkins 似乎出于某种原因找不到 fastlane
命令。我尝试为构建项目的构建节点设置 Environment Variable
,但我仍然遇到相同的错误。
这是 Jenkinsfile
中的 stage
我 运行 我的 Fastlane
任务:
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
运行 gem env
命令时] 的 Jenkins node
我得到了不同的 RUBYGEMS 版本,gem 路径和 shell 路径。我目前正在尝试让 Jenkins node
使用机器上安装的 Ruby Gem,而不是它自己的(或那些行中的东西)。
更新 (3): 经过大约 3 天的调试,我终于弄清楚了到底出了什么问题。问题是,当 运行 执行 Jenkins 管道作业时,您无法通过标准 Web 界面和插件(如 EnvInject)真正设置环境变量。另外 Mac OS 内置了 ruby 环境,Jenkins 节点默认使用该环境,我无法在其上安装 Fastlane Gem。
您通常需要手动设置 PATH,因为 Jenkins 从站不会获取完整路径。
可以通过从属配置页面上的 Jenkins 仪表板完成(管理 Jenkins -> 管理节点 -> 配置)。
在slave上运行 which fastlane
可以找到fastlane安装的位置
解决方法如下:
- 在你的 Jenkins slave 上安装 RVM or RBEnv
- 安装Fastlane
- 将适当的环境变量添加到您的 Jenkinsfile
我写了一个 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 的无效缓存和重新启动。它给出了这个错误:
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 多分支管道时,我遇到了与之前在 Android Studio 中遇到的相同的错误。从我目前发现的情况来看,Jenkins 似乎出于某种原因找不到 fastlane
命令。我尝试为构建项目的构建节点设置 Environment Variable
,但我仍然遇到相同的错误。
这是 Jenkinsfile
中的 stage
我 运行 我的 Fastlane
任务:
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
运行 gem env
命令时] 的 Jenkins node
我得到了不同的 RUBYGEMS 版本,gem 路径和 shell 路径。我目前正在尝试让 Jenkins node
使用机器上安装的 Ruby Gem,而不是它自己的(或那些行中的东西)。
更新 (3): 经过大约 3 天的调试,我终于弄清楚了到底出了什么问题。问题是,当 运行 执行 Jenkins 管道作业时,您无法通过标准 Web 界面和插件(如 EnvInject)真正设置环境变量。另外 Mac OS 内置了 ruby 环境,Jenkins 节点默认使用该环境,我无法在其上安装 Fastlane Gem。
您通常需要手动设置 PATH,因为 Jenkins 从站不会获取完整路径。
可以通过从属配置页面上的 Jenkins 仪表板完成(管理 Jenkins -> 管理节点 -> 配置)。
在slave上运行 which fastlane
可以找到fastlane安装的位置
解决方法如下:
- 在你的 Jenkins slave 上安装 RVM or RBEnv
- 安装Fastlane
- 将适当的环境变量添加到您的 Jenkinsfile