CI の一環として、GitHub のデフォルトブランチに PR を作成した時と、マージをした時に静的解析を行う GitHub Actions を作成します。
※本記事はGitHub Actions で Go のテスト実行の続編です
ファイル構成
.github
├─ actions
│ └─ go-ut
| └─ action.yml
│ └─ static-check
| └─ action.yml
└─ workflows
└─ ci.yml
json
├─ go.mod
├─ go.sum
├─ pretty_print.go
└─ pretty_print_test.go
.gitignore
UT も GitHub Actions から行っているため、静的解析の実行は action.yml に記載しています。
Action
.github/actions/static-check/action.yml
name: Go static check
description: Run go unit test
inputs:
go-directory:
required: true
runs:
using: 'composite'
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: go vet
shell: bash
run: |
echo "### go vet summary" >> $GITHUB_STEP_SUMMARY
go vet >> $GITHUB_STEP_SUMMARY
working-directory: ${{ inputs.go-directory }}
- name: Install staticcheck
shell: bash
run: go install honnef.co/go/tools/cmd/staticcheck@latest
- name: staticcheck
shell: bash
run: |
echo "### staticcheck summary" >> $GITHUB_STEP_SUMMARY
staticcheck >> $GITHUB_STEP_SUMMARY
working-directory: ${{ inputs.go-directory }}
引数には、チェック対象の Go モジュールのディレクトリ(go-directory)を定義しています。
また、解析結果を GitHub Action のサマリーとして出力しています。
静的解析は、vet と staticcheck を実行しています。
Golint は非推奨となり、staticcheck と vet が推奨されています。
https://pkg.go.dev/golang.org/x/lint
Workflow
.github/workflows/ci.yml
name: CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
CI:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Static check
uses: ./.github/actions/static-check
with:
go-directory: ./json
- name: Go UT
uses: ./.github/actions/go-ut
with:
go-directory: ./json
実行結果
main ブランチに PR を作成すると静的解析が実行されます。
静的解析の結果に問題があった場合は、GitHub Action が失敗し、Details から結果を確認することで、問題箇所の特定ができます。
TODO
- Summary を見やすくする