GitLab Runner executes your CI/CD pipeline jobs either on a dedicated host outside your GitLab instance or on the same host as your GitLab instance. For CryptoHub code signing, you need a runner that can pull Docker images from public registries (i.e., Docker Hub and the Futurex public registry), then execute build and signing jobs in isolated containers. This ensures clean, reproducible builds and keeps your signing credentials off developer workstations.In this section, you install GitLab Runner on a Linux machine, register it with your GitLab project, and configure the Docker executor to handle both MinGW cross-compilation jobs and CryptoHub CLI signing jobs. Once complete, any pipeline run will automatically route build jobs (tagged mingw) and sign jobs (tagged codesign) to this runner.
Why: GitLab Runner’s Docker executor spawns ephemeral containers for each job. Without Docker, the runner cannot execute pipeline jobs.If Docker isn’t installed, add the official Docker repository and install:
As an extra precausion, run the following command to uninstall all conflicting packages before proceeding with the below commands to install Docker.
sudo gitlab-runner registerProvide the following values when prompted:<table> <thead> <tr> <th>Prompt</th> <th>Value</th> <th>Notes</th> </tr> </thead> <tbody> <tr> <td><strong>GitLab instance URL</strong></td> <td><code>https://gitlab.com</code> (or your instance URL)</td> <td>Include <code>https://</code></td> </tr> <tr> <td><strong>Registration token</strong></td> <td><code>[token from GitLab UI]</code></td> <td>Find in <strong>Settings > CI/CD > Runners</strong></td> </tr> <tr> <td><strong>Description</strong></td> <td><code>codesign-runner</code></td> <td>Appears in GitLab UI; be descriptive</td> </tr> <tr> <td><strong>Tags</strong></td> <td><code>mingw,codesign</code></td> <td>Comma-separated; critical for job routing</td> </tr> <tr> <td><strong>Maintenance note</strong></td> <td><code>[leave empty]</code></td> <td>Optional; press Enter to skip</td> </tr> <tr> <td><strong>Executor</strong></td> <td><code>docker</code></td> <td>Type <code>docker</code> exactly</td> </tr> <tr> <td><strong>Default Docker image</strong></td> <td><code>alpine:latest</code></td> <td>Fallback image; rarely used in practice</td> </tr> </tbody></table>**Why tags matter:** GitLab routes jobs to runners based on tags. A job tagged `mingw` will only run on runners with that tag. No tag match = job stuck in "pending" until the heat death of the universe.**Example registration session:**Runtime platform: arch=amd64 os=linuxEnter the GitLab instance URL: https://gitlab.comEnter the registration token: glrt-a8c3eFx9...Enter a description: codesign-runnerEnter tags for the runner (comma-separated): mingw,codesignEnter optional maintenance note:Registering runner... succeededEnter an executor: dockerEnter the default Docker image: alpine:latestRunner registered successfully.
Enter your registry credentials when prompted. This stores authentication in /home/gitlab-runner/.docker/config.json, which the runner automatically uses.
Add the signing pipeline: Configure .gitlab-ci.yml to use the mingw and codesign tags (covered in the next section).
Lock down image access: In production, replace allowed_images = ["*"] with an explicit allowlist.
-Monitor runner logs: Watch for failures: sudo journalctl -u gitlab-runner -f