Otomatiskan deployment ke server Linux dengan injeksi SSH key yang aman, lalu naikkan levelnya menggunakan Ansible serta step ansiblePlaybook dari Jenkins.

Di episode 14 pipeline kalian sudah menjalankan test, mengukur coverage, dan menegakkan Quality Gate dengan SonarQube. Artinya kode yang sudah sampai sini bisa dipercaya. Tinggal satu langkah terakhir yang menentukan: mengirim kode tersebut ke server produksi.
Banyak tim masih melakukan deploy manual — scp file, SSH ke server, restart service, lalu berharap semuanya berjalan. Cara ini lambat, tidak konsisten, dan ketika tim sudah besar, mustahil ditelusuri siapa deploy apa kapan. Deploy manual itu seperti mengantarkan paket dengan berjalan kaki padahal ada kurir otomatis: hasilnya sama, tapi skalanya tidak pernah membesar.
Di episode ini kita akan membangun Continuous Deployment ke Linux server lewat dua pendekatan: injeksi SSH key yang aman dengan SSH Agent plugin, lalu otomatisasi penuh dengan Ansible menggunakan step ansiblePlaybook.
Secara garis besar, ada tiga pendekatan yang umum dipakai:
| Pendekatan | Plugin/Step | Karakteristik |
|---|---|---|
| SSH Agent | sshagent | Injeksi SSH key ke environment, fleksibel untuk scp/ssh/rsync |
| Publish Over SSH | sshPublisher | Kirim file dan eksekusi command lewat server SSH terkonfigurasi |
| Ansible | ansiblePlaybook | Deployment deklaratif, idempotent, bisa untuk banyak host sekaligus |
Ketiganya valid, tetapi Ansible unggul saat server bertambah banyak karena playbook mendeskripsikan keadaan akhir sistem, bukan langkah-langkahnya.
Plugin SSH Agent mengambil private key dari Jenkins Credentials dan menyuntikkannya ke dalam SSH agent pada agent yang menjalankan job, hanya selama blok sshagent berlangsung. Kunci tidak pernah tertulis ke disk workspace:
stage('Deploy via SSH') {
steps {
sshagent(['deploy-key']) {
sh 'rsync -avz --delete dist/ deploy@prod-server:/var/www/my-app/'
sh 'ssh deploy@prod-server "systemctl restart my-app"'
}
}
}sshagent menerima daftar credential id yang tersimpan di Jenkins. Di dalam bloknya, semua command SSH otomatis memakai key tersebut. Outputnya tetap terlihat di console, tapi key-nya sendiri tidak pernah terpapar.
Warning
Simpan private key sebagai credential tipe SSH Username with private key di Jenkins, jangan pernah menaruhnya sebagai file di repository atau workspace. Key yang bocor berarti siapa pun bisa masuk ke server produksi.
Plugin Publish Over SSH mengelola koneksi server di konfigurasi global Jenkins (host, username, key), lalu step sshPublisher mengirim file dan menjalankan command. Cocok untuk skenario sederhana yang hanya memindahkan artefak:
step([
$class: 'Publisher',
publishers: [
[$class: 'SSHPublisherPlugin',
configName: 'prod-server',
transfers: [[sourceFiles: 'dist/**',
removePrefix: 'dist',
remoteDirectory: '/var/www/my-app']]]
]
])Sintaksnya berbasis class, sehingga kurang nyaman dibaca dibandingkan step deklaratif. Karena itu, sebagian besar tim modern memilih Ansible untuk deployment yang lebih kompleks.
Ansible men-deploy dengan mendeskripsikan keadaan akhir yang diinginkan lewat playbook, dan ia idempotent: menjalankan playbook dua kali tidak menghasilkan efek ganda. Untuk memakainya dari Jenkins, install plugin Ansible, lalu daftarkan instalasi Ansible di Manage Jenkins > Tools — mirip cara mendaftarkan Maven.
Siapkan inventory yang mendefinisikan host produksi. Contoh inventory gaya INI dengan host berbasis SSH:
[web]
prod-server ansible_host=203.0.113.10 ansible_user=deploy
[web:vars]
ansible_ssh_private_key_file=/tmp/deploy-keyPlaybook deployment untuk sebuah aplikasi Java bisa sesederhana:
---
- name: Deploy aplikasi ke server produksi
hosts: web
become: true
tasks:
- name: Pastikan direktori target ada
ansible.builtin.file:
path: /opt/my-app
state: directory
- name: Salin artefak dari workspace
ansible.builtin.copy:
src: /tmp/my-app.jar
dest: /opt/my-app/my-app.jar
owner: myapp
group: myapp
mode: '0755'
- name: Restart service aplikasi
ansible.builtin.systemd_service:
name: my-app
state: restarted
- name: Verifikasi health endpoint
ansible.builtin.uri:
url: http://localhost:8080/health
status_code: 200Lalu panggil playbook tersebut dari pipeline dengan step ansiblePlaybook:
stage('Deploy dengan Ansible') {
steps {
ansiblePlaybook(
playbook: 'ansible/deploy.yml',
inventory: 'ansible/inventory/production.ini',
extras: '--tags deploy'
)
}
}Step ansiblePlaybook otomatis mengambil binary Ansible dari instalasi yang didaftarkan di Tools, menjalankan playbook dengan inventory yang ditunjuk, dan meneruskan extra argumen seperti --tags untuk membatasi task yang dieksekusi.
Tip
Pastikan artefak build tersedia di workspace agent sebelum playbook
berjalan — misalnya dari tahap archiveArtifacts yang di-unstash
kembali. Ansible mengirim file dari mesin yang menjalankan
ansiblePlaybook, yaitu agent Jenkins.
Important
Deployment otomatis tidak berarti tanpa kontrol. Untuk perubahan besar,
kombinasikan CD dengan manual approval gate (input step) di depan
stage deploy produksi — seperti yang kalian pelajari di episode 6.
Pada episode 15 ini kalian telah mengotomatisasi deployment ke Linux server dengan injeksi SSH key yang aman lewat sshagent, mengenal alternatif Publish Over SSH untuk transfer artefak sederhana, dan membangun deployment deklaratif dengan Ansible memakai step ansiblePlaybook. Kalian juga mendapatkan praktik terbaik keamanan seperti user khusus deploy, key-only login, dan verifikasi kesehatan setelah deploy.
Deployment ke server Linux adalah fondasi yang baik, tetapi di era cloud-native, aplikasi lebih sering dideploy ke Kubernetes dengan bantuan Helm.
Di episode 16 berikutnya kita akan membahas Continuous Deployment ke Kubernetes & Helm — menerapkan manifest dengan kubectl apply dan mengotomatisasi rilis memakai helm upgrade --install. Sampai jumpa!