Regular readers of this blog know that I’m using Jekyll to generate the static site. I’m using GitLab: when I push on the
master branch, it triggers the generation job.
However, Jekyll is Ruby-based and requires a couple of Gem dependencies. I’ve also added a few plugins. For this reason, I’ve created a Docker image with all required dependencies. Regularly, I update the versions in the
Gemfile.lock via Bundler. Afterward, I need to rebuild the Docker image.
Hence, two jobs are necessary:
- After a push containing a change that influences the Docker image, build it
- After any push, generate the site.
For the first, the trigger condition is whether any of the following files have been changed:
The problem is how to run a build only if the condition is met, as it’s an expensive and time-consuming operation. GitLab’s build file configuration offers a solution for this. In a job, you can configure an
only clause to run only if a condition is met. The condition can be:
- A reference, e.g., a branch, or a tag
- A trigger, e.g., a push, the web UI or an API call
- The value of a variable
- A change on a specific file
- A couple of others
The next to last option is the answer to our problem. We can configure a set of files, and if any of them has been changed, the build should run. Otherwise, do nothing.
It translates into the following structure:
stages: - image (1) - deploy (1) build: (2) stage: image (2) image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] script: # Build the Docker image only: refs: - master (4) changes: - Gemfile.lock (5) - Dockerfile (5) - .gitlab-ci.yml (5) pages: (3) stage: deploy (3) image: name: registry.gitlab.com/nfrankel/nfrankel.gitlab.io:latest script: # Generate the site only: refs: - master
|1||Define the two stages|
|2||Define the |
|3||Define the |
|4||Build the |
|5||Only build the image if any of these files have changed|
At this point, each change triggers the build: the image building job runs before the site generation, but GitLab skips the former if the image hasn’t changed.