Конвейер Jenkins - используйте агент ssh для клонирования хранилища на другом компьютере через ssh - PullRequest
0 голосов
/ 12 сентября 2018

Вариант использования: у меня есть конвейер Jenkins для обновления среды разработки.Мой dev env - это экземпляр EC2 aws с docker compose.

Автоматизация была написана так:

withAWS(profile: 'default') {
   sh "ssh -o StrictHostKeyChecking=no -i ~/my-key.pem user@$123.456.789 /bin/bash -c 'run some command like docker pull'"
}

Теперь у меня есть другие тестовые среды, и у них всех есть какая-тофайла docker-compose, файлов конфигурации и свойств, которые требуют, чтобы я просмотрел их все, когда что-то нужно изменить.

Чтобы помочь с этим, я создал новый репозиторий, чтобы сохранить все различные конфигурации среды, иМой план состоит в том, чтобы иметь клон этого репо во всех моих средах разработки и тестирования, поэтому, когда мне нужно что-то изменить, я могу просто сделать это локально, протолкнуть его, и мой конвейер jenkins обновит репозиторий в той среде, в которой он обновляется..

У моего jenkins есть учетные данные ssh для моего репо (он используется в другом задании, которое клонирует репо и запускает тесты с исходным кодом), поэтому я хочу использовать те же учетные данные.

Вопрос: Могу ли я каким-то образом, через ssh'ing на другую машину, использовать учетные данные Jenkins ssh-agent для клонирования / обновления битовой корзиныхранилище?

Редактировать: я изменил конвейер на:

script {
   def hgCommand = "hg clone ssh://hg@bitbucket.org/my-repo"
   sshagent(['12345']) {
     sh "ssh -o StrictHostKeyChecking=no -i ~/mykey.pem admin@${IP_ADDRESS} /bin/bash -c '\"${hgCommand}\"'"
   }
}

И я получаю:

[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-FOburguZZlU0/agent.662
SSH_AGENT_PID=664
Running ssh-add (command line suppressed)
Identity added: /home/jenkins/workspace/abc@tmp/private_key_12345.key (rsa w/o comment)
[ssh-agent] Started.
[Pipeline] {
[Pipeline] sh
[test-env-config] Running shell script
+ ssh -o StrictHostKeyChecking=no -i /home/jenkins/mykey.pem admin@123.456.789 /bin/bash -c "hg clone ssh://hg@bitbucket.org/my-repo"
remote: Warning: Permanently added the RSA host key for IP address '765.432.123' to the list of known hosts.
remote: Permission denied (publickey).
abort: no suitable response from remote hg!
$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 664 killed;
[ssh-agent] Stopped.

1 Ответ

0 голосов
/ 12 сентября 2018

Сначала немного предыстории, чтобы понять причину (это чистый ssh, не относящийся к Jenkins или Mercurial): утилита ssh-agent работает путем создания сокета домена UNIX, который затем будет использоваться ssh. Команда ssh пытается связаться с агентом, если он находит переменную среды SSH_AUTH_SOCK. Кроме того, ssh может быть проинструктирован для переадресации агента через -A. Для получения дополнительной информации см. Справочные страницы ssh-agent и ssh.

Итак, предполагая, что ваш withAWS контекст делает доступной переменную среды SSH_AUTH_SOCK (устанавливается плагином), я думаю, этого должно быть достаточно для:

  • добавьте -A к вашему ssh вызову
  • в части 'run some command like docker pull', добавьте команду hg clone, гарантируя, что вы используете схему ssh:// для ртутного URL.

Наблюдение за безопасностью: -o StrictHostKeyChecking=no следует использовать в качестве крайней меры. В вашем примере IP-адрес получателя является фиксированным, поэтому вы должны сделать следующее:

  • удалить -o StrictHostKeyChecking=no
  • one-shot: получите отпечаток хоста 123.456.789 (например, зайдя в него по ssh, а затем найдя соответствующую строку в вашем $HOME/.known_hosts). Сохраните эту строку в файле, скажем 123.456.789.fingerpint
  • сделать файл 123.456.789.fingerprint доступным для Jenkins, когда он вызывает ваш пример кода. Это можно сделать, зафиксировав этот файл в репозитории, который содержит конвейер Jenkins, это можно сделать безопасно, поскольку он не содержит секретов.
  • Наконец, измените ваш ssh-вызов на что-то вроде ssh -o UserKnownHostsFile=/path/to/123.456.789.fingerprint ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...