Всем привет! Думаю у каждого, кто когда-либо настраивал Jenkins для работы с Git-ом возникала проблема генерации ключей на Node-ах.
В очередной раз когда мне этим пришлось заняться я оказался в нелёгкой ситуации — ssh доступа к серверу с Jenkins-ом и к его слейвам у меня не было и, соответственно, ключи я сгенерировать не мог. Но всё оказалось не так плохо.
Добираемся до shell-а
Порывшись в недрах Jenkins-а была найдена Script Console, которая позволяет выполнять Groovy-код на нодах. Что нам это даёт? Возможность выполнять команды shell-а благодаря .execute() на строках. Только есть одно «но» — нельзя использовать перенаправление потоков и другие прелести bash, поэтому для начала надо придумать как исполнять код в интерпретаторе bash. Для этого были придуманы эти незамысловатые строки (буду благодарен советам по улучшению кода ибо на Groovy пишу впервые):
def file = new File(System.getenv("HOME") + "/testGroovyShell.sh")
file << "#!/bin/bashn
echo hello, world!"
def builder = new AntBuilder()
builder.chmod(file:file.getAbsolutePath(), perm:'+x')
println file.getAbsolutePath().execute().text
file.delete()
Теперь мы можем исполнять любой bash-код от имени пользователя, под которым запущен Jenkins!
Генерация SSH-ключей
Но тут меня ждал облом — для генерации ssh-ключей требуется жать Enter каждый раз когда он нас спросит о чем-нибудь. Это нас, мягко говоря, не устраивает, поэтому погуглив было найдено тупое, но зато работающее решение:
#!/bin/bash
echo -e "nnn" | ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
Тем самым мы говорим, что надо послать 3 раза перенос строки в поток ввода ssh-keygen. После выполнения этих команд скрипт выведет публичный ключ сервера. Осталось только добавить его в свой аккаунт (например, на GitHub), запустить Job и… опять обломаться.
Добавляем наш сервер в known_hosts на примере GitHub
Казалось бы, ключ у нас есть, что ещё для счастья надо? Не тут то было! SSH устроен так, что при первом обращении к неизвестному ему хосту он запросит потверждение, мол, запомнить ли его? На этот раз обойдёмся без хаков, просто выполнив команду:
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
, где github.com — хост, который вы хотите добавить.
После добавления хоста вы можете попробовать запустить вашу задачу и обрадоваться рабочему Git-у.
Заключение
Прошу тех, для кого полезность статьи стремится к нулю, не пинать сильно, т.к. задокументированного процесса как это сделать я в интернете не нашёл, а вопрос крайне актуальный.
О найденных ошибках и недочётах предпочитаю читать в ЛС, а не среди заминусованных комментов;)
Да прибудет с Вами дух Continuous Integration!
Автор: bsideup