Sunset

How to Schedule your Jekyll Posts

· by Jared · Read in about 4 min · (751 words)

Here’s a quick tutorial on how to get your jekyll blog to post at certain time intervals.

Assumptions: * This article assumes you already have the basic knowledge and ability to modify the server that is running your jekyll site. * This article assumes you are used git to store revision history of your website. If you are looking for a good place to host your repos, take a look at Bitbucket. They provided unlimited repos for up to 5 contributers. Pretty snazy. * Assumes you are using a Rakefile to deploy your site with rsync. I do include an example of my rakefile below if you are unfamiliar.

Requirements * Cron is installed on your server * ruby (I am used 1.9.3) is installed on your server (I use RVM to handle all my different versions of ruby) * jekyll (I am using the latest 1.1.2) is installed on your server

###1 - Set up your config file.

Open your _config.xml and add future: false. This will prevent jekyll from posting any posts that have future dates on them in your _posts directory.

Also add «publish.*« to your exclude variable. Here is an example of my exclude varable:

exclude: [ ".rvmrc", ".rbenv-version", "README.md", "Rakefile", "Gemfile", "Gemfile.lock", "Vagrantfile", "provisioning", "publish.*" ]

This will prevent jekyll from publishing your utility files.

###2 - Add a Rakefile.

This portion assumes you are using a Rakefile to deploy your site. If not read on anyway (you may find it useful).

If you don’t already have one, create a file in your jekyll root directory and call it Rakefile. Rake files are much like Makefiles where they are essentially scripts with several sub commands to choose from. Take a look at the Rakefile below.

require "rubygems"
require 'rake'
require 'yaml'
require 'time'
require 'open-uri'

desc 'Build site with Jekyll'
task :build do
  sh 'jekyll build --trace'
end

desc "Pings search engines with sitemap"
task :ping do
  http = open("https://www.bing.com/webmaster/ping.aspx?siteMap=https://www.yoururl.com/sitemap.xml")
  http = open("https://www.google.com/webmasters/sitemaps/ping?sitemap=https://yoururl.com/sitemap.xml")
end

desc "Launch preview environment"
task :preview do
  system "jekyll serve -w"
end

desc 'Deploy'
task :deploy => [:build, :ping] do
    sh 'rsync -rtzhq --progress --delete _site/ deployuser@yoururl.com:/path/to/www/'
end

desc 'Upload Images'
task :upload_images => [:build] do
    sh 'rsync -rtzhq --progress --delete _site/img/ deploy@yoururl.com:/path/to/www/img/'
end

In this case some tasks include build, ping, preview, deploy, upload_images. Some of these tasks are dependant on other ones. Thus, some tasks look like this:

:deploy => [:build, :ping]

The task that we’re most concerned with at this point is deploy.

###3 - Create the publish script

Create a file in your site directory and call it publish.sh.

#!/bin/sh

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

cd /path/to/jekyll/site/
/path/to/git/git pull

source /Users/jaredwolff/.rvm/environments/ruby-1.9.3-p429
rake deploy
  1. The language exports help tell the shell that encoding to use. If you don’t use these you will get some errors when you attempt to build your jekyll project.

  2. Change directories to your repo location on the server. (If you haven’t already clone your repo to an accessible location.)

Tip: Make sure you are using the full paths in this file. (or else the shell script will exit with errors. you can also export the path to git etc if that tickles your fancy as well.)

Tip: Make sure you also indicate the full path to your git install.

  1. This script will pull to get the latest goodies from the remote server (bitbucket).

  2. Using the source command will import the ruby 1.9.3 environment. This ensures there is nothing missing when we run rake in our next step.

  3. Rake deploy will deploy your site! It will run the task as shown earlier in the example Rakefile I posted. ###4 - Create a crontab file

Make a new file in the root of your site and call it jekyll.crontab

Now open it and copy and past these contents:

# min    hour    mday    month   wday    command
15      10      *       *       *       /bin/sh /path/to/jekyll/site/publish.sh

This cron script will publish your site at 10:15 am every day. If you need to debug at all you can add: »> /path/to/jekyll/site/cron.log 2>&1» after publish.sh. This will place a log in your site directory.

###5 - Add crontab to cron

At this point your configuration should be ready to go!

All you need to do is add your crontab file to cron:

crontab ./jekyll.crontab

You can see if your job is set in cron by using the crontab -l command.

Conclusion

That’s it! Your server will now come around at 10:15 am, pull your site, and publish your latest post(s). Good luck!

Are you looking for the best way to get your hardware to production?

I'm Jared Wolff. I write about startups and the nuances at every nook and cranny. If you liked this article and you want to hear about the next one, sign up for my newsletter below. You get one email a week. Plus, I respect your time, no spamming.