Aller au contenu principal

Auto Scaling de Runner Gitlab CI/CD sous AWS

· 2 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Suite à ma à l'écriture de ma configuration Terraform permettant de provisionner des machines EC2 AWS, je me suis fixé comme objectif de configurer Gitlab pour qu'il utilise mes propres runners dynamiquement.

Pour provisionner la machine je vous conseille d'utiliser la configuration du précédent billet.

Ecriture du playbook Ansible

Je vais utiliser le role gitlab-runner de riemers ce qui va simplifier énormément son écriture:

ansible-galaxy install riemers.gitlab-runner

Le playbook :

---
- hosts: tag_Name_gitlab_runner
  gather_facts: true
  check_mode: false
  become: true
  vars:
    - gitlab_runner_registration_token: "{{ lookup('env','GITLAB_TOKEN') }}"
    - gitlab_runner_coordinator_url: "https://gitlab.com/"
    - gitlab_runner_runners:
        - name: "Example autoscaling GitLab Runner"
          cache_type: s3
          cache_s3_bucket_name: "gitlab-runner-test"
          cache_s3_access_key: "{{ lookup('env','AWS_ACCESS_KEY_ID') }}"
          cache_s3_secret_key: "{{ lookup('env','AWS_SECRET_ACCESS_KEY') }}"
          state: present
          executor: "docker+machine"
          concurrent_specific: "0"
          run_untagged: true
          extra_configs:
            runners.machine:
              IdleCount: 1
              IdleTime: 1800
              MaxBuilds: 10
              MachineDriver: "amazonec2"
              MachineName: "gitlab-runner-%s"
              MachineOptions: [
                "amazonec2-access-key={{ lookup('env','AWS_ACCESS_KEY_ID') }}",
                "amazonec2-secret-key={{ lookup('env','AWS_SECRET_ACCESS_KEY') }}",
                "amazonec2-region=eu-west-2",
                "amazonec2-zone=c",
                "amazonec2-vpc-id=vpc-dsdsdsdsdsdsd",
                "amazonec2-subnet-id=subnet-sdsdsdsdsdds",
                "amazonec2-tags=gitlab-runner-dyn",
                "amazonec2-instance-type=t2.micro"
              ]
  pre_tasks:
    - name: Install docker-machine
      get_url:
        url: https://gitlab-docker-machine-downloads.s3.amazonaws.com/v0.16.2-gitlab.2/docker-machine
        dest: /usr/local/bin/docker-machine
        mode: '0755'

  roles:
    - riemers.gitlab-runner

Avant de la lancer il faudra au préalable exporter les variables suivantes avec vos propres valeurs :

export AWS_ACCESS_KEY_ID="xxcxcxcxcxcxcxcx"
export AWS_SECRET_ACCESS_KEY="ddssd/dsds/sdssdssdsdsdsdsd"
export GITLAB_TOKEN="dsdsdsdsdsdgrfdv"

Il faut également récupérer le vpc et le subnet de votre machine EC2 et les mettre dans le playbook:

aws ec2 describe-instances --region eu-west-2 |grep -iE "vpc|subnet"

C'est on est prêt on peut lancer le playbook en utilisant l'inventaire ec2 :

ansible-playbook provision-runner.yml

Au bout de quelques minutes tout devrait être configuré. Reste à créer le bucket S3.

Lançons un test sur simple job. Le resultat

Running with gitlab-runner 14.4.0 (4b9e985a)
  on Example autoscaling GitLab Runner REgPydPB
Preparing the "docker+machine" executor
00:09
Using Docker executor with image registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.0.3 ...
Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.0.3 ...
Using docker image sha256:11c22bfccc890f4912745d868b2de1a1e3a224bdfce5bf90e64386881b014d62 for registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.0.3 with digest registry.gitlab.com/gitlab-org/terraform-images/releases/terraform@sha256:414ed3939a58a458fe945ceff9660b65df18b0a00678cd6f0f28b0a4d1563259 ...
Preparing environment
00:00
Running on runner-regpydpb-project-31197695-concurrent-0 via runner-regpydpb-gitlab-runner-1637074439-dab4db3c...


/builds/Bob74/test-aws/.terraform/: found 9 matching files and directories
Uploading cache.zip to https://gitlab-runner-steph.s3.dualstack.eu-west-2.amazonaws.com/project/31197695/builds/Bob74/test-aws-1
Created cache
Cleaning up project directory and file based variables
00:01
Job succeeded

Tout fonctionne le cache est bien provisionné dans le bucket S3 et notre machine apparaît dans la console AWS.

Il faut encore travailler la partie sécurisation du tout mais ca prend le bon chemin. Renovate va pouvoir remplir sa mission en toute quiétude.