paint-brush
GitHub Actions で執筆スケジュールを管理する方法@imamdev
1,006 測定値
1,006 測定値

GitHub Actions で執筆スケジュールを管理する方法

Imamuzzaki Abu Salam7m2023/04/25
Read on Terminal Reader

長すぎる; 読むには

GitHub Action を使用してブログ投稿のリマインダーを作成した方法。 Imamuzzaki Abu Salam は、GitHub Actions を使用して簡単なリマインダーを作成しました。この投稿では、このワークフローをどのように作成したかを共有します。GitHub Actions とは何ですか? GitHub Actions は、ワークフローを自動化できる強力なツールです。
featured image - GitHub Actions で執筆スケジュールを管理する方法
Imamuzzaki Abu Salam HackerNoon profile picture
0-item
1-item

ライターとして、新しいコンテンツを公開する際の一貫性の重要性を理解しています。ただし、生活の邪魔になる場合があり、新しいブログ投稿を書くことを覚えておくのが難しい場合があります。共有スケジュールを順調に進めるために、GitHub Actions を使用して簡単なリマインダーを作成しました。この投稿では、このワークフローをどのように作成したかを共有します。

GitHub アクションとは?

GitHub Actions は、ワークフローを自動化できる強力なツールです。これを使用して、コードをビルド、テスト、デプロイできます。また、通知の送信やリマインダーのスケジュール設定など、他のさまざまなタスクを実行するためにも使用できます。

ブログ投稿を書くためのリマインダーを作成する方法

ブログ投稿のリマインダーを作成するために、 GitHub の README.md の特別なリポジトリを使用し、.github/workflows/blog-posts.yml という名前のファイルを追加しました。このファイルでは、GitHub Actions が実行するワークフローを定義しました。ファイルの最初の内容は次のとおりです。

 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 }}


このワークフローは、毎週日曜日の 00:00 にトリガーされます。次に、ブログ投稿のリストを更新するスクリプトを実行します。このスクリプトは JavaScript で記述されており、フィードパッケージを使用してブログの RSS フィードを解析します。次に、ブログ投稿のリストを生成し、README.md ファイルを更新します。最後に、変更をコミットして GitHub にプッシュします。このワークフローのリファレンスとして、ouuan のリポジトリを使用しています。

リマインダーはどこから来たのですか?実際には list-posts.js ファイルにあります。ブログ記事一覧にリマインダーを追加しました。ファイルの内容は次のとおりです。

 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') }


このスクリプトは、私のブログの RSS フィードを読み取り、ブログ投稿のリストを生成します。次に、ブログ投稿のリストで README.md ファイルを更新します。新しいブログ投稿がない場合は、ブログ投稿を書くように通知するエラーがスローされます。


投稿がまだ同じである間にスクリプトが実行されたときにスローされるのは単なるエラーであり、私の電子メールまたは私にとってより目に見えるものに送信されるリマインダーではありません.そこで、失敗したワークフロー実行の通知を有効にすることにしました。


方法は次のとおりです。


  1. ページの右上隅にある をクリックし、 [設定]を選択します。
  2. 左側のサイドバーで[通知]を選択します。
  3. [アクション]をクリックします。
  4. [失敗したワークフローのみ通知を送信する]を選択します。


これで、スクリプトが実行され、新しいブログ投稿がない場合に通知が届きます。 GitHub Web サイトでも通知を確認できます。

私が探求した別の方法

以前のワークフローは変更されたバージョンであるため、私の README.md は常に最新です。また、ブログ投稿を書くためのリマインダーを作成する別の方法も調べました。ただし、これは README.md 更新メカニズムのない純粋なリマインダーであり、単なるリマインダーです。


ブログ投稿を書くためのリマインダーを作成するために、新しい GitHub リポジトリを作成し、 .github/workflows/remind.ymlという名前のファイルを追加しました。このファイルでは、GitHub Actions が実行するワークフローを定義しました。ファイルの内容は次のとおりです。

 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]


このワークフローでは、毎週平日の午前 10 時に、新しいブログ投稿を書くように促す電子メール リマインダーが送信されます。サードパーティのアクション dawidd6/action-send-mail を使用してメールを送信しました。電子メール資格情報を GitHub シークレットとして提供したため、ワークフロー ファイルには表示されません。

結論

ブログ投稿を書くためのリマインダーを作成する 2 つの方法を検討しました。最初の方法は、GitHub プロファイルの README.md ファイルを更新することです。 2 番目の方法は、電子メール リマインダーを送信することです。 2 番目の方法よりも見やすいため、現在は 1 番目の方法を使用しています。 GitHub プロファイルにアクセスするたびにリマインダーが表示されます。


GitHub Actions を使用してブログ投稿のリマインダーを作成することは、ブログのスケジュールを順調に進めるためのシンプルで効果的な方法です。このワークフローが整っていれば、新しい投稿を書き忘れることはもうありません。独自のリマインダー ワークフローの作成に関心がある場合は、GitHub Actions のドキュメントで詳細を確認してください。ハッピーブログ!