👽

記事とプログラムを分離しました。

Published
Read Time
5 min
Written By
mook

サイトのプログラムと記事データを分離して管理可能に変更しました。
もともとはルートディレクトリ配下に _posts ディレクトリを配置して、
その中に各記事ファイル(.md)を格納しています。
この _posts は別のリポジトリで管理を行い、pushされたタイミングで自動的に吸い上げるように、変更をおこないました。

編集したファイル

今回はプログラムではなく GitHub Actions を利用して実行しています。

  1. はじめに posts レポジトリを作成し、そこに今までの記事を移動する。
  2. 次に以下の workflowposts レポジトリに設定する。
    これは posts レポジトリが変更された場合は、
    action を実行して、blog リポジトリに通知するようになっています。
    blog リポジトリはこの通知をもとに action を実行するになります。
main.yaml
--- 2023-03-19 記事のフォルダ構成を変更し、zenn-cliを利用可能な構成に変更
name: dispatch target file updated
on:
  push:
    branches:
      - main
+    paths:
+      - 'articles/*'
jobs:
  dispatch-target-updated:
    name: dispatch-target-updated
    runs-on: ubuntu-latest
    steps:
      - name: dispatch target-updated
        uses: peter-evans/repository-dispatch@v1
        with:
          token: ${{ secrets.PERSONAL_ACCESS_TOKEN  }}
          repository: 'mook-jp/blog'
          event-type: target-updated
  1. 次に blog リポジトリに workflow を設定する。
    これは 2 で作成した workflow が実行されたことを検知して、
    action が実行され、 blog リポジトリに記事をコピーして commit します。
main.yaml
--- 2023-03-19 記事のフォルダ構成を変更し、zenn-cliを利用可能な構成に変更
name: copy target.yml from repository1
on:
  repository_dispatch:
    types: [target-updated]
jobs:
  copy-target:
    name: copy target.yml
    permissions:
      actions: write
      checks: write
      contents: write
      deployments: write
      issues: write
      packages: write
      pull-requests: write
      repository-projects: write
      security-events: write
      statuses: write
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: clone posts
        uses: actions/checkout@v2
        with:
          repository: mook-jp/posts
          path: posts_dir
          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
      - name: make _posts
        run: rm -rf ./_posts && mkdir -p ./_posts
      - name: copy md
-        run: cp posts_dir/*.md ./_posts/
+        run: cp posts_dir/articles/*.md ./_posts/
      - name: clean posts
        run: rm -rf posts_dir
      - name: commit
        run: |
          git config user.name mook-jp
          git config user.email mook24.jp@gmail.com
          git add .
          git commit -m "Update post"
          git push

これで posts リポジトリが更新された場合は、
自動的に blog にコピーして commit が行われます。

最終的には blog のコミットを検知して、
cloudflare pagesdeploy されることになります。

tokenの期限切れ対応

期限切れが発生したときは下記の対応が必要になる。
1.生成済みのTokenの再生成を行う

  • githubを開く(https://github.com/settings/tokens?type=beta)
  • 生成済みのTokenをクリック
  • Regenerate tokenをクリック
  • 生成されたTokenをコピーする
    2.actionsを登録したrepositoryのsettingsを開く
    3.Secrets and variablesのActionsを開く
    4.登録済みのSecretsの編集ファイルに1でコピーしたテキストを張り付ける

この対応にてActionsが正常に動作するようになる。
エラーが発生した時はActionsのエラーでError: Bad credentialsとなる。