”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 通过 GitHub Actions 按计划更新网站内容

通过 GitHub Actions 按计划更新网站内容

发布于2024-11-06
浏览:774

我想分享我构建一个自我可持续的内容管理系统的旅程,该系统不需要传统意义上的内容数据库。

问题

该网站的内容(博客文章和书签)存储在 Notion 数据库中:

Updating website content on schedule via GitHub Actions

带书签的数据库 –  Notion UI

我试图解决的问题是不必在添加每个书签后手动部署网站。最重要的是 - 保持托管尽可能便宜,因为对我来说,我添加到我的 Notion 数据库的书签最终在线的速度有多快并不重要。

因此,经过一番研究,我提出了以下设置:

Updating website content on schedule via GitHub Actions

内容交付机制的高级概述

该系统由几个组件组成:

  • 部署更改的“Push to Main”操作
  • “更新内容”操作,从 Notion API 下载内容并提交更改
  • “按计划更新内容”操作偶尔运行一次并触发“更新内容”操作

让我们从内到外详细研究每一个。

“推送到主”工作流程

这里没什么可说的,非常标准的设置, – 当推送到主分支时,此工作流程会构建应用程序并使用 Wrangler CLI 将其部署到 Cloudflare Pages:

name: Push to Main
on:
  push:
    branches: [main]
  workflow_dispatch: {}
jobs:
  deploy-cloudflare-pages:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup pnpm
        uses: pnpm/action-setup@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .node-version
          cache: pnpm
      - name: Install node modules
        run: |
          pnpm --version
          pnpm install --frozen-lockfile
      - name: Build the App
        run: |
          pnpm build
      - name: Publish Cloudflare Pages
        env:
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        run: |
          pnpm wrangler pages deploy ./out --project-name ${{ secrets.CLOUDFLARE_PROJECT_NAME }}

“更新内容”工作流程

此工作流程只能“手动”触发……但也可以自动触发,因为您可以使用 GitHub 个人访问令牌(又名 PAT)触发它。我最初编写它是因为我想从我的手机部署更改。它使用 Notion API 下载帖子和书签,然后 - 如果代码库有任何更改 - 创建提交并推送它。为了正常运行,必须为该工作流程提供具有存储库“读取和写入代码访问权限”的 PAT:

name: Update Content
on:
  workflow_dispatch: {}
jobs:
  download-content:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          # A Github Personal Access Token with access to the repository 
          # that has the follwing permissions:
          # ✅ Read and Write access to code
          token: ${{ secrets.GITHUB_PAT_CONTENT }}
      - name: Setup pnpm
        uses: pnpm/action-setup@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .node-version
          cache: pnpm
      - name: Install node modules
        run: |
          pnpm --version
          pnpm install --frozen-lockfile
      - name: Download articles content from Notion
        env:
          NOTION_KEY: "${{ secrets.NOTION_KEY }}"
          NOTION_ARTICLES_DATABASE_ID: "${{ secrets.NOTION_ARTICLES_DATABASE_ID }}"
        run: |
          pnpm download-articles
      - name: Download bookmarks content from Notion
        env:
          NOTION_KEY: ${{ secrets.NOTION_KEY }}
          NOTION_BOOKMARKS_DATABASE_ID: ${{ secrets.NOTION_BOOKMARKS_DATABASE_ID }}
        run: |
          pnpm download-bookmarks
      - name: Configure Git
        run: |
          git config --global user.email "${{ secrets.GIT_USER_EMAIL }}"
          git config --global user.name "${{ secrets.GIT_USER_NAME }}"
      - name: Check if anything changed
        id: check-changes
        run: |
          if [ -n "$(git status --porcelain)" ]; then
            echo "There are changes"
            echo "HAS_CHANGED=true" >> $GITHUB_OUTPUT
          else
            echo "There are no changes"
            echo "HAS_CHANGED=false" >> $GITHUB_OUTPUT
          fi
      - name: Commit changes
        if: steps.check-changes.outputs.HAS_CHANGED == 'true'
        run: |
          git add ./src/content
          git add ./public
          git commit -m "Automatic content update commit"
          git push

“按计划更新内容”工作流程

这个非常简单:它只是每隔一段时间运行一次并触发上面的工作流程。为了正常运行,此工作流程必须提供一个 GitHub PAT,该 PAT 具有存储库的“对 actions 的读写访问权限”。就我而言,这是一个不同的 PAT:

name: Update Content on Schedule
on:
  schedule:
    - cron: "13 0,12 * * *"
  workflow_dispatch: {}
jobs:
  trigger-update-content:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Dispatch the Update Content workflow
        env:
          # A Github Personal Access Token with access to the repository 
          # that has the follwing permissions:
          # ✅ Read and Write access to actions
          GH_TOKEN: ${{ secrets.GITHUB_PAT_ACTIONS }}
        run: |
          gh workflow run "Update Content" --ref main

结论

对我来说,这个设置已被证明非常好且灵活。由于模块化结构,“更新内容”操作可以手动触发 - 例如旅行时从我的手机上。对我来说,这是逐步增强工作流程的又一宝贵经验。

希望您觉得这有帮助吗?

版本声明 本文转载于:https://dev.to/prudkohliad/updating-website-content-on-schedule-via-github-actions-39o7?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • React 中的 UseEffect
    React 中的 UseEffect
    欢迎来到 React Hooks 的世界!今天,我们将深入探讨最流行的挂钩之一:useEffect。别担心,我们会让它变得有趣且易于理解。那么,让我们开始吧! ? ?什么是useEffect useEffect 是一个 React Hook,允许您在功能组件中执行副作用。副作用是在组件外部发生的操作...
    编程 发布于2024-11-06
  • 如何在 Google Cloud Platform 免费层上构建现代数据平台
    如何在 Google Cloud Platform 免费层上构建现代数据平台
    我在 Medium.com 上发布了一系列七篇免费公开文章“如何在 Google Cloud Platform 免费层上构建现代数据平台”。 主要文章位于:https://medium.com/@markwkiehl/building-a-data-platform-on-gcp-0427500f...
    编程 发布于2024-11-06
  • 帖子 #f 挣扎
    帖子 #f 挣扎
    这篇文章是关于我迄今为止在编码和学习方面的挣扎 一个。我只能保持专注一个小时,最多两个小时。 b.我很容易分心 c.我不能久坐,否则我会开始感到烦躁和休息腿部问题。 我想到的有助于解决问题的解决方案 一个。我需要开始更频繁地使用我的番茄工作法应用程序 B. 我开始将手机调成振动,如果我有另一个屏幕...
    编程 发布于2024-11-06
  • 面向 Web 开发人员的热门 Chrome 扩展 4
    面向 Web 开发人员的热门 Chrome 扩展 4
    2024 年最适合 Web 开发者的 10 款 Chrome 扩展 随着 2024 年的进展,Chrome 扩展程序已成为 Web 开发人员工具包中不可或缺的一部分,在浏览器中提供强大的功能。在这篇文章中,我们将探讨今年在 Web 开发社区掀起波澜的 10 大 Chrome 扩展程...
    编程 发布于2024-11-06
  • 如何使用 React Router v4/v5 嵌套路由:简化指南
    如何使用 React Router v4/v5 嵌套路由:简化指南
    React Router v4/v5 的嵌套路由:简化指南使用 React Router 时,嵌套路由是组织的关键技术您的应用程序的导航。然而,新手经常面临设置嵌套路由的挑战。本文旨在简化使用 React Router v4/v5 的过程。React Router v4 在路由嵌套方式上引入了重大转...
    编程 发布于2024-11-06
  • 如何使用 UTF8 字符编码保留 MySQL 中的表格式?
    如何使用 UTF8 字符编码保留 MySQL 中的表格式?
    使用 UTF8 字符编码增强 MySQL 命令行格式使用存储在数据库表中的瑞典语和挪威语字符串时,查询数据时可能会遇到表格式问题使用不同的字符集。问题陈述默认情况下,使用“set names latin1;”产生失真的输出: ----------------------------------- ...
    编程 发布于2024-11-06
  • CSS 盒子模型
    CSS 盒子模型
    CSS 盒子模型是 Web 开发中的一个基本概念,它构成了 Web 布局和设计的基础。它决定了元素的大小、内容的呈现方式以及它们在网页上如何相互交互。掌握盒模型对于任何使用 HTML 和 CSS 的开发人员来说都是至关重要的,因为它会影响元素的显示、间隔和对齐方式。 在本文中,我们将详细探讨 CSS...
    编程 发布于2024-11-06
  • 我如何编写 CSS 选择器
    我如何编写 CSS 选择器
    有很多 CSS 方法,但我讨厌它们。有些多(顺风等),有些少(BEM、OOCSS 等)。但归根结底,它们都有缺陷。 当然,人们使用这些方法有充分的理由,并且解决的许多问题我也遇到过。因此,在这篇文章中,我想写下我自己的关于如何保持 CSS 组织的指南。 这不是一个任何人都可以开始使用的完整描述的 C...
    编程 发布于2024-11-06
  • 为什么输入元素不支持 HTML5 中的 ::after 伪元素?
    为什么输入元素不支持 HTML5 中的 ::after 伪元素?
    ::before 和 ::after 的伪元素兼容性在 HTML5 中,::before 和 ::after 伪元素可以使用附加内容(例如图标或复选标记)增强元素。然而,并非所有元素都完全支持这些伪元素。输入元素和 ::after在提供的示例中,::after 伪元素不是显示在输入元素上。这是因为类...
    编程 发布于2024-11-06
  • 如何使用 PHP 确定特定时区的星期几?
    如何使用 PHP 确定特定时区的星期几?
    在 PHP 中确定指定时区的星期几在 PHP 中处理日期和时间时,处理起来可能具有挑战性时区并计算具体值,例如星期几。本文将指导您完成使用 PHP 查找特定时区中的星期几的过程。了解用户的时区要确定用户的时区,您需要使用 PHP 函数 date_default_timezone_get()。此函数返...
    编程 发布于2024-11-06
  • 如何在 Go 通道中有效地生成不同的值?
    如何在 Go 通道中有效地生成不同的值?
    在 Go Channel 中高效生成不同值在 Go 中,Channel 为并发通信提供了强大的机制。但是,在使用通道时,您可能会遇到需要过滤掉重复值或确保仅发出不同值的情况。本文探讨了创建仅输出唯一值的通道的有效方法。生成不同值的挑战考虑以下场景:您有一个通道接收多个值,并且您希望迭代它,同时仅打印...
    编程 发布于2024-11-06
  • 如何使用 Tailwind CSS 设置 os Next.js
    如何使用 Tailwind CSS 设置 os Next.js
    要使用 Tailwind CSS 设置 Next.js,请按照以下步骤操作: 第 1 步:创建一个新的 Next.js 项目 如果您尚未创建 Next.js 项目,您可以使用 create-next-app 创建一个项目。 npx create-next-app@latest my-...
    编程 发布于2024-11-06
  • 如何解决 PHPmailer HTML 内容渲染问题?
    如何解决 PHPmailer HTML 内容渲染问题?
    PHPmailer 无法渲染 HTML 内容使用 PHPmailer 发送电子邮件时,用户遇到 HTML 代码显示为原始文本的问题交货时。尽管使用了 IsHTML() 方法,所需的 HTML 内容仍然无法访问。潜在问题此行为背后的原因在于方法调用的顺序。与它的前身不同,PHPMailer 6 要求在...
    编程 发布于2024-11-06
  • 如何使用 Java 从 HTML 文档中提取数据?
    如何使用 Java 从 HTML 文档中提取数据?
    Java HTML解析要从网站获取数据,首先必须了解HTML文档的结构。 HTML 元素使用标签进行组织,标签指定每个元素的类型和内容。例如,以下 HTML 表示具有特定 CSS 类的 div 标签:<div class="classname"></div>...
    编程 发布于2024-11-06
  • 为什么 Java 异常处理代码会产生“132Exception in thread main MyExc1”而不是“13Exception in thread main MyExc2”?
    为什么 Java 异常处理代码会产生“132Exception in thread main MyExc1”而不是“13Exception in thread main MyExc2”?
    Java中的异常处理:解开歧义在一个令人费解的Java异常处理场景中,一个大学问题提出了以下代码片段: // Exception Heirarchy class MyExc1 extends Exception {} class MyExc2 extends Exception {} class M...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3