Edited at

fastlaneで最新のコミットがマージコミットであるかを判定する

リリース作業の自動化でちょこっと書いたもののメモ

(実際の自動化における利用方法はページの末尾に記載)


最新のコミットがマージコミットであるか判定

# 最新のコミットと最新のマージコミットのハッシュの比較により判定

last_commit_hash = Action.sh("git log -1 --pretty=format:\"%H\"")
last_merge_commit_hash = Action.sh("git log -1 --merges --pretty=format:\"%H\"")

return false if last_commit_hash != last_merge_commit_hash


(Optional)予期せぬブランチからのマージでないかを判定

必須ではないが、予期せぬブランチからのマージでないかも判定したい場合は以下のコードも追加


# 所定のheadブランチ名(正規表現)
branch_regex = ... # "develop" や "release\/\\d+(\\.\\d+){2}" など

if branch_regex.nil? then
return true
else
# 最新のコミットメッセージ。マージコミットであるので以下のような形式(GitHubの場合)
# "Merge pull request #{number} from {repository-name}/{branch-name}"
last_commit_msg = Actions.last_git_commit_message()

# 所定のheadブランチからのマージであるかを判定
return /^Merge.*#{branch_regex}/ === last_commit_msg
end

コミットメッセージからheadブランチ名を判定する…とのざっくりしたやり方だが、さしあたり運用においては支障はないのでこのようにしている


リリース作業自動化における利用

自分のチームでは、以下のような設定でリリース作業を自動化している



  1. masterへのPush時にリリース用処理を行うように設定

  2. リリース用処理の一番最初に、所定のブランチからのマージコミットであるかを判定


    • 自分のチームではGitFlowを採用しているので、release/x.x.xまたはhotfix/x.x.x



  3. 2の判定で問題なければ実際のリリース作業を開始する

GitFlowがきちんと回せていればmasterブランチにPushされるのは所定のブランチからのマージのみになっているはずだが、

リリース作業が予期せぬ経路から実行されないよう安全のためこのようにしている


補足

headブランチの判定まで含めるとそれなりに長くなるので、以下のようなCustom actionを定義し、リリース作業用のlaneから呼び出すようにしている