在Docker中为Android运行并行Gitlab CI作业

在Docker中为Android运行并行Gitlab CI作业,android,docker,continuous-integration,gitlab,fastlane,Android,Docker,Continuous Integration,Gitlab,Fastlane,我使用Gitlab CI在Docker容器中使用fastlane构建我的Android应用程序。我的应用程序有两种“风格”,我想在单独的CI作业中构建它们。以下是.gitlab ci.yml的相关部分: 默认值: 图片:registry.example.com/group/project:29安卓fastlane debian 标签: -码头工人 在脚本之前: -ruby-v#打印ruby版本以进行调试 -捆绑安装 build\u flavor1\u调试: 阶段:建造 脚本: -bundle e

我使用Gitlab CI在Docker容器中使用fastlane构建我的Android应用程序。我的应用程序有两种“风格”,我想在单独的CI作业中构建它们。以下是
.gitlab ci.yml
的相关部分:

默认值:
图片:registry.example.com/group/project:29安卓fastlane debian
标签:
-码头工人
在脚本之前:
-ruby-v#打印ruby版本以进行调试
-捆绑安装
build\u flavor1\u调试:
阶段:建造
脚本:
-bundle exec fastlane构建版本:“false”--env-1
人工产品:
路径:
-应用程序/构建/输出/捆绑/
规则:
-如果:“$CI_COMMIT_TAG&&$CI_COMMIT_REF_PROTECTED=”true“
何时:从不
-何时:关于成功
生成2调试:
阶段:建造
脚本:
-bundle exec fastlane构建版本:“false”--env-2
人工产品:
路径:
-应用程序/构建/输出/捆绑/
规则:
-如果:“$CI_COMMIT_TAG&&$CI_COMMIT_REF_PROTECTED=”true“
何时:从不
-何时:关于成功
(此管道中的其他作业会发布git标记的构建并上传到Play Store,但这些与此问题无关。)

以下是
Fastfile
的相关部分:

#我们知道的所有口味。如果未指定一个,请全部运行它们
口味={
“flavor1”=>“com.example.flavor1.app”,
“flavor2”=>“com.example.flavor2.app”
}
#如果设置为单一口味,则使其成为数组中唯一的一种
如果环境[“风味名称”]
香精=香精.切片(ENV[“香精名称”])
结束
UI.user\u错误!如果flavors.empty,是否选择(“未知风味”#{ENV[“风味名称”]}”?
平台:androiddo
描述“构建应用程序”
车道:构建do |选项|
设置(选项)
香精。每个{香精|名称,香精|包装|
打造你的口味(
风味:风味名称,
释放:选项[:释放]
)
}
结束
结束
使用
--env
标志加载
.env
文件,并设置相应的
FLAVOR\u名称
变量,以便一次只运行一个FLAVOR

当我按顺序运行构建时,这种方法效果很好,但这需要花费太长的时间。我更改了Gitlab Runner配置,允许同时运行多达8个作业,现在出现以下错误:

The message received from the daemon indicates that the daemon has disappeared.
Build request sent: Build{id=111291aa-90bc-45c3-8fb4-9a271d4663f4, currentDir=/builds/group/project}
Attempting to read last messages from the daemon log...
Daemon pid: 1100
  log file: /root/.gradle/daemon/6.5/daemon-1100.out.log
----- Last  20 lines from daemon log file - daemon-1100.out.log -----

[SNIP] - No useful logs here...

----- End of the daemon log -----
FAILURE: Build failed with an exception.
* What went wrong:
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)
有时这种情况发生在一种口味的工作上,有时发生在另一种口味的工作上。如果我手动重新运行失败的作业,它总是成功的

我相信现在发生的是两个构建作业在同一个Docker容器中运行,而不是每个都有自己的容器。无论哪一个使用完Gradle,都会首先关闭Gradle守护进程,从而导致另一个失败


如何使这些作业能够并行运行?

您有足够的资源同时运行吗?特别是内存可能是一个问题,因此操作系统将由于内存压力而杀死另一个容器。

通过更改其中一个容器的映像来测试它们是否在同一个容器中运行,看看这是否解决了问题。尝试使用
--无守护进程
,守护进程模式在容器中是无用的。@Xiaofeng我会试试,但根据Gradle文档,这个标志不再有任何区别。同时查看您是否有足够的资源同时运行?特别是内存可能是个问题。@JanGaraj我的机器有32GB,Docker最多可以使用24GB。