Jenkins Credential’s type-SSH username with private key

Betül Aslan
4 min readMar 23, 2022

Jenkins’de kullanılan çeşitli platform’lar ile bağlantı kurmak veya secret key’ler oluşturmak için bir çok credentials type bulunur. Daha detaylı şekilde kullanım alanlarını incelemek isterseniz bu link’e tıklayabilirsiniz. https://www.jenkins.io/doc/book/using/using-credentials/

SSH username with private key credentials type’ın kullanımı hakkında daha detaylı bilgiyi bu post’ta anlatacağım.

Bu credential jenkins ile uzak sunucu arasında bağlantı yapmak istediğimiz zaman klasik olarak ve her defasında tekrarlayan bir işlem olan username password’un kullanmak yerine daha kolaylık sağlıyor. Ozellikle container ortamlarda build alınıp, deployment yapılacağı zaman oldukça kullanışlı. Container tarafında bağlantı için herhangi bir işlem yapmadan deployment için ssh bağlantısı sağlanmış olacak. Ayrıca makineleri jenkins’e build node olarak ekleme yaptığımızda ve pipeline içerisinde bitbucket’a login olmayı gerektiren durumlarda kullanılır.

Remote server’a (ubuntu machine) login olup, user için sshkey oluşturulur. Oluşturulan public key makinenin kendi authorized_keys dosyasına yazılır.

ubuntu@sto-efk2:~$ whoami
ubuntu
ubuntu@sto-efk2:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/id_rsa.
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:yMWROsE2ZRYG3EiiafQS/sEmIav3rfureswQgUaQj3c ubuntu@sto-efk2
The key’s randomart image is:
+ — -[RSA 2048] — — +
|=++ .+o=Bo |
|o*.B .B=o. |
|ooB.=. +o |
|o.+=Eooo |
|…o. o.S |
| … . |
| +. . |
| +. |
| .o++o. |
+ — — [SHA256] — — -+
ubuntu@sto-efk2:~$
ubuntu@sto-efk2:~$ cd .ssh/
ubuntu@sto-efk2:~/.ssh$ ll
total 16
drwx------ 2 ubuntu ubuntu 4096 Mar 23 14:25 ./
drwxr-xr-x 5 ubuntu ubuntu 4096 Mar 23 14:23 ../
-rw------- 1 ubuntu ubuntu 0 Oct 13 2020 authorized_keys
-rw------- 1 ubuntu ubuntu 1675 Mar 23 14:25 id_rsa
-rw-r--r-- 1 ubuntu ubuntu 397 Mar 23 14:25 id_rsa.pub
ubuntu@sto-efk2:~/.ssh$ ssh-copy-id -i id_rsa.pub ubuntu@localhost
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ubuntu@localhost's password:
Number of key(s) added: 1Now try logging into the machine, with: "ssh 'ubuntu@localhost'"
and check to make sure that only the key(s) you wanted were added.
ubuntu@sto-efk2:~/.ssh$ cat id_rsa
— — -BEGIN RSA PRIVATE KEY — — -
MIIEowIBAAKCAQEAo+0DHcxe+nwG5rc7wWfur6MnzDRBV1UzwBUt0OwfgzzvMcAt
s1oOPbmgThf8wU0YuNi74IYgqbzz7Rf7QvTsR7HNStmrWM5caYBCKi+oZ9cG9Njz
QigXcILazKDkDHebrMss1PS6EiEMmQlo1rnuPXFSWtz9Sc3t90+9K0wv5a4MDbxo
EnwZ6zuFnVWWQyw5QgfoupUogBMO3LguJ/pJhBuC5gAAni4Rqin6mgEcnvcujWiN
wmDTaB/3i3IKHKltLQfM3Wy+ruKynoBoDIk8QijJmNoBIHQ8YTzbcws+YDAm2j+x
ihpRM87gn8v/dNA9EbgdbLwh+b6KCtaXAkgfqwIDAQABAoIBAGwaOkrlYuFG93og
7hw+gQ58xxsIfuqr+oO6s8sqXCG9BnTFqp2zTt7v0kKN2RZU1G/aJhQL//BP9oCt
pvph8IvbOmoZH8Fh3VmJxphxc1p/WEwR4mIHdGWzNb1qgNmj6xrJphgOB8M63kby
CJxKY01LtSbMw5BvaHYGtNaf2Jpa3aTcTvFrnQrcR/6gkmdllfe8ls3lK+LENjE/
hCRMGRjkD666T6/PcWAfjB8qhWRmubQeMHc2k1bEpERU1n7XHs3YdLpGtHbvsnEh
RGKKcnaGXunc92FlUqb30meU+/FQupGvRHL+PVUxiHpzd+LJjs+iHqdmRztQPOYn
......
......
......
-----END RSA PRIVATE KEY-----

Private key ise jenkins üzerinde oluşturulan credentials’a eklenir.

Jenkins pipeline içerisinde credentials “sshagent” yapısı ile beraber kullanılır. Bunun için jenkins üzerinde SSH-Agent plugin’in kurulu olması gereklidir. https://plugins.jenkins.io/ssh-agent/

steps {
sshagent(credentials:['test_private_key']){
sh 'ssh -o StrictHostKeyChecking=no root@10.20.10.41 uptime “whoami”'
echo “success login”
sh 'scp -o StrictHostKeyChecking=no test.tar.gz ubuntu@10.20.10.41:/home/ubuntu/'
}
}

Yukarıdaki pipeline bir container içerisinde çalıştırıldı. Container’ın çalıştığı host veya container’ın içerisinde herhangi bir username ve password bilgisi girilmeden remote server’a bağlanmayı sağlar. Build sonrası container kill olup, yeni bir build başlattığımızda yeniden farklı bir container ayaklanacaktır. Yine aynı şekilde bu container içerisinden de remote server’a erişim sağlanmış olacaktır.

Jenkins’e makineleri, slave node olarak ekleme yaptığımızda da bu credentials type kullanılabilir.

SSH useaname-private key ile jenkins pipeline içerisinde bitbucket’a push yapmak (merge) içinde kullanılır.

Bitbucket üzerindeki kullanıcımız username(betul.aslan).Bitbucket’a login olup, push yapılacak ortam(ubuntu 16.04) ve user (ubuntu). Eğer mevcut değilse ubuntu makine üzerinde ssh-key oluşturulur(Yukarıdaki gibi). Public key bitbucket üzerindeki kullanıcımızın account’daki ssh keys bölümüne eklenir.

ubuntu makinedeki “ubuntu” kullanıcısının Private key’i de jenkins üzerinde oluşturulan credentials’a eklenir. Burada tek fark username’e bitbucket hesabımızdaki kullanıcı adımızı yazmak ve login olunacak ubuntu makinenin jenkins’e build node olarak eklenmiş olması gereklidir.

Jenkins pipeline hattı üzerindeki kullanımı;

Pipeline içerisinde node olarak “ubuntu_machine” secilir. credential’s olarakta “bitbucket_login” yazıır.

stage(‘Merge-to-branch’) {
agent {
node {
label 'ubuntu_machine'
}
}
steps {
sshagent(['bitbucket_login']) {
sh ‘ls -ltr’
sh ‘git config — global credential.helper store’
sh ‘git config — global user.name “betul.aslan”’
sh ‘git push -f origin HEAD:master’
}
}
post {
always {
deleteDir()
}
}
}

--

--