While ago I was thinking that it would be nice to have my CV always fresh and updated. Fixing it every time you change a job or just apply somewhere is a hudge pain. Over the years I used several methods to create my resume.
First it was a simple word document stored on a pendrive or desktop pc. Later on I added cloud storage and started to generate PDF files.
Next on the list was some nice tools that I found on the web to generate from templates. So decided to get everyting and automate the whole process using some free tools that is out there and thats the story how I did it.

REQUIREMENTS

  • gitlab.com account - its having everything we need out of the box - CI, version controll and shared runners (on free account you have a limit of 2000 minutes per month)
  • Awesome-CV - outstanding LaTeX template for your new CV!

1. Git repository

In this example I use gitlab but it can be easy replaced by something else. CI is also optional and I'm more then sure you could do the same in any other tool. I've prepared an example repository on both github and gitlab.

To be able to have awesome-cv inside my repository I will use git sumbodule command to add it.

─╼ git submodule add https://github.com/posquit0/Awesome-CV.git
Cloning into 'Awesome-CV'...
remote: Counting objects: 945, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 945 (delta 0), reused 1 (delta 0), pack-reused 940
Receiving objects: 100% (945/945), 14.17 MiB | 1.28 MiB/s, done.
Resolving deltas: 100% (478/478), done.
Checking connectivity... done.

Create symlinks for awesome-cv.cls, fontawesome.sty and fonts directory to be able to generate without anythin missing. After that the repo structure should look like this:

─╼ ls -la 
total 24
drwxrwxr-x 4 bart bart 4096 wrz 29 15:14 .
drwxrwxr-x 3 bart bart 4096 wrz 29 15:07 ..
drwxrwxr-x 4 bart bart 4096 wrz 29 15:09 Awesome-CV
lrwxrwxrwx 1 bart bart   25 wrz 29 15:14 awesome-cv.cls -> Awesome-CV/awesome-cv.cls
lrwxrwxrwx 1 bart bart   26 wrz 29 15:14 fontawesome.sty -> Awesome-CV/fontawesome.sty
lrwxrwxrwx 1 bart bart   17 wrz 29 15:14 fonts -> Awesome-CV/fonts/
drwxrwxr-x 8 bart bart 4096 wrz 29 15:14 .git
-rw-rw-r-- 1 bart bart   94 wrz 29 15:09 .gitmodules
-rw-rw-r-- 1 bart bart   15 wrz 29 15:07 README.md

And there it is! Base is ready, now the CV itself.

2. Curicullum Vitae

Now its time to put the CV to the repo (will use files provided in example cv.tex). Remember that texlive-full packages is needed to generate.

─╼ cp -r Awesome-CV/examples/cv* .
─╼ xelatex cv.tex 
...
Overfull \hbox (24.6408pt too wide) in alignment at lines 10--28
[] [] 
) (./cv/experience.tex [1]) (./cv/extracurricular.tex) (./cv/honors.tex)
(./cv/presentation.tex [2]) (./cv/writing.tex) (./cv/committees.tex) [3]
(./cv.aux) )
(see the transcript file for additional information)
Output written on cv.pdf (3 pages).
Transcript written on cv.log.

3. Automate it with GitLab CI!

Last thing is to combine it and start a process of building basen on a repository change. Gitlab offers shared runners that are capable to launch custom docker image so decided to look for something that is having latex packages installed. Found a public container ubuntu-texlive-full!.

It would be nice to have a place to store our generated files and as its nothing else then static content Gitlab is offering Pages.
To be able to upload generated PDF files to pages you need to enable it in Gitlab. Later the only thing to setup is a special task.
It has to be at stage deploy and have to be called pages.
Everything is quite straightforward.

Now lets prepare .gitlab-ci.yml as this is a key automation file for gitlab.

.gitlab-ci.yml

image: ablu/ubuntu-texlive-full:latest
before_script:
    - apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y git imagemagick
    - git submodule update --init

pages:
  stage: deploy
  script:
    - xelatex cv.tex
    - convert -verbose -density 300 -trim cv.pdf -quality 100 cv.png
    - mkdir .public
    - cp -r cv.pdf .public/
    - cp -r cv*.png .public/
    - mv .public public
  artifacts:
    paths:
      - public
  only:
    - master

Commiting .gitlab-ci.yml to our repository will triger the build and start the building process. Every other change of master branch will trigger the build as well. I do also recommend to schedule a build once a day. Its couple of minutes and you have your Awesome-CV auto generated each day! Enjoy!