灵感来自这个问题关于使用 Travis CI 编译 LaTeX 文件:
如何使用 GitLab 集成的 CI 功能构建 (La)TeX 文档?
答案1
背景故事
我保存着大量用 LaTeX 编写的讲义,一次托管在 GitHub 上。现在可以找到这里在 GitLab.com 上。我使用持续集成自动编译所有相关.tex
文件并将其上传到企业级 OwnCloud 安装。
几年前,我使用过如链接问题中所述的 Travis CI 设置。
GitLab CI 通常如何工作?
如果在存储库中激活,GitLab 可以在推送新提交时运行所谓的“管道”。CI 属性主要由.gitlab-ci.yml
配置文件处理,允许进行大量自定义:可以定义多个阶段(如构建、测试、部署),可以单独处理分支,秘密变量,…
此配置文件还指定了在 CI 作业中要运行哪些命令/脚本。但实际上哪台机器运行这些脚本呢?– 这由分配给存储库的“运行器”处理。任何计算机都可以通过安装 GitLab Runner 软件成为运行器,该软件适用于所有主要操作系统,甚至可以作为 Docker 容器使用。运行器将结果(控制台日志和可能的工件)发送回 GitLab。GitLab.com 运营着公共运行器,它们可以在某些限制下自由使用(我认为对 LaTeX 没什么帮助)。
有关详细信息,请参阅文档GitLab 的。
我的编译.tex
文件设置
在我的家庭服务器上,我安装了 runner 软件(在 Linux 上,添加了一个用户“gitlab-runner”),它很容易通过 进行维护apt
。此外,我安装了没有包管理器的 TeXlive(又称“推荐方式”),并确保用户“gitlab-runner”可以使用它。
从.gitlab-ci.yml
文件 amakefile
调用,然后调用 bash 脚本来编译多个文件。借助缓存功能,latexmk
仅对已修改的文件运行,并且只有更新的文件通过 WebDAV 重新上传到上述 OwnCloud 安装。
详细信息和我的.gitlab-ci.yml
文件可在上面链接的 repo 中找到。
GitLab CI 解决方案的优缺点
(与前面提到的 Travis CI 和 GitHub 的方法相比)
优点:
- CI 作业执行速度非常快,因为没有 Docker 开销,并且运行器几乎立即开始实际编译
- 缓存可防止不必要的编译
- 使用功能齐全的 TeXlive 安装
- 我认为 GitLab 比 GitHub 更受欢迎,原因有很多(自托管安装等)。
- 高度可定制(直至 TeXlive 安装)
缺点:
- 需要维护服务器(家庭服务器的能耗、网络服务器的托管费用,但理论上一些办公室电脑也可以完成这项工作)
我的判决
常见的 CI 服务(例如 Travis)并不完全适合小众应用程序 LaTeX,因为需要使用 docker 的诡计才能完成它 - GitLab 的集成 CI 功能允许提供定制的解决方案,它不仅速度更快,而且功能更强大。
如果还有其他问题,请随时提问。
答案2
注意:这是一篇关于 ConTeXt 的帖子
除了 LaTeX,您可能还想使用 Gitlab CI 编译 ConTeXt 文档。这也很容易。只需使用 ConTeXt 独立版提供的安装脚本(以下 CI 配置将下载 ConTeXt 的测试版)。
编译 ConTeXt 文档的基本示例:
stages:
- build
build:
stage: build
image: debian:unstable
script:
- apt-get update && apt-get install -y wget rsync unzip && rm -rf /var/lib/apt/lists/*
- mkdir context && cd context
- wget http://minimals.contextgarden.net/setup/first-setup.sh
- sh ./first-setup.sh --modules=all --context=beta --engine=luatex
- . tex/setuptex
- cd ..
- context document.tex
artifacts:
paths:
- ./*.pdf
更复杂的安装自定义字体(再次,我将使用来自 git repo 的 Fira Code):
stages:
- build
build:
stage: build
image: debian:unstable
script:
- apt-get update && apt-get install -y wget rsync unzip git && rm -rf /var/lib/apt/lists/*
- mkdir context && cd context
- wget http://minimals.contextgarden.net/setup/first-setup.sh
- sh ./first-setup.sh --modules=all --context=beta --engine=luatex
- . tex/setuptex
- cd .. && mkdir fonts && cd fonts
- git clone https://github.com/tonsky/FiraCode firacode
- export OSFONTDIR="/usr/local/share/fonts;$HOME/.fonts;`pwd`"
- mtxrun --script fonts --reload
- cd ..
- context document.tex
artifacts:
paths:
- ./*.pdf
为了完整起见:这里有一个 docker 文件,您可能想要使用它来将某个 ConTeXt 版本作为多个项目的容器:
FROM alpine:latest
RUN apk update && apk add wget rsync unzip libgcc
RUN mkdir context && cd context && wget http://minimals.contextgarden.net/setup/first-setup.sh && \
sh ./first-setup.sh --modules=all --context=beta --engine=luatex
ENV PATH "/context/tex/texmf-linuxmusl-64/bin:$PATH"
2019 年 12 月更新: 这特克斯岛提供 ConTeXt 独立图像,因此您需要的图像如下所示
FROM registry.gitlab.com/islandoftex/images/context:beta
在 Docker 文件中或 GitLab CI 中
image: registry.gitlab.com/islandoftex/images/context:beta
如果您想使用 LuaMetaTeX,请替换beta
为。lmtx
答案3
此答案提供了我在 Gitlab CI 上编译 LaTeX 文档时使用的 CI 文件示例。它们使用来自特克斯岛提供包括 Pygmentize 在内的基本 TeX Live 安装(它们也为较旧的 TeX Live 发行版提供快照)。如果您想使用其中之一,只需将它们放入您的.gitlab-ci.yml
文件中即可。
如果您愿意使用 pdflatex 或 arara 编译您的文档,这是一个非常简单的替代方法。
image: registry.gitlab.com/islandoftex/images/texlive:latest
before_script:
- tlmgr update --self --all
build:
script:
- arara -lv document.tex
artifacts:
paths:
- ./*.pdf
您甚至可以进行精美的字体安装(在本例中使用 git 提取 Fira 代码),然后在您的文档中使用它们:
image: registry.gitlab.com/islandoftex/images/texlive:latest
before_script:
- git clone https://github.com/tonsky/FiraCode firacode && cp firacode/distr/otf/*.otf /usr/local/share/fonts/
- fc-cache -fv
- tlmgr update --self --all
build:
script:
- lualatex document.tex
artifacts:
paths:
- ./*.pdf
如果你想建立自己的小图像文件,请查看我的回答这里。这会将图像大小减小到大约 1.7 GiB。
答案4
对于我的简历,我使用以下脚本:
compile_pdf:
image: aergus/latex
script:
- latexmk -r .latexmkrc -pdf 'resume.tex' -jobname=resume
artifacts:
paths:
- ./build/resume.pdf
它保存在一个名为的文件中.gitlab-ci.yml
,每次提交时都会构建一个新版本。
我的.latexmkrc
包含以下内容:
$latex = 'latex %O --shell-escape %S';
$pdflatex = 'lualatex %O --shell-escape %S';
$out_dir = 'build';
我对 minted 包使用了 --shell-escape 命令。