Azure DevOpsのAzure Pipeline で変数や、環境変数を後続のタスクに渡したいときにどうするか?という問題がある。以前は、強制的にEnvironmentVariablesをセットすると後続のタスクで引き継がれたが、現在は禁止されている。では、現在はどうするか?というと、Ad-hocスクリプトというやり方がある様子。
変数の出力
上記のものに従うと、次のような文字列を標準出力に出すと、AzureDevOpsがスキャンして、後続のタスクで使える変数を作ってくれる。
##vso[task.setvariable variable=foo;isSecret=false;isOutput=true;]value
ここで、isSecret
とisOutput
は省略可能なオプショナルなもので、isSecretをtrueにすると、その後の該当変数の出力が***でマスクされて、isOutputをtrueにした場合は、OutputVariablesを指定する必要がある。
OutputVariables
ここでは、someを設定している。これは後続のタスクに対する変数のネームスペースのようなもので、この指定をすることにより、以降のタスクで、最初に設定した変数に対して、$(some.foo)
もしくは環境変数のSOME_FOO
でアクセスできるようになる。
isOutputの意義
isOutputのオプションはつけなくてもよい。オプションをつけない場合はデフォルトFalseで、後続のタスクは、$(foo)
もしくはFOO
環境変数にアクセスできる。じゃあ、なぜisOutputオプションが必要なのだろうか?
想像でしかないが、変数をアウトプットするほうのタスクのユーザもしくは作者が、OutputVariablesを強制したいときに使うのだと思われる。例えばcondition
といった簡単にかぶるような名前をつけてコードを書きたい場合、そのままの変数名を後続のタスクに渡すのが不安な場合、isOutputを指定することで、コードを変えることなく、ネームスペースの使用を強制したいときに使うのだと思う。