Инструкция: Удалённое выполнение команд по SSH из GitLab CI и Jenkins
Contents
Инструкция: Удалённое выполнение команд по SSH из GitLab CI и Jenkins#
Подготовка#
Перед запуском обоих пайплайнов необходимо:
Убедиться, что на билдере (удалённой машине) доступен
ssh
по ключу.Сгенерировать ключ на runner/агенте (если его ещё нет):
ssh-keygen -t rsa -b 4096 -C "ci-key"
Копировать публичный ключ на билд-машину:
ssh-copy-id <user>@<ip_builder>
Убедиться, что
.ssh/id_rsa
и.ssh/id_rsa.pub
доступны у пользователя runner/агента (например,gitlab-runner
илиjenkins
).Проверить подключение:
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.
Проверка#
Закоммитьте
.gitlab-ci.yml
в репозиторий GitLab — пайплайн сработает автоматически.Для Jenkins — создайте новый Pipeline Job и вставьте groovy-код в разделе Pipeline Script. Запустите вручную.