t.me/atinfo_chat Telegram группа по автоматизации тестирования

Ошибка при подключении к SHH при сборке проекта в Jenkins

ssh
gitlab
jenkins
pipeline
Теги: #<Tag:0x00007f9e39eb7808> #<Tag:0x00007f9e39eb76c8> #<Tag:0x00007f9e39eb7588> #<Tag:0x00007f9e39eb73f8>

(bor_bor) #1

Добрый день. При попытке подключиться к серверу по SSH возникает ошибка. Установил плагин SSH agent, проект запускается через в Jenkinsfile (использую GitLab, если это важно).
Использую следующий синтаксис:

stage('Connect to SSH') {
            steps {
                sshagent (credentials: ['4******6-****-****-****-135a****ojwe']) {
                    sh label: '', script: 'cd /home/***/'
                    sh label: '', script: './*** stop'
                    sh label: '', script: 'rm -f ***.jar'
                }
            sh label: '', script: '...'
            }
        }

Ошибка следующего содержания:

FATAL: [ssh-agent] Could not find specified credentials

Подскажите, пожалуйста, что можно предпринять и с чем может быть это связанно?


(Alexandr D.) #2

Вы уверены, что вы передаёте правильное название credentials?
Здесь подробная инструкция: https://plugins.jenkins.io/ssh-agent


(bor_bor) #3

Вы были правы, действительно, не так указывал ID.
Но теперь другая проблема. После подключения, мне нужно пройти по определенному пути и произвести действия с файлом. НО Jenkins ищет пути и файлы в workspaces, а не на сервере…
Пример:

[ssh-agent] Using credentials dev
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent]   Exec ssh-agent (binary ssh-agent on a remote machine)
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-V**v/agent.3***2
SSH_AGENT_PID=3***5
Running ssh-add (command line suppressed)
Identity added: /var/lib/jenkins/workspace/T***@tmp/private_key_***.key (/var/lib/jenkins/workspace/T***@tmp/private_key_***.key)
[ssh-agent] Started.
[Pipeline] {
[Pipeline] sh
+ sudo su
+ pwd
/var/lib/jenkins/workspace/T***

И если я ввожу команду “cd /путь”, то он его естественно не находит.
Вполне вероятно, что и я что-то не понимаю, и в целом так и должно быть, как это вообще устроено?
Подскажите, пожалуйста, хотя бы что почитать по этой теме.


(Alexandr D.) #4

Давайте начнем с того, что вы хотите сделать?

Если выполнить какие-то скрипты на слэйвах - то, имхо, проще это делать через SSH Slaves.
Если же вы хотите выполнить какой-то скрипт на самом сервере дженкинса, то можно это сделать проще, не используя плагинов:

pipeline {
    agent {
        node {
            label 'master'
            customWorkspace "$JOB_NAME"
        }
    }
    stages {
        stage('some stage') {
            steps {
                //                              
            }
        }
    }

(bor_bor) #6

Пример кода

stage('Connect to SSH') {
            steps {
                sshagent(['ID']) {
                    sh '''pwd
                    '''
                }

Выводом является рабочая директория Jenkins, а не удаленного сервера…


(bor_bor) #8

Я хочу, чтобы сервер Jenkins подключался через SSH к удаленному серверу, а затем запускал команду на удаленном сервере.

Вместо этого Jenkins подключается к удаленному серверу, затем выполняя команду , например, pwd , делает ее локально, а не на удаленном сервере как мне нужно.

Почему последующие команды команды не запускаются внутри оболочки SSH, а вместо этого выполняются локально?


(Alexandr D.) #9

Используйте плагин https://wiki.jenkins.io/display/JENKINS/SSH+plugin


(bor_bor) #10

У меня он есть, установлен и настроен.
И я не думаю, что в этом дело.


(Alexandr D.) #11

Ну если не думаете, то делайте сами, как знаете.


(bor_bor) #12

какой ранимый:grin:


(Vasiliy Rakshin) #13

Чтобы что-то сделать на той машине, надо сначала подключиться туда, т.е.
Первая команда должна выглядеть так:
sudo ssh ${USER}@${IP_PC} 'pwd'