dip Engineer Blog

Engineer Blog
ディップ株式会社のエンジニアによる技術ブログです。
弊社はバイトル・はたらこねっとなど様々なサービスを運営しています。

BitriseでSwiftFormatを動かしたい!

はじめに

こんにちは。iOSエンジニアの@satoshi-babaです。
バイトルではSwiftFormatを使用しているのですが、これを riseで実行するようにしてみたので共有したいと思います。

SwiftFormatをRunScriptから移行したい!

ソースコードをいい感じに整形してくれるSwiftFormatですが、一般的にはRunScriptに設定してビルドに動かしていると思います。
バイトルではビルド時間が長いことを最近問題視していて、SwiftFormatも加担していることがわかりました。

f:id:dip-dev:20220221093536p:plain

少しでもビルド時間が短くなるといいなという気持ちで、SwiftFormatの実行タイミングを変えてみることにしました。

どこに移行する?

移行するといっても選択肢がいくつかあります。

最初に考えたので「GitのCommit時に実行すればいいじゃん」です。
タイミングは適切かなと思ったのですが、部分的にCommitしたい・ステージにしていたものまで修正されてしまう可能性がありました。

少し頑張ればできるかなーと思ったんですけど、そこまでスクリプトを頑張りたくなかったので、他の案を検討したところちょうどいいところにBitriseがありました。
BitriseではPullRequestをトリガーにしていることもあり、簡単に効果が得られそうで上記のような問題もないためBitriseで決定しました。

やってみた

ということでまずはやってみたのがこちら。
Workflowの最初の方にあるGit Clone Repositoryステップで、対象のリポジトリがCloneされているので、SwiftFormatをかけて実行するだけです。

#!/usr/bin/env bash
set -x

# SwiftFormatを実行
"Pods/SwiftFormat/CommandLineTool/swiftformat" . --config ".swiftformat"

# 1件以上ファイルの差分があればCommit&Push
ADD_COUNT=$(git add -n "*.swift" | wc -l)
if [ $ADD_COUNT -gt 0 ] ; then
  git add "*.swift"
  git commit -m "【auto】 Formatted the source code"
  git push origin $BITRISE_GIT_BRANCH
fi

試しにfeature/swift-format_testというブランチを作成して、developに向けてPullRequestを作成してやってみたところ、Pushがうまくいきません。

+ git commit -m '【auto】 Formatted the source code'
[detached HEAD a06733a28] 【auto】 Formatted the source code
 1 file changed, 6 insertions(+), 6 deletions(-)
+ git push origin feature/swift-format_test
error: src refspec feature/swift-format_test does not match any
error: failed to push some refs to 'xxx.git'

作業ブランチが違うのかなと思い確認してみたところ、予想的中でマージ先に向いていました。

+ git branch
* (HEAD detached at xxxxxxxx)
  develop

これはなぜかというと、PullRequestをトリガーとした場合、Git Clone Repositoryステップでマージを試みるからっぽいです。

$ git "checkout" "develop"
$ git "merge" "origin/develop"
$ git "log" "-1" "--format=%H" &> out
$ git "fetch" "--jobs=10" "--no-tags" "origin" "refs/heads/feature/swift-format_test"
$ git "merge" "xxxxxxxxxxxxxxxxxxxxxx"

なので、作業ブランチを変更する処理を追加してあげれば問題なく動かすことができました。

#!/usr/bin/env bash
set -x

# 作業ブランチを変更
git checkout $BITRISE_GIT_BRANCH

# SwiftFormatを実行
"Pods/SwiftFormat/CommandLineTool/swiftformat" . --config ".swiftformat"

# 1件以上ファイルの差分があればCommit&Push
ADD_COUNT=$(git add -n "*.swift" | wc -l)
if [ $ADD_COUNT -gt 0 ] ; then
  git add "*.swift"
  git commit -m "【auto】 Formatted the source code"
  git push origin $BITRISE_GIT_BRANCH
fi

# 念の為、変更前のブランチに戻す。
git checkout $BITRISEIO_GIT_BRANCH_DEST

まとめ

少し引っ掛かるところはありましたが、無事にSwiftFormatをBitriseで実行することができました。
ビルド時間が減ることで開発者のストレスも減ると思うので、積極的にこういった試みはやっていきましょう!

著者

dippeople.dip-net.jp