Как правильно отправить credentials типа "SSH Username with private key" в Jenkins через API?
Вопрос касается создания credentials типа "SSH Username with private key".
Принцип создания простой (часть bash-скрипта):
...
tee credentials.xml >/dev/null <<EOF
<com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
<scope>GLOBAL</scope>
<id>$ID</id>
<username>$Username</username>
<privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey\$DirectEntryPrivateKeySource">
<privateKey>$(cat $PrivateSSHKeyFile)</privateKey>
</privateKeySource>
<usernameSecret>false</usernameSecret>
</com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
EOF
Crumb=$(curl --insecure -sS --user $Login:$Token "$ServerURI/crumbIssuer/api/json" | cut -d"\"" -f8)
curl --insecure -X POST -sS "$ServerURL/credentials/store/folder/domain/_/createCredentials" \
--user $Login:$Token \
--header "Jenkins-Crumb:$Crumb" \
--header "content-type:application/xml" \
--data @credentials.xml
rm credentials.xml
Когда в Jenkins пытаюсь "воспользоваться" созданным credentials, получаю ошибку Permission denied, please try again.. То есть очевидно, что текст ключа искажается при передаче.
Вышеописанным способом создал credentials типа "Secret text" и "Username with password" и они успешно работают.
Мне кажется, что всё дело в том, как в xml передаётся сам ssh-ключ, то есть дело в строке <privateKey>$(cat $PrivateSSHKeyFile)</privateKey>.
В чём конкретно может быть проблема?
P.S.: пытался "руками" сформировать файл credentials.xml - не помогает.
На всякий случай привожу содержимое credentials.xml:
<com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
<scope>GLOBAL</scope>
<id>server</id>
<username>username</username>
<privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource">
<privateKey>-----BEGIN RSA PRIVATE KEY-----
ZC/TIwEve23ULkHdN/IRfya1ikcF7BTucyq58awbNjF3dJUnhrJlUxTK+AfNDrUW
MIIEogIBAAKCAQEAmIU+giZXwRgKALYRFFoWMzTrZTLCfoz6WIBlQvzq7pm6SVkQ
...
hKhdNl3IHAcT4GPGR2BJBsuaqry8RsXaqf134dMCgYBtSWbmk4BV23iLwpxteThi
kwdFa3mVOrXaUQrnNLEVU8xnScjHNNISy2xfWv0joG/VZRbpD9Q=
-----END RSA PRIVATE KEY-----</privateKey>
</privateKeySource>
<usernameSecret>false</usernameSecret>
</com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
Ответы (1 шт):
Дело в символах перевода строк в ключе. Вместо них должны быть символы 
 и ключ должен состоять из одной строки.
Доработанный итоговый скрипт будет выглядеть так:
PrivateSSHKeyFile=$(sed 's/$/\
/' key_file | tr -d '\n')
tee credentials.xml >/dev/null <<EOF
<com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
<scope>GLOBAL</scope>
<id>$ID</id>
<username>$Username</username>
<privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey\$DirectEntryPrivateKeySource">
<privateKey>$(echo ${PrivateSSHKeyFile::-5})</privateKey>
</privateKeySource>
<usernameSecret>false</usernameSecret>
</com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
EOF
Crumb=$(curl --insecure -sS --user $Login:$Token "$ServerURI/crumbIssuer/api/json" | cut -d"\"" -f8)
curl --insecure -X POST -sS "$ServerURL/credentials/store/folder/domain/_/createCredentials" \
--user $Login:$Token \
--header "Jenkins-Crumb:$Crumb" \
--header "content-type:application/xml" \
--data @credentials.xml
rm credentials.xml