How do I Post

Or how this site is updated

This site is build via jekyll and the sources are coming from a git repository on github. I do not write something special about git or jekyll here. Just how the “deployment” works.

Github webhook

Github Webhook

Github has a nice feature called “Service hooks” - especially a “Post-Receive URLs” hook. I use this hook to notify my server to do a git pull on a local repository, then rebuild the site with jekyll and rsync changed data to the document root.

The perl webhook endpoint (Dancer.pm code):

    package ReceiveHook;
    use Dancer ':syntax';
    our $VERSION = '0.3';
    # Configuration for different projects
    my $config = {
        "PROJECTNAME" => {
            run => "/home/user/bin/updateblog.sh",
        },
    };
    prefix '/notify';
    get '/*' => sub {
        header 'Allow' => 'POST';
        status '405';
        "Not for you\n";
    };
    post '/:project' => sub {
        if (not defined $config->{params->{project}}) {
            status 'not_found';
            return "No such project: ".params->{project}."\n";
        }
        my $payload = params->{'payload'};
        if (not defined $payload) {
            status '415';
            return "I need a payload\n";
        }
        # Read the configuration for that repo
        my $repo_config = $config->{$repo->{name}};
        if (defined $repo_config && defined $repo_config->{run}) {
            eval {
                system $repo_config->{run};
            };
        }
        return "OK";
    };
    true;

The update itself is done by this little shellscript:

    #!/bin/sh

    REPPATH="/home/user/git/localgitrepository"
    DEPLOYTARGET="/var/www/sites/mydomain"
    LIVEURL="http://mydeploydomain.tld"

    if [ -d ${REPPATH} ] ; then
        cd "${REPPATH}"
        git pull
        jekyll --url "${LIVEURL}"
        rsync -rXogpEAt _site/ "${DEPLOYTARGET}"
    fi
    

Code

Github repository feel free to use it as you like.

blog comments powered by Disqus
Posted at by toke