Running scheduled build for Gatsby site on Netlify

April 26, 2020

For a static Gatsby site deployed to Netlify, by default the content only gets updated when we push code to master branch. But what if we have “semi-dynamic” data that needs to be updated periodically?

In my previous post, I added the gatsby-source-github-api plugin to fetch my 4 pined repoes from Github. If I change the pined item from Github, it won’t get updated on my website.

So a cron job that runs on schedule to fetch the update can be helpful here.

Netlify has the build hooks feature where a build can be triggered by sending a POST request to a given URL.

$ curl -X POST -d '{}' https://api.netlify.com/build_hooks/XXXXXXXXXXXXXXX

Using Github Actions

We can use Github Actions’s scheduled events to run the curl command from above with a cron expression.

Automate, customize, and execute your software development workflows right in your repository with GitHub Actions. You can discover, create, and share actions to perform any job you’d like, including CI/CD, and combine actions in a completely customized workflow.

Create a .github/workfolws/main.yml in the repo.

name: Trigger Netlify Build
on:
  schedule:
    # Run at 0815 daily
    - cron: '15 8 * * *'
jobs:
  build:
    name: Request Netlify Webhook
    runs-on: ubuntu-latest
    steps:
      - name: Curl request
        shell: bash
        env:
          NETLIFY_DEPLOY_HOOK: ${{ secrets.NetlifyDeployHook }}
        run: curl -X POST -d {} "$NETLIFY_DEPLOY_HOOK"

Note that we are reading the Netlify deploy hook url from secrets to avoid expose it to the public. The doc for how to manage secrets from Github can be found here.

One thing I noticed that is when adding a secret, the secret name can not have _ in it otherwise it will not work.