Beberapa hal yang perlu diperhatikan ketika menggunakan Gitlab CI:
Perintah git berakhir dengan exit 1
Perlu diingat bahwa Gitlab CI akan menganggap pipeline berhasil jika semua tugas yang harus dijalankan pada .gitlab-ci.yml berakhir dengan exit code 0
. Ternyata, jika kita menambahkan perintah git sebagai salah satu script yang harus dijalankan, maka ia akan berakhir dengan status 1 walaupun tidak ada masalah dengan perintah git yang dijalankan. Misalnya untuk konfigurasi berikut:
1build:
2 only:
3 - master
4 script:
5 - yarn build
6 - git add . && git commit -m "$(date)"
7 - git push ${REPO_URL}
Pada konfigurasi di atas, baris 6 da 7 (perintah git) berakhir dengan exit code 1
sehingga pipeline dianggap gagal oleh Gitlab CI. Walaupun proses git add, git commit dan git push tidak menimbulkan konflik dan berhasil. Untuk menanggulani hal tersebut kita bisa mengakalinya dengan "memaksa" Gitlab CI menganggap perintah git selalu sukses. Berikut perubahan yang saya lakukan:
1build:
2 only:
3 - master
4 script:
5 - yarn build
6 - git add . && git commit -m "$(date)" && git push ${REPO_URL} && exit 0
Pada konfigurasi tersebut ada beberapa hal yang terjadi:
- perintah git diakhiri dengan
exit 0
untuk "memaksa" perintah tersebut berakhir dengan sukses. - menggabungkan semua perintah git menjadi 1 baris untuk menghindari konfigurasi berikut:
1- git add . && git commit -m "$(data)" && exit 0
2- git push ${REPO_URL} && exit 0
Konfigurasi di atas akan berhenti pada baris pertama tanpa melanjutkan perintah git selanjutnya (git push). Jika dijadikan 1 baris maka semua perintah git akan dijalankan lalu diakhiri exit 0
saat semuanya selesai dijalankan.
Menjalankan script berbasis Node.js berakhir dengan exit 1
Hal yang sama juga terjadi ketika kita menjalankan sebuah script berbasis node.js. Misalnya terdapat konfigurasi:
1build:
2 only:
3 - master
4 script:
5 - node doSomething.js
Apapun yang script tersebut lakukan akan berakhir dengan exit code 1
. Untuk mengakalinya kita harus membuat script berakhir dengan exit code yang tepat. Berikut yang perlu ditambahkan pada script tersebut:
1// file doSomething.js
2
3// some codes
4
5if (somethingSuccess) {
6 process.exit(0);
7} else {
8 process.exit(1);
9}
Dengan konfigurasi tersebut script akan berakhir dengan exit code yang tepat. Hal ini perlu dilakukan untuk script yang tidak didesain untuk berakhir dengan exit code 0. Contoh script yang bisa berakhir dengan exit code 0 adalah script yang berisi unit test, sebab library unit test sudah didesain agar berakhir dengan exit code 0 jika test sukses dan exit code 1 jika test gagal.
Catatan: mungkin saja hal ini juga berlaku jika kita menjalankan script dengan bahasa lain, misalnya ruby something.rb
, python something.py
, dan sebagainya.