Bitriseのパイプラインと環境変数
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環境を構築してみてください!
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ