概要
CI/CD対応でシェルスクリプトを書くことは必然ですよね。
あまり意識していなかった変数のスコープでハマったことと対策についてのまてめです。
問題
タイトルにもある通り、他シェルを呼び出した際に呼び出し元で作った変数は共有されない問題にハマりました。
- main_script.sh
#!/bin/bash -exAPP_NAME='World'echo"Hello ${APP_NAME}!!"
sh ./sub_shell.sh
- sub_script.sh
#!/bin/bash -execho"Hello ${APP_NAME}2!!"
理想は、Hello World2!!
と表示されるはずと思い込んでましたが実際は次の結果です。
$ sh main_shell.sh
Hello World!!
Hello 2!!
対策: main_script.sh
に変数を依存させない
原因は、変数が特定のシェルスクリプト内に依存してしまっている
ため他のシェルに共有できないのです。
CI/CDツールでは、前もってビルドオプションから変数を作ることができるので、Jenkinsであれば設定からビルドのパラメータ化
で対応し、CircleCIであれば設定からEnvironment Variables
に変数を作るなど、ツール内のなんらかの設定関連から変数作りが対応できると思います。
または、exportとsourceでCI/CDが動いているマシンに変数を作って共有する方法もあります。
一見するとこの対応でも良さそうですが、例えばJenkinsの場合、共有PCで起動させている際は全ジョブに対して共有されるので注意が必要です。
CI/CD対応ではなくこの問題を解決する場合は、テキストファイルに環境変数をまとめてそのファイルを各シェル内で読み込んで変数をを利用する方法があります。