GolangCI Lint

4887 단어 gogo

Background

  • Go는 자체적으로 gofmt, vet 와 같은 정적 분석 도구가 내장되어 있음
  • 하지만 프로젝트가 커질 경우 코드에 대한 합의가 필요함
  • 커밋, 푸시 이전에 CI이외의 방법으로는 필수적으로 정적 분석을 강제하는 수단이 없음
  • golangci-lint가 해결책이 될 수 있음

golangci-lint

  • Linter란 소스코드를 분석하여 프로그램 오류, 버그, 스타일 오류 등에 flag를 달아 놓는 도구
  • golangci-lint는 Linter의 모음집이며 실행시켜주는 도구임

Feature

  • Github Action에서 공직적으로 지원함 (VS code, Vim 등 다양한 integration 지원)
  • 로컬 개발환경에서 정적 분석을 실행하기에 용이함
  • Parallel하게 linter를 실행시키며 Go build 캐시와 캐시 분석 결과를 재사용하여 아주 빠름
  • Yaml 기반 configuration

Usage

Github Action

  • 여러가지 디폴트 Linter들이 설정되어 있어서 추가만 하여도 충분
  • 이슈 발견 시 Github annotation을 생성해주기 때문에 golangci-lint 이슈를 디깅할 필요 없음

  • golangci-lint.yml 예시
# .github/workflow/lint.yml
name: Lint
# This workflow is run on every pull request and push to main
# The `golangci` job will pass without running if no *.{go, mod, sum} files have been modified.
on:
  pull_request:
  push:
    branches:
      - main
      - master
      - "release/*"
jobs:
  golangci:
    name: golangci-lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        with:
          PATTERNS: |
            **/**.go
            go.mod
            go.sum
      - uses: golangci/golangci-lint-action@v3
        with:
          # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
          version: v1.45.2
          args: --timeout 10m
          github-token: ${{ secrets.github_token }}
        if: "env.GIT_DIFF != ''" # Run only when "env.GIT_DIFF" is null

Reference

좋은 웹페이지 즐겨찾기