Инструкция: Удалённое выполнение команд по SSH из GitLab CI и Jenkins#

Подготовка#

Перед запуском обоих пайплайнов необходимо:

  1. Убедиться, что на билдере (удалённой машине) доступен ssh по ключу.

  2. Сгенерировать ключ на runner/агенте (если его ещё нет):

ssh-keygen -t rsa -b 4096 -C "ci-key"
  1. Копировать публичный ключ на билд-машину:

ssh-copy-id <user>@<ip_builder>
  1. Убедиться, что .ssh/id_rsa и .ssh/id_rsa.pub доступны у пользователя runner/агента (например, gitlab-runner или jenkins).

  2. Проверить подключение:

ssh -i ~/.ssh/id_rsa <user>@<ip_builder>

GitLab CI: .gitlab-ci.yml#

stages:
  - remote-exec

ssh_execute:
  stage: remote-exec
  tags:
    - <runner_tag>
  script:
    - |
      SSH_HOST="<user>@<ip_builder>" 
      SSH_KEY="$HOME/.ssh/id_rsa"
      COMMANDS=$(cat <<EOF
        echo "Адрес билдера $SSH_HOST"
        echo "Запуск сборки проектов."
        /opt/global/gsf-cli/manage.sh --all build
EOF
      )
      echo "$COMMANDS" | ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$SSH_HOST"

Важно:

  • Runner должен быть с executor: shell.

  • Убедитесь, что id_rsa доступен и читаем (chmod 600).

  • Не забудьте указать свой <runner_tag>, <user>, <ip_builder>.


Jenkins Groovy Pipeline#

pipeline {
    agent { label '<label_worker>' }

    environment {
        SSH_HOST = "<user>@<ip_builder>"
        SSH_KEY  = "$HOME/.ssh/id_rsa"
    }

    stages {
        stage('SSH Execute') {
            steps {
                script {
                    sh '''
                        ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$SSH_HOST" << 'EOF'
echo "Адрес билдера $SSH_HOST"
echo "Запуск сборки проектов."
/opt/global/gsf-cli/manage.sh --all build
EOF
                    '''
                }
            }
        }
    }
}

Важно:

  • Агент Jenkins должен быть с shell или ssh executor.

  • Ключи должны быть в $HOME/.ssh/ у пользователя, от имени которого работает Jenkins agent.

  • Можно использовать Jenkins Credentials Plugin (SSH Key credentials) вместо -i "$SSH_KEY" — если нужно, напиши, сделаю вариант с credentialsId.


Проверка#

  1. Закоммитьте .gitlab-ci.yml в репозиторий GitLab — пайплайн сработает автоматически.

  2. Для Jenkins — создайте новый Pipeline Job и вставьте groovy-код в разделе Pipeline Script. Запустите вручную.