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:
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 REgPydPBPreparing the "docker+machine" executor00:09Using 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 environment00:00Running on runner-regpydpb-project-31197695-concurrent-0 via runner-regpydpb-gitlab-runner-1637074439-dab4db3c...
/builds/Bob74/test-aws/.terraform/: found 9 matching files and directoriesUploading cache.zip to https://gitlab-runner-steph.s3.dualstack.eu-west-2.amazonaws.com/project/31197695/builds/Bob74/test-aws-1Created cacheCleaning up project directory and file based variables00:01Job 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.