在 gitlab-ci 作业中将文件从摇杆容器传递到乳胶容器

Pau*_*eux 6 latex r gitlab gitlab-ci

我想使用 Gitlab CI 来编译一篇 Latex 文章,如tex.stackexchange 上的这个答案中所述(类似的 pdf 生成示例在artifactsgitlab 文档中显示)。我使用了期刊编辑提供的特殊乳胶模板。我的 Latex 文章包含使用 R 统计软件制作的数字。R 和 Latex 是两个具有很多依赖项的大型软件安装,因此我决定使用两个单独的容器进行构建,一个用于使用 R 进行统计分析和可视化,另一个用于将 Latex 文档编译为 pdf。

以下是内容.gitlab-ci.yml

knit_rnw_to_tex:
  image: rocker/verse:4.0.0
  script:
  - Rscript -e "knitr::knit('article.Rnw')"
  artifacts:
    paths:
      - figure/

compile_pdf:
  image: aergus/latex
  script:
  - ls figure
  - latexmk -pdf -bibtex -use-make article.tex
  artifacts:
    paths:
      - article.pdf
Run Code Online (Sandbox Code Playgroud)

knit_rnw_to_tex在 R "rocker" 容器中执行的作业成功,我可以从 gitlab "jobs" 页面下载图形工件。第二份工作的问题compile_pdfls figure向我显示了一个空文件夹,并且由于缺少数字,Latex 文章编译失败。

  • 根据这个答案和这个解释得很好的论坛帖子,应该可以使用工件在作业之间传递数据,但它们只使用一个容器来处理不同的作业。在我的情况下它不起作用。可能是因为我使用了两个不同的容器?
  • 另一种解决方案是仅使用rocker/tidyverse 容器并在其中安装latexmk,但由于apt install latexmk未知原因安装失败。也许是因为它有超过一百个依赖项,这对于 gitlab-CI 来说太多了?
  • 根据该答案,“依赖项”关键字可以提供帮助,但是当我使用它时,工件仍然不可用。
  • 如何将工件从一项工作传递到另一项工作?
  • 我应该按照docs.gitlab.com/caching 中的说明使用缓存吗?

tuk*_*kan 4

感谢您的评论,因为我想确定您是如何做到的。示例也会有所帮助,但我现在将是通用的(使用docker)。

\n

要运行多个容器,您需要\n (The Docker executor )

\n

引用文档

\n
\n

Docker 执行器与 GitLab CI 一起使用时,连接到 Docker\nEngine 并使用\n在 中设置的预定义映像在单独且隔离的容器中运行每个构建\ .gitlab-ci.ymlnconfig.toml

\n
\n

工作流程

\n
\n

Docker执行器将作业分为多个步骤:

\n
    \n
  • 准备:创建并启动服务。
  • \n
  • 作业前:克隆、恢复缓存并下载前一阶段的工件。这是在一个特殊的 Docker 镜像上运行的。
  • \n
  • 工作:用户构建。这是在用户提供的 Docker 映像上运行的。
  • \n
  • 后期工作:创建缓存,将工件上传到 GitLab。这是在一个特殊的 Docker 镜像上运行的。
  • \n
\n
\n

你的config.toml可能看起来像这样:

\n
[runners.docker]\n  image = "rocker/verse:4.0.0"\n  builds_dir = /home/builds/rocker\n\n[[runners.docker.services]]\n  name = "aergus/latex"\n  alias = "latex"\n
Run Code Online (Sandbox Code Playgroud)\n

从上面的链接文档:

\n

关键词image

\n

关键字image是本地 Docker 引擎中存在的 Docker 映像的名称(列出具有 docker 映像的所有映像)或可以在 Docker Hub 中找到的任何映像。有关镜像和 Docker Hub 的更多信息,请阅读 Docker 基础文档。

\n

简而言之,我们所说的镜像指的是 Docker 镜像,它将用于创建一个容器,您的构建将在该容器上运行。

\n

如果您不指定 \xe2\x80\x99t namespace,则 Docker 暗示包含所有官方映像的库。这就是为什么你会在 .gitlab-ci.yml 和 config.toml 中多次看到库部分被省略的原因。例如,您可以定义一个像 的图像image: ruby:2.6,它是 image: 的快捷方式library/ruby:2.6

\n

然后,每个 Docker 镜像都有标签,表示镜像的版本。它们是在图像名称后面用冒号 (:) 定义的。例如,对于 Ruby,您可以在docker hub上查看支持的标签。如果您不\xe2\x80\x99t 指定标签(如image: ruby),则隐含最新的。

\n

image选择运行 viaimage指令的构建必须在其操作系统中有一个工作 shell PATH。对于 Linux,支持的 shell 是shbash、 和pwsh(自 13.9 起),对于 Windows,支持的 shell 是 PowerShell。GitLab Runner 无法使用底层操作系统系统调用(例如 exec)执行命令。

\n

关键词services

\n

services关键字仅定义在构建期间运行的另一个 Docker 映像,并链接到该映像关键字定义的 Docker 映像。这允许您在构建期间访问服务映像。

\n

service映像可以运行任何应用程序,但最常见的用例是运行数据库容器,例如mysql. 使用现有映像并将其作为附加容器运行比安装更容易、更快捷mysql每次构建项目时安装都更容易、更快捷。

\n

您可以在CI 服务示例的相关文档中看到一些广泛使用的服务示例

\n

如果需要,您可以分配一个alias为每项服务分配一个。

\n

至于你的问题:

\n
\n

根据这个答案和这个解释良好的论坛帖子,应该可以使用工件在作业之间传递数据,但\n它们仅使用一个容器来处理不同的作业。它在我的情况下不起作用。可能是因为我使用了两个不同的容器?

\n
\n

构建和缓存存储(来自文档)

\n

默认情况下,Docker 执行器将所有构建/builds/<namespace>/<project-name>和所有缓存存储在/cache(容器内)。您可以通过在 中的 部分下定义和选项来覆盖/builds和目录。这将修改数据在容器内的存储位置。/cachebuilds_dircache_dir[[runners]]config.toml

\n

如果修改/cache存储路径,还需要确保通过在中的部分volumes = ["/my/cache/"]下定义该目录来将该目录标记为持久目录。[runners.docker]config.toml

\n
    \n
  • builds_dir-> 构建存储在所选执行器上下文中的目录的绝对路径。例如,本地、Docker 或 SSH。
  • \n
\n

[[runners]] 部分文档

\n

您可能已经注意到,我已将您的文件build_dir中的自定义为,请将其调整为您自己的路径。toml/home/builds/rocker

\n
\n

如何将工件从一项工作传递到另一项工作?

\n
\n

您可以使用该build_dir指令。第二种选择是使用Job Artifacts API

\n
\n

我应该按照 docs.gitlab.com/caching 中的说明使用缓存吗?

\n
\n

是的,您应该用来cache存储项目依赖项。优点是您只需从互联网获取依赖项一次,然后后续运行就会快得多,因为它们可以跳过此步骤。 Artifacts用于在构建阶段之间共享结果。

\n

我希望现在更清楚了,我已经为您指明了正确的方向。

\n