亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

如何自動同步你的作品集和GitHub倉庫?????

议题 🫤

我们大多数人都有作品集。作为开发者,我们想展示自己的项目,这些项目大多存储在我们的GitHub个人主页上的项目中。

但在我们的作品集网站上,我们该如何展示这些作品呢?

之前,我有一个 ts 文件,里面存放了 GitHub 仓库的链接和卡片的相关信息。

    export const data = [
      {
        id: Math.random(),
        subtitle:
          "一个基于OpenAI的简历生成器,可以从提供的数据生成简历。支持使用Supabase上传文件。",
        title: "基于OpenAI的简历生成器",
        github: "https://github.com/shricodev/resume-builder-openai",
        noLive: true, // 表示无实时链接
      },
      {
        id: Math.random(),
        title: "PDFWhisper - OpenAI",
        subtitle: "一个基于OpenAI的PDF聊天机器人。它可以回答基于PDF中的内容提出的问题。",
        github: "https://github.com/shricodev/pdfwhisper-openai",
        liveUrl: "https://pdfwhisper-openai.vercel.app/",
      },
      // ...其余项目详情
    ];

全屏 开启 全屏 关闭

Alternatively, 你也可以用 json 文件来存类似的信息内容。

这种做法的问题

真正的问题是这个过程完全是手工操作。你也不能在README文件中查看项目内容。当你新建一个项目时,你需要手动编辑文件,提交修改,然后推送到仓库。哎,这样的工作真的让人头疼 😮‍💨。

为什么不自动化这个,或者也可以用 Markdown 显示 README 呢?

此处省略内容

修复篇 🛠️

我对这个过程感到非常沮丧,总是觉得我的作品集网站因此而显得过时了。我马上想到的是:我们能否使用 GitHub Actions 来自动化它?

答案是肯定的,但怎么做到的呢?

有几个方法可以解决这个问题。你可以用专门与 GitHub API 交互的 JavaScript 库,GitHub 推荐 Octokit.js,或者找其他替代方案。

当我阅读文档时,提到需要生成个人访问令牌,感觉这有点多余,因为我只需要从公开仓库获取数据就没必要。毕竟,GitHub 有一个公共 API(https://api.github.com),有宽松的速率限制,非常适合用来获取仓库信息,无需生成令牌。

所以我决定不使用库了,转而使用一些Bash的小技巧。🪄🧙

使用 curl 拿数据

通过一个简单的 curl 命令,我获取了所有仓库名称。

下面的命令可以从shricodev的GitHub页面获取公开的非fork仓库名称(最多300个)并去重。
curl -s "https://api.github.com/users/shricodev/repos?per_page=300" | jq -r '.[] | select(.private == false and .fork == false) | .name' | uniq

进入全屏 切换回正常模式

这条命令会获取指定用户的全部仓库名称。它利用 jq 过滤掉所有分叉仓库(毕竟,你肯定不想在你的作品集中显示任何分叉仓库),然后再根据唯一性筛选项目(以防万一,以确保更安全)。

🤔 但我们如何过滤特定仓库在我们网站上显示呢?

为此目的,我们将为想展示的仓库添加一个独特的标签,例如 showcase,你可以按照你喜欢的方式命名。并将这个独特的标签添加到你希望在个人展示中展示的所有仓库中。

GitHub 仓库话题

我们现在需要做的是修改上述的 jq 过滤命令,检查主题 showcase 是否存在于仓库中,如果是,则就获取该仓库的所有元数据和相关信息。

    curl -s "https://api.github.com/users/shricodev/repos?per_page=300" | jq -r '.[] | select(.private == false and .fork == false and (.topics | index("showcase") != null)) | .name' | uniq

注:以上命令为英文,可以直接执行。

进入全屏,退出全屏

接下来,我从GitHub开发者页面的设置生成了一个个人访问令牌(Personal Access Token,PAT),并将其添加到仓库的密钥和变量 -> 操作部分。

这就对了:

添加GitHub仓库的PAT令牌

编写 GitHub 操作 ✍️

以下是:如下所示的使用 curl 命令的完整 GitHub Actions 工作流配置:

name: 获取公共仓库的README

on:
  schedule:
    # 每天零点运行。
    - cron: '0 0 * * *'
  workflow_dispatch:

permissions:
  contents: write

jobs:
  fetch-readmes:
    runs-on: ubuntu-latest

    steps:
      - name: 检出代码库
        uses: actions/checkout@v4

      - name: 获取并处理公共仓库列表及README元数据
        env:
          TARGET_USER: <username>
          TARGET_FOLDER: '<path_to_the_folder_to_store_readme(s)>'
        run: |
          mkdir -p "$TARGET_FOLDER"

          # 获取公共仓库列表
          repos=$(curl -s "https://api.github.com/users/$TARGET_USER/repos?per_page=300" | jq -r '.[] | select(.private == false and .fork == false and (.topics | index("showcase") != null)) | .name' | uniq)

          for repo in $repos; do
            readme_file="$TARGET_FOLDER/${repo}_README.mdx"

            if [[ -f "$readme_file" ]]; then
              echo "该README已存在,跳过..."
              continue
            fi

            repo_metadata=$(curl -s "https://api.github.com/repos/$TARGET_USER/$repo")
            title=$(echo "$repo_metadata" | jq -r '.name')
            description=$(echo "$repo_metadata" | jq -r '.description // ""')
            clone_url=$(echo "$repo_metadata" | jq -r '.clone_url')
            language=$(echo "$repo_metadata" | jq -r '.language // ""')
            homepage=$(echo "$repo_metadata" | jq -r '.homepage // ""')
            topics=$(echo "$repo_metadata" | jq -r '.topics | join(", ")')
            created_at=$(echo "$repo_metadata" | jq -r '.created_at')
            updated_at=$(echo "$repo_metadata" | jq -r '.updated_at')

            status_code=$(curl -o /dev/null -s -w "%{http_code}" https://raw.githubusercontent.com/$TARGET_USER/$repo/main/README.md)

            if [ "$status_code" -eq 200 ]; then
              readme_content=$(curl -s https://raw.githubusercontent.com/$TARGET_USER/$repo/main/README.md)

              {
                echo "---"
                echo "title: "\"$title\"\""
                echo "description: "\"$description\"\""
                echo "clone_url: \"$clone_url\""
                echo "language: \"$language\""
                echo "homepage: \"$homepage\""
                echo "topics:"
                for topic in $(echo "$topics" | tr ',' '\n'); do
                  echo " - \"$topic\""
                done
                echo "created_at: \"$created_at\""
                echo "updated_at: \"$updated_at\""
                echo "---"
                echo ""
                echo "$readme_content"
              } > "$readme_file"
            else
              echo "$repo 没有 README,跳过..."
            fi
          done

      - name: 提交变更
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"

          git add -A

          # 如果有更改则提交
          if ! git diff --cached --quiet; then
            git commit -m "更新公共仓库README和其元数据"
            git push https://x-access-token:${{ secrets.<secret_name> }}@github.com/<username>/<repository_name>.git HEAD:<branch_name>
          else
            echo "没有需要提交的更改。"
          fi

进入全屏,退出全屏

GitHub Actions 工作流每天都会运行,获取所有用户的所有仓库,写入它们的元数据以及 README 内容(如果有),并将它们分别保存为 <repository_name>_README.mdx 文件。

通过在 cron 定时器下方添加 workflow_dispatch:,我们可以启用手动触发工作流,以便在需要时手动触发。

如果你跟着教程做,确保用实际名字替换占位符文本。

现在,有了所有的元数据以及仓库README内容,我们可以用任何Markdown解析器来解析这些mdx内容,并在我们的网站上显示它。

如果你想看看下面的页面👇

https://techwithshrijal.com/projects


结论啦 ⚡

通过这个简单的 GitHub Actions,你的个人网站将始终与你的 GitHub 项目保持同步更新。通过使用基本的命令行脚本,我们把这个过程自动化了,这样就无需依赖第三方库。

你可以在这里找到整个代码库:https://github.com/shricodev/portfolio.git

可以在这里查看我的作品集:https://techwithshrijal.com,欢迎来看看!

谢谢大家的阅读!🎉

Leonardo Dicaprio Cheers

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消