GitHub Actionsで変数展開するところで起こったエラーに対する対処法。
起こった現象
Pythonのプロジェクトでpytestを実行した後、
MishaKav/pytest-coverage-comment
というactionを使ってカバレッジのレポートを作っていました。
このactionは出力にnotSuccessTestInfo
という値を持っていて、ここには
スキップされたテスト項目が入っています。
pytest.mark.parametrize
などを使うと引数部分も入ってそれを囲う記号もはいってきたりすることもありますが、
その際に問題が起きていたようです。
上記のアクションにcoverageComment
というidをつけていたとして、下のactionで
1
2
3
4
5
6
7
8
9
10
11
12
| - name: Check the output coverage
shell: bash
run: |
echo "Coverage Percantage - ${{ steps.coverageComment.outputs.coverage }}"
echo "Coverage Color - ${{ steps.coverageComment.outputs.color }}"
echo "Coverage Warnings - ${{ steps.coverageComment.outputs.warnings }}"
echo "Coverage Errors - ${{ steps.coverageComment.outputs.errors }}"
echo "Coverage Failures - ${{ steps.coverageComment.outputs.failures }}"
echo "Coverage Skipped - ${{ steps.coverageComment.outputs.skipped }}"
echo "Coverage Tests - ${{ steps.coverageComment.outputs.tests }}"
echo "Coverage Time - ${{ steps.coverageComment.outputs.time }}"
echo "Not Success Test Info - ${{ steps.coverageComment.outputs.notSuccessTestInfo }}"
|
のようにして結果を見ていたのですが、
この最後のところで
1
| /home/runner/work/_temp/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.sh: line 10: syntax error near unexpected token `('
|
といった感じのエラーが出るようになったものがありました。
問題点
GitHub Actionsのrunの部分ががシェルスクリプトになって実行されていて、shebang部分が加わるので10行目はnotSuccessTestInfo
のところです。
ここを見ようと思ってもこの行を入れてしまうとエラー終了してしまうので難しいところですが、
おそらくsteps.coverageComment.outputs.notSuccessTestInfo
に(
が入っていて、それをGitHub Action上での二重括弧構文での展開の後
通常のシェルとして処理しようとして問題になっている感じ。
この変数部分が最初から完全に文字列として扱われてくれれば良いのですが、このようにrun
の中で展開しようとするとうまく行かないことがあるみたいです。
回避方法
これを回避するには
env
を使って環境変数として登録しておいてrun
の中から参照するという方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| - name: Check the output coverage
shell: bash
env:
NOT_SUCCESS_TEST_INFO: "${{ steps.coverageComment.outputs.notSuccessTestInfo }}"
run: |
echo "Coverage Percantage - ${{ steps.coverageComment.outputs.coverage }}"
echo "Coverage Color - ${{ steps.coverageComment.outputs.color }}"
echo "Coverage Warnings - ${{ steps.coverageComment.outputs.warnings }}"
echo "Coverage Errors - ${{ steps.coverageComment.outputs.errors }}"
echo "Coverage Failures - ${{ steps.coverageComment.outputs.failures }}"
echo "Coverage Skipped - ${{ steps.coverageComment.outputs.skipped }}"
echo "Coverage Tests - ${{ steps.coverageComment.outputs.tests }}"
echo "Coverage Time - ${{ steps.coverageComment.outputs.time }}"
echo "Not Success Test Info - ${{ steps.coverageComment.outputs.notSuccessTestInfo }}"
echo "Not Success Test Info - $NOT_SUCCESS_TEST_INFO"
|
このようにするとNOT_SUCCESS_TEST_INFO
は最初からただの文字列として扱われるので
echo
を使ってそのまま出力することができます。
こんな感じで記号とかを含むActionの出力やあらかじめ登録しておいたActionのVariableやSecretをrun
で
シェルスクリプト的に使う際には
直接使うとエラーになってしまうことがありますが、
一旦env
を使って環境変数に入れれば使えるようになります。