Search code examples
rubyconfigurationpaginationjekyll

Is there any way to roll two paginated blogs into one Jekyll site, hosted in a single GitHub Pages repo?


I have a Jekyll site that uses the jekyll-paginate plugin and is hosted by GitHub Pages, pretty standard.

Does anybody know of other solutions to handle pagination such that I could build two blogs from the same site at domain/blog1 and domain/blog2 using this solution, but also retain pagination?

Retaining the current pagination design is not a priority. Creative ideas that require redesign are welcome.

I know jekyll-paginate-multiple exists, but GitHub Pages does not support it natively, and I would have to maintain two repos to maintain the site code and build artifacts separately, which is not ideal.


Solution

  • Use any custom Plugin/Gem with your GitHub Pages hosted Jekyll blog

    Here is how you CAN use any custom plugin on a GitHub Pages hosted website. I use this on my own blog so I'm 100% certain that it works. The basic idea is that you use TravisCI to build your custom Jekyll site on a staging branch and then push it automatically to your GitHubPages master branch that serves your website. Here comes the quick walkthrough:

    a) you configure GitHub Pages to host from the docs folder of your master branch

    b) you add and configure a staging branch to be the default branch of your repo, there is where you do all your local work, releases work through setting a git tag on this branch

    c) you use _config.yml file to set your destination directory to docs

    # _config.yml
    destination: docs
    

    d) to avoid build issues with Travis CI you can add Gemfile.lock to your .gitignore file and the docs folder to your local .git/info/exclude since you don't want to push them anymore. To exclude the docs folder from a local push is optional, but for me that works best. You also may need to delete the Gemfile.lock first and then let Travis CI pick the fitting versions for the selected Docker OS, otherwise you can run into version conflicts which can be pretty hard to fix.

    e) to deploy with Travis CI into production a.k.a. your live site you add a .travis.yml file alike :

    language: ruby
    rvm:
    - 2.6.3
    install:
      - bundle install
    script:
      - JEKYLL_ENV="production" bundle exec jekyll build
    deploy:
      provider: script
      script: bash script/deploy.sh
      skip_cleanup: true
      on:
        tags: true
        branch: staging
    
    branches:
      only:
        - staging
        - /\d+\.\d+(\.\d+)?(-\S*)?$/
    env:
      global:
      - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
      - secure: TRAVIS_SECRET_KEY_FOR_GITHUB_CREDENTIALS
    sudo: false
    cache: bundler
    notifications:
      email: false
    

    g) script/deploy.sh looks somewhat like this:

    #!/usr/bin/env bash
    
    bundle install
    JEKYLL_ENV="production" bundle exec jekyll build
    git status
    git add .
    git commit -m"[skip travis] Automated build"
    git remote set-url origin https://USERNAME:[email protected]/YOUR_GIT_USER/YOUR_REPO.git
    git push origin HEAD:master --force
    

    e) to get your encrypted TRAVIS_SECRET_KEY_FOR_GITHUB_CREDENTIALS in .travis.yml with the used $PSW variable used in the deploy script, just follow the Encryption Key Doc

    Once this configuration is done, you can use any Gem the same way as on localhost since the building part is not done by GitHub anymore but TravisCI.

    Conclusion

    You just work on staging and only let Travis CI push to your master branch. You use tags in the form 1.0.0 to deploy. All you need to do now is to add jekyll-paginate-multiple to your Gemfile and _config.yml and you are ready.

    If anyone is interested in more details for those step, have a look at this Blog Post detailing the issue