Using Travis to build your Sculpin blog

This static blog site is generated by Sculpin and hosted on GitHub Pages. In this article, I'll tell you how you can setup automatic generation using Travis.

The Publish Script

Generating a Sculpin site is basically executing some commands. Let's create a publish.sh file which will execute all commands required to generate the site:

1
2
3
4
# build site
sass source/css/wouterj.scss:source/css/wouterj.css --style compressed --no-cache
./vendor/bin/sculpin generate --env prod
touch output_prod/.nojekyll

As this site uses Sass, it first needs to compile the sass code into a css file. Then, Sculpin is used to generate the site for production. At last, a .nojekyll file is created, to make sure GitHub Pages is not going to try to render the site as a Jekyll blog.

To make Travis execute this file, you need some Travis configuration:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# .travis.yml
language: php
php:
  - hhvm

sudo: false
cache:
  directories:
    - $HOME/.composer/cache

before_script:
  - gem install sass
  - composer install --prefer-dist

script:
  - sh publish.sh

The first 9 lines are setting up the quickest Travis PHP build: HHVM, caching, Docker environment, etc. The lines after this install Sass and the dependencies (yes, I commit composer.lock). The real Travis script executes the publish.sh file.

The Branching Strategy

The master branch is always used by GitHub Pages, so the source code is pushed to a source branch. This branch is also set up as the default branch on GitHub, as this is the only branch you should care about.

To make sure that Travis only runs builds on the source branch, use the branches.only setting:

1
2
3
4
5
6
# .travis.yml

# ...
branches:
  only:
    - source

Commiting the Build

The idea now is to make Travis change the root of the repository to the output_prod directory, commit and push it as the master branch. First, some Git config is required:

1
2
3
4
5
6
7
# publish.sh

# configure env
git config --global user.email 'your_email@example.com'
git config --global user.name 'WouterJ.nl bot'

# ... build site section

Since the build is executed on the source branch, Travis need to checkout the master branch. However, as master is going to be replaced each time, it should just delete current master and create a new one based on the source branch:

1
2
3
4
5
6
7
# ... configure env section

# checkout publish branch
git branch -D master
git checkout -b master

# ... build site section

Travis is in the master branch and has build the site in output_prod now. Git can make this output directory the new root of the branch using the git filter-branch command. Before executing this, Travis has to commit the currently added files (the output_prod directory):

1
2
3
4
5
6
7
# .travis.yml

# ... configure env, checkout publish branch and build site sections

# commit build
git add -f output_prod
git commit -m "Build website"

The -f is required, as output directories are in the .gitignore file of a common Sculpin blog. Now, execute the git filter-branch command:

1
2
3
4
5
6
# .travis.yml

# ...

# only commit output dir
git filter-branch --subdirectory-filter output_prod/ -f

Pushing the Result

The branch is ready to be pushed back to GitHub, so let's do that!

1
2
3
4
5
6
# .travis.yml

# ...

# push to GitHub Pages
git push "https://github.com/WouterJ/wouterj.github.com" -f master

Wait a moment... It needs either a username and password or a GitHub token in order to push. This means that everyone can see my GitHub token. That's a huge security leak!

Fortunately, Travis allows you to encrypt the token in a special way that only works for your repository. This way, you're the only person who can use this token. Download the Travis command line app and use the travis encrypt command to encrypt your public token to an environment variable:

1
$ travis encrypt --add GH_TOKEN=XXX

(XXX is your github token here).

As the --add option was added, the encrypted string is added to your .travis.yml configuration. Using this directly like git push http://$GH_TOKEN@github.com/... will still show your github token in the output of the command. You have to put it in the ~/.netrc of the Linux environment before executing this command. This file is used by Linux to authenticate with ssh servers.

1
2
3
4
5
# .travis.yml

# ...
before_install:
  - echo -e "machine github.com\n  login $GH_TOKEN" >> ~/.netrc

Round Up

Congrats, you have a running Sculpin blog on GitHub Pages using automatic buildings with Travis! Everytime you push to your blog's source branch, the site will be regenerated. There are even more nice features:

  • You get a notification when the build failed;
  • The output is never pushed when the build failed, meaning you always have a working site.

You can see the complete files in the repository of this site.

comments powered by Disqus