paint-brush
如何使用 GitHub Actions 管理您的写作计划经过@imamdev
1,006 讀數
1,006 讀數

如何使用 GitHub Actions 管理您的写作计划

经过 Imamuzzaki Abu Salam7m2023/04/25
Read on Terminal Reader

太長; 讀書

我如何提醒使用 GitHub Action 撰写博客文章。 Imamuzzaki Abu Salam 使用 GitHub Actions 创建了一个简单的提醒。在这篇文章中,我将分享我是如何制作这个工作流程的。什么是 GitHub Actions? GitHub Actions 是一个强大的工具,可让您自动化工作流程。
featured image - 如何使用 GitHub Actions 管理您的写作计划
Imamuzzaki Abu Salam HackerNoon profile picture
0-item
1-item

作为一名作家,我理解在发布新内容时保持一致性的重要性。然而,有时生活会遇到阻碍,记住写一篇新的博客文章可能具有挑战性。为了帮助我跟上共享计划的进度,我使用 GitHub Actions 创建了一个简单的提醒。在这篇文章中,我将分享我是如何制作这个工作流程的。

什么是 GitHub 操作?

GitHub Actions是一个强大的工具,可让您自动化工作流程。您可以使用它来构建、测试和部署您的代码。您还可以使用它来执行范围广泛的其他任务,例如发送通知或安排提醒。

我如何创建提醒以撰写博客文章

为了创建写博客文章的提醒,我使用了README.md 的 GitHub 特殊存储库并添加了一个名为 .github/workflows/blog-posts.yml 的文件。在此文件中,我定义了 GitHub Actions 将执行的工作流程。这是文件的初始内容:

 name: Blog Posts on: schedule: - cron: '0 0 * * 0' # Run at 00:00 every Sunday workflow_dispatch: jobs: update-posts: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Update post list run: | sleep 1m curl -LO https://blog.imam.dev/feed.xml node src/list-posts.js rm feed.xml - name: Commit changes run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git add -A git diff-index --quiet HEAD || git commit -m "Update blog posts" - name: Pull changes run: git pull -r - name: Push changes uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e with: github_token: ${{ secrets.GITHUB_TOKEN }}


该工作流程每周日 00:00 触发。然后它运行一个脚本来更新博客文章列表。该脚本是用 JavaScript 编写的,使用提要包来解析我博客的 RSS 提要。然后生成博客文章列表并更新 README.md 文件。最后,它提交更改并将它们推送到 GitHub。我正在使用 ouuan 的存储库作为此工作流程的参考。

提醒从何而来?它实际上在 list-posts.js 文件中。我在博客文章列表中添加了提醒。这是文件的内容:

 const { readFileSync, writeFileSync } = require('fs') /** * Convert XML string to JSON * @param {string} xmlString * @returns {object} json */ const xmlToJson = (xmlString) => { const regex = /<(\w+)([^>]*)>([\s\S]*?)<\/\1>/gm const matches = xmlString.matchAll(regex) const json = {} for (const match of matches) { const [, key, attributes, value] = match const subMatches = value.matchAll(regex) const subJson = {} for (const subMatch of subMatches) { const [, subKey, subAttributes, subValue] = subMatch if (subValue.match(regex)) { if (Array.isArray(subJson[subKey])) { subJson[subKey].push( xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey] ) } else if (subJson[subKey]) { subJson[subKey] = [ subJson[subKey], xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey], ] } else { subJson[subKey] = xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey] } } else if (Array.isArray(subJson[subKey])) { subJson[subKey].push(subValue) } else if (subJson[subKey]) { subJson[subKey] = [subJson[subKey], subValue] } else { subJson[subKey] = subValue } } if (json[key]) { if (Array.isArray(json[key])) { json[key].push(subJson) } else { json[key] = [json[key], subJson] } } else { json[key] = subJson } } return json } /** * Sort JSON by pubDate * @param {object} json * @returns {object} sortedJson */ const sortJson = (json) => { json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate)) return json } // Read XML file and convert to JSON const xmlString = readFileSync('feed.xml', 'utf8') const feeds = sortJson(xmlToJson(xmlString).rss.channel.item) // Create Markdown list of posts const posts = feeds .slice(0, 5) .map( (item) => `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${ item.link }?utm_source=GitHubProfile)` ) // Update README.md if posts have changed, // otherwise throw an error to remind me to write a blog post const readme = readFileSync('README.md', 'utf8') if (readme.includes(posts.join('\n'))) { throw new Error('No new blog posts') } else { const updatedReadme = readFileSync('README.md', 'utf8').replace( /(?<=<!--START_SECTION:blog-posts-->\n)[\s\S]*(?=\n<!--END_SECTION:blog-posts-->)/, posts.join('\n') ) writeFileSync('README.md', updatedReadme) console.log('Updated README.md') }


该脚本读取我博客的 RSS 提要并生成博客文章列表。然后它使用博客文章列表更新 README.md 文件。如果没有新的博文,它会抛出一个错误提醒我写一篇博文。


这只是在执行脚本时会抛出的错误,而帖子仍然相同,并且不会发送到我的电子邮件或对我来说更明显的东西的提醒。因此,我决定为任何失败的工作流运行启用通知。


方法如下:


  1. 点击页面右上角的 并选择Settings
  2. 选择左侧栏中的通知
  3. 单击操作
  4. 选择仅发送失败工作流的通知


现在,当脚本执行并且没有新的博客文章时,我会收到通知。我还可以在 GitHub 网站上看到通知。

我探索的另一种方式

我告诉您的之前的工作流程是修改后的版本,因此我的 README.md 始终是最新的。我还探索了另一种创建博客帖子提醒的方法。但是,它是一个纯粹的提醒,没有任何 README.md 更新机制,只是一个提醒。


为了创建写博文的提醒,我创建了一个新的 GitHub 存储库并添加了一个名为.github/workflows/remind.yml的文件。在此文件中,我定义了 GitHub Actions 将执行的工作流程。这是文件的内容:

 name: Reminder to write a blog post on: schedule: - cron: '0 10 * * 1-5' jobs: remind: runs-on: ubuntu-latest steps: - name: Send a reminder uses: dawidd6/[email protected] with: server_address: smtp.gmail.com server_port: 465 username: ${{ secrets.EMAIL_USERNAME }} password: ${{ secrets.EMAIL_PASSWORD }} subject: 'Reminder to write a new blog post' body: "Don't forget to write a new blog post today!" to: [email protected]


此工作流在每个工作日的上午 10:00 向我发送一封电子邮件提醒,提醒我写一篇新的博文。我使用了第三方操作 dawidd6/action-send-mail 来发送电子邮件。我提供了我的电子邮件凭据作为 GitHub 机密,因此它们在工作流文件中不可见。

结论

我探索了两种创建博客文章提醒的方法。第一种方法是更新我的 GitHub 配置文件的 README.md 文件。第二种方式是发送电子邮件提醒。我目前正在使用第一种方式,因为它比第二种方式更明显。每次访问我的 GitHub 配置文件时,我都能看到提醒。


使用 GitHub Actions 创建写博文的提醒是一种简单有效的方式来保持您的博客计划。有了这个工作流程,您将永远不会忘记再次撰写新帖子。如果您有兴趣创建自己的提醒工作流程,请务必查看 GitHub Actions 文档以了解更多信息。写博客快乐!