Самый ясный и краткий способ описать команды SSH в .gitlab-ci.yml - PullRequest
1 голос
/ 30 июня 2019

Обычно я выполняю следующую работу в .gitlab-ci.yml для выполнения команд на удаленном сервере через SSH:

# The job
deploy:
  script:
    # I've omitted the SSH setup here
    - |
      ssh gitlab@example.com "
        # Makes the server print the executed commands to stdout. Otherwise only the command output is printed. Required for monitoring and debug.
        set -x &&

        # Executes some commands
        cd /var/www/example &&
        command1 &&
        command2 &&
        command3 &&
        command4 &&
        command5
      "

Он работает правильно, но код YAML выглядит слишком сложным:

  • Команда set -x - это скорее шаблон, чем полезный код. Это не требуется для обычных команд CI, потому что GitLab CI печатает их автоматически.
  • && на каждой линии тоже шаблон. Они делают остановку выполнения при сбое одной из команд. В противном случае следующие команды будут выполнены при сбое (в отличие от обычных команд задания).
  • Все команды SSH представляют собой одну строку YAML, поэтому редакторы не выделяют комментарии и команды, поэтому код трудно читать.

Существует ли более понятный и удобный способ выполнения нескольких команд на удаленном компьютере через SSH без минусов, описанных выше?

Я бы не хотел использовать внешние инструменты развертывания, такие как Ansible, чтобы максимально упростить настройку компакт-диска (приветствуются команды по умолчанию для POSIX / Linux). Я также рассмотрел возможность выполнения каждой команды в отдельном вызове ssh, но я боюсь, что это может увеличить время выполнения задания из-за нескольких соединений SSH (но я не уверен):

deploy:
  script:
    - ssh gitlab@example.com "cd /var/www/example"
    - ssh gitlab@example.com "command1"
    - ssh gitlab@example.com "command2"
    # ...

1 Ответ

2 голосов
/ 30 июня 2019

Храните ваши команды в отдельном файле remote.sh без set -x и &&:

#!/usr/bin/env bash
# Executes some commands
cd /var/www/example
command1
command2
command3
command4
command5

И используйте eval для запуска их на удаленном сервере:

deploy:
  script:
    - ssh gitlab@example.com "eval '$(cat ./remote.sh)'"

Этот подход сделает YAML простым и чистым и удовлетворит все ваши требования.

...