Lambdaカクテル

京都在住Webエンジニアの日記です

CIとかでファイルが修正されていたらコミットするのをスクリプト化した

CIとかで,gofmt -s -wとかeslint --fixとかをかけて,ファイルが修正されていたらコミットしてあげる,というのはよくやるテクニックだと思う。この動作は頻出だし,業務でも登場したのでシェルスクリプト化した。

./commit-when-modified.sh "brach-name" "commit-message" '*.ts' '*.tsx'のように使う。ファイルグロブを直接受け取るので,ダブルクオートではなくクオートを使っていることに注意。

#!/bin/bash
# $0 'ブランチ名' 'コミットメッセージ' 'コミットするファイルのグロブ' ['コミットするファイルのグロブ' ...]

set -ex

BRANCH_NAME=$1
shift
COMMIT_MSG=$1
shift
COMMIT_MSG=${COMMIT_MSG-Automated commit}

RESULT=$(git ls-files -m $@)

if [ -n "$RESULT" ] ; then # true when not empty
  git add $RESULT
  git switch -c $BRANCH_NAME
  git commit -m "${COMMIT_MSG}"
  git push origin $BRANCH_NAME
fi

あとはCI側でgit config --global user.{name|email}したり,remote.origin.urlをセットしてやればコミットとpushできる。remote.origin.urlにはhttpsのURLを指定してやって,https://x-access-token:パーソナルアクセストークン@github.com/リポジトリという風にしておくと簡単。Github ActionsのWorkflowだと自動でトークンを配ってくれるのでマニュアルを読むと良い。