如何製作 GitHub 個人主頁

2023-07-05 06:02:21

人們在網上首先發現你的地方是哪裡?也許你的社交媒體是人們搜尋你時首先發現的東西,亦也許是你為自己建立的投資組合網站。然而,如果你使用GitHub來分享你的程式碼並參與開源專案,那麼你的GitHub個人主頁可能是人們為了瞭解你而去的第一個地方。

你希望你的GitHub個人主頁說些什麼?你希望如何以簡明易讀的方式向訪客表達對你的重要性以及你是誰?無論他們是未來的僱主還是開源專案的潛在合作伙伴,你都必須擁有一個引人注目的個人主頁。

使用GitHub Actions,你可以把一個靜態的markdown檔案變成一個動態的、保持對你最新資訊更新的良好體驗。那麼如何做到這一點呢?

我將向你展示一個例子,告訴你如何在不費吹灰之力的情況下迅速做到這一點。在這個例子中,你將學習如何抓取一個網站並使用這些資料來動態更新你的GitHub個人主頁。我們將在Ruby中展示這個例子,但你也可以用JavaScript、TypeScript、Python或其他語言來做。

GitHub個人主頁如何運作

你的GitHub個人主頁可以通過在網頁瀏覽器中存取github.com/[你的使用者名稱]找到。那麼該頁面的內容來自哪裡?

它存在於你賬戶中一個特殊的倉庫中,名稱為你的賬戶使用者名稱。如果你還沒有這個倉庫,當你存取github.com/[你的使用者名稱]時,你不會看到任何特殊的內容,所以第一步是確保你已經建立了這個倉庫,如果你還沒有,就去建立它。

探索倉庫中的檔案

倉庫中唯一需要的檔案是README.md檔案,它是你的個人主頁頁面的來源。

./
├── README.md

繼續在這個檔案中新增一些內容並儲存,重新整理你的使用者名稱主頁,你會看到這些內容反映在那裡。

為動態內容新增正確的資料夾

在我們建立程式碼以使我們的個人主頁動態化之前,讓我們先新增資料夾結構。

在頂層新增一個名為.github的新資料夾,在.github內部新增兩個新的子資料夾:scripts/workflows/

你的檔案結構現在應該是這樣的:

./
├── .github/
│   ├── scripts/
│   └── workflows/
└── README.md

製作一個動態個人主頁

對於這個例子,我們需要做三件事:

  • README中定義一個放置動態內容的地方
  • scripts/中新增一個指令碼,用來完成爬取工作
  • workflows/中為GitHub Actions新增一個工作流,按計劃執行該指令碼

現在讓我們逐步實現。

更新README

我們需要在README中增加一個部分,可以用正則來抓取指令碼進行修改。它可以是你的具體使用情況所需要的任何內容。在這個例子中,我們將在README中新增一個最近部落格文章的部分。

在程式碼編輯器中開啟README.md檔案,新增以下內容:

### Recent blog posts

現在我們有了一個供指令碼查詢的區域。

建立指令碼

我們正在構建的範例指令碼是用Ruby編寫的,使用GitHub gem octokit與你的倉庫進行互動,使用nokogiri gem爬取網站,並使用httparty gem進行HTTP請求。

在下面這個例子中,要爬取的元素已經被確定了。在你自己的用例中,你需要明確你想爬取的網站上的元素的路徑,毫無疑問它將不同於下面顯示的在 posts 變數中定義的,以及每個post的每個titlelink

下面是範例程式碼,將其放在scripts/資料夾中:

require 'httparty'
require 'nokogiri'
require 'octokit'

# Scrape blog posts from the website
url = "<https://www.bengreenberg.dev/blog/>"
response = HTTParty.get(url)
parsed_page = Nokogiri::HTML(response.body)
posts = parsed_page.css('.flex.flex-col.rounded-lg.shadow-lg.overflow-hidden')

# Generate the updated blog posts list (top 5)
posts_list = ["\n### Recent Blog Posts\n\n"]
posts.first(5).each do |post|
  title = post.css('p.text-xl.font-semibold.text-gray-900').text.strip
  link = "<https://www.bengreenberg.dev#{post.at_css('a')[:href]}>"
  posts_list << "* [#{title}](#{link})"
end

# Update the README.md file
client = Octokit::Client.new(access_token: ENV['GITHUB_TOKEN'])
repo = ENV['GITHUB_REPOSITORY']
readme = client.readme(repo)
readme_content = Base64.decode64(readme[:content]).force_encoding('UTF-8')

# Replace the existing blog posts section
posts_regex = /### Recent Blog Posts\n\n[\s\S]*?(?=<\/td>)/m
updated_content = readme_content.sub(posts_regex, "#{posts_list.join("\n")}\n")

client.update_contents(repo, 'README.md', 'Update recent blog posts', readme[:sha], updated_content)

正如你所看到的,首先向網站發出一個HTTP請求,然後收集有部落格文章的部分,並將資料分配給一個posts變數。然後,指令碼在posts變數中遍歷部落格文章,並收集其中的前5個。你可能想根據自己的需要改變這個數位。每回圈一次博文,就有一篇博文被新增到post_list的陣列中,其中有該博文的標題和URL。

最後,README檔案被更新,首先使用octokit gem找到它,然後在README中找到要更新的地方,並使用一些正則: posts_regex = /### Recent Blog Posts\n\n[\s\S]*?(?=<\/td>)/m

這個指令碼將完成工作,但實際上沒有任何東西在呼叫這個指令碼。它是如何被執行的呢?這就輪到GitHub Actions出場了!

建立Action工作流

現在我們已經有了指令碼,我們需要一種方法來按計劃自動執行它。GitHub Actions 提供了一種強大的方式來自動化各種任務,包括執行指令碼。在這種情況下,我們將建立一個GitHub Actions工作流,每週在週日午夜執行一次該指令碼。

工作流檔案應該放在.github/workflows/目錄下,可以命名為update_blog_posts.yml之類的。以下是工作流檔案的內容:

name: Update Recent Blog Posts

on:
  schedule:
    - cron: '0 0 * * 0' # Run once a week at 00:00 (midnight) on Sunday
  workflow_dispatch:

jobs:
  update_posts:
    runs-on: ubuntu-latest

    steps:
    - name: Check out repository
      uses: actions/checkout@v2

    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 3.1

    - name: Install dependencies
      run: gem install httparty nokogiri octokit

    - name: Scrape posts and update README
      run: ruby ./.github/scripts/update_posts.rb
      env:
        GITHUB_TOKEN: $
        GITHUB_REPOSITORY: $

這個工作流是根據cron語法定義的時間表觸發的,該時間表指定它應該在每個星期天的00:00(午夜)執行。此外,還可以使用workflow_dispatch事件來手動觸發該工作流。

update_posts工作由幾個步驟組成:

  • 使用 actions/checkout@v2操作來簽出倉庫。
  • 使用 ruby/setup-ruby@v1 操作來設定 Ruby,指定的 Ruby 版本為 3.1。
  • 使用 gem install 命令安裝所需的 Ruby 依賴(httpartynokogirioctokit)。
  • 執行位於.github/scripts/目錄下的指令碼 update_posts.rbGITHUB_TOKENGITHUB_REPOSITORY環境變數被提供給指令碼,使其能夠與倉庫進行互動。

有了這個工作流程,你的指令碼就會每週自動執行,抓取部落格文章並更新README檔案。GitHub Actions負責所有的排程和執行工作,使整個過程無縫且高效。

將所有的東西放在一起

如今,你的網路形象往往是人們與你聯絡的第一個接觸點--無論他們是潛在的僱主、合作者,還是開源專案的貢獻者。尤其是你的GitHub個人主頁,是一個展示你的技能、專案和興趣的寶貴平臺。那麼,如何確保你的GitHub個人主頁是最新的、相關的,並能真正反映出你是誰?

通過利用 GitHub Actions 的力量,我們展示瞭如何將你的 GitHub 組態檔從一個靜態的 Markdown 檔案轉變為一個動態的、不斷變化關於你是誰的例子。通過本指南提供的例子,你已經學會了如何從網站上抓取資料,並利用它來動態更新你的 GitHub個人主頁。雖然我們的例子是用Ruby實現的,但同樣的原則也可以用JavaScript、TypeScript、Python或你選擇的任何其他語言來應用。

回顧一下,我們完成了建立一個Ruby指令碼的過程,該指令碼可以從網站上抓取部落格文章,提取相關資訊,並更新你的README.md檔案中的"最近部落格文章"部分。然後,我們使用GitHub Actions設定了一個工作流,定期執行該指令碼,確保你的個人主頁中保持最新的內容。

但我們的旅程並沒有就此結束。本指南中分享的技術和方法可以作為進一步探索和創造的基礎。無論是從其他來源拉取資料,與API整合,還是嘗試不同的內容格式,都有無限的可能性。

因此,行動起來讓你的 GitHub 個人主頁成為你自己的一個充滿活力的擴充套件。讓它講述你的故事,突出你的成就,並邀請你與他人合作。

以上就是本文的全部內容,如果對你有所啟發,歡迎點贊、收藏、轉發~