Categories
Development Tools

Otomasi Kemaskini Kod Di Server Dengan Git

Sesuatu yang memeningkan kepala dalam minggu ini adalah berkenaan otomasi proses kemaskini kod di server menggunakan Git yang saya cuba pasang. Apa yang saya cuba capai adalah seperti berikut:

  • Saya ada Git server menggunakan Gitlab
  • Saya ada Testing server di tempat lain, server berasingan daripada Gitlab
  • Pembangun akan melakukan push dengan Git ke Git server hasil kerja terbaru mereka
  • Testing server akan membuat pull secara otomatik kod-kod baru dari setiap kali push oleh Pembangun berlaku

Apa yang perlu dilakukan

  1. Di Git server, kita perlu setup satu pengguna baru dengan SSH keynya ataupun memasukkan SSH key menggunakan ciri Deploy Key di dalam Gitlab.
  2. Di Testing server, kita perlu membina satu pasang SSH key untuk diletakkan di dalam Gitlab seperti langkah pertama. Publickey adalah rentetan kod yang digunakan untuk diletakkan ke Gitlab.
  3. Di Testing server juga, kita perlu bina satu fail PHP (atau apa jua bahasa pilihan) yang boleh dipanggil oleh Gitlab nanti menggunakan ciri Web Hook. Fail ini akan menjalankan operasi git pull kelak. Ini contoh kod untuk membuat operasi pull. Saya namakan fail ini git.php.
  4. Kita perlu memberitahu Gitlab di mana URL git.php kita di dalam ciri Web Hook.

Sekiranya ini semua sudah dipasang dengan baik, sepatutnya ahli pasukan untuk projek ini boleh membuat penambahan baru, commit dan kemudian push ke GitLab. Dan apabila itu berlaku, Testing server akan menarik turun kod-kod baru ini secara otomatik.

Tetapi saya menghadapi masalah. Ianya tida berlaku. Saya push hasil kerja terkini, malah membuat fail-fail baru untuk mencuba. Semuanya dipush ke GitLab tetapi Testing server tidak mengambil fail-fail terkini itu.

Di mana silapnya?

Saya sudah dapat atasinya. Secara dasarnya tiada masalah dengan Git server atau Gitlab. Tiada juga apa-apa masalah dengan Git push yang saya lakukan dari komputer.

Masalahnya adalah pada Testing server. Untuk memastikan ini berjaya kita perlulah:

  1. Memastikan akaun user apa yang digunakan oleh Apache (atau webserver) anda. Ini kerana akaun ini yang akan digunakan untuk menjalankan arahan git pull dari dalam git.php. Kita boleh ketahui user akaun ini dengan kod berikut di dalam git.php
  2. Dalam kes saya, user yang biasa digunakan dalam server Ubuntu ni oleh saya adalah “dino”. Tetapi Apache bergerak sebagai “www-data”. Maka kita perlu membina sepasang SSH key untuk www-data, bukan untuk dino mahupun root.
  3. Sebelum membina SSH key, secara amnya, untuk user www-data, ianya akan dibina di dalam /var/www/.ssh. Akan tetapi folder /var/www ini biasanya dimiliki oleh root. Arahan di bawah akan menukar group untuk folder kepada www-data dan mengubah permission kepada 775. Ini akan memberikan kebenaran kepada www-data untuk mengubah isi kandungan folder /var/www lantas membina dan menyimpan SSH key di dalamnya. Kemudian boleh kita bina SSH key
    sudo chgrp -R www-data /var/www
    sudo chmod -R 775 /var/www
    sudo -u www-data ssh-keygen -t rsa

    Taipkan “yes” apabila diminta untuk menaip yes/no. Tekan ‘Enter’ sehingga anda kembali ke command-line.

  4. Seterusnya kita perlu meletakkan publickey dari Testing server untuk user www-data ke dalam Gitlab. Kita boleh menggunakan arahan ini untuk memaparkannya.
    sudo cat /var/www/.ssh/id_rsa.pub

    Apa sahaja yang dipaparkan, salin dan gunakan untuk membina satu SSH key di Gitlab. Ianya boleh dipasangkan di Gitlab sebagai Deploy Key.
    webhook

  5. Pastikan di mana aplikasi dipasang, www-data mempunyai kebenaran untuk menulis data atau fail baru di situ.
  6. Sekiranya belum mengisytiharkan satu projek baru dalam Testing server, kita boleh lakukan arahan seperti berikut di dalam folder itu, yang turut mempunyai git.php
    git init
    git remote add origin [email protected]:myproject.git

    Ini bermakna repo remote kita bernama origin. Dan itu adalah format alamat repo bagi GitLab. Ianya mungkin berbeza dengan Git server awak. Untuk kali yang pertama, bolehlah awak lakukan git pull secara manual.

    git pull origin master
  7. Sekarang kita boleh mencuba membuat push dari komputer lain dan melihat sama ada projek ini dikemaskini ataupun tidak dengan Git.

 Kesilapan saya sebelum ini.

  1. Membuat SSH key bukan untuk www-data. Pada mulanya saya membuat SSH key untuk akaun user saya sendiri di Ubuntu, sedangkah Apache bergerak sebagai www-data. Web hook tidak akan berjaya untuk ini.
  2. Ada juga ketika saya mencuba git clone. Tetapi disebabkan tiada kebenaran untuk menulis fail atau folder, saya mencuba sudo git clone. Ini juga tidak akan berjaya kerana SSH key yang diletakkan di Gitlab bukan untuk root.
  3. Pada satu ketika, saya cuba membina SSH key untuk www-data tapi asyik gagal. Rupa-rupanya ssh akan ditulis di folder /var/www/.ssh tetapi www-data tiada kebenaran untuk folder itu.

 

2 replies on “Otomasi Kemaskini Kod Di Server Dengan Git”

Leave a Reply