Je vous partage en exemple, mon fichier gitlab-ci.yml qui content 3 jobs
1) test_build
Le job test_build se lance uniquement sur ma branche de dev, Il me permet de vérifier que tout ce que j'ai poussé, fonctionnera lors du passage en production. Il va récupérer la base de production (restore.sh), faire un composer install + drush cim + drush updb (update.sh).
Dans cette étape, on pourrait lancer également les tests unitaires. (je n'ai pas de module custom, donc inutile dans mon cas).
Il est exécuté dans une image docker-compose, ce qui me permet de lancer la même stack que celle de prod sur le runner gitlab (runner-1).
2) job_integ_delivery
le job job_integ_delivery va mettre à jour mon serveur de test en se basant sur ma base de production.
Il est exécuté dans une image alpline pour exécuter les commandes ssh sur le serveur distant.
3) job_prod_delivery
le job_prod_delivery va mettre à jours mon environnement de production.
stages: - build - deploy before_script: - apk --update add openssh-client bash rsync - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' services: - docker:dind variables: DOCKER_DRIVER: overlay test_build: stage: build image: docker/compose:latest tags: - runner-1 script: - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY - bash scripts/init.sh dev - docker-compose up -d - docker-compose exec -T web composer install - bash scripts/restore.sh - docker-compose exec -T web bash ./scripts/update.sh only: refs: - dev job_integ_delivery: stage: deploy image: alpine:latest tags: - runner-1 script: - ssh docker@dockervm "cd /var/data/famillewallon-test && git checkout test && git pull" - ssh docker@dockervm "cd /var/data/famillewallon-test && ./scripts/restore.sh" - ssh docker@dockervm "cd /var/data/famillewallon-test && docker-compose exec -T web bash ./scripts/update.sh" only: refs: - test job_prod_delivery: stage: deploy image: alpine:latest tags: - runner-1 script: - ssh docker@prodsrv "cd /home/docker/data/famillewallon && git checkout master && git pull" - ssh docker@prodsrv "cd /home/docker/data/famillewallon && docker-compose exec -T web bash ./scripts/update.sh" only: refs: - master when: manual