154 слов | 1 минута

Конфигурация .gitlab-ci.yml

Файл .gitlab-ci.yml описывает шаги CI/CD pipeline в GitLab. Ниже — готовые шаблоны деплоя через FTP (LFTP) и SSH (RSYNC).

Деплой через RSYNC

rsync копирует только изменившиеся файлы, что ускоряет деплой на больших проектах:

stages:
  - deploy

deploy-job:
  stage: deploy
  script:
    - echo "Deploying application..."
    - rsync -av --no-perms --no-owner --no-group --exclude ".git*" $CI_PROJECT_DIR/ /var/www/project
    - echo "Application successfully deployed."

Деплой через LFTP (FTP)

Переменные $PROD_FTP_USER, $PROD_FTP_PASSWORD, $PROD_FTP_SERVER задаются в настройках группы или проекта GitLab.

before_script:
  - 'which lftp || ( apt-get update -y && apt-get install lftp -y )'

deploy_master:
  only:
    - master
  stage: deploy
  script:
    - lftp ftp://$PROD_FTP_USER:$PROD_FTP_PASSWORD@$PROD_FTP_SERVER -e \
      "set ftp:ssl-allow no; mirror --continue --reverse --delete --verbose --exclude=^\.git/$ . /; quit"

Пояснение параметров:

  • set ftp:ssl-allow no — отключает проверку SSL-сертификата на FTP-сервере
  • --reverse — копирует локальные файлы на удалённый сервер
  • --delete — удаляет на сервере файлы, отсутствующие в репозитории
  • --verbose — подробный вывод процесса (отключите на больших проектах)

Примечание: LFTP перезаливает проект целиком при каждом деплое. Подходит для небольших сайтов; для крупных проектов используйте RSYNC.

Исключение файлов логов при деплое

script:
  - lftp ftp://$PROD_FTP_USER:$PROD_FTP_PASSWORD@$PROD_FTP_SERVER -e \
    "set ftp:ssl-allow no; mirror --continue --reverse --delete --exclude=^logs\/.*\.log$ --exclude=^\.git/$ . /; quit"

Деплой через RSYNC по SSH

Для деплоя на сервер по SSH с аутентификацией по паролю:

image: ubuntu:20.04

deploy:
  before_script:
    - apt-get update -y
    - apt-get install -y rsync sshpass
    - export SSHPASS=$SSH_ANGERRO_PSWD
  script:
    - rsync --recursive --links --owner --group --times --verbose \
        --no-perms --chmod=D0700,F0700 \
        --rsh="sshpass -e ssh -o StrictHostKeyChecking=no" \
        --exclude '.git' --exclude '.gitlab-ci.yml' \
        ./ $SSH_ANGERRO_USER@$SSH_ANGERRO_SERVER:tickets/public_html/
  only:
    - master

Переменные окружения:

  • $SSH_ANGERRO_PSWD — пароль к серверу
  • $SSH_ANGERRO_USER — логин к серверу
  • $SSH_ANGERRO_SERVER — адрес сервера

Пояснение:

  • sshpass — выполняет SSH-команды без интерактивного ввода пароля
  • rsync синхронизирует только изменившиеся файлы
  • Файлы, переименованные или удалённые в Git, на сервере автоматически не удаляются — требуется ручная очистка

Подробная документация: rsync man page