How to schedule Jekyll posts using GitHub actions

2019-10-07 00:00:00 +0000

Preface

In all these years, I have changed this blog several times, switching between Blogger, Wordpress, Ghost and Jekyll + GitHub pages.

Each platform had its advantages, and I liked Jekyll and GitHub pages a lot, but sometimes I wanted to schedule posts, and it was difficult. All the other options I tried had post scheduling, but had other things I didn’t like.

A summary about what I loved about Jekyll/GitHub pages:

  GitHub Pages Ghost Wordpress Blogger
Supports markdown X X - -
Supports scheduling - X X X
Free Ad-free Hosting X - - !
Total control X ! ! -
Fast X X - -
Secure X ! - X

The other day I discovered GitHub actions and installed the beta.

Today I thought about how could I schedule posts in Jekyll using actions. And now I have the solution.

soywiz/github-action-jekyll-publish-drafts to the rescue

I have created a new github action and published to the marketplace: https://github.com/soywiz/github-action-jekyll-publish-drafts

This plugin allows you to place a cron; for example each hour, and check in the _drafts folder, the files with a frontmatter with a date field that is older than the current time. Those files are moved to the _posts folder changing the prefix to include the date, makes a commit and pushes it back to the repository, creating a new commit and thus producing a page generation.

How cool is that?

Using the plugin

This should work for both public and private repositories:

  • You have to register to the GitHub actions beta.
  • You have to create the file .github/workflows/publish_drafts.yml with this content:
      name: Publish Drafts
        
      on:
        schedule:
          - cron: '*/60 * * * *'
        
      jobs:
        build:
        
          runs-on: ubuntu-latest
            
          steps:
          - uses: actions/checkout@v1
          - name: Jekyll Publish Drafts
            uses: soywiz/github-action-jekyll-publish-drafts@v1
            with:
              github_token: $
              jekyll_path: ./
              branch: master
    

It registers an action that happens every hour, that does the job. You can configure jekyll_path and branch parameters. For example:

jekyll_path: ./docs
branch: gh-pages

About the plugin

The plugin is written using TypeScript and executed via Node.JS using docker.

You can check the repository for further details.