2017-06-23 17:58:45 +02:00
|
|
|
# Howto Gitlab CI
|
|
|
|
|
|
|
|
Gitlab CI/CD permet de mettre en place des processus d'intégration continue pour
|
|
|
|
tester, *builder* et déployer vos projets Gitlab.
|
|
|
|
|
|
|
|
Cet outil est intégré directement dans Gitlab et est simple à mettre en place.
|
|
|
|
|
|
|
|
Les composants essentiels pour utiliser le CI sont un **Gitlab Runner** et
|
|
|
|
le fichier de configuration `.gitlab-ci.yml` propre à chaque projet.
|
|
|
|
|
|
|
|
|
|
|
|
## Gitlab Runner
|
|
|
|
|
2017-06-23 18:07:25 +02:00
|
|
|
Gitlab Runner est l'application avec laquelle s'exécute les scripts définis dans
|
2017-06-23 17:58:45 +02:00
|
|
|
le fichier de configuration `.gitlab-ci.yml`. Écrit en Go, Runner se déploie
|
|
|
|
sur n'importe quelle plateforme supportant le language.
|
|
|
|
|
|
|
|
Voir: [Installer Gitlab Runner](https://docs.gitlab.com/runner/install/)
|
|
|
|
|
|
|
|
### Installer un Runner avec Docker
|
|
|
|
|
|
|
|
L'une des façons les plus simples de mettre en place un Runner est avec Docker.
|
|
|
|
Il suffit de lancer le conteneur en utilisant la commande suivante:
|
|
|
|
|
2017-06-23 18:07:54 +02:00
|
|
|
```
|
2017-06-23 17:58:45 +02:00
|
|
|
$ docker run -d --name gitlab-runner --restart always \
|
|
|
|
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
|
|
|
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
|
|
gitlab/gitlab-runner:latest
|
|
|
|
```
|
|
|
|
|
|
|
|
Ensuite il faut générer la configuration du runner en lançant la commande
|
|
|
|
suivante:
|
|
|
|
|
|
|
|
`$ docker exec -it gitlab-runner gitlab-runner register`
|
|
|
|
|
|
|
|
Les informations requises pour configurer un runner sont:
|
|
|
|
|
|
|
|
- L'URL du coordinateur CI (ex: https://gitlab.evolix/ci)
|
|
|
|
- Un token généré dans Gitlab pour ce runner
|
|
|
|
- Un nom descriptif pour ce runner
|
|
|
|
- [Optionel] Les tags des tâches que ce runner peut accepter
|
|
|
|
|
|
|
|
Un runner peut être spécifique à un projet particulier ou être disponible pour
|
|
|
|
tous les projets (partagé).
|
|
|
|
|
|
|
|
**Pour un runner spécifique**
|
|
|
|
|
|
|
|
Utiliser le token disponible dans la configuration du projet sous l'onglet *CI/CD*.
|
|
|
|
|
|
|
|
**Pour un runner partagé**
|
|
|
|
|
|
|
|
Utiliser le token disponible dans la configuration de Gitlab sous l'onglet
|
|
|
|
*Overview* puis *Runners*.
|
|
|
|
|
|
|
|
--
|
|
|
|
|
|
|
|
Une fois la configuration terminée, le runner sera enregistré auprès de votre
|
2017-06-23 18:07:25 +02:00
|
|
|
instance Gitlab, prêt à exécuter vos tâches !
|
2017-06-23 17:58:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
## Fichier de configuration `.gitlab-ci.yml`
|
|
|
|
|
|
|
|
Ce fichier de configuration doit être situé à la racine de votre projet.
|
|
|
|
|
2017-06-23 18:07:25 +02:00
|
|
|
Il définit l'environnement, le *pipeline* et tout ce qui doit être exécuté pour
|
2017-06-23 17:58:45 +02:00
|
|
|
tester, *builder* et déployer le projet.
|
|
|
|
|
|
|
|
Vous pouvez consulter la
|
|
|
|
[documentation complète](https://docs.gitlab.com/ce/ci/yaml/README.html)
|
|
|
|
pour connaitre toutes les options disponibles.
|
|
|
|
|
|
|
|
### Example standard
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
image: debian:jessie
|
|
|
|
services:
|
|
|
|
- postgres
|
|
|
|
|
|
|
|
before_script:
|
|
|
|
- bundle install
|
|
|
|
|
|
|
|
after_script:
|
|
|
|
- rm secrets
|
|
|
|
|
|
|
|
stages:
|
|
|
|
- build
|
|
|
|
- test
|
|
|
|
- deploy
|
|
|
|
|
|
|
|
job1:
|
|
|
|
stage: build
|
|
|
|
script:
|
|
|
|
- execute-script-for-job1
|
|
|
|
only:
|
|
|
|
- master
|
|
|
|
tags:
|
|
|
|
- docker
|
|
|
|
```
|
|
|
|
|
|
|
|
### Exemple pour déployer un site web avec Rsync
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
# Stages to execute
|
|
|
|
stages:
|
|
|
|
- staging
|
|
|
|
- deploy
|
|
|
|
|
|
|
|
# Global variables
|
|
|
|
variables:
|
|
|
|
WWW_MOD: "D750,F640"
|
|
|
|
|
|
|
|
# Add SSH private key to deploy to prod/staging server
|
|
|
|
before_script:
|
2017-06-23 18:08:35 +02:00
|
|
|
- apt update -y && apt install -y rsync
|
|
|
|
- 'which ssh-agent || ( apt install openssh-client -y )'
|
2017-06-23 17:58:45 +02:00
|
|
|
- eval $(ssh-agent -s)
|
|
|
|
- ssh-add <(echo "$SSH_PRIVATE_KEY")
|
|
|
|
- mkdir -p ~/.ssh
|
|
|
|
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
|
|
|
|
|
|
|
# Deploy instruction for stage "staging"
|
|
|
|
# On master only
|
|
|
|
# Automatic
|
|
|
|
deploy_staging:
|
|
|
|
stage: staging
|
|
|
|
variables:
|
|
|
|
WWW_USER: "..."
|
|
|
|
script:
|
|
|
|
- rsync -av --chmod=$WWW_MOD --delete --exclude .git $CI_PROJECT_DIR/www/ $WWW_USER@webserver.example.com:~/www/
|
|
|
|
environment:
|
|
|
|
name: staging
|
|
|
|
url: https://staging.example.com
|
|
|
|
only:
|
|
|
|
- master
|
|
|
|
|
|
|
|
# Deploy instruction for stage "prod"
|
|
|
|
# On master only
|
|
|
|
# Only on manual action
|
|
|
|
deploy_prod:
|
|
|
|
stage: deploy
|
|
|
|
variables:
|
|
|
|
WWW_USER: "..."
|
|
|
|
script:
|
|
|
|
- rsync -av --chmod=$WWW_MOD --delete --exclude .git $CI_PROJECT_DIR/www/ $WWW_USER@webserver.example.com:~/www/
|
|
|
|
environment:
|
|
|
|
name: production
|
|
|
|
url: https://example.com
|
|
|
|
when: manual
|
|
|
|
only:
|
|
|
|
- master
|
|
|
|
```
|