表題まま。
覚えた Tips や備忘録のような一言メモ(ツイートみたいなやつ)を Org Mode で書いて、プライベートリポジトリで管理していたりするリポジトリがあります。
.org ファイルに自分用のコマンドをシェルスクリプトで書いてある部分があって、シェルスクリプトの内容を書き換えたら手動でファイル出力して、リポジトリに追加したりしていました。
.org ファイルの中のシェルスクリプトの書き換えで満足してしまって、ファイル出力するのを忘れることがありそうだし、単に面倒くさいということもあって、これを自動化してみた試みについての話です。
README.org
README.org
というファイルにいくつか自分用のシェルコマンドを書いてあります。
一言メモは投稿日時と投稿内容だけが保存されているようなもので、勤務中に org-capture して蓄積した一言メモを、退勤時に一回だけコミットして、GitHub にプッシュしておき、後でスマホから見たり編集したりできるように 1 しているだけなので、いちいちコミットメッセージとかつけるようなものではありません。
なので、退勤時に一発コマンドを叩けば、適当なコミットメッセージで今ある差分すべてをコミットしてプッシュしてくれるようなシェルスクリプトが README.org
に記述されています。
以下のような感じです。
* GitHub に同期するコマンド
日常的には以下のスクリプトで commit & push する。
#+begin_src shell :tangle bin/upload :tangle-mode (identity #o755) :shebang #!/bin/bash
cd $(dirname $(realpath $0))
git commit -am "autocommit: $(TZ=Asia/Tokyo date -Iseconds)"
git push
#+end_src
上記をタングルする(org-babel-tangle
でファイル出力するの意)と、Org Babel のヘッダに記載されているとおり、パーミッション 755 で bin/upload
というファイルが生成されます。
GitHub Actions
上記以外にも README.org
にはファイル出力したいコード片がいくつかあります。コード片を書き換えた時にファイル出力を忘れることを防止したい、そもそも楽したいということで、下記の GitHub Actions で自動化したという話です。
コード片の変更によって出力されるファイル内容が変われば、それが差分となって GitHub アクションが勝手に出力されたファイルをリポジトリに追加してくれるようになります。
name: tangle
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Emacs
uses: purcell/setup-emacs@v3.0
with:
version: 27.1
- name: Tangle
run: emacs -Q --batch --eval "(progn (require 'ob-tangle) (with-current-buffer (find-file-noselect \"./README.org\") (org-babel-tangle)))"
- name: Git Auto Commit
uses: stefanzweifel/git-auto-commit-action@v4.7.2
with:
commit_message: "[自動コミット] GitHub Actions がタングルした"
すでに世に出回っているアクションの組み合わせで事足りました。
Emacs をセットアップしてくれる Set up Emacs アクションを使ったのと、一連のステップでリポジトリに生じた差分を自動コミットしたりできる Git Auto Commit アクションを使わせてもらいました。
自分で書かなきゃいけなかった箇所は実質、Emacs を使って README.org
に記載されているコード片をタングルする所だけですが、これも公式ドキュメントの Batch Execution という項目にやり方が載っていました。
ということでたいした苦労もせずに自動化できてしまい、先人の皆様ありがとうございます という気持ちです。
現場からは以上です。Happy Org Babel !!
-
Termux に GitHub の Git リポジトリをクローンして、Orgzly のローカルリポジトリに割り当ています。 ↩