GitHub Actions에서 PR에 동일한 종류의 주석을 Upsert로 추가하는 방법

GitHub Actions의 Pull Request(이하 PR) 이벤트 트리거의 워크플로우에 있어서, 대상 코드의 Lint나 보안 스캔, terraform plan이나 CloudFormation Change Set등의 결과를 PR의 코멘트에 표시되면 뭔가와 기쁘지요? 본 기사에서는, 이 PR 코멘트를, Insert가 아닌 Upsert(없으면 Insert, 있으면 Update)로 투고하는 방법을 소개한다.

만약, 코멘트 내용을 의식하지 않고 PR synchronize 이벤트 등 트리거로 워크플로우가 달릴 때마다 코멘트를 투고하는 것과 같은 유사한 코멘트가 몇개나 투고되어 버려 PR을 더럽혀 버리게 되는 것이 상상할 수 있을까 생각한다. 에서 이것을 Insert가 아니라 Upsert 하려면 GitHub API - Review Comments 로 코멘트 일람을 취득해, 같은 코멘트에 대해서 Update 하면 된다. 저자도 처음 그걸로 하려고 했다. 그렇지만, GitHub Marketplace를 들여다보면 이미 하고 싶은 것을 실현해 주는 멋진 Action이 발견되었다. 그것이 Sticky Pull Request Comment 그러므로, 이하, 이 Action 을 사용해 PR 코멘트를 Upsert 하는 방법을 간단히 설명한다.

1. 주석 문자열을 직접 전달하는 방법


marocchino/sticky-pull-request-comment@v1 액션의 message input에 캐릭터 라인을 건네준다. 여기에서는 이전의 step로 코멘트 캐릭터 라인을 작성해 set-output 그리고 그 후의 step에 공유하고 있다. 또, header 에 건네주는 캐릭터 라인에 의해 그 코멘트를 식별한다. 같은 header의 코멘트이면, ​​2회째 이후는 Upsert로 갱신된다. 만약 별도의 코멘트로 나누고 싶으면, header의 내용을 바꿀 필요가 있다.
      - name: "Make PR comment body"
        id: make-pr-comment
        run: | 
          now=$(date "+%s")
          pr-comment-body="It's ${now}" 
          echo ::set-output name=result::${pr-comment-body}
      - name: "PR comment on Updating CFn Change Set"
        uses: marocchino/sticky-pull-request-comment@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          header: header-of-comment
          message: ${{ steps.make-pr-comment.outputs.result }}

2. 코멘트 캐릭터 라인을 파일로부터 건네주는 방법



1과 달리 2는 주석 문자열을 파일에서 전달하는 접근법입니다. 크기가 큰 문자열이나, JSON이나 YAML등의 문자열을 Pretty-print, 즉 취득했을 때의 상태를 유지해 성형 표시시키고 싶은 경우에는 파일로부터 건네주는 것이 좋을까 생각한다. marocchino/sticky-pull-request-comment@v1 액션의 path input 에 파일의 패스 건네준다.
다음 샘플은 AWS CloudFormation의 Change Set describe 내용(JSON)을 파일에 떨어뜨리고 다음 단계에서 PR comment로 게시하고 있다.
      - name: "Make PR comment body"
        id: make-pr-comment
        run: |
          pr_comment_body=''
          changeset_output=$(aws cloudformation describe-change-set --change-set-name ${changeset_id})
          pr_comment_body=$(cat << EOF
          ${pr_comment_body}
          <details><summary><code>${changeset_name}</code></summary> 

          \`\`\`json
          ${changeset_output}
          \`\`\`
          </details>
          EOF

          pr_comment_body_file=/tmp/pr_comment_body.txt
          cat << EOF  > ${pr_comment_body_file}
          <strong>CFn Change Set</strong>

          ${pr_comment_body}
          EOF
          echo ::set-output name=result::${pr_comment_body_file}

      - name: "PR comment"
        if: steps.make-pr-comment.outputs.result
        uses: marocchino/sticky-pull-request-comment@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          header: header-of-comment
          path: ${{ steps.make-pr-comment.outputs.result }}

실행 결과 샘플


라고 하는 것으로, 결론은, GitHub API - Review Comments 로 코멘트 일람을 취득해, 같은 코멘트를 찾아 Update해도 되지만, Sticky Pull Request Comment 를 사용하면 편하게에 할 수 있어・・・였습니다.

좋은 웹페이지 즐겨찾기