Please enable JavaScript to view the comments powered by Disqus. Otomatis Pull Git menggunakan Hook | Satrion Community

Otomatis Pull Git menggunakan Hook


Install Web Hook

Hook dapat berjalan menggunakan Laravel, pastikan laravel sudah terinstall d server Anda dan dapat diakses menggunakan URL server hook Anda. contoh hook.satrion.com. Setelah itu, untuk menambahkan Hook di Laravel project Anda, gunakan command berikut:

composer require bryanjack/git

Install database git hook dengan menggunakan command berikut:

php artisan migrate

Setelah Anda menjalankan command diatas, di database akan ada table baru bernama repos. Table tersebut memiliki kolom:

  1. id : nomor id secara urut
  2. project : nama project di GitHub/GitLab
  3. master_ip : IP Address untuk production
  4. master_user : Username untuk melakukan update project di server
  5. master_path : Path lokasi project disimpan e.g: /home/apmin/public_html/test
    Selain master, ada juga kolom untuk UAT, Dev, dan DRC.

Secret token digunakan sebagai unique key bahwa request ke Hook datang dari sumber yang valid. Buat secret toket sesuai keinginan Anda dengan menambahkan line berikut di file .env pada Laravel:

secret_token='super_awesome'

Server Hook juga dapat mengirimkan notifikasi ke telegram dengan menambahkan config berikut di file .env:

bot_api_key='123123123:AABBCCPFkc6w3RNpYH0wiYkGJPFkc6w3RNp'
bot_username='HOOKBOT'
chat_id='-123123123'

Setting Server Hook

Agar server Hook dapat melakukan pull d server lain, diperlukan credential oleh server hook untuk mengakses server tersebut.
Buat ssh key yang akan digunakan oleh server Hook dengan menggunakan command berikut:

ssh-keygen -t rsa -b 4096 -C "bryan_awesome_satrion"

copy ssh key yg telah dibuat ke directory apache

sudo cp -R ~/.ssh /usr/share/httpd/.ssh
sudo chown -R apache.apache /usr/share/httpd/.ssh

Menggunakan user apmin, buat file initial_server.sh dengan isi sebagai berikut:
Ganti hook.satrion.com menjadi nama domain hook Anda.

ssh-copy-id $1@$2
cat ~/.ssh/id_rsa.pub | ssh $1@$2 "cat >>  ~/.ssh/id_rsa.pub"
cat ~/.ssh/id_rsa | ssh $1@$2 "cat >>  ~/.ssh/id_rsa"
ssh $1@$2 "chmod -R 700 ~/.ssh && ssh-keyscan hook.satrion.com >> ~/.ssh/known_hosts"

Untuk pertama kali akses ke server target, jalankan command berikut dengan mengganti 10.100.10.10 dengan IP target Anda.

sudo -u apache ./initial_server.sh apmin 10.100.10.10

Setting GitLab / GitHub Webhook

Agar setiap project yang dipush atau merge dapat diupdate ke server, diperlukan triger dari GitLab/GitHub ke server Hook yang disebut sebagai Webhooks.
Untuk menambahkan Webhooks, buka project Anda di GitLab, lalu pilih setting -> Webhooks. Isikan URL menggunakan domain server Hook Anda ditambah URL suffix berikut:

https://hook.satrion.com/git/hook.php

Dan juga isikan secret token yang telah kita buat sebelumnya di kolom secret token pada GitLab.

Testing

Tambahkan project test beserta ip, user, dan path untuk colom master di database Anda.
Anda dapat mencoba apakah instalasi hook Anda sudah sukses atau belum, dengan menggunakan Postman untuk mengirimkan contoh request berikut:
Header:

X-Gitlab-Token: super_awesome

Body:

{
  "object_kind": "push",
  "event_name": "push",
  "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
  "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
  "ref": "refs/heads/master",
  "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
  "message": "Hello World",
  "user_id": 4,
  "user_name": "John Smith",
  "user_email": "john@example.com",
  "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
  "project_id": 15,
  "project": {
    "id": 15,
    "name": "test",
    "description": "",
    "web_url": "https://test.example.com/gitlab/gitlab",
    "avatar_url": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
    "git_ssh_url": "git@test.example.com:gitlab/gitlab.git",
    "git_http_url": "https://test.example.com/gitlab/gitlab.git",
    "namespace": "gitlab",
    "visibility_level": 0,
    "path_with_namespace": "gitlab/gitlab",
    "default_branch": "master"
  },
  "commits": [
    {
      "id": "c5feabde2d8cd023215af4d2ceeb7a64839fc428",
      "message": "Add simple search to projects in public area\n\ncommit message body",
      "title": "Add simple search to projects in public area",
      "timestamp": "2013-05-13T18:18:08+00:00",
      "url": "https://test.example.com/gitlab/gitlab/-/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428",
      "author": {
        "name": "Test User",
        "email": "test@example.com"
      }
    }
  ],
  "total_commits_count": 1,
  "push_options": {
    "ci": {
      "skip": true
    }
  }
}