• トップ
  • ブログ一覧
  • Bitriseのパイプラインと環境変数
  • Bitriseのパイプラインと環境変数

    加納(エンジニア)加納(エンジニア)
    2024.03.11

    IT技術

    Bitriseのパイプラインを利用したジョブ管理が色々と保守に便利だったので、
    感じたメリットと構成を紹介します

    昔はBitriseには無料枠がありませんでしたが、今は料金体系が変わって一ヶ月150分まで無料のHobbyプランが用意されているので、こちらを利用していきます

    パイプラインのメリット

    Bitriseでは、様々な機能がカプセル化されたステップ、ステップの実行を定義するワークフローがありますが、このワークフローを連続で実行できるのがパイプラインです。

    • ワークフローを切り分けることができ、保守性が上がる
    • ワークフローの並列実行が可能
    • 並列実行時、次ステージへの待機中クレジットが消費されない

    以上のメリットを活かして、iOS、Androidの両プラットフォーム向けのアプリをビルドするジョブを構築していきます。

    各環境面ごとにワークフローを作成すると、環境値を何箇所にも分散していることにより変更漏れや間違いが発生したり、一部のステップを修正するために環境分のワークフローを修正する必要が出たりします。
    環境面追加の際にできるだけ変更箇所を少なくでき、またビルドフローに変更があった際も該当ワークフロー変更するだけで済む構築を目指します。
    以下は、上記の構築でPRDビルド用とSTGビルド用のパイプラインを用意したサンプルのbitrise.ymlです。

    1---
    2format_version: '13'
    3default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
    4project_type: flutter
    5# pipelinesで、stagesで定義したステージを指定
    6pipelines:
    7  # PRDビルド用パイプライン
    8  PRD-build:
    9    stages:
    10    - PRD-pre-build: {}
    11    - app-build: {}
    12    - deploy: {}
    13  # STGビルド用パイプライン
    14  STG-build:
    15    stages:
    16    - STG-pre-build: {}
    17    - app-build: {}
    18    - deploy: {}
    19# ステージの定義
    20stages:
    21  # PRDビルド
    22  PRD-pre-build:
    23    workflows:
    24    - PRD-build-setting: {}
    25  # STGビルド
    26  STG-pre-build:
    27    workflows:
    28    - STG-build-setting: {}
    29  app-build:
    30    workflows:
    31    - ios-build: {}
    32    - android-build: {}
    33  deploy:
    34    workflows:
    35    - ios-deploy: {}
    36    - android-deploy: {}
    37# ワークフロー定義(Bitriseのダッシュボード内からでも編集可能)
    38workflows:
    39
    40  # stage:**-pre-buildで環境設定を行うためのワークフロー
    41  PRD-build-setting:
    42    steps:
    43    - script@1:
    44      # Scriptステップで、build_env変数を追加
    45        inputs:
    46        - content: envman add --key build_env --value "PRD"
    47    - share-pipeline-variable@1:
    48    # ここで指定した変数を下流ワークフローに共有するためのステップ
    49    # share-pipeline-variableステップで指定した変数は、アプリ環境変数で上書きされるため、
    50    # build_envという名前のアプリ環境変数を作らないようにする対応が必要
    51        inputs:
    52        - variables: build_env
    53  STG-build-setting:
    54    steps:
    55    - script@1:
    56        inputs:
    57        - content: envman add --key build_env --value "STG"
    58    - share-pipeline-variable@1:
    59        inputs:
    60        - variables: build_env
    61
    62  # リポジトリのclone、アプリのビルドを行う
    63  ios-build:
    64    steps:
    65    - activate-ssh-key@4:
    66        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    67    - git-clone@8: {}
    68    - certificate-and-profile-installer@1: {}
    69    - script@1:
    70        inputs:
    71        # アプリビルド処理(今回はダミーとして.dummy_ipa という名前のbinaryファイルを生成するシェル)
    72        - content: sh mock-build.sh iOS ${build_env}
    73    - deploy-to-bitrise-io@2:
    74    # 今回は単純なbinaryファイルをダミーとして出力しているため、
    75    # deploy-to-bitriseステップで共有ファイルとして指定してBitrise上にデプロイし、
    76    # 次のワークフローでpull-intermediate-filesで引き出してくる形で共有
    77        inputs:
    78        - pipeline_intermediate_files: ${build_env}.dummy_ipa:IPA_PATH
    79  android-build:
    80    steps:
    81    - activate-ssh-key@4:
    82        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    83    - git-clone@8: {}
    84    - certificate-and-profile-installer@1: {}
    85    - script@1:
    86        inputs:
    87        - content: sh mock-build.sh Android ${build_env}
    88    - deploy-to-bitrise-io@2:
    89        inputs:
    90        - pipeline_intermediate_files: ${build_env}.dummy_apk:APK_PATH
    91
    92  # 成果物をデプロイ
    93  ios-deploy:
    94    steps:
    95    # pull-intermediate-filesステップを利用して、デプロイ済みのファイルを作業フォルダに落とす
    96    - pull-intermediate-files@1: {}
    97    - script@1:
    98        inputs:
    99        - content: echo [iOS] ipa file path $IPA_PATH \necho Deploy to URL:https://******/${build_env}
    100  android-deploy:
    101    steps:
    102    - pull-intermediate-files@1: {}
    103    - script@1:
    104        inputs:
    105        - content: echo [iOS] apk file path $APK_PATH \necho Deploy to URL:https://*******/${build_env}
    106  
    107meta:
    108  bitrise.io:
    109    stack: osx-xcode-15.2.x
    110    machine_type_id: g2-m1.4core
    111app:
    112  envs:
    113  - opts:
    114      is_expand: false
    115    BITRISE_FLUTTER_PROJECT_LOCATION: "*"

    環境変数について

    上記の構成では、環境面設定としてBitriseの環境変数を利用しています。
    Bitriseの環境変数はいくつか種類があり、それぞれ処理のタイミングの関係で上書きされたりスコープが違ったりするため、整理しておきます。

    下記はそれぞれの環境変数が、ジョブ中で適用されるタイミングと有効な期間です。
    同じ変数名が存在した場合、後に適用された方に上書きされます。

    カスタム環境変数(Custom Environment Variables)

    ビルドやビルドトリガー設定時、APIでジョブを叩いた際にカスタム環境変数を利用して環境変数を指定できます。ユーザー宣言の環境変数の中では一番最初に適用がされるため、他の環境変数で同名の変数を宣言していた場合、かならず上書きされます。カスタム環境変数の設定はダッシュボードのジョブ一覧でひと目では分からないため、bitriseのダッシュボードをメインにしてアプリビルド管理を行う場合、カスタム環境変数を利用した環境面指定はおすすめできません。

    アプリ環境変数(Env Vars App Environment Variables)

    ダッシュボードのEnv Vars、もしくはBitrise.ymlから指定できます。アプリ全体に適用され、処理としてはワークフローが始まる度に適用されているようです。全てに適用されるためパイプライン利用時も使用しやすいですが、他の環境変数設定を上書きしたり、逆にされたりするので注意が必要です。

    ワークフロー環境変数(Env Vars Workflow Environment Variables)

    ダッシュボードのEnv Vars、もしくはBitrise.ymlから指定できます。該当ワークフローにのみ、アプリ環境変数の後に適用されるため、アプリ環境変数と同名の変数は上書きします。

    envman

    スクリプトステップで利用でき、新しい環境変数の宣言や、カスタム、アプリ、ワークフローなどの環境変数の書き換えができます。書き換えるのはBitriseの設定ではなく、ワークフロー中の定義だけです。envmanで宣言した次のステップから有効になります。

    share-pipeline-variable

    ワークフロー間の環境変数共有のためのステップです。ワークフロー内で定義した変数を後続のワークフローに共有する際に便利ですが、適応されるタイミングはアプリ環境変数の前なので、同名のアプリ環境変数があった場合はすべてアプリ環境変数で上書きされます

    まとめ

    今回はパイプライン構成の説明のため、シンプルにビルドとデプロイを行う構成でしたが、テストや通知などのフローも簡単に増やせるものになっていると思います。
    変数のみでのビルド環境設定を行うのが難しい場合もありますが、今回紹介したbitrise.yamlには後続のワークフローにファイルを共有(deploy-to-bitriseとpull-intermediate-files)するサンプルもありますので、こちらが活用できるかもしれません。
    Bitriseは多くの機能が簡単に利用可能な形で用意されており、拡張性も高くなっているので、ぜひ最強のCI環境を構築してみてください!

    加納(エンジニア)

    加納(エンジニア)

    おすすめ記事