SQ解析が現時点ではあまりpull_request_targetイベントをサポートしておらず、ちょいちょい手間が必要だったのでまとめます。 完全なYAMLのサンプルは↓にあります。
checkout する場合はrefを指定する
pull_request_target
イベントでcheckoutを実行すると標準ではデフォルトブランチをチェックアウトしてしまいます。
よって fetch-depth: 0
に加えて ref
の指定も必要です。以下のようにHEADをチェックアウトするか:
- uses: actions/checkout@v2 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.ref || github.ref }}
以下のようにマージコミットをチェックアウトすることで解決できます*1。
- name: Decide the ref to check out uses: haya14busa/action-cond@v1 id: condval with: cond: ${{ github.event_name == 'pull_request_target' }} if_true: refs/pull/${{ github.event.pull_request.number }}/merge if_false: ${{ github.ref }} - uses: actions/checkout@v2 with: fetch-depth: 0 ref: ${{ steps.condval.outputs.value }}
2021年11月17日更新:前者の方法だとforkからのPRでは動作しないので、後者がおすすめです。
PR解析用のオプションを加える
おそらくScanner側の問題だと思うのですが、Developer Editionの機能のためかコードは見つけられていません。現時点では sonar.pullrequest.key
と sonar.pullrequest.branch
の双方を手動で設定する必要があります*2。
run: | mvn org.jacoco:jacoco-maven-plugin:prepare-agent verify sonar:sonar -B -e -V \ ${PR_NUMBER:+ -Dsonar.pullrequest.key=$PR_NUMBER -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} } env: PR_NUMBER: ${{ github.event.pull_request.number }}
2021年8月30日更新:
上記実装では脆弱性が残ることをazu さんにご指摘いただきました。ありがとうございました! ブランチ名はPR作成者が決定可能なので、一度環境変数で受けてから使用するべきとのことです。
run: | mvn org.jacoco:jacoco-maven-plugin:prepare-agent verify sonar:sonar -B -e -V \ ${PR_NUMBER:+ -Dsonar.pullrequest.key=$PR_NUMBER -Dsonar.pullrequest.branch=${PR_BRANCH} } env: PR_NUMBER: ${{ github.event.pull_request.number }} PR_BRANCH: ${{ github.event.pull_request.head.ref }}
Sonar Scannerの実行にはJava 11が必要
pull_request_target
と直接関係はありませんが、最近更新が入ったようなので念のため。
Sonar Scannerは実行にJava 11以上が必要なので、Java 8のコードを書いている場合でもJDK 11以上でビルドする必要があります。MavenもGradle*3も --release
オプションをサポートしているので、それを使うと良いでしょう。Java 8に無いAPIを見つけてコンパイルエラーにしてくれるので、 --target
よりも安心です。
*1:https://github.com/actions/checkout/issues/518
*2:https://community.sonarsource.com/t/github-comments-stopped-working-in-github-action-after-switch-to-pull-request-target/42556
*3:https://docs.gradle.org/7.2/dsl/org.gradle.api.tasks.compile.CompileOptions.html#org.gradle.api.tasks.compile.CompileOptions:release