Continuous Integration Sederhana Jekyll dan Github Webhook

Continuous Integration Sederhana Jekyll dan Github Webhook

Saya tidak tahu apakah ini bisa disebut sebagai Continuous Integration. Hahaha. Flownya seperti gambar diatas. Untuk casenya seperti ini:

  • Saya punya VPS dan serving website yang dibuild pakai jekyll di dalamnya.
  • Repo dari situs itu saya simpan di github.
  • Selama ini, dari dalam vps saya pull dan build secara manual.
  • Saya ingin pull otomatis, jekyll build otomatis, dan deploy hasil build secara otomatis, ketika saya melakukan push ke repo yang ada di github.

Solusinya adalah:

  • Github webhook
  • Sesuatu di VPS yang akan menerima webhook (saya akan pakai flask dan bash script).

Saya buat program flask untuk merespon webhook dari github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import Flask, request
import subprocess
import os
import json

app = Flask(__name__)

@app.route('/', methods=['POST'])
def blogrefresh():
    data = json.loads(request.data)
    print "New commit by: {}".format(data['commits'][0]['author']['name'])

    script_path = "/home/sumarsono/jekyll_rebuild.sh"
    subprocess.call([os.path.expanduser(script_path)])
    return "OK"

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000)

Disitu saya memakai library flask, saya install pakai pip. Kemudian ada bash script yang dieksekusi yaitu jekyll_rebuild.sh, harus dibuat.

Bash script untuk build dan deploy jekyll

1
nano /home/sumarsono/jekyll_rebuild.sh

Isinya:

1
2
3
4
5
6
7
#!/bin/bash
source /home/sumarsono/.rvm/scripts/rvm

cd ~/blog/anuan;
git pull origin master;
bundle exec jekyll build;
cp -rf ~/blog/anuan/_site/* /var/www/html/sumarsono/;

Konfigurasi vhost nginx

Saya tidak mau membuka port 5000 ke public, jadi pakai reserve proxy aja buat ngarahin ke localhost:5000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
  listen 80;
  server_name api.anuan.com;

  error_log /var/log/nginx/api/error.log warn;
  access_log /var/log/nginx/api/access.log combined;

  location /jekyll {
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_pass http://localhost:5000/;
  }
}

Nantinya, setiap akses ke api.anuan.com/jekyll akan di proxy ke localhost:5000. Jangan lupa reload nginx, nginx -s reload dan tambahkan subdomain api di manager dns.

eksekusi

siapkan repo di lokal

1
2
3
mkdir /home/sumarsono/blog
cd /home/sumarsono/blog
git clone git clone git@github.com:unomind/anuan.git

Jalankan program python tadi:

1
python /home/sumarsono/webhook.py

Konfigurasi webhook di repo github gh-webhook.png

Kalau kita coba melakukan push ke repo, VPS kita akan menanggapinya kurang lebih seperti ini:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 4 (delta 3), reused 4 (delta 3), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:unomind/nalakawula.github.io
 * branch            master     -> FETCH_HEAD
Updating 0920d54..73fbf41
Fast-forward
 _posts/2019-01-18-pembaruan-otomatis-sertifikat-lets-encrypt-menggunakan-systemd-timer.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Configuration file: /home/sumarsono/blog/anuan/_config.yml
            Source: /home/sumarsono/blog/anuan
       Destination: /home/sumarsono/blog/anuan/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
       Jekyll Feed: Generating feed for posts
                    done in 3.059 seconds.
 Auto-regeneration: disabled. Use --watch to enable.
127.0.0.1 - - [19/Jan/2019 05:13:53] "POST / HTTP/1.0" 200 -

PR selanjutnya adalah menambahkan secret.