Là một nhà văn, tôi hiểu tầm quan trọng của tính nhất quán khi xuất bản nội dung mới. Tuy nhiên, có những lúc cuộc sống cản trở bạn và việc nhớ viết một bài đăng blog mới có thể là một thách thức. Để giúp tôi theo kịp lịch trình chia sẻ của mình, tôi đã tạo một lời nhắc đơn giản bằng GitHub Actions. Trong bài đăng này, tôi sẽ chia sẻ cách tôi thực hiện quy trình công việc này.
GitHub Actions là một công cụ mạnh mẽ cho phép bạn tự động hóa quy trình làm việc của mình. Bạn có thể sử dụng nó để xây dựng, thử nghiệm và triển khai mã của mình. Bạn cũng có thể sử dụng nó để thực hiện nhiều tác vụ khác, chẳng hạn như gửi thông báo hoặc lên lịch nhắc nhở.
Để tạo lời nhắc viết bài đăng trên blog, tôi đang sử dụng kho lưu trữ đặc biệt của GitHub là README.md và thêm một tệp có tên .github/workflows/blog-posts.yml. Trong tệp này, tôi đã xác định quy trình công việc mà Tác vụ GitHub sẽ thực thi. Đây là nội dung ban đầu của tệp:
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 }}
Quy trình công việc này được kích hoạt vào mỗi Chủ Nhật lúc 00:00. Sau đó, nó sẽ chạy một tập lệnh cập nhật danh sách các bài đăng trên blog. Tập lệnh được viết bằng JavaScript và sử dụng gói nguồn cấp dữ liệu để phân tích nguồn cấp dữ liệu RSS của blog của tôi. Sau đó, nó tạo danh sách các bài đăng trên blog và cập nhật tệp README.md. Cuối cùng, nó cam kết các thay đổi và đẩy chúng lên GitHub. Tôi đang sử dụng kho lưu trữ của ouuan làm tài liệu tham khảo cho quy trình làm việc này.
Lời nhắc đến từ đâu? Nó thực sự nằm trong tệp list-posts.js. Tôi đã thêm một lời nhắc vào danh sách các bài đăng trên blog. Đây là nội dung của tập tin:
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') }
Tập lệnh đọc nguồn cấp dữ liệu RSS của blog của tôi và tạo danh sách các bài đăng trên blog. Sau đó, nó cập nhật tệp README.md với danh sách các bài đăng trên blog. Nếu không có bài đăng blog mới, nó sẽ báo lỗi để nhắc tôi viết một bài đăng blog.
Đó chỉ là một lỗi sẽ được đưa ra khi tập lệnh được thực thi trong khi các bài đăng vẫn như cũ và đó không phải là lời nhắc sẽ được gửi đến email của tôi hoặc thứ gì đó mà tôi dễ thấy hơn. Vì vậy, tôi đã quyết định bật thông báo cho bất kỳ lần chạy quy trình công việc nào không thành công.
Đây là cách thực hiện:
Bây giờ, tôi sẽ nhận được thông báo khi tập lệnh được thực thi và không có bài đăng blog mới nào. Tôi cũng có thể xem thông báo trên trang web GitHub.
Quy trình làm việc trước đây mà tôi nói với bạn là một phiên bản sửa đổi để README.md của tôi luôn được cập nhật. Tôi cũng đã khám phá một cách khác để tạo lời nhắc viết một bài đăng trên blog. Tuy nhiên, đó là một lời nhắc thuần túy không có bất kỳ cơ chế cập nhật README.md nào, chỉ là một lời nhắc.
Để tạo lời nhắc viết bài đăng trên blog, tôi đã tạo một kho lưu trữ GitHub mới và thêm một tệp có tên .github/workflows/remind.yml
. Trong tệp này, tôi đã xác định quy trình công việc mà Tác vụ GitHub sẽ thực thi. Đây là nội dung của tập tin:
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]
Quy trình công việc này sẽ gửi cho tôi một lời nhắc qua email vào mỗi ngày trong tuần lúc 10:00 sáng, nhắc tôi viết một bài đăng blog mới. Tôi đã sử dụng một hành động của bên thứ ba, dawidd6/action-send-mail, để gửi email. Tôi đã cung cấp thông tin đăng nhập email của mình dưới dạng bí mật GitHub, vì vậy chúng không hiển thị trong tệp quy trình làm việc.
Tôi đã khám phá hai cách để tạo lời nhắc viết một bài đăng trên blog. Cách đầu tiên là cập nhật tệp README.md trong hồ sơ GitHub của tôi. Cách thứ hai là gửi email nhắc nhở. Hiện tôi đang dùng cách thứ nhất vì nó dễ thấy hơn cách thứ hai. Tôi có thể thấy lời nhắc mỗi khi truy cập hồ sơ GitHub của mình.
Tạo lời nhắc viết bài đăng trên blog bằng GitHub Actions là một cách đơn giản và hiệu quả để theo dõi lịch trình viết blog của bạn. Với quy trình làm việc này, bạn sẽ không bao giờ quên viết một bài đăng mới nữa. Nếu bạn quan tâm đến việc tạo quy trình nhắc nhở của riêng mình, hãy nhớ xem tài liệu về Hành động GitHub để tìm hiểu thêm. Chúc bạn viết blog vui vẻ!