Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

Mengelola Proyek dengan Redmine

Redmine adalah aplikasi manajemen proyek yang dibuat menggunakan framework Ruby on Rails. Pada saat artikel ini ditulis, Redmine sudah mencapai versi 0.5.1 yang dirilis 15 Juli 2007.

Selain Redmine, banyak juga aplikasi manajemen proyek lainnya, misalnya:

Redmine mendukung multiple project. Jadi kita bisa menginstal Redmine di perusahaan untuk mengelola semua proyek yang sedang berjalan.

Untuk pengelolaan proyek, Redmine memiliki Gantt chart dan Calendar. Untuk mengelola dokumentasi proyek, kita bisa menggunakan wiki yang sudah tersedia. Tugas dibagikan pada team member dengan menggunakan konsep issue yang akan dijelaskan di bawah. Kita bahkan bisa melihat kode program yang sudah dibuat menggunakan version control browser. Saat ini Redmine dapat melihat isi repository Subversion, CVS, Mercurial, dan Darcs.

Pertama, kita instal dulu Redmine.

Selanjutnya, mari kita langsung saja menggunakan Redmine.

Setelah Redmine terinstal, kita dapat langsung membuka browser dan melihat halaman depan Redmine. Segera klik tombol Login untuk masuk ke dalam sistem.

Login Screen

Default username dan passwordnya adalah admin/admin. Segera masuk ke halaman My Account untuk mengganti password administrator.

Membuat user

Buat user baru melalui menu Administration > Users > New.

Menu New User

Isi informasi yang sesuai di halaman form user baru.

Form User

Jangan lupa untuk membuat beberapa user, agar bisa digunakan di

Membuat project

Selanjutnya, kita mendefinisikan project. Buat project baru melalui menu Administration > Projects > New. Isi informasi tentang project.

Project Summary

Isikan juga informasi tentang version control bila ada.

Berikutnya, tentukan anggota project. Tentu saja saja anggota ini sudah harus didaftarkan dulu seperti pada langkah sebelumnya.

Assign Member

Setelah itu, kita tentukan Version dalam proyek. Version ini bisa iterasi, atau fase, tergantung dari siklus pengembangan yang kita gunakan dalam proyek. Version ini nantinya digunakan sebagai target penyelesaian suatu issue.

Project Version

Di halaman selanjutnya, kita akan menentukan kategori untuk issue. Semua tugas di dalam Redmine disebut Issue. Ada tiga jenis issue:

  • Feature: Ini digunakan untuk membuat semacam To Do List untuk fitur yang akan dibuat dalam proyek kita.

  • Bug: Ini digunakan untuk mencatat dan melacak status penyelesaian defect dalam proyek kita. Selain untuk bug aplikasi, saya biasanya menggunakan jenis issue ini untuk mencatat

    • Resiko Proyek

    • Kesalahan dokumen (salah requirement, revisi project schedule, dsb)

    • Masalah yang terjadi dalam proyek

  • Support: fitur ini tidak saya gunakan. Mungkin ini ditujukan untuk pertanyaan dari user yang belum tentu bug.

Saya menggunakan kategori berikut untuk issue:

  • Project Document: Dokumentasi project seperti schedule, progress report, dsb

  • Functional Specification: spesifikasi aplikasi yang ingin dibuat, sering disebut juga dengan dokumen analisa

  • Technical Specification: spesifikasi tentang bagaimana cara membuatnya, sering disebut juga dengan dokumen desain

  • User Documentation: segala issue yang berkaitan dengan dokumen user manual

  • Business Layer: komponen logika bisnis dari aplikasi

  • User Interface Layer: komponen tampilan aplikasi

  • Data Access Layer: komponen aplikasi yang berinteraksi dengan database

Persiapan project selesai. Sekarang kita bisa langsung membuat daftar pekerjaan. Melalui menu, klik Nama Project > New Issue > Feature.

New Feature

Kita bisa daftarkan tugas yang harus dilakukan dengan mengisi informasi pada formnya. Setelah diisi, tekan Save dan lihat hasilnya pada tampilan daftar issue.

List of Issue

Issue yang sudah didaftarkan dapat dilacak pengerjaannya. Dari tampilan daftar issue, klik nama issue sehingga muncul tampilan detailnya.

Detail Issue

Kita bisa klik Log Time untuk memasukkan waktu yang sudah kita gunakan untuk menyelesaikan issue tersebut.

Log Time

Isikan jumlah jam yang digunakan, misalnya 2 jam, lalu klik Save. Selanjutnya kita akan diarahkan ke halaman Spent Time. Halaman ini menunjukkan jumlah waktu yang sudah digunakan untuk berbagai task dalam project. Kita bisa melihat jumlah waktu untuk satu task saja ataupun keseluruhan project.

Sekarang kita sudah memiliki beberapa issue yang terdaftar. Data tersebut ditampilkan oleh Redmine dalam berbagai bentuk, misalnya:

Calendar

Calendar

Gantt Chart

Gantt Chart

Report

Report

Activity

Activity

Roadmap

Roadmap

Untuk tampilan Activity dan Roadmap mirip sekali dengan Trac. Activity di Trac disebut dengan Timeline. Entah disengaja atau tidak, dari tampilan sampai cara kerjanya tidak dapat dibedakan. Silahkan lihat sendiri.

Timeline Trac

Timeline ala Trac

Roadmap Trac

Roadmap ala Trac

Kita juga bisa melihat isi repository Subversion kita. Repo Browser

Seperti repo browser lainnya, kita bisa melihat perbandingan antara dua versi file yang berbeda. Inline Diff

Perbedaan ini bisa ditampilkan secara inline seperti gambar di atas, atau secara berdampingan seperti ini.

Side by Side Diff

Demikianlah sekilas tentang aplikasi Redmine. Masih banyak fitur Redmine yang belum dieksplorasi, misalnya wiki, document management, dan file management. Mengingat umurnya yang masih muda, besar harapan Redmine akan semakin canggih di masa yang akan datang.

Dengan menggunakan aplikasi ini, kita dapat mengelola berbagai aspek dalam manajemen proyek kita secara terpusat. Redmine gratis dan mudah diinstal, jadi tunggu apa lagi … segera gunakan.


Pakai IDE apa?

Posting ini dibuat untuk menanggapi diskusi di milis Netbeans. Saya menyarankan para programmer, daripada menghabiskan waktunya untuk memperdebatkan editor, lebih baik menginvestasikan waktu dan energi untuk memperdalam konsep. Ekstrimnya, coding dengan Notepad bila perlu.

Salah satu programmer hebat yang saya kenal, sampai hari ini masih coding menggunakan editornya Midnight Commander (MC). Untuk urusan produktivitas, daftar hasil karyanya lebih panjang daripada anda-anda yang berdebat Eclipse vs Netbeans.

Dari keseluruhan hasil karyanya, perkiraan saya paling tidak 75% dibuat dengan editor MC. Dan aplikasi yang ada di sana adalah aplikasi betulan, bukan tugas kuliah, bukan skripsi.

Editor Midnight Commander, kalau ingin tau, terlihat seperti ini:

Tampilan Editor MC

Tidak ada autocomplete, tidak bisa mouse over terus keluar JavaDoc, tidak bisa klik kanan - Deploy in Tomcat.

Komentar di milis Netbeans tentang coding pakai editor seperti ini:

waduh pake notepad… be-darah2 itu mah codingnyah

Not really … gak juga kok. Memang lebih lambat daripada pakai Eclipse/Netbeans, soalnya kalo ada syntax error baru ketahuan setelah compile.

Workflownya mirip dengan coding PHP. Edit kodenya, save, refresh browser.

Kalau Java, edit, save, Alt-Tab ke konsol, ant compile. Nanti kan keluar pesan errornya di baris berapa.

Buat yang belum merasakan, memang terkesan seperti latihan kungfu di Shaolin. Keras dan melelahkan.

Tapi ada hasilnya:

  • Bebas mau pakai IDE apa aja.
    Bisa pakai the right tools for the right job. Spring development, pakai Eclipse. Desktop development, pakai Netbeans. Bikin aplikasi desktop yang mengakses Webservice, pakai 2-2nya

  • Lebih jeli dalam mendebug.
    Sampai saat ini, sebagian besar XML code harus didebug manual, karena memang by nature sulit untuk disupport IDE. Development jaman sekarang, pasti harus melibatkan XML. Dengan coding pakai editor minimalis, kita akan terbiasa melihat error message dan mengartikannya.

  • Lebih mudah mempelajari teknik automation, misalnya Continuous Integration (CI).
    Soalnya CI itu mengharuskan kita bisa compile tanpa IDE. Buat yang tidak terbiasa (apalagi lulusan VB/Delphi), pasti akan kaget, bagaimana bisa compile tanpa IDE?

  • Lebih cepat belajar bahasa pemrograman baru.
    Kalau kita terbiasa coding pakai IDE, begitu belajar bahasa baru, hal pertama yang kita pikirkan adalah, “IDE-nya pakai apa ya??”. Lalu menghabiskan dua minggu debat di milis, baru pilih salah satu. Download butuh waktu 2 hari. Setelah terinstal, baca Help setengah jam, baru tau cara bikin file baru. Setelah coding Hello World, bingung cari tombol Compile dan Run, 2 jam lagi untuk baca Help. Notepad coder tidak. Langsung buka apapun editor yang tersedia, mulai coding dan compile via command-line. Pada saat IDE-code baru bisa menjalankan Hello World, Notepad-coder sudah paham tentang duck-typing.

Satu pertanyaan yang selalu saya ajukan kalau ada yang tanya tentang IDE, RAD tools, dan sejenisnya.

“Apakah ini coding untuk belajar, atau coding untuk mencari nafkah??”

Kalau jawabannya belajar, entah itu mahasiswa, atau pro yang belajar framework baru, gunakan tools sesedikit mungkin.

Alasannya adalah, karena tujuan kita untuk paham, bukan untuk selesai. Semakin banyak/canggih tools yang digunakan, pemahaman semakin minim. Tambahan lagi, kalau ada error (yang mana akan sering terjadi, namanya juga lagi belajar) sulit membedakan error karena salah pakai tools, atau error di kode program kita.

Belajar Spring AOP dengan Notepad, tidak mungkin notepad yang salah, pasti kode kita. Belajar Spring AOP dengan Netbeans/Eclipse, ada kemungkinan tools tersebut salah loading classpath, punya asumsi sendiri tentang struktur folder, dsb.

Kalau jawabannya untuk mencari nafkah, gunakan tools tercanggih yang bisa diperoleh dengan halal. Hal ini hanya mungkin jika kita tidak terikat pada tools tertentu. Tidak akan bisa coding desktop dengan Netbeans, kemudian buka Eclipse untuk coding server-side backend.

Demikian saran dari saya.


Konfigurasi Mentari GPRS dengan LG KG300 di Ubuntu Gutsy

Maraknya akses internet 3G rupanya berimbas pada turunnya harga layanan GPRS. Salah satu yang sudah turun harga adalah Mentari, dari Rp. 5/kB menjadi Rp. 1/kB, setidaknya sampai Januari 2008.

Dengan adanya perkembangan yang menggembirakan ini, saya segera mengaktifkan koneksi GPRS tersebut agar bisa digunakan dari laptop. Caranya tidak terlalu sulit, seperti akan kita lihat segera.

Hardware

Laptop saya NEC Versa E3100, tepatnya seri E3100-1800DR. Handphone yang saya gunakan adalah LG KG300, seperti yang diiklankan Agnes Monica di TV. Jadi kalau kapan-kapan Agnes mau setting GPRS juga, bisa lihat artikel ini :D

Koneksi handphone ke laptop menggunakan kabel data, karena laptop saya tidak ada blututnya.

Software

Saya menggunakan Ubuntu Gutsy Gibbon 7.10, yang sudah dilengkapi dengan wvdialconf dan wvdial untuk melakukan koneksi. Tidak perlu ada instalasi software tambahan, karena kedua aplikasi ini sudah terinstal dari sananya.

Provider

Saya pakai Mentari. Sebelum mencoba koneksi melalui komputer, pastikan dulu kita bisa browsing langsung dari HP. Ini untuk memastikan bahwa dari HP ke Provider sudah OK. Jangan sampai sudah pusing-pusing utak-atik Ubuntu, ternyata masalahnya ada di HP. Untuk LG KG300, kita bisa konfigurasi otomatis melalui OTA. Cukup kirim SMS ke 3000 dengan isi sebagai berikut:

gprs lg kg300

Nanti kita akan terima SMS, yang bila dibuka akan ada konfirmasi apakah kita ingin mengkonfigurasi GPRS. Tentu saja jawab Yes. Silahkan browsing ke Yahoo di http://m.yahoo.com atau Gmail di http://gmail.com/app.

Bila Anda punya akun YM, bisa dicoba chatting di sana.

LG KG300 punya fasilitas Java dengan versi MIDP 2.0. Bila malas chat melalui antarmuka Yahoo, bisa gunakan aplikasi shMessenger.

Konfigurasi

Setelah lancar browsing dan chatting di handphone, kini tiba saatnya kita browsing di laptop. Hubungkan handphone ke laptop melalui kabel data yang disediakan. Nanti di handphone akan muncul pertanyaan, apakah kita ingin terhubung sebagai Storage Media atau COM2. Pilih COM2. Storage Media dipilih bila ingin melakukan transfer file.

Oh iya, untuk memudahkan troubleshooting, selama melakukan konfigurasi, tampilkan kernel log dengan perintah tail -f /var/log/messages di konsol. Biarkan window ini tetap terbuka selama konfigurasi.

Di kernel log akan muncul laporan deteksi modem seperti ini:

Oct 26 09:19:28 sweetdreams kernel: [  507.608000] usb 1-2: new full speed USB device using uhci_hcd and address 2
Oct 26 09:19:29 sweetdreams kernel: [  507.792000] usb 1-2: configuration #1 chosen from 1 choice
Oct 26 09:19:29 sweetdreams kernel: [  508.100000] cdc_acm 1-2:1.1: ttyACM0: USB ACM device
Oct 26 09:19:29 sweetdreams kernel: [  508.104000] usbcore: registered new interface driver cdc_acm
Oct 26 09:19:29 sweetdreams kernel: [  508.104000] /build/buildd/linux-source-2.6.22-2.6.22/drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters

Setelah itu, jalankan wvdialconf sebagai root.

sudo wvdialconf
Editing `/etc/wvdial.conf'.

Scanning your serial ports for a modem.

Modem Port Scan: S0   S1   S2   S3   SL0  
WvModem: Cannot get information for serial port.
ttyACM0: ATQ0 V1 E1 -- OK
ttyACM0: ATQ0 V1 E1 Z -- OK
ttyACM0: ATQ0 V1 E1 S0=0 -- OK
ttyACM0: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyACM0: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyACM0: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyACM0: Modem Identifier: ATI -- MTK2
ttyACM0: Speed 4800: AT -- OK
ttyACM0: Speed 9600: AT -- OK
ttyACM0: Speed 19200: AT -- OK
ttyACM0: Speed 38400: AT -- OK
ttyACM0: Speed 57600: AT -- OK
ttyACM0: Speed 115200: AT -- OK
ttyACM0: Speed 230400: AT -- OK
ttyACM0: Speed 460800: AT -- OK
ttyACM0: Max speed is 460800; that should be safe.
ttyACM0: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

Found an USB modem on /dev/ttyACM0.
/etc/wvdial.conf: Can't open '/etc/wvdial.conf' for reading: No such file or directory
/etc/wvdial.conf: ...starting with blank configuration.
Modem configuration written to /etc/wvdial.conf.
ttyACM0: Speed 460800; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"

Hasilnya adalah sebuah file /etc/wvdial.conf sebagai berikut:

[Dialer Defaults]
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = USB Modem
; Phone = 
ISDN = 0
; Username = 
Init1 = ATZ
; Password = 
Modem = /dev/ttyACM0
Baud = 460800

Edit menjadi seperti ini:

[Dialer Defaults]
Modem = /dev/ttyACM0
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","indosatgprs"
Stupid Mode = on
Modem Type = USB Modem
Phone = *99***1#
ISDN = 0
Username = indosat
Password = indosat
Baud = 460800

Go Online

Kalau sudah, saatnya kita online. Gunakan perintah wvdial untuk melakukan dial-up.

sudo wvdial
WvDial<*1>: WvDial: Internet dialer version 1.56
WvModem<*1>: Cannot get information for serial port.
WvDial<*1>: Initializing modem.
WvDial<*1>: Sending: ATZ
WvDial Modem<*1>: ATZ
WvDial Modem<*1>: OK
WvDial<*1>: Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
WvDial Modem<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
WvDial Modem<*1>: OK
WvDial<*1>: Sending: AT+CGDCONT=1,"IP","indosatgprs"
WvDial Modem<*1>: AT+CGDCONT=1,"IP","indosatgprs"
WvDial Modem<*1>: OK
WvDial<*1>: Modem initialized.
WvDial<*1>: Sending: ATDT*99***1#
WvDial<*1>: Waiting for carrier.
WvDial Modem<*1>: ATDT*99***1#
WvDial Modem<*1>: CONNECT
WvDial Modem<*1>: ~[7f]}#@!}!} } }2}"}&} } } } }#}$@#}'}"}(}"R[04]~
WvDial<*1>: Carrier detected.  Starting PPP immediately.
WvDial<Notice>: Starting pppd at Fri Oct 26 09:25:58 2007
WvDial<Notice>: Pid of pppd: 6028
WvDial<*1>: Using interface ppp0
WvDial<*1>: local  IP address 10.33.41.205
WvDial<*1>: remote IP address 10.64.64.64
WvDial<*1>: primary   DNS address 202.155.0.10
WvDial<*1>: secondary DNS address 202.155.46.77

Setelah itu, silahkan coba browsing. Jangan tutup window wvdial supaya tidak disconnect.

Untuk menghentikan koneksi, cukup ketik Ctrl-C di window wvdial.

Caught signal 2:  Attempting to exit gracefully...
WvDial<*1>: Terminating on signal 15
WvDial<*1>: Connect time 1.2 minutes.
WvDial<*1>: Disconnecting at Fri Oct 26 09:27:20 2007

Kita dapat melihat keseluruhan sesi internet, berikut jumlah trafik yang kita gunakan di kernel log, sebagai berikut.

Oct 26 09:25:58 sweetdreams pppd[6028]: pppd 2.4.4 started by root, uid 0
Oct 26 09:25:58 sweetdreams pppd[6028]: Using interface ppp0
Oct 26 09:25:58 sweetdreams pppd[6028]: Connect: ppp0 <--> /dev/ttyACM0
Oct 26 09:26:00 sweetdreams pppd[6028]: PAP authentication succeeded
Oct 26 09:26:12 sweetdreams pppd[6028]: Could not determine remote IP address: defaulting to 10.64.64.64
Oct 26 09:26:12 sweetdreams pppd[6028]: local  IP address 10.33.41.205
Oct 26 09:26:12 sweetdreams pppd[6028]: remote IP address 10.64.64.64
Oct 26 09:26:12 sweetdreams pppd[6028]: primary   DNS address 202.155.0.10
Oct 26 09:26:12 sweetdreams pppd[6028]: secondary DNS address 202.155.46.77
Oct 26 09:27:19 sweetdreams pppd[6028]: Terminating on signal 15
Oct 26 09:27:19 sweetdreams pppd[6028]: Connect time 1.2 minutes.
Oct 26 09:27:19 sweetdreams pppd[6028]: Sent 0 bytes, received 0 bytes.
Oct 26 09:27:19 sweetdreams pppd[6028]: Connection terminated.
Oct 26 09:27:19 sweetdreams pppd[6028]: Exit.

Demikianlah cara konfigurasi modem LG KG300 di Ubuntu. Mudah-mudahan dengan adanya artikel ini, Agnes Monica bisa segera online.


Continuous Integration dengan Hudson

Pada artikel sebelumnya, kita sudah membahas penggunaan Luntbuild dan CruiseControl untuk menerapkan Continuous Integration (CI). Kali ini, kita akan mencoba Hudson, aplikasi CI lain yang tersedia.

Hudson dapat diunduh dari websitenya. Setelah mengunduh, kita akan mendapatkan satu file *war. File ini dapat langsung dijalankan standalone dengan perintah:

java -jar hudson.war

Ataupun dideploy ke servlet engine favorit Anda, seperti Tomcat atau sejenisnya.

Setelah dideploy, kita bisa melihat tampilan awalnya melalui browser ke alamat http://localhost:8080 (untuk standalone) atau http://localhost:8080/hudson (bila dideploy ke servlet engine)

Keunggulan pertama Hudson adalah kemudahan setupnya. Segera setelah dijalankan (baik standalone maupun dideploy), kita bisa segera mengunjungi halaman depannya.

Hudson Welcome Page

Hal pertama yang saya lakukan adalah konfigurasi email. Bila ini tidak dilakukan, Hudson akan gagal mengirim email laporan hasil build.

Klik Manage Hudson di sebelah kiri atas. Layar konfigurasi akan muncul.

Manage Hudson

Selanjutnya, pilih System Configuration, lalu scroll ke bagian bawah untuk mengatur email.

Email Configuration

Setelah selesai, klik OK.

Bila Ant belum ada di PATH komputer Anda, jangan lupa untuk menyebutkan folder instalasi Ant di halaman ini.

Setelah selesai, kita bisa langsung mendaftarkan job. Klik tombol New Job di kiri atas.

Create New Job

Project saya menggunakan Ant biasa, tanpa Maven. Jadi saya pilih free-style. Klik OK.

Selanjutnya, kita konfigurasi repository project. Isikan nilai yang sesuai di bagian Source Code Management.

Configure Subversion

Segera setelah kursor meninggalkan field Repository URL (on blur), Hudson akan memeriksa URL yang kita berikan. Bila URL tersebut membutuhkan otentikasi, Hudson akan mengeluarkan pesan error dengan link untuk mengkonfigurasi username dan password.

Subversion Authentication

Isikan nilai yang sesuai. Seperti kita lihat, Hudson mendukung beberapa modus otentikasi.

Bagian selanjutnya adalah jadwal build atau trigger. Hudson menggunakan format yang mirip dengan Cron.

Build Schedule

Bila kita ingin melakukan build setiap jam, hanya pada hari kerja, entrinya adalah sebagai berikut:

1 * * * 1-5

Agar build berjalan setiap jam 1 dini hari, hari Senin dan Rabu, entrinya sebagai berikut:

0 * 1 * 1,3

Setelah jadwal, kita mengkonfigurasi proses build itu sendiri. Di project saya, build dilakukan oleh Ant. Kita bisa mendaftarkan target yang akan dieksekusi.

Build Method

Terakhir, kita mengkonfigurasi post build. Ini adalah kegiatan yang dilakukan setelah build sukses dijalankan. Pada tahap ini, saya ingin Hudson mempublikasikan *.jar atau *.war yang dihasilkan agar siap didonlod.

Post Build

Selain itu, saya juga bisa menyuruh Hudson untuk memproses hasil unit test JUnit. Hudson mengerti file XML yang dihasilkan JUnit dan TestNG.

Hudson juga bisa disuruh mengirim email apabila terjadi kegagalan build. Di sini biasanya saya isi dengan alamat mailing list developer.

Setelah selesai, klik Save.

Selanjutnya, kita tinggal melihat-lihat hasilnya.

Di halaman depan, kita bisa lihat rangkuman status tiap project.

Build Status

Klik salah satu project, dan lihat detailnya

Build Result

Di situ kita bisa lihat artifact yang sudah dipublish. Dari semua build yang sudah dilakukan, kita bisa lihat trendnya.

Trend of Build Time

Selain itu, kita juga bisa lihat hasil JUnit test.

JUnit Result

Kesimpulan akhir, berikut adalah perbandingan ketiga tools ini.

Tools Setup Tampilan Aksesoris Tag Otomatis

CruiseControl

Sulit, semua harus pakai XML

Kurang bagus, terlihat kuno

Lengkap

Bisa, menggunakan publisher

Luntbuild

Mudah, setup melalui web

Rumit dan kurang intuitif

Sangat sedikit

Bisa, dikonfigurasi melalui web

Hudson

Sangat Mudah

Bagus, intuitif, Web 2.0, AJAX

Eclipse plugin, Netbeans Plugin, Trac Plugin

Tidak bisa, harus manual

Demikianlah, semoga bermanfaat.


Dump Restore PostgreSQL

Pada tahap implementasi, fitur dump-restore database sangat penting. Dengan fitur ini, kita bisa melakukan migrasi data di mesin development, melakukan troubleshoot, data cleansing, dan sebagainya dengan tenang. Begitu sudah selesai, kita dump struktur tabel berikut datanya dari mesin development, kemudian buat database baru di mesin production, lalu restore.

Agar tidak lupa, berikut saya tulis rangkaian langkah-langkahnya. Diasumsikan kita sudah memiliki database development dengan parameter sebagai berikut:

  • Nama Database : buku_tamu
  • Username : belajar
  • Password : java
  • File hasil dump : buku_tamu-schema-20070925-2021.sql dan buku_tamu-data-20070925-2021.sql

Untuk melakukan dump skema tabel, berikut adalah perintahnya:

pg_dump --schema-only --no-owner -h localhost --username belajar buku_tamu | grep -v "^--"  > buku_tamu-schema.sql && sed -i '/^SET/d' buku_tamu-schema.sql && sed -i '/^SELECT/d' buku_tamu-schema.sql && mv buku_tamu-schema.sql buku_tamu-schema-`date +%Y%m%d-%H%M`.sql

Penjelasannya sebagai berikut:

  • --pg_dump : adalah aplikasi command line untuk melakukan import
  • --schema-only : hanya membuat DDL statement, tanpa data
  • --no-owner : tidak perlu mengatur kepemilikan tabel dan view
  • -h : supaya koneksi dilakukan melalui TCP/IP, bukan Unix socket
  • grep -v "^--" : menghilangkan baris-baris comment di file hasil backup
  • sed -i '/^SET/d' : menghilangkan command-command SET yang kita tidak perlukan
  • sed -i '/^SELECT/d' : menghilangkan command-command SELECT yang kita tidak perlukan

Untuk melakukan dump data dalam database, berikut adalah perintahnya:

pg_dump --column-inserts --data-only -h localhost -U belajar buku_tamu | grep -v "^--" > buku_tamu-data.sql  && sed -i '/^SET/d' buku_tamu-data.sql && sed -i '/^SELECT/d' buku_tamu-data.sql && mv buku_tamu-data.sql buku_tamu-data-`date +%Y%m%d-%H%M`.sql

Penjelasannya sebagai berikut:

  • --column-inserts : mencantumkan nama kolom dalam statement insert data
  • --data-only : hanya membuat INSERT statement

Selanjutnya, tiba saat melakukan restore. Parameternya sama dengan database development, kecuali nama databasenya adalah buku_tamu_prod. Bila database belum ada, buat dulu dengan user postgres.

$ sudo su - postgres
$ createdb buku_tamu_prod
CREATE DATABASE
$ exit

Baru setelah itu kita lakukan restore.

psql -h localhost -d buku_tamu_prod -U belajar -f buku_tamu-schema-20070925-2021.sql.sql
psql -h localhost -d buku_tamu_prod -U belajar -f buku_tamu-data-20070925-2021.sql.sql

Penjelasan opsinya adalah sebagai berikut:

  • -h : supaya connect melalui TCP/IP, bukan lewat Unix socket
  • -d : nama database yang akan direstore
  • -U : username yang digunakan untuk koneksi
  • -f : file dump

Bila tidak ada pesan error, struktur tabel dan data seharusnya sudah masuk ke database baru.