Workflow Git untuk Maintainer Project Open Source

Pada artikel sebelumnya, kita sudah membahas tentang apa yang harus dilakukan oleh kontributor agar hasil pekerjaannya siap untuk digabungkan dengan repository utama/induk/upstream, yaitu membuat Pull Request.

Sebagai maintainer project, tugas kita adalah memilah semua kontribusi yang masuk. Bila kontribusinya bagus, maka kita masukkan ke dalam project. Bila kurang bagus, kita pandu untuk memperbaikinya.

Kita bisa menerima kontribusi dalam berbagai bentuk, misalnya:

  • Pull Request di aplikasi version control (Github, Gitlab, Bitbucket, dsb)
  • Link repository kontributor dan branchnya
  • File patch

Begitu kita mendapatkan kontribusi, ada beberapa hal yang harus kita lakukan, yaitu:

  • mengambil kontribusi tersebut
  • melakukan review dan test
  • bila oke, masukkan ke repository
  • bila kurang oke, berikan feedback kepada kontributor

Pull Request di Aplikasi

Semua aplikasi version control populer yang mainstream sekarang ini – seperti Github, Gitlab, Bitbucket – biasanya sudah memiliki fitur manajemen Pull Request. Ini memudahkan orang untuk mengirim kontribusi ke project yang dihosting di aplikasi tersebut. Secara garis besar caranya sama, walaupun disebut dengan istilah yang berbeda-beda. Misalnya, Gitlab dan Bitbucket menyebutnya dengan istilah Merge Request.

Sebagai ilustrasi, kita akan bahas yang Github saja. Aplikasi lain tidak jauh berbeda.

Pertama, kita bisa lihat daftar Pull Request dengan membuka tab Pull Request.

Daftar Pull Request

Kemudian buka detailnya dengan mengklik salah satu pull request yang ingin diproses. Kita akan melihat banyak informasi di sana.

Detail Pull Request

Untuk perubahan sederhana dan non-coding, kita bisa langsung klik commitnya dan melihat perubahan yang dikirimkan. Selanjutnya kita juga bisa langsung menerima kontribusi dengan klik tombol Merge Pull Request.

Walaupun demikian, cara ini tidak dianjurkan. Khususnya untuk kontribusi kode program. Kita harus cek dulu apakah kode programnya bisa dijalankan dengan baik dan tidak mengganggu fitur-fitur yang lain.

Best practicesnya adalah mengunduh dulu kontribusinya di komputer kita dan melakukan review.

Persiapan Review

Pertama, kita pastikan dulu kondisi lokal kita sudah up to date dengan remote.

git checkout master
git pull upstream master

Sebelum melakukan review, sebaiknya kita buat dulu branch khusus untuk integrasi dan review.

git branch review-implementasi-lombok
git checkout review-implementasi-lombok

Nah, sekarang kita siap menarik perubahan yang dikirim kontributor. Caranya berbeda-beda tergantung metode pengiriman kontribusi. Beberapa kondisi yang biasa terjadi:

  • kontributor memiliki repository yang bisa diakses online, kontribusinya terdiri dari beberapa commit dan sudah dikelompokkan dalam satu branch
  • kontribusi terdiri dari beberapa commit, tercampur dalam branch master dengan commit lain yang tidak berkaitan
  • kontribusi hanya terdiri dari satu commit saja
  • kontribusi dikirim dalam bentuk file, bisa via email, layanan sharing file, whatsapp/telegram, dsb

Unduh Kontribusi dari Branch

Kasus pertama yang paling sederhana. Biasanya dilakukan oleh kontributor yang sudah berpengalaman. Kita tinggal pull saja branch tersebut. Misalnya repo kontributor ada di https://github.com/endymuhardin/aplikasi-dosen.git branchnya implementasi-lombok.

git checkout review-implementasi-lombok
git pull https://github.com/endymuhardin/aplikasi-dosen.git implementasi-lombok

Berikut outputnya

From https://github.com/endymuhardin/aplikasi-dosen
 * branch            implementasi-lombok -> FETCH_HEAD
Updating fe9c196..d8686f6
Fast-forward
 pom.xml                                                              |   5 ++
 src/main/java/id/ac/tazkia/dosen/entity/BidangIlmu.java              |  36 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/BuktiKinerja.java            |  34 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/BuktiKinerjaKegiatan.java    |  35 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/BuktiPenugasan.java          |  35 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/BuktiPenugasanKegiatan.java  |  35 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/Dosen.java                   | 218 +------------------------------------------------------------------------
 src/main/java/id/ac/tazkia/dosen/entity/Fakultas.java                |  26 +--------
 src/main/java/id/ac/tazkia/dosen/entity/JenisBuktiKegiatan.java      |  27 +--------
 src/main/java/id/ac/tazkia/dosen/entity/JenisKegiatan.java           |  50 +----------------
 src/main/java/id/ac/tazkia/dosen/entity/JenisPengajuanDokumen.java   |  34 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/JenisSurat.java              |  34 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/KategoriBuktiKegiatan.java   |  28 +---------
 src/main/java/id/ac/tazkia/dosen/entity/KategoriKegiatan.java        |  28 +---------
 src/main/java/id/ac/tazkia/dosen/entity/Kecamatan.java               |  35 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/KegiatanBelajarMengajar.java | 107 +-----------------------------------
 src/main/java/id/ac/tazkia/dosen/entity/KegiatanDosen.java           | 108 +-----------------------------------
 src/main/java/id/ac/tazkia/dosen/entity/Kota.java                    |  35 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/PengajuanDosenProfile.java   | 148 +------------------------------------------------
 src/main/java/id/ac/tazkia/dosen/entity/Permission.java              |  34 +++---------
 src/main/java/id/ac/tazkia/dosen/entity/PoinKegiatan.java            |  42 +-------------
 src/main/java/id/ac/tazkia/dosen/entity/ProgramStudi.java            |  44 +--------------
 src/main/java/id/ac/tazkia/dosen/entity/Provinsi.java                |  28 +---------
 src/main/java/id/ac/tazkia/dosen/entity/Role.java                    |  36 +-----------
 src/main/java/id/ac/tazkia/dosen/entity/SatuanHasilKegiatan.java     |  27 +--------
 src/main/java/id/ac/tazkia/dosen/entity/SuratTugas.java              |  51 +----------------
 src/main/java/id/ac/tazkia/dosen/entity/User.java                    |  51 +----------------
 src/main/java/id/ac/tazkia/dosen/entity/UserPassword.java            |  26 +--------
 28 files changed, 81 insertions(+), 1316 deletions(-)

Perubahan sudah masuk ke repo lokal. Kita bisa buka filenya, jalankan aplikasinya, review kualitas kode program, dan sebagainya.

Commit Tercampur dengan Task Lain

Kalau saya sebagai maintainer, tidak mau repot dengan yang satu ini. Langsung saja berikan feedback kepada kontributor untuk merapikan kontribusinya. Bila dia memang ingin kontribusi ke dua hal berbeda, minimal commitnya dipisahkan. Akan lebih ideal kalau branchnya juga dipisah.

Unduh Satu Commit

Seringkali terjadi orang malas membuat branch. Misalnya dia hanya ingin menambahkan satu hal kecil saja. Koreksi typo, penamaan variabel, komentar, atau hal lain yang remeh temeh. Kemudian dia memberikan ke kita commit-id perubahan tersebut. Di Github, biasanya sudah ada URL patch untuk satu commit tertentu, misalnya https://github.com/endymuhardin/aplikasi-dosen/commit/d8686f6cc4306b75109d88e2834f7e58456c60f6.patch

Kita sebagai maintainer bisa langsung tarik dari URL tersebut

git checkout review-implementasi-lombok
curl https://github.com/endymuhardin/aplikasi-dosen/commit/d8686f6cc4306b75109d88e2834f7e58456c60f6.patch | git am

Kita gunakan perintah git am untuk mengunduh file patch, kemudian menggabungkannya ke source code yang ada. Outputnya seperti ini

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
100 50730    0 50730    0     0   8804      0 --:--:--  0:00:05 --:--:-- 11263
Applying: implement lombok, remove getter/setter
.git/rebase-apply/patch:1570: new blank line at EOF.
+
warning: 1 line adds whitespace errors

Perubahan sudah masuk, kita tinggal review dan test.

File Patch

Ada kalanya kita menerima file dengan format patch. Misalnya, file tersebut kita taruh di folder /tmp. Maka kita bisa proses file tadi dengan git am seperti pada bagian sebelumnya.

git am < /tmp/0001-implement-lombok-remove-getter-setter.patch

Outputnya seperti ini

.git/rebase-apply/patch:1570: new blank line at EOF.
+
warning: 1 line adds whitespace errors.

Perubahan siap kita test dan review.

Berbagai Kemungkinan Hasil

Pada waktu kita menggabungkan (merge) kontribusi orang, ada beberapa hal yang bisa terjadi:

  • kontribusinya oke : bisa langsung diterima.
  • terjadi merge conflict : saya suruh perbaiki dulu. Biasanya ini terjadi karena kontributor coding di atas versi upstream yang jadul. Solusinya, mereka harus pull dari upstream terbaru, kemudian rebase topic branch ke upstream yang baru tersebut.
  • minor problem : saya minta perbaiki, commit lagi ke topic branch yang sama, kemudian notifikasi saya agar saya coba merge lagi.

Menerima Hasil

Setelah kontribusi kita terima, kita akan publish ke repo utama, agar orang lain bisa ikut menikmati kontribusi tersebut. Berikut perintahnya

git checkout master
git merge review-implementasi-lombok
git push upstream master

Kita bisa menghapus branch review-implementasi-lombok tadi, karena sudah tidak dipakai lagi.

git branch -d review-implementasi-lombok

Outputnya seperti ini

Deleted branch review-implementasi-lombok (was d9c732c).

Selanjutnya, menjadi tanggung jawab masing-masing kontributor untuk mengupdate local dan remote reponya masing-masing.

Selamat mencoba, semoga bermanfaat.