【问题标题】:How to run a fastlane lane in a docker image on Jenkins如何在 Jenkins 上的 docker 镜像中运行快车道
【发布时间】:2020-05-11 16:54:40
【问题描述】:

我正在使用 Jenkins 来运行 CI。我正在使用 docker 映像 mingc/android-build-box 在容器中运行快车道 (dokka)。 如果我遵循here 建议的指导方针并运行:

docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; bundle exec fastlane dokka'

操作成功,但所有生成的文件都归根用户所有。这会破坏 CI,因为当不再需要它们时,我无法删除它们。

我试图通过 CI 用户:

docker run --rm --user $(id -u):$(id -g) -v `pwd`:/project mingc/android-build-box bash -c "cd /project; bundle install --deployment; bundle exec fastlane dokka"

我得到错误:

/ 不可写。 Bundler 将临时使用 `/tmp/bundler20200511-6-m21qkb6' 作为您的主目录。 捆绑器:加载命令失败:fastlane (/usr/local/bin/fastlane) Bundler::GemNotFound:在任何源中都找不到 aws-eventstream-1.1.0

所以我尝试在bundle exec 之前调用bundle install --deployment,现在我得到了错误:

fileutils.rb:232:in `mkdir': [!] Permission denied @ dir_s_mkdir - /.fastlane (Errno::EACCES)

我用谷歌搜索了这个错误,发现了很多报告,但没有一个包含有用的答案,无论如何,这并不理想,因为 docker 映像已经安装了 fastlane gem,如果能够无需重新安装即可使用。

另一种解决方案是让容器以 root 用户身份运行,然后在使用文件后删除它们。此解决方案也不理想,因为我必须记住删除创建的每个文件,但容器除外。

【问题讨论】:

    标签: ruby docker jenkins fastlane


    【解决方案1】:

    如果您在 Jenkins 中运行它,its standard Docker support 会为您处理挂载、权限等。在脚本化的管道代码中,应该足够了

    docker.inside('mingc/android-build-box') {
      sh 'bundle exec fastlane dokka'
    }
    

    Jenkins 会将WORKDIR 挂载到容器中(在相同的路径上),以相同的用户 ID 运行,保持相同的工作目录,等等。您可以在其日志中看到它使用的(相当长的)docker run 命令。

    【讨论】:

    • 谢谢。这对于清理代码很有用,但我想它不会解决问题。我仍然会遇到与我相同的错误。对吗?
    • 至少文件权限应该更加一致。 Jenkins 将为您提供docker run -v -w -u 选项。 (我不确定为什么您的 bundle 调用正在寻找主目录。)
    猜你喜欢
    • 2022-10-15
    • 2021-02-18
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多