🐈

github actionsのCIでログをコメントに書き出す

2022/01/02に公開

以前から、あえてやる必要もないけど、あれば便利だな〜と思うものとして、CIログのコメント表示がありました。

先日、AWS CDKをCIとして組み込む中で、cdk diffというコマンドで、実際の差分をコメントでも確認したいという箇所が出てきたので一度やってみました。

他にも応用できる範囲は結構ありそうなので、もしよろしければ参考になりますと幸いです。

AWS CDKのdiffを都度コメントで表示させるサンプル(全体)

      - name: 🧑‍🏭 Cdk Diff Check
        id: cdk_diff
        env:
          AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          npm run cdk:diff --ci  &> diff.txt # 
          less diff.txt
      - id: get-comment-body
        run: |
          body="$(cat diff.txt)"
          body="${body//'%'/'%25'}"
          body="${body//$'\n'/'%0A'}"
          body="${body//$'\r'/'%0D'}" 
          echo "::set-output name=body::$body"
      - name: Create comment
        if: steps.fc.outputs.comment-id == ''
        uses: peter-evans/create-or-update-comment@v1
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: | 
            ## 🍰  cdk diff 🍰 
            ```bash
            ${{ steps.get-comment-body.outputs.body }}
            ```
          reactions: rocket

それぞれ解説してみます。

1. コマンドの出力をバックグラウンドでtxtに格納

	任意のコマンド  &> diff.txt
        less diff.txt

実際にコメントに返したいコマンドをバックグラウンドでtxtファイルとして一旦保存をかけています。また、こうすることでgithub actionsのCIログに当該コマンドのログが出力されなくなってしまうので、スクロール可能なlessで出力してしまっています。

2. github actionsのoutputで、複数行が1行で出力されてしまうため対策

      - id: get-comment-body
        run: |
          body="$(cat diff.txt)"
          body="${body//'%'/'%25'}"
          body="${body//$'\n'/'%0A'}"
          body="${body//$'\r'/'%0D'}" 
          echo "::set-output name=body::$body"

先ほど保存していたdiff.txtの改行コードをエスケープさせます。

理由として、これはgithub actionsの仕様のようなのですが、stepから実行した処理の出力をCI上で格納する際に、エスケープなしでは全て1行にまとめられてしまうため、こういった処理が必要になっています。

参考: set-output Truncates Multiline Strings

3. githubの当該PRにコメントをする

色々なやり方があるとは思いますが、イケメンがすでに作ってくれているのでそちらを使ってみます。

peter-evans/create-or-update-comment - github

      - name: Create comment
        if: steps.fc.outputs.comment-id == ''
        uses: peter-evans/create-or-update-comment@v1
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: | 
            ## 🍰  cdk diff 🍰 
            ```bash
            ${{ steps.get-comment-body.outputs.body }}
            ```
          reactions: rocket

基本的にはREADMEにあるようなデフォルトの挙動で組んでいます。CIが走るたびに都度コメントが追加されていきます。

変える必要があるのはここだけですね。

          body: | 
            ## 🍰  cdk diff 🍰 
            ```bash
            ${{ steps.get-comment-body.outputs.body }}
            ```
          reactions: rocket

先ほどset-outputしていたoutputをここで出力します。

github上のコメントは、もちろんgithub flavored markdownで書けるので、お好みでコメント本文を作成することができます。今回はCIログなのでbashでそのまま書き出してしまいます。

reactionsはスタンプをつけたければお好みでどうぞ。

まとめ

先日、AWS CDKを使っているときに、github actionsのCI上でAWSリソースの差分を出すコマンドを打った後のログをそのままコメントできないかなと思いやってみました。

他にもテストレポートをCIからコメントで返すなど、応用できるポイントも多いのかな、と感じています。

また何かあればぜひコメントなどで教えてくださいませ!

Discussion