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