Pau*_*eux 6 latex r gitlab gitlab-ci
我想使用 Gitlab CI 来编译一篇 Latex 文章,如tex.stackexchange 上的这个答案中所述(类似的 pdf 生成示例在artifacts的gitlab 文档中显示)。我使用了期刊编辑提供的特殊乳胶模板。我的 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_pdf是ls figure向我显示了一个空文件夹,并且由于缺少数字,Latex 文章编译失败。
apt install latexmk未知原因安装失败。也许是因为它有超过一百个依赖项,这对于 gitlab-CI 来说太多了?感谢您的评论,因为我想确定您是如何做到的。示例也会有所帮助,但我现在将是通用的(使用docker)。
要运行多个容器,您需要\n (The Docker executor )
引用文档:
\n\n\nDocker 执行器与 GitLab CI 一起使用时,连接到 Docker\nEngine 并使用\n在 中设置的预定义映像在单独且隔离的容器中运行每个构建\
\n.gitlab-ci.ymlnconfig.toml。
\n\nDocker执行器将作业分为多个步骤:
\n\n
\n- 准备:创建并启动服务。
\n- 作业前:克隆、恢复缓存并下载前一阶段的工件。这是在一个特殊的 Docker 镜像上运行的。
\n- 工作:用户构建。这是在用户提供的 Docker 映像上运行的。
\n- 后期工作:创建缓存,将工件上传到 GitLab。这是在一个特殊的 Docker 镜像上运行的。
\n
你的config.toml可能看起来像这样:
[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"\nRun Code Online (Sandbox Code Playgroud)\n从上面的链接文档:
\nimage关键字image是本地 Docker 引擎中存在的 Docker 映像的名称(列出具有 docker 映像的所有映像)或可以在 Docker Hub 中找到的任何映像。有关镜像和 Docker Hub 的更多信息,请阅读 Docker 基础文档。
简而言之,我们所说的镜像指的是 Docker 镜像,它将用于创建一个容器,您的构建将在该容器上运行。
\n如果您不指定 \xe2\x80\x99t namespace,则 Docker 暗示包含所有官方映像的库。这就是为什么你会在 .gitlab-ci.yml 和 config.toml 中多次看到库部分被省略的原因。例如,您可以定义一个像 的图像image: ruby:2.6,它是 image: 的快捷方式library/ruby:2.6。
然后,每个 Docker 镜像都有标签,表示镜像的版本。它们是在图像名称后面用冒号 (:) 定义的。例如,对于 Ruby,您可以在docker hub上查看支持的标签。如果您不\xe2\x80\x99t 指定标签(如image: ruby),则隐含最新的。
您image选择运行 viaimage指令的构建必须在其操作系统中有一个工作 shell PATH。对于 Linux,支持的 shell 是sh、bash、 和pwsh(自 13.9 起),对于 Windows,支持的 shell 是 PowerShell。GitLab Runner 无法使用底层操作系统系统调用(例如 exec)执行命令。
services这services关键字仅定义在构建期间运行的另一个 Docker 映像,并链接到该映像关键字定义的 Docker 映像。这允许您在构建期间访问服务映像。
该service映像可以运行任何应用程序,但最常见的用例是运行数据库容器,例如mysql. 使用现有映像并将其作为附加容器运行比安装更容易、更快捷mysql每次构建项目时安装都更容易、更快捷。
您可以在CI 服务示例的相关文档中看到一些广泛使用的服务示例。
\n如果需要,您可以分配一个alias为每项服务分配一个。
\n\n根据这个答案和这个解释良好的论坛帖子,应该可以使用工件在作业之间传递数据,但\n它们仅使用一个容器来处理不同的作业。它在我的情况下不起作用。可能是因为我使用了两个不同的容器?
\n
默认情况下,Docker 执行器将所有构建/builds/<namespace>/<project-name>和所有缓存存储在/cache(容器内)。您可以通过在 中的 部分下定义和选项来覆盖/builds和目录。这将修改数据在容器内的存储位置。/cachebuilds_dircache_dir[[runners]]config.toml
如果修改/cache存储路径,还需要确保通过在中的部分volumes = ["/my/cache/"]下定义该目录来将该目录标记为持久目录。[runners.docker]config.toml
builds_dir-> 构建存储在所选执行器上下文中的目录的绝对路径。例如,本地、Docker 或 SSH。您可能已经注意到,我已将您的文件build_dir中的自定义为,请将其调整为您自己的路径。toml/home/builds/rocker
\n\n如何将工件从一项工作传递到另一项工作?
\n
您可以使用该build_dir指令。第二种选择是使用Job Artifacts API。
\n\n我应该按照 docs.gitlab.com/caching 中的说明使用缓存吗?
\n
是的,您应该用来cache存储项目依赖项。优点是您只需从互联网获取依赖项一次,然后后续运行就会快得多,因为它们可以跳过此步骤。 Artifacts用于在构建阶段之间共享结果。
我希望现在更清楚了,我已经为您指明了正确的方向。
\n| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |