人們在網上首先發現你的地方是哪裡?也許你的社交媒體是人們搜尋你時首先發現的東西,亦也許是你為自己建立的投資組合網站。然而,如果你使用GitHub來分享你的程式碼並參與開源專案,那麼你的GitHub個人主頁可能是人們為了瞭解你而去的第一個地方。
你希望你的GitHub個人主頁說些什麼?你希望如何以簡明易讀的方式向訪客表達對你的重要性以及你是誰?無論他們是未來的僱主還是開源專案的潛在合作伙伴,你都必須擁有一個引人注目的個人主頁。
使用GitHub Actions,你可以把一個靜態的markdown
檔案變成一個動態的、保持對你最新資訊更新的良好體驗。那麼如何做到這一點呢?
我將向你展示一個例子,告訴你如何在不費吹灰之力的情況下迅速做到這一點。在這個例子中,你將學習如何抓取一個網站並使用這些資料來動態更新你的GitHub個人主頁。我們將在Ruby中展示這個例子,但你也可以用JavaScript、TypeScript、Python或其他語言來做。
你的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.md
檔案,新增以下內容:
### Recent blog posts
現在我們有了一個供指令碼查詢的區域。
我們正在構建的範例指令碼是用Ruby編寫的,使用GitHub gem octokit
與你的倉庫進行互動,使用nokogiri
gem爬取網站,並使用httparty
gem進行HTTP請求。
在下面這個例子中,要爬取的元素已經被確定了。在你自己的用例中,你需要明確你想爬取的網站上的元素的路徑,毫無疑問它將不同於下面顯示的在 posts
變數中定義的,以及每個post
的每個title
和link
。
下面是範例程式碼,將其放在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出場了!
現在我們已經有了指令碼,我們需要一種方法來按計劃自動執行它。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 依賴(httparty
、nokogiri
和 octokit
)。.github/scripts/
目錄下的指令碼 update_posts.rb
。GITHUB_TOKEN
和GITHUB_REPOSITORY
環境變數被提供給指令碼,使其能夠與倉庫進行互動。有了這個工作流程,你的指令碼就會每週自動執行,抓取部落格文章並更新README
檔案。GitHub Actions負責所有的排程和執行工作,使整個過程無縫且高效。
如今,你的網路形象往往是人們與你聯絡的第一個接觸點--無論他們是潛在的僱主、合作者,還是開源專案的貢獻者。尤其是你的GitHub個人主頁,是一個展示你的技能、專案和興趣的寶貴平臺。那麼,如何確保你的GitHub個人主頁是最新的、相關的,並能真正反映出你是誰?
通過利用 GitHub Actions 的力量,我們展示瞭如何將你的 GitHub 組態檔從一個靜態的 Markdown 檔案轉變為一個動態的、不斷變化關於你是誰的例子。通過本指南提供的例子,你已經學會了如何從網站上抓取資料,並利用它來動態更新你的 GitHub個人主頁。雖然我們的例子是用Ruby實現的,但同樣的原則也可以用JavaScript、TypeScript、Python或你選擇的任何其他語言來應用。
回顧一下,我們完成了建立一個Ruby指令碼的過程,該指令碼可以從網站上抓取部落格文章,提取相關資訊,並更新你的README.md
檔案中的"最近部落格文章"部分。然後,我們使用GitHub Actions設定了一個工作流,定期執行該指令碼,確保你的個人主頁中保持最新的內容。
但我們的旅程並沒有就此結束。本指南中分享的技術和方法可以作為進一步探索和創造的基礎。無論是從其他來源拉取資料,與API整合,還是嘗試不同的內容格式,都有無限的可能性。
因此,行動起來讓你的 GitHub 個人主頁成為你自己的一個充滿活力的擴充套件。讓它講述你的故事,突出你的成就,並邀請你與他人合作。
以上就是本文的全部內容,如果對你有所啟發,歡迎點贊、收藏、轉發~