TLDR: Harus menggunakan git didalam shell (sh/bat). Tidak bisa menggunakan plugin git di dalam pipeline. Kita bisa menggunakan plugin sshagent daripada di akal akali mengetik banyak baris shell.
Git Publisher Plugin (Jgit)
Ini adalah cara terbaik karena mengadopsi prinsip KISS (Keep it simple, stupid) serta ini plugin official dari jenkins, bukan third party. Jika dibuka baju nya, sebenernya ini tidak menggunakan git, jadi kita tidak perlu menginstall git di VM master/worker. Plugin ini menggunakan Jgit, yaitu implementasi git yang ditulis dalam bahasa Java. Jgit ini di “embed” dalam plugin jenkins nya. Plugin ini mensupport beberapa operasi : clone, tag, push. Untuk autentikasi git nya, plugin ini juga support menggunakan private key dengan passphrase. Namun sayang operasi ini hanya bisa digunakan di freestyle mode, dan tidak bisa digunakan di pipeline mode. Jadi kita harus menggunakan git dalam shell (sh/bat)
Menggunakan git dalam shell (sh/bat)
Dengan *nix shell, semua bisa dilakukan. With great power comes great responsibilities. Hal yang perlu kita lakukan : autentikasi menggunakan prviate key + passphrase. Kita dapat melakukannya secara statis, dengan menambahakn passphrase secara manual di VM (ssh-agent). Atau secara dinamis, dengan menkonfigurasi autentikasi setiap pipeline dijalankan, dengan kreensial (private key + passphrase) nya disimpan di kredensial Jenkins. Saya akan menjelaskan cara yang kedua, karena yang pertama cukup jelas walaupun tidak best practice menurut saya karena stateful.
withCredentials([sshUserPrivateKey(credentialsId: GIT_CREDENTIAL_ID, keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
withEnv(["GIT_SSH_COMMAND=ssh -o StrictHostKeyChecking=no -o User=${SSH_USER} -i ${SSH_KEY}"]) {
sh "git push …"
}
}
paramter keyFileVariable (SSH_KEY) diisi dengan path dari private key, bukan text/isi dari private key. withCredentials akan menyimpan private key nya sebagai file sementara.
environment variable GIT_SSH_COMMAND diugnakan untuk override ssh command nya (tidak menggunakan command ssh standar). StrictHostKeyChecking=no digunakan untuk bypass host key checking, jadi kita tidak perlu menambahkan secara manual public key di ~/.ssh/authorized_key
Tapi ternyata ada masalah, menggunakan cara kedua ini kita tetap tidak bisa menggunakan private key dengan passphrase. Sebenernya bisa di akal akali, cuman agak ribet menggunakan banyak baris kode, jadinya tidak KISS lagi.
Menggunakan Plugin SSH Agent
Saya coba mencari plugin yang terpercaya untuk konek ssh menggunakan private key + passphrase (karena autentikasi git private key sebenernya itu menggunakan ssh). Dan ketemu plugin ssh agent, saya coba digabungkan dengan git shell, ternyata bisa.
https://plugins.jenkins.io/ssh-agent/
Penutup
Sebenernya solusi ini terletak di stackoverflow yang tadi. Terletak di jawaban yang kedua. Tapi entah kenapa saya tidak melihat nya. Mungkin karena saya buru buru terbawa oleh deadline. Saya baru menyadari hal ini ketika saya menulis artikel ini, dan melihat ulang stackoverflow tadi. Jadi intinya, tetap santai kalau ada masalah, kalau buru buru bisa kaya saya ini. Harusnya 1 menit, jadi 1 jam lebih 😀