# Running `mdbook` in Continuous Integration

While the following examples use Travis CI, their principles should straightforwardly transfer to other continuous integration providers as well.

## Ensuring Your Book Builds and Tests Pass

Here is a sample Travis CI `.travis.yml` configuration that ensures `mdbook build` and `mdbook test` run successfully. The key to fast CI turnaround times is caching `mdbook` installs, so that you aren't compiling `mdbook` on every CI run.

    language: rust
    sudo: false

    cache:
      - cargo

    rust:
      - stable

    before_script:
      - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
      - (test -x $HOME/.cargo/bin/mdbook || cargo install --vers "^0.3" mdbook)
      - cargo install-update -a

    script:
      - mdbook build path/to/mybook && mdbook test path/to/mybook

## Deploying Your Book to GitHub Pages

Following these instructions will result in your book being published to GitHub pages after a successful CI run on your repository's `master` branch.

First, create a new GitHub "Personal Access Token" with the "public_repo" permissions (or "repo" for private repositories). Go to your repository's Travis CI settings page and add an environment variable named `GITHUB_TOKEN` that is marked secure and not shown in the logs.

Then, append this snippet to your `.travis.yml` and update the path to the `book` directory:

    deploy:
      provider: pages
      skip-cleanup: true
      github-token: $GITHUB_TOKEN
      local-dir: path/to/mybook/book
      keep-history: false
      on:
        branch: master

That's it!

### Deploying to GitHub Pages manually

If your CI doesn't support GitHub pages, or you're deploying somewhere else with integrations such as Github Pages: note: you may want to use different tmp dirs:

    $> git worktree add /tmp/book gh-pages
    $> mdbook build
    $> rm -rf /tmp/book/* # this won't delete the .git directory
    $> cp -rp book/* /tmp/book/
    $> cd /tmp/book
    $> git add -A
    $> git commit 'new book message'
    $> git push origin gh-pages
    $> cd -

Or put this into a Makefile rule:

    .PHONY: deploy
    deploy: book
    	@echo "====> deploying to github"
    	git worktree add /tmp/book gh-pages
    	rm -rf /tmp/book/*
    	cp -rp book/* /tmp/book/
    	cd /tmp/book && \
    		git add -A && \
    		git commit -m "deployed on $(shell date) by ${USER}" && \
    		git push origin gh-pages