Настраиваем SSH ключи на Node-ах Jenkins без ssh-доступа к ним

от автора

Всем привет! Думаю у каждого, кто когда-либо настраивал 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/bash\n\ 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 "\n\n\n" | 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!

ссылка на оригинал статьи http://habrahabr.ru/post/173625/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *