1. Setting up GitLab CI/CD
  2. Using the GitLab CI/CD
  3. CI/CD script structure
    1. Docker image
    2. Build job
    3. Validation job
    4. Deployment job

The 'thesis' project provides two GitLab scripts for setting up CI/CD. The default script is somewhat more complex, mainly designed for validating the template's functionality and PDF/A conformance in various use cases. The script typically needs slight modifications to be useful for producing a single document. Using this simplified script is recommended instead.

Other Git hosting services (e.g. GitHub) provide similar services, but the CI/CD pipeline configuration may require slight modifications.

Setting up GitLab CI/CD

The easiest way to set up GitLab CI/CD is to replace the provided .gitlab-ci.yml with the contents from .gitlab-ci-simple.yml:

$ mv .gitlab-ci-simple.yml .gitlab-ci.yml

Using the GitLab CI/CD

GitLab should automatically detect and run the CI/CD script after each commit if the file has the correct location (project root directory) and name (.gitlab-ci.yml). No further configuration required.

Note that the default configuration will inform all the GitLab project's owners via email upon a failed pipeline run.


CI/CD script structure

Next, let's take a closer look at the different sections in the CI/CD script.

Docker image

The CI/CD scripts delegate the document generation and validation to a custom TeXLive Docker container. See the project page for a detailed list of installed software.

While the purpose of this container is to facilitate LaTeX document generation in a CI/CD pipeline, the same image can also be used directly from the command line prompt or as a backend for other middleware.

To set up the environment in a GitLab CI/CD pipeline, configure the script to use the following image:

image: registry.gitlab.utu.fi/tech/soft/thesis/builder:latest

In case the image does not suit your needs, other prebuilt LaTeX Docker images such as these may offer a better starting point:

Build job

# build latex/thesis.tex -> latex/thesis.pdf using pdflatex
# shell-escape functionality is required by the minted package
build:
  stage: build
  script:
    - cd latex
    - latexmk -pdf --shell-escape thesis.tex
  artifacts:
    paths:
      - latex/thesis.pdf

Validation job

The Docker image contains a headless PDF/A validation tool that can be started by invoking (in a CI task) pdfa-validate <document-file>, e.g.:

$ pdfa-validate thesis.pdf

For a conforming document, built in the version=final mode, a successful run of the validation tool will print a single line starting with "PASS". See the PDF/A page for further instructions. A conforming document can be submitted to the UTUGradu system.

In the GitLab CI/CD, the validate job performs PDF/A validation for the resulting document. Note that the allow_failure directive is enabled here. This is due to the fact that the draft versions of the document may often fail and GitLab would otherwise spam all the project owners of each failed CI task by mail.

# a validation prints "PASS + something" if the file is PDF/A 
validate:
  stage: test
  script:
    - pdfa-validate latex/thesis.pdf|grep '^PASS'
  allow_failure: true

Deployment job

The pages job can be used to copy the generated PDF file to the GitLab Pages area (default location: https://USERNAME.utugit.fi/PROJECTNAME). This can be useful for automatically testing the build and producing the document for the supervisors. The deployment task can be left out if not needed.

In order to deploy the document, just copy the pdf file to the public/ directory inside the build directory. This is a bit problematic as there will be no index page and the exact URL must be used to access the file.

The following example demonstrates a bit more advanced deployment using sitegen. The application copies the document (assumption: thesis.pdf in the document root) to public/, then attempts to locate doc/thesis.md (useful for adding e.g. a changelog), converts the file to html, and finally composes an index.html that contains all the processed content along with a pdf.js viewer for browsing the document inside a browser. Note that the tool requires a compatible Docker image that contains either wget or curl, and optionally poppler-utils & pdfa-validator (both installed in the provided image).

pages:
  stage: deploy
  script:
    # if the docker image contains curl instead of wget, use this 
    # curl https://gitlab.utu.fi/tech/soft/tools/sitegen -o sitegen.jar
    - wget https://gitlab.utu.fi/tech/soft/tools/sitegen -O sitegen.jar
    - java -jar sitegen.jar -pdfjs
  only:
    - master
  artifacts:
    paths:
      - public/