GitLab CI 通常如何工作?

GitLab CI 通常如何工作?

灵感来自这个问题关于使用 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 命令。

相关内容