Autres
CI/CD Dév
Apprendre des technologies pour savoir faire un peu de qualité
🗓
Dernière maj le 14 octobre 2020
Le but de ce TP est de monter une pipeline de test dev maison. Le tp permet de vous apprendre certaine technologie, au menu :
  • First day
    • Setup Gitlab
    • Un bout de code ?
    • Une première pipeline
    • Linting de code
  • Second day
    • Gitlab : Docker integration
    • Sonarqube

First day

Setup Gitlab

  • création de compte
  • création d'un dépôt de test

Un bout de code ?

Le mieux pour effectuer ensuite des tests d'intégration et effectuer du déploiement facilement ça serait d'avoir une petite app API REST. Utilisez le langage/framework de votre choix pour coder une API simpliste (une ou deux entités, avec du GET/POST/DELETE simplement).

Une première pipeline

Dans l'interface de Gitlab, sur un dépôt donné, vous trouverez dans le volet de gauche un menu CI/CD, où vous verrez vos pipelines s'exécuter.
Afin de déclencher une pipeline, il faut un fichier .gitlab-ci.yml à la racine de votre dépôt git.
Exemple de structure :
1
stages:
2
- first_test
3
4
first-test:
5
stage: first_test
6
image: debian
7
script:
8
- echo 'toto'
Copied!
Tester ce premier fichier .yml.

Linting de code

Créer une nouvelle pipeline qui met en place du linting. Pour ce faire :
  • trouver un binaire qui est capable de lint votre code (par exemple pylint pour Python)
  • utiliser une image Docker qui contient ce binaire
  • créer une pipeline qui mobilise cette image afin de tester votre code

Second day

Gitlab : Docker integration

Il est possible d'utiliser les pipelines de CI/CD pour construire et packager des images Docker. Ces images peuvent ensuite être utilisées à des fins de dév, ou poussées sur une infra de prod.
Gitlab embarque nativement un registre Docker (un registre permet d'héberger des images Docker, à l'instar du Docker Hub).
Lors du déroulement d'une pipeline, plusieurs variables d'environnement sont disponibles à l'intérieur du fichier .gitlab-ci.yml. On peut par exemple récupérer dynamiquement le nom de la branche qui est en train d'être poussée, l'ID de commit ou encore, l'adresse du registre Docker associé à l'instance Gitlab.
Pour tester tout ça, on va avoir besoin de deux fichiers :
  • un Dockerfile
    • décrit comment construire une image Docker
  • un .gitlab-ci.yml qui fait appel à des commandes docker pour construire et pousser les images sur le registre
Exemple de setup simple :
1
FROM alpine
2
3
RUN apk update
Copied!
1
image: docker:18
2
3
stages:
4
- build
5
- push
6
7
services:
8
- docker:dind
9
10
before_script:
11
- echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
12
13
Build:
14
stage: build
15
script:
16
- >
17
docker build
18
--pull
19
--build-arg VCS_REF=$CI_COMMIT_SHA
20
--build-arg VCS_URL=$CI_PROJECT_URL
21
--cache-from $CI_REGISTRY_IMAGE:latest
22
--tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
23
.
24
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
25
26
Tag master as latest:
27
variables:
28
GIT_STRATEGY: none
29
stage: push
30
only:
31
- master
32
script:
33
- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
34
- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
35
- docker push $CI_REGISTRY_IMAGE:latest
Copied!
Testez le build et push automatique de conteneur :
  • ajouter ces fichiers à un dépôt Gitlab
  • une fois le push effectué et la pipeline terminée, un nouvel onglet est disponible lorsque vous consultez le projet depuis la WebUI Packages & Registries > Container Registry
Pour pousser un peu plus, vous pouvez créer un Dockerfile vous-même qui package dans une image Docker votre code et le pousse sur le registry. Si vous avez Docker sur votre machine, vous pourrez ensuite directement récupérer les images avec un docker pull.

Sonarqube

Bon. Pour Sonarqube c'est compliqué d'utiliser l'instance publique gitlab.com et Sonarqube de concert si on a pas accès facilement à une IP publique pour tout le monde.
L'alternative : un docker-compose.yml qui monte ce qu'il faut pour reproduire un environnement de travail similaire à Gitlab. Vous pouvez le lancer dans une VM pour avoir cette stack en local et utiliser Sonarqube.
Le docker-compose.yml est clairement inspiré du TP infra et embarque :
  • Gitea
    • gère des dépôts gits
    • gestion de users/permissions
  • Drone
    • Pipeline de CI
  • Registre Docker
  • Sonarqube
    • Analyse de code
Steps :
  • installer Docker et docker-compose en suivant la documentation officielle
    • dans une VM Linux si vous pouvez
    • sur votre hôte c'est possible, je vous laisse gérer votre environnement :)
  • récupérer le docker-compose.yml et le placer dans un répertoire de travail
1
# sonarqube : 8080
2
# gitea : 3000
3
# drone : 80
4
version: "3.7"
5
6
services:
7
gitea:
8
image: gitea/gitea:1.10.3
9
environment:
10
- APP_NAME=Gitea
11
- USER_UID=1000
12
- USER_GID=1000
13
- ROOT_URL=http://ci:3000
14
- SSH_DOMAIN=ci
15
- SSH_PORT=2222
16
- HTTP_PORT=3000
17
- DB_TYPE=postgres
18
- DB_HOST=gitea-db:5432
19
- DB_NAME=gitea
20
- DB_USER=ci
21
- DB_PASSWD=ci
22
restart: always
23
volumes:
24
- gitea:/data
25
ports:
26
- "3000:3000"
27
- "2222:2222"
28
networks:
29
ci:
30
aliases:
31
- "ci"
32
33
gitea-db:
34
image: postgres:alpine
35
container_name: gitea-db
36
restart: always
37
volumes:
38
- gitea-db:/var/lib/postgresql/data
39
environment:
40
- POSTGRES_DB=gitea
41
- POSTGRES_USER=ci
42
- POSTGRES_PASSWORD=ci
43
networks:
44
- ci
45
46
drone-server:
47
image: drone/drone:1.2.1
48
container_name: drone-server
49
ports:
50
- 80:80
51
- 9000
52
volumes:
53
- drone:/var/lib/drone/
54
restart: always
55
depends_on:
56
- gitea
57
environment:
58
- DRONE_RPC_SECRET=9c3921e3e748aff725d2e16ef31fbc42
59
- DRONE_OPEN=true
60
- DRONE_GITEA=true
61
- DRONE_NETWORK=ci
62
- DRONE_DEBUG=true
63
- DRONE_ADMIN=ci
64
- DRONE_USER_CREATE=username:ci,admin:true
65
- DRONE_SERVER_PORT=:80
66
- DRONE_DATABASE_DRIVER=postgres
67
- DRONE_DATABASE_DATASOURCE=postgres://ci:[email protected]:5432/postgres?sslmode=disable
68
- DRONE_GIT_ALWAYS_AUTH=false
69
- DRONE_GITEA_SERVER=http://gitea:3000
70
- DRONE_SERVER_HOST=drone-server:80
71
- DRONE_HOST=http://drone-server:80
72
- DRONE_SERVER_PROTO=http
73
- DRONE_TLS_AUTOCERT=false
74
- DRONE_AGENTS_ENABLED=true
75
networks:
76
- ci
77
78
drone-agent:
79
image: drone/agent:1.2.1
80
container_name: drone-agent
81
command: agent
82
restart: always
83
depends_on:
84
- drone-server
85
volumes:
86
- /var/run/docker.sock:/var/run/docker.sock
87
- drone-agent:/data
88
environment:
89
- DRONE_RPC_SERVER=http://drone-server:80
90
- DRONE_RPC_SECRET=9c3921e3e748aff725d2e16ef31fbc42
91
- DRONE_RUNNER_CAPACITY=1
92
- DRONE_RUNNER_NETWORKS=ci
93
networks:
94
- ci
95
sonarqube:
96
image: sonarqube
97
expose:
98
- 9000
99
ports:
100
- "8080:9000"
101
networks:
102
- ci
103
environment:
104
- SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar
105
- SONARQUBE_JDBC_USERNAME=sonar
106
- SONARQUBE_JDBC_PASSWORD=sonar
107
volumes:
108
- sonarqube_conf:/opt/sonarqube/conf
109
- sonarqube_data:/opt/sonarqube/data
110
- sonarqube_extensions:/opt/sonarqube/extensions
111
- sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
112
113
db:
114
image: postgres
115
networks:
116
- ci
117
environment:
118
- POSTGRES_USER=sonar
119
- POSTGRES_PASSWORD=sonar
120
volumes:
121
- postgresql:/var/lib/postgresql
122
- postgresql_data:/var/lib/postgresql/data
123
registry:
124
restart: always
125
image: 'registry:2'
126
ports:
127
- "5000:5000"
128
environment:
129
REGISTRY_AUTH: htpasswd
130
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
131
REGISTRY_AUTH_HTPASSWD_REALM: bap
132
volumes:
133
- registry:/var/lib/registry
134
- registry-auth:/auth
135
136
volumes:
137
sonarqube_conf:
138
sonarqube_data:
139
sonarqube_extensions:
140
sonarqube_bundled-plugins:
141
postgresql:
142
postgresql_data:
143
gitea: {}
144
gitea-db: {}
145
drone: {}
146
drone-agent: {}
147
registry:
148
registry-auth:
149
150
networks:
151
ci:
152
name: ci
Copied!
  • lancer la stack avec un docker-compose up -d
  • ajouter une ligne à votre fichiers hosts pour faire pointer le nom ci vers l'IP de la machine qui porte la stack
Les différents WebUI sont dispos sur des ports différents :
  • Gitea : http://ci:3000
  • Drone : http://ci
  • Sonarqube : http://ci:8080
Steps :
  • aller sur la WebUI de Gitea
    • onglet Explore
    • laisser les paramètres par défaut SAUF : n'oubliez pas la création d'un utilisateur admin (tout en bas)
    • vous authentifier pour vérifier le bon fonctionnement
    • créer un dépôt et y pousser du code
  • aller sur la WebUI de Sonarqube
    • se log avec admin:admin
    • aller dans les paramètre du compte My Account puis onglet Security
    • générer un token et notez le somewhere
  • aller sur la WebUI de Drone
    • les credentials sont les mêmes que pour Gitea
    • déclencher une synchro avec Gitea
    • activer le dépôt et configurez-le :
      • cocher "Trusted"
      • définir deux variables :
        • sonar_host : http://sonarqube:9000
        • sonar_token : <YOUR_TOKEN>
  • ajouter un .drone.yml à la racine de votre dépôt
1
ind: pipeline
2
type: docker
3
name: code-analysis
4
5
steps:
6
- name: code-analysis
7
image: aosapps/drone-sonar-plugin
8
settings:
9
sonar_host:
10
from_secret: sonar_host
11
sonar_token:
12
from_secret: sonar_token
Copied!
  • git push tout ça
  • vous devriez voir votre code sur Gitea, testé dans Drone, analysé dans Sonarqube
Explorez une peu l'interface de Sonarqube une fois qu'il est en place, beaucoup de métriques intéressantes y remontent.
Drone est quant à lui un outil minimaliste mais puissant. Vous pouvez mettre en place une pipeline similaire à celle de Gitlab sous Drone.
Dernière mise à jour 10mo ago