10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

いまいち分かりづらいBitriseの環境変数周りの仕様を整理する

Posted at

はじめに

最近Bitriseのワークフローをガッツリいじる機会があったのですが、環境変数周りの仕様について勘違いしていたところがあり、結構嵌って時間を取られてしまいました。

ググってもわかりやすい記事が意外と出てこなくて、簡単なワークフローを自分で作っていろいろ試してやっと理解できたので、ユースケースごとに整理してみます。

なお、以下ではSecretsEnv Varsという用語を使い、総称として環境変数と表現します。

Env Varsを上書きしたい

Env VarsSLACK_CHANNELを追加します。

image.png

Slackにメッセージを送信するステップにおいて、$SLACK_CHANNELを指定します。

image.png

ビルド時にCustom Environment Variablesを以下のように指定し、別のチャンネルにメッセージを送信するようにしてみましょう。
ところが、SLACK_CHANNELの値は上書きされず、#default-channelにメッセージが送信されてしまいます。

image.png

実は環境変数には以下の評価順序があり、Custom Environment VariablesのあとにEnv Varsが評価されるので、値を上書きできないのです。

Secrets -> Custom Environment Variables -> Env Vars

Don't use the same key as an App Env Var
App Environment Variables have precedence over custom Environment Variables! This means that if you define a custom Env Var with the same key as an App Env Var, the build will use the value of the App Env Var.

値を上書きするためには、Slackステップの前にScriptステップを配置し、以下のようなスクリプトを入れておきます。

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

if [ ! -z "$CUSTOM_SLACK_CHANNEL" ]; then
  envman add --key SLACK_CHANNEL --value "$CUSTOM_SLACK_CHANNEL"
fi

# もしくはワンライナーで
envman add --key SLACK_CHANNEL --value ${CUSTOM_SLACK_CHANNEL:-$SLACK_CHANNEL}

これでCustom Environment VariablesCUSTOM_SLACK_CHANNELを追加することで、Slackのメッセージの送信先チャンネルを変更することができます。

image.png

Secretsを上書きしたい

環境変数には以下の評価順序があると説明しました。

Secrets -> Custom Environment Variables -> Env Vars

つまり、Secretsはビルド時にCustom Environment Variablesを同名で追加することで上書きが可能です。

SecretsSLACK_CHANNELを追加します。

image.png

Custom Environment VariablesSLACK_CHANNEL#custom-channelを指定します。
これで#custom-channelにメッセージが送信されます。

image.png

Env VarsSecretsで変数展開したい

環境変数の中で別の環境変数を使用したいケースがあります。
そんなときはEnv VarsSecretsどちらでも使える変数展開の機能を使用します。

Env Varsに以下のように環境変数を追加します。
SLACK_CHANNELの値に別の環境変数である$ENV_PRODUCTIONを使用しています。
変数展開して値を#ios-prodとなるようにするには、Replace variables in inputs?のチェックをオンにします。

image.png

Secretsも同様に変数展開可能なんですが、Secretsの場合は環境変数が登録されている順番が重要らしく、以下のようにENV_PRODUCTIONSLACK_CHANNELよりも下にあると参照できないようでした。

image.png

Env VarsSecrets間で変数を参照し合うことはできるのか?

結論は以下の通りです。

  • Env VarsからSecretsの環境変数を参照して展開することはできる
  • SecretsからEnv Varsの環境変数を参照して展開することはできない

前述の評価順序に従えば納得ですね。

Custom Environment Variablesを参照して変数展開することはできるのか?

Env VarsSLACK_CHANNELを以下のように追加しておきます。

image.png

Custom Environment VariablesENV_PRODUCTIONprodを指定します。
こうすると変数展開されて、SLACK_CHANNEL#ios-prodになります。
※下図において、Replace variables in input?のチェックはここではどちらでも関係ありません

image.png

なお、SecretsCustom Environment Variablesを受け取って変数展開することはできませんでした。
これも評価順序を理解していれば想定通りです。

Custom Environment VariablesEnv Varsを参照して変数展開することはできるのか?

Env VarsENV_PRODUCTIONを追加します。

image.png

そしてCustom Environment Variablesで変数展開するように指定してみましたが、これはできませんでした。
値が#ios-になってしまいます。

image.png

Custom Environment Variables同士で参照して変数展開することはできるのか?

Custom Environment Variablesに以下の2つを追加すると、SLACK_CHANNELの値は#ios-prodになります。
変数展開したい方の環境変数ではReplace variables in input?のチェックをオンにします。

image.png

なお、このケースではSLACK_CHANNELを先に追加してしまうとENV_PRODUCTIONを参照できないので、追加順序に気をつけてください。

あとがき

ユニットテストやビルドの作成に限らず、Bitriseを使うと様々なことが自動化できて便利です。
使い込み出すと、環境変数を変えてワークフローの挙動を制御したりしたくなってくるのですが、環境変数がうまく上書きされなかったりして困ることが結構ありました。

特にReplace variables in input?を盛大に勘違いしていて、これのチェックをオンにしてればCustom Environment Variablesで上書きできるんだろうと思っていたのですが、全然違いました。。

調べてみると、割と深く理解してないと環境変数をうまく使いこなせないことがわかり、今回時間をかけて整理をしてみました。
同じように困ってる人の助けになれば幸いです。

10
4
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
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?