Aller au contenu

Auto Scaling de Runner Gitlab CI/CD sous AWS

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:

Terminal window
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 :

Terminal window
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:

Terminal window
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 :

Terminal window
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

Terminal window
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.

gitlab runner auto scale

gitlab runner auto scale

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.