Deploying Jekyll on Shared Hosting
Posted on 29 January 2013
A couple of weeks ago I finally finished porting my website and blog to make use of the wonderful static site generator, Jekyll.
In order to get my whole writing/editing/deploying workflow fully automated I installed jekyll, along with its dependencies, and also setup a git post-receive hook (based on the official docs on github) to automatically build the site.
Since I have a shared hosting plan, however, I don’t have admin rights to install any pieces of software. Here are the steps I took, and you can too, in order to get around the restrictions to install everything and setup the automation.
First, install Ruby Version Manager(RVM) to get a local copy of Ruby in your home folder. Be sure to follow all the install instructions to ensure that your
$PATH environment variable is correctly setup. To verify, call
which ruby and make sure the output is within the RVM install location in your home folder.
Finally, you are ready to install the jekyll without needing root privileges. Also required is the pygments python library to provide code highlighting. I decided to install the pygmentize Ruby gem, which sources the python library, to avoid having to jump through more hoops to get
pip to work without root.
Here’s all that text on the command line:
laptop:~$ ssh firstname.lastname@example.org server:~$ \curl -L https://get.rvm.io | bash -s stable --ruby ... server:~$ which ruby /path/to/home/directory/.rvm/rubies/ruby-1.9.3-p362/bin/ruby server:~$ gem install jekyll ... server:~$ gem install pygmentize ...
Next, I setup the git repository to be able to receive my code. Follow the following steps to setup the directory structure and repository location I used:
server:~$ ls htdocs/ server:~$ mkdir tmp server:~$ mkdir git server:~$ cd git server:~/git$ git --bare init website.git ... sever:~/git$ ls website.git/ sever:~/git$ cd ~ server:~$ ls git/ htdocs/ tmp/
The bare git repository is the one where you will push up changes to your site. Then, the
tmp directory is where a temporary copy of your code will get checked out for processing by jekyll. And of course, the folder
htdocs (or whatever it is called for your particular hosting service) is the public directory that will hold your site’s live contents.
To setup the automatic checkout-generation-deployment-cleanup flow, you will need to use a post-receive hook for the bare git repository. To create the script, you need to edit the
~/git/website.git/hooks/post-receive file. In the file paste in the following script:
#!/bin/sh # Directory locations GIT_REPO=$HOME/git/website.git TMP_GIT_CLONE=$HOME/tmp/website PUBLIC_WWW=$HOME/htdocs # Make sure character encodings are set to avoid any issues with accented letters and the like export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 # Assuming you installed rvm in the default location # Setup the environment to be able to find the required gems source $HOME/.rvm/environments/ruby-1.9.3-p362 # Cleanup old checked out version if it's still there if [ -d "$TMP_GIT_CLONE" ]; then rm -rf $TMP_GIT_CLONE fi git clone $GIT_REPO $TMP_GIT_CLONE # Change into checkout directory to avoid issues with plugins not running cd $TMP_GIT_CLONE # Generate the site and output the files into the final destination jekyll --no-auto $TMP_GIT_CLONE $PUBLIC_WWW exit
If you changed or want to change any of the locations, such as those for the temporary checkout or the final public folder, feel free to make those changes. Just remember to come back and update your post-receive hook to do the right thing.
Finally, on your local machine link up your development/writing git repo to your deployment server by adding a deploy remote:
laptop:~$ git remote add deploy email@example.com:~/git/website.git
And then whenever you want to update your website, just call the following command:
laptop:~$ git push deploy master
Tada! Now you have a fully automated workflow for your jekyll powered website.
← Previous Post Next Post →
comments powered by Disqus