Pourquoi utiliser un système de gestion de versions ?
Un système de gestion de versions (VCS) est un outil permettant de suivre les modifications apportées au code source d’un projet au fil du temps.
Son utilisation permet de :
Installation et configuration de Git
sudo apt install git-all
sudo dnf install git-all
git --version
pour que macOS propose de l’installer avec d’autres outils de développement.brew install git
ou de télécharger l’installateur.scoop install git
.main
comme nom par défaut.flowchart TD subgraph system subgraph global subgraph local node[Configuration] end end end
global
.local
peut également être utilisé pour des paramètres spécifiques à un projet.git config --global user.name "Prénom Nom"
git config --global user.email "utilisateur@domaine.tld"
git config --global http.proxy "http://proxy.domaine.tld:port"
git config --global https.proxy "http://proxy.domaine.tld:port"
git config --global no.proxy "exception1,exception2,localhost"
git config
permet également de connaître la valeur actuelle d’un paramètre.git config --list
--show-origin
permet d’indiquer en plus si une configuration vient du niveau system
, global
ou local
.git help <commande>
git help
sans préciser de nom de commande, Git écrira dans le terminal une liste des commandes les plus usuelles.Créer un dépôt, écrire des commits, gérer des multiples branches, consulter et manipuler l’historique
cd
) dans un dossier à transformer en dépôt et d’utiliser la commande :git init
.git
(caché sous UNIX, pour le voir : ls -la
) qui sert notamment à stocker l’historique.git status
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
1d0703d3
).git status
permet de connaître l’état de chaque fichierexemple.txt
, la commande git status
donne la sortie suivante :On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
exemple.txt
nothing added to commit but untracked files present (use "git add" to track)
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% classDiagram direction RL Index..Répertoire Dépôt..Index class Répertoire{ +exemple.txt a4d584 } class Index{ } class Dépôt{ }
git add <fichier>
.
à la place du nom du fichier pour demander à Git d’indexer tout le répertoire de travail.git status
reflète cette évolution :On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: exemple.txt
git rm --cached <fichier>
-f
peut être utilisée à la place de --cached
pour supprimer totalement le fichier.On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: exemple.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: exemple.txt
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% classDiagram direction RL Index<|--Répertoire : git add Dépôt..Index class Répertoire{ +exemple.txt a4d584 } class Index{ +exemple.txt a4d584 } class Dépôt{ }
git commit -m "Message de commit"
git status
:On branch main
nothing to commit, working tree clean
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% classDiagram direction RL Index..Répertoire Dépôt<|--Index : git commit class Répertoire{ +exemple.txt a4d584 } class Index{ } class Dépôt{ +exemple.txt a4d584 }
git commit -m
, la longueur du message est limitée à 49 caractères.--amend
:git commit --amend -m "Nouveau message de commit"
--no-edit
à la place de -m
.git mv <ancien_nom> <nouveau_nom>
git rm <fichier_a_supprimer>
.gitignore
(sans extension), qui continent la liste des fichiers et dossiers à ignorer..gitignore
doit être commité pour être pris en compte.%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit id: "3b1d805" commit id: "6a2b687" commit id: "49eb5d0" commit id: "8f7308f" commit id: "30d524c" tag: "HEAD"
git log
permet d’obtenir l’historique complet des commits d’un dépôt, dans l’ordre chronologique inversé :git log
commit 30d524c6603ed1982bdf82eb54d7215a00b22328 (HEAD -> main)
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:31:00 2023 +0200
Suppression du fichier exemple.txt devenu inutile
commit 8f7308fc1099a44fb25af05c3ee7c6a7ca17f111
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:30:31 2023 +0200
Correction d'une coquille dans le poème
commit 49eb5d06716e1f0668681b417a884b3d808bacda
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:30:02 2023 +0200
Le poème est plutôt un haiku
commit 6a2b687e994b4c8341adc6542c313cb860dad452
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:29:24 2023 +0200
Ajout d'un poème sur l'informatique
commit 3b1d805510f43af8e7b9da97d0bf44dca127a9d1
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Thu Apr 13 16:56:41 2023 +0200
Exemple de commit avec un fichier unique
--oneline
permet d’obtenir un affichage compact, avec une seule ligne par commit :git log --oneline
30d524c (HEAD -> main) Suppression du fichier exemple.txt devenu inutile
8f7308f Correction d'une coquille dans le poème
49eb5d0 Le poème est plutôt un haiku
6a2b687 Ajout d'un poème sur l'informatique
3b1d805 Exemple de commit avec un fichier unique
--stat
permet de connaître le nombre de modifications effectuées sur chaque fichier :git log --stat
commit 30d524c6603ed1982bdf82eb54d7215a00b22328 (HEAD -> main)
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:31:00 2023 +0200
Suppression du fichier exemple.txt devenu inutile
exemple.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
commit 8f7308fc1099a44fb25af05c3ee7c6a7ca17f111
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:30:31 2023 +0200
Correction d'une coquille dans le poème
haiku.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 49eb5d06716e1f0668681b417a884b3d808bacda
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:30:02 2023 +0200
Le poème est plutôt un haiku
poeme.txt => haiku.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
commit 6a2b687e994b4c8341adc6542c313cb860dad452
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Fri Apr 14 12:29:24 2023 +0200
Ajout d'un poème sur l'informatique
poeme.txt | 3 +++
1 file changed, 3 insertions(+)
commit 3b1d805510f43af8e7b9da97d0bf44dca127a9d1
Author: Maxence Lagalle <contact@maxence.lagalle.fr>
Date: Thu Apr 13 16:56:41 2023 +0200
Exemple de commit avec un fichier unique
exemple.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
--oneline
et --stat
.git log
supporte de nombreuses options permettant de filtrer l’historique selon plusieurs critères :-n <nombre>
: n derniers commits--before="AAAA-MM-JJ HH:mm"
: commits plus anciens qu’une date--after="AAAA-MM-JJ HH:mm"
: commits plus récents qu’une date--author="Nom"
: commits signés par un auteur-- <fichier>
: commits affectant un fichier-S
permet de rechercher une chaîne de caractères et d’afficher la liste des commits contenant cette chaîne à l’intérieur des fichiers qu’ils modifient :git log -S "Chaîne à rechercher"
-G
pour faire une recherche par expression régulière (regex).git blame
permet de connaître l’historique détaillé d’un fichier en précisant de quel commit viennent chacune de ses lignes dans leur rédaction actuelle :git blame <fichier>
git blame haiku.txt
6a2b687e poeme.txt (Maxence Lagalle 2023-04-14 12:29:24 +0200 1) Un clic malencontreux
8f7308fc haiku.txt (Maxence Lagalle 2023-04-14 12:30:31 +0200 2) Fichier important supprimé
6a2b687e poeme.txt (Maxence Lagalle 2023-04-14 12:29:24 +0200 3) Sauvegarde ? Jamais fait.
git diff
, il est possible d’effectuer des comparaisons entre deux états d’un fichier.49eb5d0
à l’état actuel du dépôt, c’est-à-dire au commit HEAD
:git diff 49eb5d0 HEAD
diff --git a/exemple.txt b/exemple.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/haiku.txt b/haiku.txt
index b3c75e6..2ba1e15 100644
--- a/haiku.txt
+++ b/haiku.txt
@@ -1,3 +1,3 @@
Un clic malencontreux
-Fichier portant supprimé
+Fichier important supprimé
Sauvegarde ? Jamais fait.
\ No newline at end of file
git diff
permet également de vérifier les modifications qui seront incluses dans le commit en cours de préparation en comparant l’index et le dernier commit :git diff --staged
git bisect
permet de retrouver un commit défectueux (par exemple, ayant introduit un bug) par recherche dichotomique.git bisect start
git bisect bad <mauvais commit, vide pour commit actuel>
git bisect good <bon commit>
Bisecting: X revisions left to test after this (roughly Y steps)
git bisect good
si le bug est absentgit bisect bad
si le bug est présent8f7308fc1099a44fb25af05c3ee7c6a7ca17f111 is the first bad commit
commit 8f7308fc1099a44fb25af05c3ee7c6a7ca17f111
...
git bisect reset
revert
permettant d’annuler les modifications d’un commit. Il consiste à écrire un nouveau commit qui continent l’inverse des modifications du commit original. Ce mécanisme s’utilise avec la commande suivante :git revert <commit_a_annuler>
git reset
permet de ramener un dépôt à un état antérieur en supprimant tous les commits réalisés après un commit donné :git reset <dernier_commit_a_conserver>
--soft
, le répertoire de travail est remis à l’état du commit ciblé et les modifications réalisées depuis sont remises dans l’index.--hard
réinitialise définitivement le répertoire de travail et l’index.git filter-branch --index-filter \
'git rm -rf --cached --ignore-unmatch <chemin_vers_le_fichier>' HEAD
git filter-repo --invert-paths --path <chemin_vers_le_fichier>
git tag <nom_du_tag> <commit>
-a
.git tag --list
git tag show <nom_du_tag>
git tag -d <nom_du_tag>
main
(anciennement master
).HEAD
est le tag du dernier commit de la branche actuellement active.%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit commit branch feature commit commit checkout main commit tag: "main" checkout feature commit tag: "feature, HEAD"
feature
est la branche active.git branch
:git branch
* feature
main
*
)-v
permet d’afficher en plus l’identifiant et le message du dernier commit de chaque branchegit branch
:git branch <nom_de_la_branche> <commit_initial>
HEAD
sera le point de départ de la nouvelle branche.git switch
permet de changer la branche active :git switch <branche_a_activer>
git checkout <branche>
HEAD
git stash
--include-untracked
permet d’également inclure les fichiers non suivis par Git.git stash pop
git stash drop
git stash list
git merge
, en précisant la branche source des modifications :git merge <branche_source>
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit commit id: "1-8a4f40a" branch feature commit commit checkout main commit checkout feature commit tag: "feature" checkout main merge feature id: "6-1a59d24" tag: "main, HEAD"
1-8a4f40a
) et y injecte les modifications issues de chaque branche, pour créer un nouveau commit dans la branche active, dit commit de merge.6-1a59d24
.classDiagram direction LR Commit1..Commit4 Commit1..Commit5 Commit4..Commit6 Commit5..Commit6 class Commit1 { fichier1.txt 41ad58 fichier2.txt 1efc25 fichier3.txt 690a41 } class Commit4 { fichier1.txt 914da0 fichier2.txt 1efc25 fichier3.txt 690a41 } class Commit5 { fichier1.txt 41ad58 fichier2.txt ea451d fichier3.txt 690a41 } class Commit6 { fichier1.txt 914da0 fichier2.txt ea451d fichier3.txt 690a41 }
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit commit branch feature commit commit checkout main merge feature tag: "main, feature, HEAD"
Git signale l’échec de la fusion automatique et les conflits dans la sortie de la commande git merge
:
Auto-merging sonnet.txt
CONFLICT (add/add): Merge conflict in sonnet.txt
Automatic merge failed; fix conflicts and then commit the result.
La commande git status
précise également qu’une fusion est en cours et la liste des fichiers en conflit :
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both added: sonnet.txt
no changes added to commit (use "git add" and/or "git commit -a")
<<<<<<< HEAD
Version de la branche cible
=======
Version de la branche source
>>>>>>> source
git config --global merge.conflictstyle diff3
<<<<<<< HEAD
Version de la branche cible
||||||| merged common ancestor
Version de l'ancêtre commun
=======
Version de la branche source
>>>>>>> source
git add
)git commit
), ce qui permettra de finaliser le commit de merge et la fusion des branches.sonnet.txt
avant résolution des conflits :<<<<<<< HEAD
=======
Quand l'écran s'allume, je tape sur mon clavier,
Et je me sens l'âme d'un héros bien armé,
Mais parfois c'est la guerre, les bugs sont aguerris,
Et je dois me résoudre à un peu de répit.
>>>>>>> alt-sonnet
Sur mon écran s'affichent des pixels brillants,
Des octets bien alignés, des programmes ardents,
Des virus dévastateurs, des spams envahissants,
Des câbles emmêlés, des bugs persistants.
<<<<<<< HEAD
Je pianote sur mon clavier, tel un virtuose,
Je créé des dossiers, des fichiers grandioses,
Je navigue sur le web, je me sens comme un rose,
Mais parfois je m'emmêle, je suis un peu névrose.
Je rêve de machines, de logiciels parfaits,
De claviers qui répondent à mes moindres souhaits,
De souris magiques qui font tout à ma place.
=======
Je rêve de machines, de logiciels parfaits,
D'ordinateurs qui pensent, qui lisent dans mes traits,
De robots programmés, qui m'apportent le café.
>>>>>>> alt-sonnet
Mais en attendant, je m'en remets à mon ordinateur,
Avec ses programmes parfois un peu farfelus,
Et je souris, car je sais qu'il est mon sauveur.
sonnet.txt
après résolution des conflits :Quand l'écran s'allume, je tape sur mon clavier,
Et je me sens l'âme d'un héros bien armé,
Mais parfois c'est la guerre, les bugs sont aguerris,
Et je dois me résoudre à un peu de répit.
Je pianote sur mon clavier, tel un virtuose,
Je créé des dossiers, des fichiers grandioses,
Je navigue sur le web, je me sens comme un rose,
Mais parfois je m'emmêle, je suis un peu névrose.
Je rêve de machines, de logiciels parfaits,
D'ordinateurs qui pensent, qui lisent dans mes traits,
De robots programmés, qui m'apportent le café.
Mais en attendant, je m'en remets à mon ordinateur,
Avec ses programmes parfois un peu farfelus,
Et je souris, car je sais qu'il est mon sauveur.
alt-sonnet
git status
permet de confirmer que la fusion est terminée après commit des modifications :On branch main
nothing to commit, working tree clean
git merge --abort
git cherry-pick
:git cherry-pick <identifiant_commit>
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit commit branch feature commit id: "2-7ed128b" tag: "feature" checkout main commit cherry-pick id: "2-7ed128b" commit commit tag: "main, HEAD"
2-7ed128b
, initialement présent dans la branche feature
a été intégré sans fusion à l’historique de la branche main
.git rebase
permet d’effectuer cette opération :git rebase <branche_source>
git add
git rebase --continue
git merge
:%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit id: "0-71af11d" commit id: "1-8a4f40a" branch feature commit id: "2-9358c74" commit id: "3-8151b64" checkout main commit id: "4-09aa3e3" checkout feature commit id: "5-af29107" tag: "feature" checkout main merge feature id: "6-1a59d24" commit id: "7-46ccbcb" tag: "main, HEAD"
git rebase
:%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit id: "0-71af11d" commit id: "1-8a4f40a" commit id: "2-9358c74" commit id: "3-8151b64" commit id: "5-af29107" commit id: "4-09aa3e3" commit id: "6-1a59d24" commit id: "7-46ccbcb" tag: "main, HEAD"
squash
permet à Git de rassembler plusieurs commits en un seul au moment d’une fusion, ce qui est une autre façon de linéariser un historique tout en le simplifiant.--squash
à git merge
:git merge --squash <branche_source>
-d
de git branch
permet de supprimer une branche :git branch -d <branche_a_supprimer>
-D
par sécurité)Se synchroniser avec un dépôt distant et travailler de manière collaborative, exploiter les fonctionnalités de la forge logicielle GitLab
ssh-keygen
:ssh-keygen -t ed25519
ed25519
est l’algorithme de génération des clés, s’appuyant sur l’algèbre des courbes elliptiques. Il existe également rsa
qui repose sur la théorie des nombres premiers.Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\<Utilisateur>/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\<Utilisateur>\.ssh\id_ed25519
Your public key has been saved in C:\Users\<Utilisateur>\.ssh\id_ed25519.pub
The key fingerprint is:
SHA256:nmqJx3Wutsb8fe75FUDLYiQqJk4E6ZeWe1X6FdvDM+w <Utilisateur>@<Hostname>
The key's randomart image is:
+--[ED25519 256]--+
| .o. . . . |
| .. ..o.o . |
|. ooo .o o*+ |
| .o=o .o .o.B. |
| o.. . S . . +. |
| . . ..o. E .|
| .o =oo .|
| . =.= .. ...|
| o.oo+. .++..|
+----[SHA256]-----+
cat C:\Users\<Utilisateur>\.ssh\id_ed25519.pub
git remote
permet de gérer les dépôts distants. Par convention, le dépôt distant principal d’un projet s’appelle origin
.git remote add origin git@gitlab.com:<nom-utilisateur>/<slug-projet>.git
git push -u origin --all
git push -u origin --tags
git clone
:git clone git@gitlab.com:<nom-utilisateur>/<slug-projet>.git
origin
.git push
permet d’envoyer les modifications (les commits) effectuées localement dans une branche :git push
origin
et y enverra les modifications locales.--set-upstream
permet de demander à Git de la créer sur le serveur.git pull
:git push --tags
git push --force-with-lease
--force
pour réécrire l’historique sans cette sécurité.git pull
:git pull
--rebase
.pull
est en fait l’enchaînement de deux opérations : fetch
pour télécharger les modifications, puis merge
pour les intégrer.main
.git push
seront alors systématiquement rejetées.git merge
sur une branche cible protégée.git pull
permet de répercuter la fusion sur le dépôt local.GitFlow, OneFlow, GitLab Flow
main
: branche principale et permanente, chaque version de main est vouée à être mise en productiondevelop
: branche permanente, soutenant la version de développementfeature
: branches éphémères tirées de develop
, dédiées au développement d’une fonctionnalitérelease
: branches éphémères tirées de develop
, servant aux ultimes correctifs avant mise en productionhotfix
: branches éphémères tirées de main
, permettant la correction de bugs en production%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit tag: "v1.0.0" branch develop order: 3 branch feature/US1 order: 4 commit commit checkout main branch hotfix/1.0.1 order: 1 commit checkout main merge hotfix/1.0.1 tag: "v1.0.1" checkout develop merge hotfix/1.0.1 branch feature/US2 order: 5 commit commit checkout feature/US1 commit checkout develop merge feature/US1 branch release/1.1.0 order: 2 commit commit checkout main merge release/1.1.0 tag: "v1.1.0" checkout develop merge release/1.1.0 checkout feature/US2 commit
git-flow
est généralement disponible pour installer cette extension.git flow
init
de git flow
:git flow init
Which branch should be used for bringing forth production releases?
Branch name for production releases: [main]
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Version tag prefix? [] v
feature start
:git flow feature start <nom_de_la_fonction>
develop
et l’activer.git flow feature publish <nom_de_la_fonction>
git flow feature pull origin <nom_de_la_fonction>
git flow feature finish <nom_de_la_fonction>
develop
, supprime la branche devenue inutile et réactive develop
.feature
par release
ou hotfix
:git flow release start <numero_de_version> <commit_de_depart>
main
.release
(resp., hotfix
) de n’importe quel commit de develop
(resp., main
).squash
ou les rebase
.main
qui sert de branche de développementfeature
pour les fonctionnalitésrelease
pour les mises en productionhotfix
pour les correctifs sur la productionrelease
et hotfix
s’achèvent par un tag qui permet d’identifier leur dernier commit comme étant prêt à être mis en production.%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit tag: "v1.0.0" branch hotfix/1.0.1 order: 1 branch feature/US1 order: 3 commit commit checkout main checkout hotfix/1.0.1 commit checkout main merge hotfix/1.0.1 tag: "v1.0.1" branch feature/US2 order: 4 commit commit checkout feature/US1 commit checkout main merge feature/US1 branch release/1.1.0 order: 2 commit commit checkout main merge release/1.1.0 tag: "v1.1.0" checkout feature/US2 commit
main
avant de les fusionner :%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit tag: "v1.0.0" branch hotfix/1.0.1 order: 1 checkout main checkout hotfix/1.0.1 commit checkout main merge hotfix/1.0.1 tag: "v1.0.1" branch feature/US1 order: 3 commit commit commit checkout main merge feature/US1 branch release/1.1.0 order: 2 commit commit checkout main merge release/1.1.0 tag: "v1.1.0" branch feature/US2 order: 4 commit commit commit checkout main merge feature/US2
main
est une branche perpétuelle qui sert au développement.%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%% gitGraph commit branch qualification order: 3 commit checkout main branch production order: 5 commit tag: "v1.0.0" checkout main branch feature/US1 order: 1 commit commit checkout production branch hotfix/1.0.1 order: 4 checkout hotfix/1.0.1 commit commit commit checkout production merge hotfix/1.0.1 tag: "v1.0.1" checkout qualification merge hotfix/1.0.1 checkout main merge qualification branch feature/US2 order: 2 commit commit checkout feature/US1 commit checkout main merge feature/US1 checkout qualification merge main checkout production merge qualification tag: "v1.1.0" checkout feature/US2 commit checkout main merge feature/US2 checkout qualification merge main
rebase
.Introduction aux pipelines GitLab CI/CD
runner
lorsque des événements surviennent un dépôt (comme un commit)..gitlab-ci.yml
et doit être placé à la racine du dépôt.# Commentaire
cle: valeur
parent:
enfant: valeur
liste:
- option 1
- option 2
niveau1:
niveau2:
niveau3a: valeur a
niveau3b: |
1 choix 1
2 choix 2
niveau3c:
- liste
jobs
, qui sont un ensemble d’instructions de ligne de commande (un script) qui doivent être exécutées par le runner :job:nom-du-job:
script:
- commande 1
- commande 2
job:build:
image: maven/3-eclipse-temurin-17 # Maven 3 + Java 17
script:
- mvn package
stages
qui s’exécuteront de manière séquencée.stages:
- build
- test
job:build:
image: maven/3-eclipse-temurin-17
stage: build
script:
- mvn package
job:unit-test:
image: maven/3-eclipse-temurin-17
stage: test
script:
- mvn test
rules
permet de fixer ces règles de lancement conditionnel pour un job.rules
, il est possible de fixer une ou plusieurs conditions avec if
.$CI_COMMIT_BRANCH
: branche du commit$CI_COMMIT_TAG
: tags du commit$CI_COMMIT_TITLE
: message du commitjob:deploy:
image: maven/3-eclipse-temurin-17
script:
- mvn deploy
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_TITLE =~ /Deploy.*/
deploy
ne s’exécutera que si le pipeline est déclenché depuis la branche main
ou si le message de commit débute par “Deploy”.when
permet de modifier ce comportement.when
peut être combiné avec rules
pour créer des scénarios d’exécution complexes.on_success
: seulement si tous les jobs de l’étape précédente réussissent (mode par défaut)on_failure
: seulement si au moins un job de l’étape précédente a échouéalways
: toujours exécuter ce jobnever
: ne jamais exécuter ce job (utile en combinaison avec rules
)manual
: ne pas exécuter automatiquement ce job, mais permettre de le lancer manuellementallow-failure: true
job:deploy:
image: maven/3-eclipse-temurin-17
script:
- mvn deploy
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_TITLE =~ /Deploy.*/
when: manual
deploy
ne se lancera plus automatiquement si le commit commence par “Deploy”, mais une option permettant de le lancer manuellement sera proposée à la place.cache
doit préciser les fichiers et dossiers concernés dans le sous-bloc paths
.policy
:pull
: récupérer le cache, mais ne pas écrire les modificationspush
: ne pas récupérer le cache, mais écrire les modificationsstages:
- build
- verify
job:build:
image: maven/3-eclipse-temurin-17
stage: build
script:
- mvn package
cache:
paths:
- target
policy: push
target
sera mis en cache pour être réutilisé à l’étape verify
.artifacts
.artifacts
se décompose en plusieurs sous-blocs :paths
permet de définir les fichiers et dossiers du runner à rendre disponiblesname
définit le nom de l’archive zip qui contiendra l’artefactexpire_in
fixe la durée de vie de l’artefact. Par défaut, cette durée s’exprime en secondes, mais il est possible de préciser une autre unité.stages:
- build
- verify
job:build:
image: maven/3-eclipse-temurin-17
stage: build
script:
- mvn package
artifacts:
paths:
- target
name: build
expire_in: 1 week
target
disponible au téléchargement dans un fichier nommé build.zip
. Ce fichier sera conservé par GitLab pendant 1 semaine.