LoginSignup
8
1

More than 1 year has passed since last update.

Bitriseの run_if で OR条件やAND条件を書く方法 (PRの変更ファイルで分岐させてステップを動かしたい場合とかで便利)

Posted at

概要

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
  ・・・
8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1