Schöne Anleitung. Ich hätte nur einen Verbesserungsvorschlag und einen Hinweis. Statt bei jedem Deployment den Container immer neu zu bauen, würde ich einen vorbereiten, bei dem rsync schon installiert ist. Da GitLab ja auch eine eigene Docker-Registry hat, kannst du diese auch direkt für die Speicherung dieses Containers nutzen.

Und noch effektiver als ein Deployment mit rsync ist eines per Git, sofern auf dem Server vorhanden. Meine .gitlab-ci.yml sieht in etwa wie folgt aus:

stages:
- deploy
variables:
  # Setting some global variable used later in some script.
  # Values can be overwritten in individual jobs.
  SSH_HOST: [user]@[www.example.com]
  SSH_DOCUMENT_ROOT: /path/to/document/root
.ssh_git_deployment: &ssh_git_deployment
  image: gitlab-registry.example.com/gitlab/gitlab-ci-git-deploy
  stage: deploy
  script:
  - ssh $SSH_HOST "cd $SSH_DOCUMENT_ROOT && git fetch && git checkout $CI_COMMIT_SHA && git submodule foreach git fetch --tags && git submodule update"
deploy:staging:
  <<: *ssh_git_deployment
  environment: staging
  # This is an example of an overwritten variable.
  # The other variable SSH_HOST will be used as defined globally.
  variables:
    SSH_DOCUMENT_ROOT: ~/domains/staging.example.com/public_html
  only:
  - master
deploy:production:
  <<: *ssh_git_deployment
  environment: production
  only:
  - tags
  when: manual

Das Deployment passiert hier aus Staging immer bei einem Push auf master, der immer stabil ist. Ein Push auf Production wird manuell über GitLab ausgeführt und ist nur auf Tags zugelassen. Auch die Rollbacks sind hierdurch super einfach möglich.

Der Image gitlab-ci-git-deploy beinhaltet schon alles, was notwendig ist. Lediglich der Public-Key muss dann noch auf dem Zielsystem für den Nutzer in die Datei ~/.ssh/authorized_keys eingetragen werden.

Aber wenn es mal kein Git auf dem Zielsystem gibt, ist deine Anleitung wirklich sehr hilfreich. Werde ich mal ausprobieren, denn mit Git-FTP kommt es genau zu dem beschriebenen Problem, dass nicht immer alle Dateien auf einmal übertragen werden können.