Categories: CI/CDDevops

Git Push di Jenkins Pipeline Menggunakan Passphrase Private Key

Sumber : https://www.jenkins.io/

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)

https://stackoverflow.com/questions/38769976/is-it-possible-to-git-merge-push-using-jenkins-pipeline/48523179

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 😀

Herbert Abdillah

Test

Recent Posts

Disk 1 tb sisa 100 gb

Berikut ini detail breakdown nya Docker

7 months ago

Langchain JsonOutputParser Invalid json output Error

Sometimes json output from llm like this : {"key": "value"}``` that langchain JsonOutputParser regex cant…

8 months ago

Tontonan Bagus

https://www.youtube.com/watch?v=ZAqIoDhornk (more…)

8 months ago

Ada Apa Didalam Sistem Operasi (Linux). Apa yang membedakan distribusi Linux seperti Ubuntu, Redhat, Alpine?

#include <stdio.h> int main() { FILE *f_ptr; char f_content[256]; char output[512]; f_ptr = fopen("/tmp/1337", "r");…

11 months ago

Convert OpenSSL 1 in Ruby Gem to OpenSSL 3

Version 3 have different interface Example: https://github.com/herbertabdillah/fabric-gateway-ruby/commit/c7377aaf2e62de1e2ac309965a09b5c7c72a2c7e (more…)

2 years ago

Catatan Belajar Ruby on Rails dari aliran Java dan Php

Telah di edit. Sumber Asli : https://twitter.com/nateberkopec/status/1250603032523370496/photo/1 Ruby on Rails merupakan framework web MVC menggunakan…

3 years ago