rcmdnk's blog

20240202_error_200_200

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を使って環境変数に入れれば使えるようになります。

Sponsored Links
Sponsored Links

« Gitで現在のディレクトリのファイルの状況だけをignoreされてるものなども含めて表示する Poetryを使ったDocker環境構築について »

}