「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > GitHub Actions を介して Web サイトのコンテンツをスケジュールどおりに更新する

GitHub Actions を介して Web サイトのコンテンツをスケジュールどおりに更新する

2024 年 11 月 6 日に公開
ブラウズ:470

従来の意味でのコンテンツ データベースを必要としない、自立可能なコンテンツ管理システムを構築する私のこれまでの道のりを共有したいと思います。

問題

この Web サイトのコンテンツ (ブログ投稿とブックマーク) は Notion データベースに保存されています:

Updating website content on schedule via GitHub Actions

ブックマークのあるデータベース – Notion UI

私が解決しようとしていた問題は、ブックマークを追加するたびに Web サイトを手動で展開する必要がないようにすることでした。それに加えて、ホスティング料金はできるだけ安く抑えてください。私にとって、Notion データベースに追加したブックマークがどれだけ早くオンラインになるかはあまり重要ではないからです。

そこで、いくつかの調査を行った結果、次の設定を思いつきました:

Updating website content on schedule via GitHub Actions

コンテンツ配信メカニズムの概要

システムはいくつかのコンポーネントで構成されています:

  • 変更をデプロイする「メインにプッシュ」アクション
  • Notion API からコンテンツをダウンロードし、変更をコミットする「コンテンツの更新」アクション
  • 「スケジュールに従ってコンテンツを更新」アクションが時々実行され、「コンテンツを更新」アクションがトリガーされます

それぞれを内側から外側まで詳しく見てみましょう。

「メインにプッシュ」ワークフロー

ここで言うことはあまりありません。非常に標準的なセットアップです – メインブランチへのプッシュがある場合、このワークフローはアプリを構築し、Wrangler CLI を使用して Cloudflare Pages にデプロイします。

name: Push to Main
on:
  push:
    branches: [main]
  workflow_dispatch: {}
jobs:
  deploy-cloudflare-pages:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup pnpm
        uses: pnpm/action-setup@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .node-version
          cache: pnpm
      - name: Install node modules
        run: |
          pnpm --version
          pnpm install --frozen-lockfile
      - name: Build the App
        run: |
          pnpm build
      - name: Publish Cloudflare Pages
        env:
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        run: |
          pnpm wrangler pages deploy ./out --project-name ${{ secrets.CLOUDFLARE_PROJECT_NAME }}

「コンテンツの更新」ワークフロー

このワークフローは「手動」でのみトリガーできますが、GitHub Personal Access Token (別名 PAT) を使用してトリガーできるため、自動でもトリガーできます。最初にこれを書いたのは、携帯電話から変更をデプロイしたかったからです。 Notion API を使用して投稿とブックマークをダウンロードし、コードベースに変更があった場合はコミットを作成してプッシュします。適切に機能するには、このワークフローにリポジトリの「コードへの読み取りおよび書き込みアクセス」を持つ PAT が提供されている必要があります:

name: Update Content
on:
  workflow_dispatch: {}
jobs:
  download-content:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          # A Github Personal Access Token with access to the repository 
          # that has the follwing permissions:
          # ✅ Read and Write access to code
          token: ${{ secrets.GITHUB_PAT_CONTENT }}
      - name: Setup pnpm
        uses: pnpm/action-setup@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .node-version
          cache: pnpm
      - name: Install node modules
        run: |
          pnpm --version
          pnpm install --frozen-lockfile
      - name: Download articles content from Notion
        env:
          NOTION_KEY: "${{ secrets.NOTION_KEY }}"
          NOTION_ARTICLES_DATABASE_ID: "${{ secrets.NOTION_ARTICLES_DATABASE_ID }}"
        run: |
          pnpm download-articles
      - name: Download bookmarks content from Notion
        env:
          NOTION_KEY: ${{ secrets.NOTION_KEY }}
          NOTION_BOOKMARKS_DATABASE_ID: ${{ secrets.NOTION_BOOKMARKS_DATABASE_ID }}
        run: |
          pnpm download-bookmarks
      - name: Configure Git
        run: |
          git config --global user.email "${{ secrets.GIT_USER_EMAIL }}"
          git config --global user.name "${{ secrets.GIT_USER_NAME }}"
      - name: Check if anything changed
        id: check-changes
        run: |
          if [ -n "$(git status --porcelain)" ]; then
            echo "There are changes"
            echo "HAS_CHANGED=true" >> $GITHUB_OUTPUT
          else
            echo "There are no changes"
            echo "HAS_CHANGED=false" >> $GITHUB_OUTPUT
          fi
      - name: Commit changes
        if: steps.check-changes.outputs.HAS_CHANGED == 'true'
        run: |
          git add ./src/content
          git add ./public
          git commit -m "Automatic content update commit"
          git push

「スケジュールに従ってコンテンツを更新」ワークフロー

これは非常に単純です。時々実行され、上記のワークフローをトリガーするだけです。適切に機能するには、このワークフローにリポジトリの「アクションへの読み取りおよび書き込みアクセス」を持つ GitHub PAT が提供されている必要があります。私の場合は別の PAT です:

name: Update Content on Schedule
on:
  schedule:
    - cron: "13 0,12 * * *"
  workflow_dispatch: {}
jobs:
  trigger-update-content:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Dispatch the Update Content workflow
        env:
          # A Github Personal Access Token with access to the repository 
          # that has the follwing permissions:
          # ✅ Read and Write access to actions
          GH_TOKEN: ${{ secrets.GITHUB_PAT_ACTIONS }}
        run: |
          gh workflow run "Update Content" --ref main

結論

私にとって、このセットアップは非常に優れており、柔軟性があることがわかりました。モジュール構造のため、「コンテンツの更新」アクションは手動でトリガーできます。旅行中に携帯電話から。私にとって、これもワークフローを段階的に強化する貴重な経験でした。

これが役に立ちましたか?

リリースステートメント この記事は次の場所に転載されています: https://dev.to/prudkohliad/updating-website-content-on-schedule-via-github-actions-39o7?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>
  • Pythonでリストを減算する方法?
    Pythonでリストを減算する方法?
    リストの減算: 差分の計算Python のリストにはさまざまな要素を含めることができます。リストに対して減算などの数学的演算を実行するには、特定の方法またはテクニックを使用します。あるリストから別のリストを減算する方法を見てみましょう。要素ごとの減算にリスト内包表記を使用する1 つのアプローチは、リ...
    プログラミング 2024 年 11 月 6 日に公開
  • Pythonでジェネレーターが空かどうかを確認する方法は?
    Pythonでジェネレーターが空かどうかを確認する方法は?
    空のジェネレーターの初期化の検出Python では、ジェネレーターは一度に 1 つずつ値を生成する反復子です。そのため、ジェネレーターが最初から空であるかどうかを判断するのは困難な場合があります。リストやタプルとは異なり、ジェネレーターには固有の長さや isEmpty メソッドがありません。課題への...
    プログラミング 2024 年 11 月 6 日に公開
  • ## Python から Java を効率的に呼び出したいですか? JPype の代替として Py4J を試してみましょう!
    ## Python から Java を効率的に呼び出したいですか? JPype の代替として Py4J を試してみましょう!
    Python から Java を呼び出す: JPype の代替としての Py4JPython から Java コードを呼び出すには、いくつかの解決策が考えられます。オプションの 1 つである JPype はコンパイルが難しく、最近リリースされていないため非アクティブに見えます。ただし、代替ソリューシ...
    プログラミング 2024 年 11 月 6 日に公開
  • スモールスウールDB
    スモールスウールDB
    Small Swoole Db 2.3 で左結合が導入されました : $selector = (new TableSelector('user')) ->leftJoin('post', 'messageOwner', 'message') ; $selector->where(...
    プログラミング 2024 年 11 月 6 日に公開
  • 位置人口カウント操作のパフォーマンスを向上させるために、アセンブリ命令を使用して __mm_add_epi32_inplace_purego 関数を最適化するにはどうすればよいですか?
    位置人口カウント操作のパフォーマンスを向上させるために、アセンブリ命令を使用して __mm_add_epi32_inplace_purego 関数を最適化するにはどうすればよいですか?
    アセンブリを使用した __mm_add_epi32_inplace_purego の最適化この質問は、バイト配列の位置ポピュレーション カウントを実行する __mm_add_epi32_inplace_purego 関数の内部ループを最適化することを目的としています。目標は、アセンブリ命令を利用して...
    プログラミング 2024 年 11 月 6 日に公開
  • React Router を使用したナビゲーション React Js パート A React アプリケーションでのルーティングのガイド
    React Router を使用したナビゲーション React Js パート A React アプリケーションでのルーティングのガイド
    React シリーズへようこそ!以前の投稿では、コンポーネント、状態、小道具、イベント処理などの重要な概念について説明しました。ここで、React Router を使用して React アプリケーションのルーティングを調べてみましょう。ルーティングを使用すると、アプリ内のさまざまなビューまたはコンポ...
    プログラミング 2024 年 11 月 6 日に公開
  • file_get_contents() は HTTP ファイルのアップロードに使用できますか?
    file_get_contents() は HTTP ファイルのアップロードに使用できますか?
    HTTP ストリーム コンテキストを使用した file_get_contents() によるファイルのアップロードWeb フォーム経由のファイルのアップロードは、cURL 拡張機能を使用してシームレスに実行できます。ただし、HTTP ストリーム コンテキストと組み合わせて PHP の file_ge...
    プログラミング 2024 年 11 月 6 日に公開
  • React での UseEffect
    React での UseEffect
    React Hooks の世界へようこそ!今日は、最も人気のあるフックの 1 つである useEffect について詳しく説明します。楽しく分かりやすく説明していきますので、ご安心ください。それでは、始めましょう! ? ? useEffectとは何ですか useEffect は、機能コンポーネントで...
    プログラミング 2024 年 11 月 6 日に公開
  • Google Cloud Platform の無料枠で最新のデータ プラットフォームを構築する方法
    Google Cloud Platform の無料枠で最新のデータ プラットフォームを構築する方法
    私は、Medium.com で一連の 7 つの無料公開記事「Google Cloud Platform の無料枠で最新のデータ プラットフォームを構築する方法」をリリースしました。 リード記事は、https://medium.com/@markwkiehl/building-a-data-plat...
    プログラミング 2024 年 11 月 6 日に公開
  • #f を投稿する
    #f を投稿する
    この投稿は、これまでのコーディングと学習における私の苦労について書いています A.集中力を維持できるのは最大でも 1 時間、2 時間くらいです。 b.私は本当にすぐに気が散ってしまいます c.長く座っていられなかったり、イライラして休むと脚に問題が生じ始めます。 問題を解決するために考えた解決策 ...
    プログラミング 2024 年 11 月 6 日に公開
  • Web 開発者向けのトップ Chrome 拡張機能 4
    Web 開発者向けのトップ Chrome 拡張機能 4
    2024 年の Web 開発者向け Chrome 拡張機能トップ 10 2024 年に向けて、Chrome 拡張機能はウェブ開発者のツールキットに不可欠な部分となり、ブラウザー内で強力な機能を提供します。この記事では、今年 Web 開発コミュニティで話題になっている Chrome ...
    プログラミング 2024 年 11 月 6 日に公開
  • React Router v4/v5 でルートをネストする方法: 簡易ガイド
    React Router v4/v5 でルートをネストする方法: 簡易ガイド
    React Router v4/v5 でのネストされたルート: 簡易ガイドReact Router を使用する場合、ネストされたルートは整理するための重要なテクニックですアプリケーションのナビゲーション。ただし、初心者は、ネストされたルートの設定で課題に直面することがよくあります。この記事は、Rea...
    プログラミング 2024 年 11 月 6 日に公開
  • MySQL で UTF8 文字エンコーディングを使用してテーブルの書式設定を保持するにはどうすればよいですか?
    MySQL で UTF8 文字エンコーディングを使用してテーブルの書式設定を保持するにはどうすればよいですか?
    UTF8 文字エンコーディングによる MySQL コマンド ラインの書式設定の強化データベース テーブルに格納されているスウェーデン語およびノルウェー語の文字列を操作しているときに、データのクエリ時にテーブルの書式設定で問題が発生する可能性があります。 問題ステートメントデフォルトでは、「set n...
    プログラミング 2024 年 11 月 6 日に公開
  • CSSボックスモデル
    CSSボックスモデル
    CSS ボックス モデルは、Web 上のレイアウトとデザインの基礎を形成する Web 開発の基本的な概念です。これは、要素のサイズがどのように設定されるか、要素のコンテンツがどのようにレンダリングされるか、Web ページ上で要素がどのように相互作用するかを決定します。ボックス モデルをマスターするこ...
    プログラミング 2024 年 11 月 6 日に公開
  • CSSセレクターの書き方
    CSSセレクターの書き方
    世の中にはたくさんの CSS 手法がありますが、私はそれらすべてが大嫌いです。より多くのものもあれば (追い風など)、いくつかは少なくなります (BEM、OOCSS など)。しかし結局のところ、それらにはすべて欠点があります。 人々がこれらのアプローチを使用するのにはもちろん正当な理由があり、対処さ...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3