178 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| ---
 | |
| layout: docs
 | |
| title: Continuous Integration
 | |
| prev_section: deployment-methods
 | |
| next_section: troubleshooting
 | |
| permalink: /docs/continuous-integration/
 | |
| ---
 | |
| 
 | |
| You can easily test your website build against one or more versions of Ruby.
 | |
| The following guide will show you how to set up a free build environment on
 | |
| [Travis][0], with [GitHub][1] integration for pull requests. Paid
 | |
| alternatives exist for private repositories.
 | |
| 
 | |
| [0]: https://travis-ci.org/
 | |
| [1]: https://github.com/
 | |
| 
 | |
| ## 1. Enabling Travis and GitHub
 | |
| 
 | |
| Enabling Travis builds for your GitHub repository is pretty simple:
 | |
| 
 | |
| 1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username
 | |
| 2. Find the repository for which you're interested in enabling builds.
 | |
| 3. Click the slider on the right so it says "ON" and is a dark grey.
 | |
| 4. Optionally configure the build by clicking on the wrench icon. Further
 | |
|    configuration happens in you `.travis.yml` file. More details on that
 | |
|    below.
 | |
| 
 | |
| ## 2. The Test Script
 | |
| 
 | |
| The simplest test script simply runs `jekyll build` and ensures that Jekyll
 | |
| doesn't fail to build the site. It doesn't check the resulting site, but it
 | |
| does ensure things are built properly.
 | |
| 
 | |
| When testing Jekyll output, there is no better tool than [html-proofer][2].
 | |
| This tool checks your resulting site to ensure all links and images exist.
 | |
| Utilize it either with the convenient `htmlproof` command-line executable,
 | |
| or write a Ruby script which utilizes the gem.
 | |
| 
 | |
| ### The HTML Proofer Executable
 | |
| 
 | |
| {% highlight bash %}
 | |
| #!/usr/bin/env bash
 | |
| set -e # halt script on error
 | |
| 
 | |
| bundle exec jekyll build
 | |
| bundle exec htmlproof ./_site
 | |
| {% endhighlight %}
 | |
| 
 | |
| Some options can be specified via command-line switches. Check out the
 | |
| `html-proofer` README for more information about these switches, or run
 | |
| `htmlproof --help` locally.
 | |
| 
 | |
| ### The HTML Proofer Library
 | |
| 
 | |
| You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile):
 | |
| 
 | |
| {% highlight ruby %}
 | |
| #!/usr/bin/env ruby
 | |
| 
 | |
| require 'html/proofer'
 | |
| HTML::Proofer.new("./_site").run
 | |
| {% endhighlight %}
 | |
| 
 | |
| Options are given as a second argument to `.new`, and are encoded in a
 | |
| symbol-keyed Ruby Hash. More information about the configuration options,
 | |
| check out `html-proofer`'s README file.
 | |
| 
 | |
| [2]: https://github.com/gjtorikian/html-proofer
 | |
| 
 | |
| ## 3. Configuring Your Travis Builds
 | |
| 
 | |
| This file is used to configure your Travis builds. Because Jekyll is built
 | |
| with Ruby and requires RubyGems to install, we use the Ruby language build
 | |
| environment. Below is a sample `.travis.yml` file, and what follows that is
 | |
| an explanation of each line.
 | |
| 
 | |
| {% highlight yaml %}
 | |
| language: ruby
 | |
| rvm:
 | |
| - 2.1
 | |
| script: ./script/cibuild
 | |
| 
 | |
| # branch whitelist
 | |
| branches:
 | |
|   only:
 | |
|   - gh-pages     # test the gh-pages branch
 | |
|   - /pages-(.*)/ # test every branch which starts with "pages-"
 | |
| 
 | |
| env:
 | |
|   global:
 | |
|   - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer
 | |
| {% endhighlight %}
 | |
| 
 | |
| Ok, now for an explanation of each line:
 | |
| 
 | |
| {% highlight yaml %}
 | |
| language: ruby
 | |
| {% endhighlight %}
 | |
| 
 | |
| This line tells Travis to use a Ruby build container. It gives your script
 | |
| access to Bundler, RubyGems, and a Ruby runtime.
 | |
| 
 | |
| {% highlight yaml %}
 | |
| rvm:
 | |
| - 2.1
 | |
| {% endhighlight %}
 | |
| 
 | |
| RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This
 | |
| directive tells Travis the Ruby version to use when running your test
 | |
| script.
 | |
| 
 | |
| {% highlight yaml %}
 | |
| script: ./script/cibuild
 | |
| {% endhighlight %}
 | |
| 
 | |
| Travis allows you to run any arbitrary shell script to test your site. One
 | |
| convention is to put all scripts for your project in the `script`
 | |
| directory, and to call your test script `cibuild`. This line is completely
 | |
| customizable. If your script won't change much, you can write your test
 | |
| incantation here directly:
 | |
| 
 | |
| {% highlight yaml %}
 | |
| script: jekyll build && htmlproof ./_site
 | |
| {% endhighlight %}
 | |
| 
 | |
| The `script` directive can be absolutely any valid shell command.
 | |
| 
 | |
| {% highlight yaml %}
 | |
| # branch whitelist
 | |
| branches:
 | |
|   only:
 | |
|   - gh-pages     # test the gh-pages branch
 | |
|   - /pages-(.*)/ # test every branch which starts with "pages-"
 | |
| {% endhighlight %}
 | |
| 
 | |
| You want to ensure the Travis builds for your site are being run only on
 | |
| the branch or branches which contain your site. One means of ensuring this
 | |
| isolation is including a branch whitelist in your Travis configuration
 | |
| file. By specifying the `gh-pages` branch, you will ensure the associated
 | |
| test script (discussed above) is only executed on site branches. If you use
 | |
| a pull request flow for proposing changes, you may wish to enforce a
 | |
| convention for your builds such that all branches containing edits are
 | |
| prefixed, exemplified above with the `/pages-(.*)/` regular expression.
 | |
| 
 | |
| The `branches` directive is completely optional.
 | |
| 
 | |
| {% highlight yaml %}
 | |
| env:
 | |
|   global:
 | |
|   - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer
 | |
| {% endhighlight %}
 | |
| 
 | |
| Using `html-proofer`? You'll want this environment variable. Nokogiri, used
 | |
| to parse HTML files in your compiled site, comes bundled with libraries
 | |
| which it must compile each time it is installed. Luckily, you can
 | |
| dramatically increase the install time of Nokogiri by setting the
 | |
| environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`.
 | |
| 
 | |
| ## 4. Gotchas
 | |
| 
 | |
| ### Exclude `vendor`
 | |
| 
 | |
| Travis bundles all gems in the `vendor` directory on its build servers,
 | |
| which Jekyll will mistakenly read and explode on. To avoid this, exclude
 | |
| `vendor` in your `_config.yml`:
 | |
| 
 | |
| {% highlight yaml %}
 | |
| exclude: [vendor]
 | |
| {% endhighlight %}
 | |
| 
 | |
| ### Questions?
 | |
| 
 | |
| This entire guide is open-source. Go ahead and [edit it][3] if you have a
 | |
| fix or [ask for help][4] if you run into trouble and need some help.
 | |
| 
 | |
| [3]: https://github.com/jekyll/jekyll/edit/master/site/_docs/continuous-integration.md
 | |
| [4]: https://github.com/jekyll/jekyll-help#how-do-i-ask-a-question
 |