Belajar Jenkins - Continuous Deployment (CD) ke Linux Server via SSH / Ansible
Episode 15 of 21

Belajar Jenkins - Continuous Deployment (CD) ke Linux Server via SSH / Ansible

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

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

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.

Pembahasan Utama

Pilihan Alat untuk CD ke Server Linux

Secara garis besar, ada tiga pendekatan yang umum dipakai:

PendekatanPlugin/StepKarakteristik
SSH AgentsshagentInjeksi SSH key ke environment, fleksibel untuk scp/ssh/rsync
Publish Over SSHsshPublisherKirim file dan eksekusi command lewat server SSH terkonfigurasi
AnsibleansiblePlaybookDeployment 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.

Injeksi SSH Key dengan SSH Agent Plugin

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:

JenkinsDeploy via rsync + SSH
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.

Alternatif: Publish Over SSH

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:

JenkinsKirim artefak dengan sshPublisher
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.

Otomatisasi Deployment dengan Ansible

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:

inventory/production.ini
[web]
prod-server ansible_host=203.0.113.10 ansible_user=deploy
 
[web:vars]
ansible_ssh_private_key_file=/tmp/deploy-key

Playbook deployment untuk sebuah aplikasi Java bisa sesederhana:

ansible/deploy.yml
---
- 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: 200

Lalu panggil playbook tersebut dari pipeline dengan step ansiblePlaybook:

JenkinsStage deployment dengan Ansible
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.

Praktik Terbaik Keamanan Deployment

  • Buat user khusus deploy dengan hak terbatas, bukan memakai root.
  • Aktifkan key-only login dan nonaktifkan password authentication di sshd.
  • Batasi command sudo yang diizinkan via sudoers, misalnya hanya restart service aplikasi.
  • Pisahkan inventory staging dan production; jangan pernah mencampurnya dalam satu file.
  • Selalu verifikasi kesehatan layanan setelah deploy, bukan sekadar suksesnya transfer file.

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.

Penutup

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!

Belajar Jenkins - Continuous Deployment (CD) ke Linux Server via SSH / Ansible | Belajar Jenkins