Scheduled Article Publishing in Astro with Cloudflare Pages
/ 3 min read
Astro, a powerful framework for building modern websites, offers efficient static build capabilities. In collaboration with Cloudflare Pages, it provides a robust hosting solution. An intriguing feature I wanted to implement on my blog (hosted on Cloudflare Pages and built with Astro) was scheduled article publishing. This feature allows articles to be automatically published when the current date matches their predefined publication date.
Strategy for Scheduled Publishing
To achieve scheduled article publishing, I employed a two-step approach:
1. Adding publishDate
Metadata to Content Collection
Firstly, I added a publishDate
metadata field to the content collection. This date determines when an article should be published. By checking if this date matches the current date, the system decides whether to publish the post. Astro’s documentation on content collections and handling dates was instrumental in implementing this.
2. Modifying the Build Script for Date Comparison
Secondly, I modified the build script to include a function that compares the publishDate
with the build date. This function filters out any posts that are marked as drafts or have a future publish date. The TypeScript code snippet below illustrates this process:
/** Filters out draft posts based on the environment and the post's publishDate **/
export async function getAllPosts() {
return await getCollection("post", ({ data }) => {
const isNotDraft = import.meta.env.PROD ? data.draft !== true : true;
// Treat posts with a future publishDate as drafts
const isNotFuture = import.meta.env.PROD
? data.publishDate.valueOf() <= new Date().valueOf()
: true;
return isNotDraft && isNotFuture;
});
}
Automating Deployment with Cloudflare Pages and GitHub Actions
To ensure that this scheduled publishing mechanism works effectively, I automated the build and deployment process of the site. Cloudflare Pages offers a feature called Deploy Webhook, which triggers the build and deployment of pages when it receives a POST request. I utilized GitHub Actions to send this POST request to the Deploy Webhook daily. Below is an example YAML configuration for the GitHub Actions workflow:
# Only articles with a past or present publishDate are displayed in the Astro build
# Thus, we perform a daily deployment with a date condition check
name: "Daily Deploy"
on:
# daily at 00:00 UTC
schedule:
- cron: "0 0 * * *"
# for debugging purposes
workflow_dispatch:
jobs:
# Trigger deploy webhook with curl
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
run: curl -X POST -d {} ${{ secrets.CLOUDFLARE_DEPLOY_WEBHOOK }}
This setup guarantees that the website is rebuilt daily, ensuring that any article with the current date as its publishDate
gets published automatically. This approach leverages the static build performance of Astro while introducing dynamic elements like scheduled publishing, making the blog more efficient.