DEV Community

Ederson Brilhante
Ederson Brilhante

Posted on

GitLab Runners as a Service with Github Action

TL;DR; This article will show how to implement the action "Gitlab Runner Service Action" in a "GitHub Workflow" that is triggered by a "GitLab-CI job", and this way having temporary GitLab Runners hosted by GitHub.

For more info about GitHub workflow, check the official documentation

For more info about GitLab-CI, check the official documentation


Steps

Step 1

Create a new GitHub repository with the following GitHub Workflow. File location: .github/workflows/gitlab-runner.yaml

name: Gitlab Runner Service
on: [repository_dispatch]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Maximize Build Space
        uses: easimon/maximize-build-space@master
        with:
          root-reserve-mb: 512
          swap-size-mb: 1024
          remove-dotnet: 'true'
          remove-android: 'true'
          remove-haskell: 'true'

      - name: Gitlab Runner
        uses: edersonbrilhante/gitlab-runner-action@main
        with:
          registration-token: "${{ github.event.client_payload.registration_token }}"
          docker-image: "docker:19.03.12"
          name: ${{ github.run_id }}
          tag-list: "crosscicd"
Enter fullscreen mode Exit fullscreen mode

What does this workflow do?

This workflow will run just when the event repository_dispatch is triggered. The first step will be to increase the free space removing useless packages for our GitLab runner. And the second step will run the action that registers a new GitLab Runner with a tag crosscicd, so start it and unregister it after a GitLab-CI job is completed with success or failure.

Step 2

Create a new GitLab repository with the following GitLab-CI config. File location: .gitlab-ci.yml

start-crosscicd:
  image: alpine
  before_script:
    - apk add --update curl && rm -rf /var/cache/apk/*
  script: |
    curl -H "Authorization: token ${GITHUB_TOKEN}" \
    -H 'Accept: application/vnd.github.everest-preview+json' \
    "https://api.github.com/repos/${GITHUB_REPO}/dispatches" \
    -d '{"event_type": "gitlab_trigger_'${CI_PIPELINE_ID}'", "client_payload": {"registration_token": "'${GITLAB_REGISTRATION_TOKEN}'"}}'

github:
  image: docker:latest
  services:
    - name: docker:dind
      alias: thedockerhost
  variables:
    DOCKER_HOST: tcp://thedockerhost:2375/
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
  script:
    - df -h
    - docker run --privileged ubuntu df -h
  tags:
    - crosscicd
Enter fullscreen mode Exit fullscreen mode

What does this gitlab-ci?

The job start-crosscicd will trigger the GitHub workflow, creating the GitLab runner with the tag crosscicd. And the job GitHub will wait for a runner with a tag crosscicd.

Step 3

Set the EnvVars in the new GitLab Repo

    GITHUB_REPO:<username>/<github-repo>
    GITHUB_TOKEN:<GitHub Access Token>
    GITLAB_REGISTRATION_TOKEN:<GitLab Registration Token>
Enter fullscreen mode Exit fullscreen mode

How to create a new GitHub Access Token:

How to get Registration Token:

  • Go to https://gitlab.com/<username>/<repo>/-/settings/ci_cd and click and expand Runners

  • Copy the Registration Token

Where to store the EnvVars?

  • Go to https://gitlab.com/<username>/<repo>/-/settings/ci_cd and click and expand Variables

  • Click in Add Variable and save it for each EnvVar

Step 4

Now your pipeline is ready to run the GitLab Runner in GitHub trigger by Gitlab-CI Job :)


Example

Video Demo

Screenshots

Job start-crosscicd trigger Github Workflow
Job start-crosscicd trigger Github Workflow

Workflow triggered by Gitlab-CI job
Workflow triggered by Gitlab-CI job

There is 17GB free by default
There is 17GB free by default

After Maximize we have 54GB free to use
After Maximize we have 54GB free to use

Register a Runner, Start it, and Unregister after the job in GitLab is completed
Register a Runner, Start it, and Unregister after the job in GitLab is completed

Code


That’s it!

In case you have any questions, please leave a comment here or ping me on 🔗 LinkedIn.

Discussion (0)