Skip to content

v2: PDF を同じブランチの pdf/ に置き、rclone で OneDrive などにも送れるようにする - #12

Merged
5ym merged 3 commits into
masterfrom
folder-output
Oct 3, 2026
Merged

5ym merged 3 commits into
masterfrom
folder-output

Conversation

@5ym

@5ym 5ym commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

変えたこと (互換が無いので v2)

  • 置き場所: pdf ブランチをやめた。.qd と同じフォルダ構造で、同じブランチの output-dir (既定 pdf/) に置き、Action がコミットして push する
    • GITHUB_TOKEN で push したコミットは次のワークフローを起動しないので、変換は繰り返されない
  • 差分の判定: 前回変換したコミットを <output-dir>/.seisho に記録し、そこからの差分だけを変換する
    • リネームは「消して作り直す」として扱うので、旧名の PDF が残らなくなった
  • rclone で送る: rclone-config (rclone.conf の中身。secret から渡す) と rclone-remote (例 onedrive:Documents/report) を指定すると、変換した PDF を同じフォルダ構造で送る。消した分は送り先からも消す。送り先にある他のファイルには触らない
  • なくなったもの: 入力 pdf-branch / source-branch と、元のブランチへ戻す処理
  • README (OneDrive の設定のしかた、v1 からの移り方を含む) と docs/spec.md を書き直した

確かめたこと

5ym/academic の試し用ブランチから 5ym/seisho@folder-output を呼んだ:

  • 初回: 29 本の PDF と .seisho が pdf/academic/... にコミットされた。rclone の送り先 (ランナー上の local 型の remote) にも、同じ構造で 29 本が届いた。全角のコロンを含む名前もそのまま
  • 2 回目 (1 本削除・1 本リネーム・1 本変更): 変換は 2 本だけ。削除した PDF は消え、リネームした PDF は新しい名前になった
  • Action 自身の PDF のコミットでは、ワークフローは起動しなかった
  • rclone の失敗: 存在しない送り先を指定すると、ジョブは失敗し PDF のコミットは作られなかった。送り先を直して push すると、同じ PDF がもう一度変換・送信・コミットされた
  • 送り先に無いファイルの削除: 2 回目は送り先がまっさらだったので、消そうとした PDF は送り先に無かった。それでも失敗しなかった

OneDrive の実物での確認は、認証が要るのでまだしていない。マージ後、v2 / v2.0.0 のタグを打つ。

🤖 Generated with Claude Code

https://claude.ai/code/session_01USCeESvgLneCai7g8399GM

- pdf ブランチをやめ、.qd と同じフォルダ構造で output-dir (既定 pdf) に置いて
  コミット・push する。前回変換したコミットは <output-dir>/.seisho に記録する
- リネームは消して作り直すので、旧名の PDF が残らない
- rclone-config / rclone-remote を指定すると、変換した PDF を送り、消した分は
  送り先からも消す
- 入力 pdf-branch / source-branch と、元のブランチへ戻す処理は無くなった

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01USCeESvgLneCai7g8399GM
@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 34s —— View job


レビュー結果

action.yml を中心に確認しました。全体の設計 (同じブランチの pdf/、.seisho による差分管理、リネームを削除+追加として扱う処理) はシンプルで、整合性も取れています。気になった点は次のとおりです。

不具合・要確認

  1. rclone の送信が失敗すると、取り戻せなくなる (要確認)
    commit and push のステップで .seisho (前回変換したコミット) が先にコミットされ、そのあとに upload with rclone が走ります。rclone の copy が失敗すると、PDF と .seisho はすでに push 済みです。次回の差分はその続きから始まるため、送れなかった PDF は送り先に永久に届きません。

    • 送り先は output-dir の内容からいつでも作り直せるので、rclone sync "$OUT" "$REMOTE" のような全体同期にする案があります。ただし「送り先の他のファイルには触らない」という方針とは合いません。
    • 送り先用に別の記録を持つ案もあります。
    • 少なくとも README に「送信失敗時は再実行しても再送されない」と書いたほうがよいです。
  2. rclone delete ... || true でエラーが隠れる
    削除済みファイルが送り先に無い場合のエラーを避ける意図と思われますが、認証切れやネットワークの失敗も握りつぶします。copy が成功していれば認証は通っているはずなので、--ignore-errors のようなファイル欠落だけを許す方法のほうが安全です (要確認: rclone の delete が欠落ファイルでエラーを返すかどうか)。

  3. 並行実行 (要確認)
    push のリトライでは pull --rebase をしています。2 本のジョブが同時に動くと、両方が .seisho を書き換えて rebase でコンフリクトし、3 回とも失敗して終わります。呼び出し側で concurrency: を設定するよう README に書いておくと親切です。

セキュリティ

  1. curl -fsSL https://rclone.org/install.sh | sudo bash
    ランナー上で root 権限のスクリプトを無検証で実行します。バージョンを固定した公式リリースの取得 (チェックサム確認付き) か、apt-get install rclone のほうが望ましいです。
  2. rclone.conf を $RUNNER_TEMP に書き出しています。既定の権限は 644 ですが、シークレットを含むので umask 077 か chmod 600 を付けるとより安全です。使い終わりに削除しているのは良いです。ただしステップが途中で失敗すると rm -f に届きません。ランナーは使い捨てなので実害は小さいです。

軽微

  1. grep -v "^$OUT/" は output-dir を正規表現として扱います。. などを含む名前では意図せず広くマッチします。grep -vF と前方一致の判定にしておくと安全です。output-dir が空文字や . の場合は未検証です (要確認)。

テスト

テストはありません。このリポジトリは Action 本体と docs だけなので、PR 本文にある実機確認 (初回・2 回目・ループしないこと) が実質のテストです。ただし上記 1 の失敗系は確認されていないので、rclone の remote に書き込めない設定を使った確認があると安心です。

OneDrive 実物は未確認とのことなので、マージ前か v2.0.0 を打つ前に確認することをおすすめします。

@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 26s —— View job


レビュー結果

action.yml の最新のコミットを読みました。README と docs は読んでいません。実行もしていません。前回のレビューで挙げた点は反映済みです。

  • rclone をコミットより先に実行しています。送信に失敗すると .seisho が進まないので、次回の実行で再送されます。
  • || true を外しています。
  • rclone は apt で入れています。
  • 設定ファイルは umask 077 で書き、trap で必ず消します。
  • output-dir は検証しています。

ロジックの誤りやセキュリティ上の問題は見つかりませんでした。

要確認 (小さな点)

  1. 並行実行: 2 つのジョブが同時に動くと、両方が .seisho を書き換えます。git pull --rebase がコンフリクトして 3 回とも失敗し、exit 1 で終わります。その時点では rebase の途中のまま止まりますが、ランナーは使い捨てなので実害はほぼありません。呼び出し側で concurrency: を指定するよう README に書いておくとよいです。すでに書いてあれば不要です。
  2. rclone delete --files-from-raw で送り先に無いファイルを指定した場合: 失敗せず無視されるか、確認できていません。PR 本文の実機確認は初回と 2 回目で、2 回目は削除とリネームを含みます。ただし送り先でその挙動を見たかどうかは書かれていません。無視されない場合、送り先から手で消したファイルを .qd の削除で消そうとしたときに、ジョブが毎回失敗します。ローカルの remote で 1 度試せば確かめられます。
  3. rclone-remote 側の空フォルダ: 削除でフォルダが空になっても、送り先には空フォルダが残ります。output-dir 側は find -empty -delete で消しているので、挙動が少し違います。動作に問題はありません。

テスト

このリポジトリは Action 本体と docs だけで、自動テストはありません。PR 本文の実機確認 (初回、2 回目の削除・リネーム・変更、ループしないこと) が実質のテストです。rclone の失敗系 (書き込めない remote で .seisho が進まないこと) は書かれていません。必要なら確認してください。OneDrive の実物は、v2.0.0 を打つ前に確認することをおすすめします。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01USCeESvgLneCai7g8399GM
@5ym
5ym merged commit dc35834 into master Oct 3, 2026
1 check passed
@5ym
5ym deleted the folder-output branch October 3, 2026 12:28
@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 17s —— View job


レビュー結果

action.yml の最新版を読みました。README と docs は読んでいません。実行もしていません。

前回までの指摘は反映されています。

  • rclone の送信をコミットより前に移したので、失敗しても .seisho が進まず、次回に再送されます。
  • || true を外しました。
  • rclone は apt で入れます。
  • 設定ファイルは umask 077 で書き、trap で消します。
  • output-dir は検証します。

新しく指摘する不具合やセキュリティ上の問題は見つかりませんでした。

要確認 (小さな点)

  1. 並行実行: 2 つのジョブが同時に動くと、両方が .seisho を書き換えます。pull --rebase がコンフリクトして 3 回とも失敗します。README に呼び出し側で concurrency: を指定するよう書いてあるか確認してください。
  2. 送り先に無いファイルの rclone delete --files-from-raw: 失敗せず無視されるか、確認できていません。action.yml:167 のコメントは「無視される」前提で書かれています。無視されない場合、.qd を消すたびにジョブが失敗します。ローカルの remote で 1 度試せば確かめられます。
  3. rclone 失敗時の挙動: 書き込めない remote で .seisho が進まないことは、PR 本文の確認項目に入っていません。

テスト

自動テストはありません。このリポジトリは Action 本体と docs だけで、PR 本文の実機確認が実質のテストです。OneDrive の実物は v2.0.0 を打つ前に確認することをおすすめします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant