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

Вопрос или проблема

Добрый день, я столкнулся с проблемой, что не могу использовать команды git через sshagent. Идея в том, что я загружаю обновление на GitHub, срабатывает хук, jenkins подключается к удаленному узлу, останавливает контейнер, получает обновление из GitHub, а затем снова запускает контейнер. Я смог написать Pipeline, который останавливает и запускает контейнер.

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"
                }
            }
        }
    }
}

но возникли проблемы с командами git

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"
                }
            }
        }
    }
}

Если я использую такой Pipeline, он застревает в бесконечной загрузке. Но сама команда работает, независимо от репозитория, все выводится корректно (я использую log только для тестирования)

root@docker-work:~# git --git-dir=/home/CloudToDoList/CloudToDoList/.git log
commit 660e12c50978995333eebeeecdcf2a71d6747961 (HEAD -> master, origin/master)
Author: root <[email protected]>
Date:   Thu Oct 24 14:27:28 2024 +0000

    готовая страница Note, File, Task, GroupTask, TaskForGroup

Ответ или решение

Использование команд git через sshagent в Jenkins

Добрый день! Разберем, как корректно использовать команды git через sshagent в Jenkins, особенно в свете вашего сценария, который включает работу с удалённым сервером и Docker.

1. Понимание задачи

Ваше требование заключается в том, чтобы после получения обновлений на GitHub запускался процесс, который останавливает контейнер, загружает обновление из репозитория и снова запускает контейнер. Вы уже успешно реализовали остановку и запуск контейнеров с помощью docker-compose, но столкнулись с проблемами при выполнении git-команд.

2. Анализ проблемы

Вы отметили, что при выполнении git-команд через sshagent происходит «бесконечное ожидание». Это может свидетельствовать о том, что SSH-соединение не завершает выполнение из-за ожидания ввода или ожидания ответа от команды. Рассмотрим, как это можно исправить.

3. Рекомендации по исправлению

  • Отладка ssh-подключения: Для начала, убедитесь, что SSH-подключение работает правильно и что пользователь имеет необходимые права на выполнение git-команд.

  • Проверка наличия SSH ключей: Убедитесь, что необходимые SSH-ключи загружены в Jenkins и правильно указаны в ваших данных для доступа (credentials). Вы можете проверить это в разделе Управление Jenkins → Управление учётными записями.

  • Изменение команд: Попробуйте упростить вызываемые команды. Например, используйте git fetch или git pull, чтобы загрузить обновления из удалённого репозитория.

  • Запуск команд в фоновом режиме: Можно попробовать выполнить команды в фоновом режиме, добавляя & в конце команд. Но будьте внимательны, чтобы не потерять вывод.

pipeline {
    agent any

    stages {
        stage('SSH') {
            steps {
                sshagent(credentials: ['docker-work']) {
                    sh """
                        ssh -tt -o StrictHostKeyChecking=no user@server 'git --git-dir=/home/CloudToDoList/CloudToDoList/.git fetch origin'
                        ssh -tt -o StrictHostKeyChecking=no user@server 'git --git-dir=/home/CloudToDoList/CloudToDoList/.git log'
                    """
                }
            }
        }
    }
}

4. Дополнительные шаги по отладке

  • Логи Jenkins: Включите детализированные логи Jenkins для SSH. Это может помочь выяснить, где именно возникает проблема.

  • Изоляция команды: Попробуйте выполнить git-команды вручную на удалённом сервере, чтобы убедиться, что они работают как ожидается.

  • Проблемы с терминалом: Иногда при вызове git-команд через SSH они могут ожидать ввода данных. Используйте GIT_TERMINAL_PROMPT=0, чтобы отключить ввод данных для git-команд.

sh "ssh -tt -o StrictHostKeyChecking=no user@server 'GIT_TERMINAL_PROMPT=0 git --git-dir=/home/CloudToDoList/CloudToDoList/.git log'"

5. Заключение

На этом этапе вам нужно протестировать обновлённый Jenkins Pipeline, применяя предложенные изменения. Если возникнут новые вопросы или сложности, не стесняйтесь обращаться за помощью. Надеюсь, эти рекомендации помогут вам успешно интегрировать git-команды через sshagent и достигнуть ваших целей. Удачи в разработке!

Оцените материал
Добавить комментарий

Капча загружается...