So, in my first blog post I will describe howto use GitHub to serve a Blogofile Blog, which I have done with this blog. ### First, what is Blogofile? Blogofile is a framework for static websites. You don’t need a webserver and no database, only webspace. Blogofile provides templates, controllers and filters, almost like any other dynamic web frameworks and compiles them to a static website. Right now it is more or less a blogging engine but you can actually create any website you want. Have a look at the website for details.
And there comes GitHub into the play. GitHub provides with GitHub Pages a very simple way of publishing content to the web. So why not using GitHub for serving your blogofile website.
You need 2 public repositories for that, the source code repository and the website repository that contains the compiled pages. My two repos are:
The later one is a special repository for user pages published with GitHub Pages.
The whole source code of your website with the Mako templates etc. will be
pushed to the source code repository. The command blogofile build
compiles the
website into the sub-folder _site
. The contents of this directory is what we
want to push to the website repository which GitHub will publish to the web. In
order to do that we need to create a git
submodule
with the command:
git submodule add http://github.com/mohlendo/mohlendo.github.com _site
That creates a new submodule _site
. Now every time the site is rebuild, you
can commit and push the changes to the website repository and github will
automatically publish them - in my case to
http://mohlendo.github.com
Every time blogofile recreates the website it completely clears the _site
directory and therefor also the .git
directory of the submodule. This leads to
a confusion of git and it cannot track changes on the compiled website anymore.
I wrote some small custom pre_build()
and post_build()
hooks that moves the
.git
directory to a temp folder and restores it after a successful build.
def pre_build():
if not os.path.isdir("_tmp"):
os.mkdir("_tmp")
else:
shutil.rmtree("_tmp")
os.mkdir("_tmp")
if os.path.isdir(os.path.join("_site",".git")):
shutil.move(os.path.join("_site",".git"),"_tmp")
#Do whatever you want before the _site is built
pass
def post_build():
if os.path.isdir(os.path.join("_tmp",".git")):
shutil.move(os.path.join("_tmp",".git"),"_site")
#Do whatever you want after the _site is built
Sadly, blogofile only invokes the post_build()
hook when everything works
fine. When you have an error in your templates blogofile only invokes the
pre_build()
hook. But destroying your submodule is no problem since you have
it on GitHub! Just delete the _site
folder and update the submodule with git submodule update
in the root folder of your blogofile project.
Quite cool, I think, because you don’t need any webserver or webspace and still have quite a nice blog! As a start you can also fork my two github repos.