Как можно использовать git команды через ssh-agent в Jenkins?

Добрый день! Я столкнулся с проблемой использования команд git через ssh-agent в Jenkins. 

Смысл задачи заключается в следующем: я загружаю обновления на GitHub, срабатывает хук, после чего Jenkins подключается к удаленному серверу, останавливает контейнер, получает обновления с GitHub и снова запускает контейнеры. 

Pipeline для запуска и остановки контейнера я уже написал и он работает корректно:

<pre><code>pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    sh "ssh -tt -o StrictHostKeyChecking=no [email protected] docker-compose -f /home/CloudToDoList/CloudToDoList/docker-compose.yml stop"
                    sh "ssh -tt -o StrictHostKeyChecking=no [email protected] docker-compose -f /home/CloudToDoList/CloudToDoList/docker-compose.yml up -d"
                }
            }
        }
    }
}</code></pre>

Однако у меня возникли проблемы с выполнением git-команд:

<pre><code>pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    sh "ssh -tt -o StrictHostKeyChecking=no [email protected] git --git-dir=/home/CloudToDoList/CloudToDoList/.git log"
                }
            }
        }
    }
}</code></pre>

Когда я пытаюсь использовать такой Pipeline, он застревает в бесконечной загрузке. Тем не менее, команда работает корректно и возвращает ожидаемый вывод, если выполнять её напрямую на сервере:

<pre><code>root@docker-work:~# git --git-dir=/home/CloudToDoList/CloudToDoList/.git log
commit 660e12c50978995333eebeeecdcf2a71d6747961 (HEAD -> master, origin/master)
Auth
</code></pre>

Можете подсказать, в чем может быть проблема?
  • 26 октября 2024 г. 9:02
Ответы на вопрос 1
Проблема, с которой вы столкнулись при использовании `git` через `ssh` в Jenkins, может быть связана с тем, что `git` ожидает ввода данных, которых нет в вашем скрипте. Когда вы запускаете команду `git log` через `ssh`, она может пытаться получить доступ к терминалу для отображения информации, что может вызвать зависание в Jenkins.

Вот несколько предложений по решению проблемы:

### 1. Добавьте флаг `--no-pager`

Попробуйте добавить флаг `--no-pager` к вашей команде `git`. Это предотвратит использование pager'а (например, `less`), который требует интерфейса терминала:

```groovy
pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    sh "ssh -tt -o StrictHostKeyChecking=no [email protected] git --git-dir=/home/CloudToDoList/CloudToDoList/.git --no-pager log"
                }
            }
        }
    }
}
```

### 2. Используйте `-q` или `-n`

Если вам не нужно выводить длинный журнал, можете использовать флаги `-q` (quiet mode) или `-n` для ограничения количества выводимых коммитов:

```groovy
pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    sh "ssh -tt -o StrictHostKeyChecking=no [email protected] git --git-dir=/home/CloudToDoList/CloudToDoList/.git log -n 10"
                }
            }
        }
    }
}
```

### 3. Используйте `-C` для указания директории

Можно указать директорию с помощью параметра `-C`, если это подходит для вашего случая. Это позволяет не использовать `--git-dir`, а просто указать директорию, которая содержит `.git`:

```groovy
pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    sh "ssh -tt -o StrictHostKeyChecking=no [email protected] git -C /home/CloudToDoList/CloudToDoList log --no-pager"
                }
            }
        }
    }
}
```

### 4. Логирование вывода

Если проблема сохраняется, добавьте логирование вывода команды в Jenkins, чтобы лучше понять, что происходит:

```groovy
pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    script {
                        def output = sh(script: "ssh -tt -o StrictHostKeyChecking=no [email protected] git -C /home/CloudToDoList/CloudToDoList log --no-pager", returnStdout: true)
                        echo "${output}"
                    }
                }
            }
        }
    }
}
```

### 5. Проверка настроек git на сервере

Убедитесь, что `git` на вашем сервере настроен правильно и что SSH-ключи работают, а также проверьте, нет ли дополнительных параметров или настроек, которые могут влиять на выполнение команд.

Если ни один из вышеперечисленных методов не решает проблему, возможно, стоит проверить логи Jenkins для получения дополнительных подсказок о том, что могло пойти не так.
Похожие вопросы