前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GitHub Actions 还能这么玩?

GitHub Actions 还能这么玩?

作者头像
Peter Shen
发布2021-12-02 12:22:27
7440
发布2021-12-02 12:22:27
举报
文章被收录于专栏:持续集成

最近实现了一个很有意思的 Workflow,就是通过 GitHub Actions 自动将每次最新发布的文章自动同步到我的 GitHub 首页。

就像这样在首页显示最近发布的博客文章。

要实现这样的工作流需要了解以下这几点:

  1. 需要创建一个与 GitHub 同名的个人仓库,这个仓库的 README.md 信息会显示在首页
  2. 通过 GitHub Actions 自动获取博客的最新文章并更新 README.md
  3. 只有当有新的文章发布的时候才触发自动获取、更新文章 GitHub Action

GitHub 同名的个人仓库是一个特殊仓库,即创建一个与你的 GitHub 账号同名的仓库,添加的 README.md 会在 GitHub 个人主页显示。

举个例子:如果你的 GitHub 名叫 GeBiLaoWang,那么当你创建一个叫 GeBiLaoWang 的 Git 仓库,添加 README.md 后就会在主页显示。

针对这个功能 GitHub 上有很多丰富多彩的个人介绍(如下)。更多灵感可以参看这个链接:https://awesomegithubprofile.tech/

自动获取文章并更新 README.md

在 GitHub 上有很多开发者为 GitHub Actions 开发新的小功能。我这里用到一个开源项目叫 blog-post-workflow,它可以通过 RSS(订阅源)来获取到博客的最新文章。

它不但支持 RSS 还支持获取 StackOverflow 以及 Youtube 视频等资源。

我只需要在 GitHub 同名的仓库下添加一个这样的 Workflow YML .github/workflows/blog-post-workflow.yml 即可。

代码语言:javascript
复制
name: Latest blog post workflow
on:
  schedule:
    - cron: '* 2 * * *'
  workflow_dispatch:

jobs:
  update-readme-with-blog:
    name: Update this repo's README with latest blog posts
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: gautamkrishnar/blog-post-workflow@master
        with:
          # 我的博客 RSS 链接
          feed_list: "https://shenxianpeng.github.io/atom.xml"
          # 获取最新 10 篇文章
          max_post_count: 10

刚开始我需要让这个 Workflow 能工作即可。因此用的定时触发,即就是每天早上两点就自动获取一次最新文章并更新这个特殊仓库 README.md

这个做法还可以,但不够节省资源也不够完美。最好的做法是:只有当有新文章发布时才触发上面的 Workflow 更新 README.md。这就需要有一个 Webhook 当检测到有文章更新时自动触发这里的 Workflow。

触发另一个 GitHub Action

GitHub Actions 提供了一个 Webhook 事件叫做 repository_dispatch 可以来做这件事。

它的原理:使用 GitHub API 来触发一个 Webhook 事件,这个事件叫做 repository_dispatch,这个事件里的类型是可以自定义的,并且在要被触发的 workflow 里需要使用 repository_dispatch 事件。

即:在存放博客文章的仓库里要有一个 Workflow 通过发送 repository_dispatch 事件触发特殊仓库中的 Workflow 来更新 README.md

这里我定义事件类型名叫 special_repository,它只接受来自 GitHub API repository_dispatch 事件。

再次调整上面的 .github/workflows/blog-post-workflow.yml 文件如下:

代码语言:javascript
复制
# special_repository.yml
name: Latest blog post workflow

on:
  repository_dispatch:
    # 这里的类型是可以自定义的,我将它起名为:special_repository
    types: [special_repository]
  workflow_dispatch:

jobs:
  update-readme-with-blog:
    name: Update this repo's README with latest blog posts
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: gautamkrishnar/blog-post-workflow@master
        with:
          feed_list: "https://shenxianpeng.github.io/atom.xml"
          max_post_count: 10

接受事件的 Workflow 修改好了。如何发送类型为 special_repositoryrepository_dispatch 事件呢?我这里通过 curl 直接调用 API 来完成。

代码语言:javascript
复制
curl -XPOST -u "${{ secrets.PAT_USERNAME}}:${{secrets.PAT_TOKEN}}" \
    -H "Accept: application/vnd.github.everest-preview+json" \
    -H "Content-Type: application/json" https://api.github.com/repos/shenxianpeng/shenxianpeng/dispatches \
    --data '{"event_type": "special_repository"}'

最后,发送事件 Workflow YML .github/workflows/send-dispatch.yml 如下:

代码语言:javascript
复制
name: Tigger special repository

on:
  push:
    # 当 master 分支有变更的时候触发 workflow
    branches:
      - master
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Send repository dispatch event
        run: |
          curl -XPOST -u "${{ secrets.PAT_USERNAME}}:${{secrets.PAT_TOKEN}}" \
          -H "Accept: application/vnd.github.everest-preview+json" \
          -H "Content-Type: application/json" https://api.github.com/repos/shenxianpeng/shenxianpeng/dispatches \
          --data '{"event_type": "special_repository"}'

注:PAT_USERNAMEPAT_TOKEN 需要在当前的仓库【设置 -> Secrets】里进行添加,这里就不具体介绍了,需要可以自行搜索。

以上就是通过 GitHub Actions 实现当博客有新发布的文章后自动更新 GitHub 首页的所有内容了。

如果还有什么有意思的玩法欢迎评论区里分享一下吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自动获取文章并更新 README.md
  • 触发另一个 GitHub Action
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档