概要
Bitriseでは、ワークフローのstepの実行条件にrun_if
を使います。
たとえば、こんな感じです。
- slack:
is_always_run: true
run_if: .IsBuildFailed
・・・・・
これは、前のステップが失敗した場合に動作させる方法です。.IsBuildFailed
は、Bitriseで元々定義されています。
で、このrun_if
を使う時にその他の条件を追加しようと思った時にどう書くかという記事です。
ChatGPTに聞いてみたけど、正しい回答が出てこなかったので記事にまとめてみました。
ChatGPTが、正しい回答をしたら、この記事のおかげだと思ってくださいw
正解
正解はこう書きます。
これは、IsBuildFailed
つまり前のステップが失敗した場合、または、環境変数がtrueの場合を意味します。
run_if: |-
{{or (.IsBuildFailed) (getenv "SHOULD_RUN_UT" | eq "true")}}
なんでこう書くの
BitriseはGolangのTemplateを使っています。その書き方です。
{{ }}
や .IsBuildFailed
を見ると まさにその文法です。
GolangのTemplateについては、ネットで検索して貰えれば良いと思います。
使い方の例
PRの変更にKotlinが含まれている場合だけUnitTestを動かしたい場合に使えます。
まずは、PR作成する時にunittestワークフローを動くようにします。
trigger_map:
- pull_request_source_branch: *
workflow: unittest
以下のようにunittest
ワークフロー内のscriptステップでmasterブランチとの差分にjavaやktがあれば、SHOULD_RUN_UTという環境変数にtrueを入れます。
unittest:
steps:
- set-java-version@1: {}
- activate-ssh-key:
run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
- git-clone: {}
- script:
title: Check PR include Java or Kotlin
inputs:
- content: |-
#!/usr/bin/env bash
# fail if any commands fails
set -e
# debug log
set -x
git fetch --jobs=10 --depth=1 --no-tags origin master
while read line; do
if [[ "$line" == *".java"* ]] || [[ "$line" == *".kt"* ]]; then
echo "Java/Kotlinが含まれています"
envman add --key "SHOULD_RUN_UT" --value "true"
exit 0
fi
done < <(git diff --name-only origin/master HEAD)
・・・・
次のステップでは、処理が失敗してる場合やjavaやktファイルがあれば、install-missing-android-tools
ステップを動かし、それ以外はスキップします。こうしておけば、単体テストとは関係ない修正で、余計なunittestのための必要なステップを実行する必要がありません。
前のステップで失敗した場合でもなぜ動くようにしておくかというと、たとえば、ファイルの差分を見るために利用しているgit fetch
とかで落ちてたとしても、単体テスト自体は動かしたいからです。
これをしてないとテストが失敗しているのに、他のところで落ちていることに気づかずに過ごしてしまいます。
- install-missing-android-tools:
is_always_run: true
run_if: |-
{{or (.IsBuildFailed) (getenv "SHOULD_RUN_UT" | eq "true")}}
inputs:
- gradlew_path: "$PROJECT_LOCATION/gradlew"
・・・
他の必要なステップでも同じように書けば良いです。
以下は、まさに単体テストを動かしているステップです。
- script:
is_always_run: true
run_if: |-
{{or (.IsBuildFailed) (getenv "SHOULD_RUN_UT" | eq "true")}}
title: Unit Test
inputs:
- content: |
#!/usr/bin/env bash
# fail if any commands fails
set -e
# debug log
set -x
./gradlew ui:testLocalDebugUnitTestCoverage
./gradlew domain:testLocalDebugUnitTestCoverage
./gradlew infrastructures:testLocalDebugUnitTestCoverage
・・・