octocov is a tool for collecting code metrics (code coverage, code to test ratio and test execution time).

octocov

build coverage ratio time

octocov is a tool for collecting code metrics (code coverage, code to test ratio and test execution time).

Key features of octocov are:

:octocat: GitHub Actions for octocov is here

Usage

First, run test with coverage report output.

For example, in case of Go language, add -coverprofile=coverage.out option as follows

$ go test ./... -coverprofile=coverage.out

Add .octocov.yml ( or octocov.yml ) file to your repository, and run octocov

$ octocov

Check for acceptable coverage

By setting coverage.acceptable:, the minimum acceptable coverage is specified.

If it is less than that value, the command will exit with exit status 1.

# .octocov.yml
coverage:
  acceptable: 60%
$ octocov
Error: code coverage is 54.9%, which is below the accepted 60.0%

Check for acceptable code to test ratio

By setting codeToTestRatio.acceptable:, the minimum acceptable "Code to Test Ratio" is specified.

If it is less than that value, the command will exit with exit status 1.

# .octocov.yml
codeToTestRatio:
  code:
    - '**/*.go'
    - '!**/*_test.go'
  test:
    - '**/*_test.go'
  acceptable: 1:1.2
$ octocov
Error: code to test ratio is 1:1.1, which is below the accepted 1:1.2

Check for acceptable test execution time

(on GitHub Actions only)

By setting testExecutionTime.acceptable:, the maximum acceptable "Test Execution Time" is specified.

If it is greater than that value, the command will exit with exit status 1.

# .octocov.yml
testExecutionTime:
  acceptable: 1 min
$ octocov
Error: test execution time is 1m15s, which is below the accepted 1m

Generate report badges self.

By setting coverage.badge.path:, generate the coverage report badge self.

# .octocov.yml
coverage:
  badge:
    path: docs/coverage.svg

By setting codeToTestRatio.badge.path:, generate the code-to-test-ratio report badge self.

# .octocov.yml
codeToTestRatio:
  badge:
    path: docs/ratio.svg

By setting testExecutionTime.badge.path:, generate the test-execution-time report badge self (on GitHub Actions only).

# .octocov.yml
testExecutionTime:
  badge:
    path: docs/time.svg

You can display the coverage badge without external communication by setting a link to this badge image in README.md, etc.

# mytool

![coverage](docs/coverage.svg)

coverage

Push report badges self.

By setting push.enable:, git push report badges self.

# .octocov.yml
coverage:
  badge:
    path: docs/coverage.svg
push
  enable: true

Store report to central datastore

By setting datastore:, store the coverage reports to central datastore.

GitHub

# .octocov.yml
datastore:
  github:
    repository: owner/coverages # central datastore repository
    branch: main                # default: main
    path:                       # default: reports/${GITHUB_REPOSITORY}/report.json

If section

# .octocov.yml
datastore:
  if: env.GITHUB_REF == 'refs/heads/main'
  github:
    repository: owner/coverages

The variables available in the if section are as follows

Variable name Type Description
year int Year of current time (UTC)
month int Month of current time (UTC)
day int Day of current time (UTC)
hour int Hour of current time (UTC)
weekday int Weekday of current time (UTC) (Sunday = 0, ...)
github.event_name string Event name of GitHub Actions ( ex. issues, pull_request )
github.event object Detailed data for each event of GitHub Actions (ex. github.event.action, github.event.label.name )
env. string The value of a specific environment variable

S3

🚧

Central mode

By enabling central:, octocov acts as a central repository for collecting reports ( example ).

# .octocov.yml
central:
  enable: true
  root: .          # root directory or index file path of collected coverage reports pages. default: .
  reports: reports # directory where reports are stored. default: reports
  badges: badges   # directory where badges are generated. default: badges
  push:
    enable: true   # enable self git push

When central mode is enabled, other functions are automatically turned off.

Supported coverage report formats

Go coverage

Default path: coverage.out

LCOV

Default path: coverage/lcov.info

Support SF DA only

SimpleCov

Default path: coverage/.resultset.json

Clover

Default path: coverage.xml

Supported code metrics

  • Code Coverage
  • Code to Test Ratio
  • Test Execution Time (on GitHub Actions only)

Install

deb:

Use dpkg-i-from-url

$ export OCTOCOV_VERSION=X.X.X
$ curl -L https://git.io/dpkg-i-from-url | bash -s -- https://github.com/k1LoW/octocov/releases/download/v$OCTOCOV_VERSION/octocov_$OCTOCOV_VERSION-1_amd64.deb

RPM:

$ export OCTOCOV_VERSION=X.X.X
$ yum install https://github.com/k1LoW/octocov/releases/download/v$OCTOCOV_VERSION/octocov_$OCTOCOV_VERSION-1_amd64.rpm

apk:

Use apk-add-from-url

$ export OCTOCOV_VERSION=X.X.X
$ curl -L https://git.io/apk-add-from-url | sh -s -- https://github.com/k1LoW/octocov/releases/download/v$OCTOCOV_VERSION/octocov_$OCTOCOV_VERSION-1_amd64.apk

homebrew tap:

$ brew install k1LoW/tap/octocov

manually:

Download binary from releases page

go get:

$ go get github.com/k1LoW/octocov

docker:

$ docker pull ghcr.io/k1low/octocov:latest
Owner
Comments
  • JaCoCo format support

    JaCoCo format support

    Hello, thank you for creating a great tool! We are considering introducing octocov. I'd like to confirm if JaCoCo will be supported (or how we implement a patch for JaCoCo). This is because we are using JaCoCo for Java workload, and clover and cobertura that are supported by octocov seems not to be actively developed.

  • Support for inserting code metrics report to body of pull request

    Support for inserting code metrics report to body of pull request

    Support for inserting code metrics report to body of pull request.

    Code Metrics Report

    | | main (39c8672) | #172 (c666757) | +/- | |-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------:|------------------------------------------------------------------------------------------------------------------------------------------------:|------:| | Coverage | 65.7% | 64.8% | -1.0% | | Code to Test Ratio | 1:0.4 | 1:0.4 | -0.0 | | Test Execution Time | 33s | 44s | +11s |

    Details
      |                     | main (39c8672) | #172 (c666757) |  +/-  |
      |---------------------|----------------|----------------|-------|
    - | Coverage            |          65.7% |          64.8% | -1.0% |
      |   Files             |             29 |             29 |     0 |
      |   Lines             |           2446 |           2485 |   +39 |
    + |   Covered           |           1608 |           1610 |    +2 |
    - | Code to Test Ratio  |          1:0.4 |          1:0.4 |  -0.0 |
      |   Code              |           6333 |           6445 |  +112 |
      |   Test              |           2840 |           2840 |     0 |
    - | Test Execution Time |            33s |            44s |  +11s |
    

    Code coverage of files in pull request scope (41.1% → 39.2%)

    | Files | Coverage | +/- | |-----------------------------------------------------------------------------------------------------------------------|---------:|------:| | config/config.go | 58.5% | +0.6% | | config/ready.go | 59.9% | -9.6% | | config/yaml.go | 78.6% | +0.4% | | gh/gh.go | 15.5% | -0.8% |


    Reported by octocov

  • SIGSEGV on v0.38.1

    SIGSEGV on v0.38.1

    I got the following error on v0.38.1 via [email protected]. Do you have any idea about the SIGSEGV?

    I confirmed that v0.38.0 doesn't have this issue. ( So now I'm using it for now )

    I've tried to use v0.38.1 binary directly, but got the same error.

    octocov version 0.38.1
    
                           #XXXX (xxxxxxx)  
    ----------------------------------------
      Coverage                       xx.x%  
      Code to Test Ratio             x:x.x  
      Test Execution Time            XmXXs  
    
    fatal error: unexpected signal during runtime execution
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x63 pc=0x7f5988e39360]
    
    runtime stack:
    runtime.throw({0x164bc18, 0x7f5988b4b653})
    	/Users/k1low/sdk/go1.17.7/src/runtime/panic.go:1198 +0x71
    runtime.sigpanic()
    	/Users/k1low/sdk/go1.17.7/src/runtime/signal_unix.go:719 +0x396
    
    goroutine 41 [syscall]:
    runtime.cgocall(0x10f1310, 0xc00006a590)
    	/Users/k1low/sdk/go1.17.7/src/runtime/cgocall.go:156 +0x5c fp=0xc00006a568 sp=0xc00006a530 pc=0x40527c
    net._C2func_getaddrinfo(0xc001349c60, 0x0, 0xc00134daa0, 0xc002476480)
    	_cgo_gotypes.go:91 +0x56 fp=0xc00006a590 sp=0xc00006a568 pc=0x68b116
    net.cgoLookupIPCNAME.func1({0xc001349c60, 0xc00006a738, 0x4479af}, 0x16023b9, 0x3)
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:163 +0x9f fp=0xc00006a5e8 sp=0xc00006a590 pc=0x68ce5f
    net.cgoLookupIPCNAME({0x14e22c8, 0x2}, {0x16023b9, 0xc00006a77c})
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:163 +0x16d fp=0xc00006a738 sp=0xc00006a5e8 pc=0x68c6ad
    net.cgoIPLookup(0x0, {0x14e22c8, 0x0}, {0x16023b9, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:220 +0x3b fp=0xc00006a7a8 sp=0xc00006a738 pc=0x68cf1b
    net.cgoLookupIP·dwrap·25()
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:230 +0x36 fp=0xc00006a7e0 sp=0xc00006a7a8 pc=0x68d396
    runtime.goexit()
    	/Users/k1low/sdk/go1.17.7/src/runtime/asm_amd64.s:1581 +0x1 fp=0xc00006a7e8 sp=0xc00006a7e0 pc=0x4655e1
    created by net.cgoLookupIP
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:230 +0x125
    
    goroutine 1 [chan receive]:
    cloud.google.com/go/compute/metadata.testOnGCE()
    	/Users/k1low/go/pkg/mod/cloud.google.com/go/[email protected]/metadata/metadata.go:153 +0x185
    cloud.google.com/go/compute/metadata.initOnGCE()
    	/Users/k1low/go/pkg/mod/cloud.google.com/go/[email protected]/metadata/metadata.go:114 +0x17
    sync.(*Once).doSlow(0x1aa4340, 0xc0029bd530)
    	/Users/k1low/sdk/go1.17.7/src/internal/poll/fd_poll_runtime.go:89
    internal/poll.(*FD).Read(0xc001b61580, {0xc00289c000, 0xdfa, 0xdfa})
    	/Users/k1low/sdk/go1.17.7/src/internal/poll/fd_unix.go:167 +0x25a
    net.(*netFD).Read(0xc001b61580, {0xc00289c000, 0xc00289c005, 0x56b})
    	/Users/k1low/sdk/go1.17.7/src/net/fd_posix.go:56 +0x29
    net.(*conn).Read(0xc00056e000, {0xc00289c000, 0x6, 0xc0013ed7f8})
    	/Users/k1low/sdk/go1.17.7/src/net/net.go:183 +0x45
    crypto/tls.(*atLeastReader).Read(0xc0028ee090, {0xc00289c000, 0x0, 0x40b90d})
    	/Users/k1low/sdk/go1.17.7/src/crypto/tls/conn.go:777 +0x3d
    bytes.(*Buffer).ReadFrom(0xc0013de978, {0x1aa0b20, 0xc0028ee090})
    	/Users/k1low/sdk/go1.17.7/src/bytes/buffer.go:204 +0x98
    crypto/tls.(*Conn).readFromUntil(0xc0013de700, {0x1aa44c0, 0xc00056e000}, 0x400)
    	/Users/k1low/sdk/go1.17.7/src/crypto/tls/conn.go:799 +0xe5
    crypto/tls.(*Conn).readRecordOrCCS(0xc0013de700, 0x0)
    	/Users/k1low/sdk/go1.17.7/src/crypto/tls/conn.go:606 +0x112
    crypto/tls.(*Conn).readRecord(...)
    	/Users/k1low/sdk/go1.17.7/src/crypto/tls/conn.go:574
    crypto/tls.(*Conn).Read(0xc0013de700, {0xc00289d000, 0x1000, 0x1})
    	/Users/k1low/sdk/go1.17.7/src/crypto/tls/conn.go:1277 +0x16f
    net/http.(*persistConn).Read(0xc0001c3200, {0xc00289d000, 0xc002030060, 0xc0013edd30})
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1926 +0x4e
    bufio.(*Reader).fill(0xc001335b60)
    	/Users/k1low/sdk/go1.17.7/src/bufio/bufio.go:101 +0x103
    bufio.(*Reader).Peek(0xc001335b60, 0x1)
    	/Users/k1low/sdk/go1.17.7/src/bufio/bufio.go:139 +0x5d
    net/http.(*persistConn).readLoop(0xc0001c3200)
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:2087 +0x1ac
    created by net/http.(*Transport).dialConn
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1747 +0x1e05
    
    goroutine 40 [select]:
    net/http.(*persistConn).writeLoop(0xc0001c3200)
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:2386 +0xfb
    created by net/http.(*Transport).dialConn
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1748 +0x1e65
    
    goroutine 23 [select]:
    net/http.(*Transport).getConn(0x2a639a0, 0xc00055e140, {{}, 0x0, {0x15f111b, 0x4}, {0xc000046120, 0x12}, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1372 +0x5d2
    net/http.(*Transport).roundTrip(0x2a639a0, 0xc001b00200)
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:581 +0x774
    net/http.(*Transport).RoundTrip(0xc0013eeb30, 0x1aa4560)
    	/Users/k1low/sdk/go1.17.7/src/net/http/roundtrip.go:18 +0x19
    net/http.send(0xc001b00200, {0x1aa4560, 0x2a639a0}, {0x14af480, 0x7f599243ef01, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/http/client.go:252 +0x5d8
    net/http.(*Client).send(0x289eb20, 0xc001b00200, {0x0, 0xec8e24, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/http/client.go:176 +0x9b
    net/http.(*Client).do(0x289eb20, 0xc001b00200)
    	/Users/k1low/sdk/go1.17.7/src/net/http/client.go:725 +0x908
    net/http.(*Client).Do(...)
    	/Users/k1low/sdk/go1.17.7/src/net/http/client.go:593
    cloud.google.com/go/compute/metadata.testOnGCE.func1()
    	/Users/k1low/go/pkg/mod/cloud.google.com/go/[email protected]/metadata/metadata.go:133 +0x310
    created by cloud.google.com/go/compute/metadata.testOnGCE
    	/Users/k1low/go/pkg/mod/cloud.google.com/go/[email protected]/metadata/metadata.go:130 +0xf5
    
    goroutine 24 [select]:
    net.cgoLookupIP({0x1ac2848, 0xc0023c5540}, {0x14e22c8, 0x0}, {0x16023b9, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:231 +0x1b7
    net.cgoLookupHost({0x1ac2848, 0xc0023c5540}, {0x16023b9, 0x18})
    	/Users/k1low/sdk/go1.17.7/src/net/cgo_unix.go:59 +0x55
    net.(*Resolver).lookupHost(0x2a621e0, {0x1ac2848, 0xc0023c5540}, {0x16023b9, 0x18})
    	/Users/k1low/sdk/go1.17.7/src/net/lookup_unix.go:82 +0xa8
    net.(*Resolver).LookupHost(0x0, {0x1ac2848, 0xc0023c5540}, {0x16023b9, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/lookup.go:187 +0x165
    cloud.google.com/go/compute/metadata.testOnGCE.func2()
    	/Users/k1low/go/pkg/mod/cloud.google.com/go/[email protected]/metadata/metadata.go:143 +0x45
    created by cloud.google.com/go/compute/metadata.testOnGCE
    	/Users/k1low/go/pkg/mod/cloud.google.com/go/[email protected]/metadata/metadata.go:142 +0x15d
    
    goroutine 13 [runnable]:
    net.setDefaultSockopts(0x8, 0x2, 0x1, 0x0)
    	/Users/k1low/sdk/go1.17.7/src/net/sockopt_linux.go:12 +0x14f
    net.socket({0x1ac28b8, 0xc0013822a0}, {0x14e7c69, 0x3}, 0x2, 0x1, 0x0, 0x18, {0x1acadf8, 0x0}, ...)
    	/Users/k1low/sdk/go1.17.7/src/net/sock_posix.go:24 +0x99
    net.internetSocket({0x1ac28b8, 0xc0013822a0}, {0x14e7c69, 0x3}, {0x1acadf8, 0x0}, {0x1acadf8, 0xc00287c150}, 0xc00138a000, 0x0, ...)
    	/Users/k1low/sdk/go1.17.7/src/net/ipsock_posix.go:142 +0xf8
    net.(*sysDialer).doDialTCP(0xc001b60000, {0x1ac28b8, 0xc0013822a0}, 0x0, 0x12fa6e0)
    	/Users/k1low/sdk/go1.17.7/src/net/tcpsock_posix.go:66 +0xa5
    net.(*sysDialer).dialTCP(0xc0013822a0, {0x1ac28b8, 0xc0013822a0}, 0x4bd566, 0x2000)
    	/Users/k1low/sdk/go1.17.7/src/net/tcpsock_posix.go:62 +0x59
    net.(*sysDialer).dialSingle(0xc001b60000, {0x1ac28b8, 0xc0013822a0}, {0x1ab6478, 0xc00287c150})
    	/Users/k1low/sdk/go1.17.7/src/net/dial.go:583 +0x28b
    net.(*sysDialer).dialSerial(0xc001b60000, {0x1ac28b8, 0xc0013822a0}, {0xc00287a090, 0x1, 0x14ede87})
    	/Users/k1low/sdk/go1.17.7/src/net/dial.go:551 +0x312
    net.(*Dialer).DialContext(0xc00127c9c0, {0x1ac2880, 0xc0001aa000}, {0x14e7c69, 0x7f59897e7f20}, {0xc000046120, 0x118})
    	/Users/k1low/sdk/go1.17.7/src/net/dial.go:428 +0x736
    net.(*Dialer).Dial(...)
    	/Users/k1low/sdk/go1.17.7/src/net/dial.go:351
    net/http.(*Transport).dial(0xc00287e000, {0x1ac2848, 0xc0023c5540}, {0x14e7c69, 0x3000106}, {0xc000046120, 0xffffffffffffffff})
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1169 +0x5a
    net/http.(*Transport).dialConn(0x2a639a0, {0x1ac2848, 0xc0023c5540}, {{}, 0x0, {0x15f111b, 0x4}, {0xc000046120, 0x12}, 0x0})
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1604 +0x845
    net/http.(*Transport).dialConnFor(0x0, 0xc001380000)
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1446 +0xb0
    created by net/http.(*Transport).queueForDial
    	/Users/k1low/sdk/go1.17.7/src/net/http/transport.go:1415 +0x3d7
    
  • "Error: env ACTIONS_RUNTIME_URL is only available from the context of an action" occurred on GHES

    We using octocov on GHES and self hosted runner (macOS).

    This error occurs is in the report upload.

    Storing report...
    Error: env ACTIONS_RUNTIME_URL is only available from the context of an action
    Error: Process completed with exit code 1.
    

    Can we give or substitute the ACTIONS_RUNTIME_URL in our environment?

    workflow:

    run: |
      gh release download --repo github.com/k1LoW/octocov --pattern "*darwin_amd64.zip"
      unzip -d octocov octocov*.zip
      ./octocov/octocov
    

    Environment variable being set:

    • GITHUB_API_URL
    • GITHUB_TOKEN

    .octocov:

    report:
      if: is_default_branch
      datastores:
        - artifact://${GITHUB_REPOSITORY}
    
  • octocov-action with v0.41.0 fails

    octocov-action with v0.41.0 fails

    Thank you for the very useful tool! Our org stated to use this in many projects.

    I found the CI stared to fail as soon as the new version released with the same CI and the same test code. I hope the following stack trace will help. I also investigate the cause.

    Before

    octocov version 0.40.1
    
                           feature/xxx-branch
                                      (xxxxxxxx)              
    ---------------------------------------------------------
      Coverage                                        32.7%  
      Code to Test Ratio                              1:0.5  
      Test Execution Time                             1m22s  
    
    Commenting report...
    Skip storing the report: the condition in the `if` section is not met (is_default_branch)
    Skip pushing generate files: push: is not set
    

    After

    octocov version 0.41.0
    
                           feature/xxx-branch
                                      (xxxxxxxx)              
    ---------------------------------------------------------
      Coverage                                        32.7%  
      Code to Test Ratio                              1:0.5  
      Test Execution Time                             1m36s  
    
    fatal error: unexpected signal during runtime execution
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x63 pc=0x7f5cac004360]
    
    runtime stack:
    runtime.throw({0x17bde[16](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:17)?, 0x7f5ca4b94623?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/panic.go:992 +0x71
    runtime.sigpanic()
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/signal_unix.go:802 +0x389
    
    goroutine 52 [syscall]:
    runtime.cgocall(0x120bb10, 0xc000c6ed98)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/cgocall.go:157 +0x5c fp=0xc000c6ed70 sp=0xc000c6ed38 pc=0x40571c
    net._C2func_getaddrinfo(0xc0021555d0, 0x0, 0xc0020f8d80, 0xc000010900)
    	_cgo_gotypes.go:94 +0x56 fp=0xc000c6ed98 sp=0xc000c6ed70 pc=0x6b2c36
    net.cgoLookupIPCNAME.func1({0xc0021555d0, 0x689af2?, 0xc000188980?}, 0xc0018d7c50?, 0x6b919b?)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/cgo_unix.go:160 +0x9f fp=0xc000c6edf0 sp=0xc000c6ed98 pc=0x6b495f
    net.cgoLookupIPCNAME({0x16497a4, 0x3}, {0xc0018d7c50, 0xe})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/cgo_unix.go:160 +0x16d fp=0xc000c6ef38 sp=0xc000c6edf0 pc=0x6b41cd
    net.cgoIPLookup(0x2d09230?, {0x16497a4?, 0xc0018d7c68?}, {0xc0018d7c50?, 0xc000c7d810?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/cgo_unix.go:2[17](https://github.comxxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:18) +0x3b fp=0xc000c6efa8 sp=0xc000c6ef38 pc=0x6b4a1b
    net.cgoLookupIP.func1()
    	/opt/hostedtoolcache/go/1.[18](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:19).5/x64/src/net/cgo_unix.go:227 +0x36 fp=0xc000c6efe0 sp=0xc000c6efa8 pc=0x6b4e56
    runtime.goexit()
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/asm_amd64.s:1571 +0x1 fp=0xc000c6efe8 sp=0xc000c6efe0 pc=0x4658a1
    created by net.cgoLookupIP
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/cgo_unix.go:227 +0x12a
    
    goroutine 1 [select]:
    net/http.(*Transport).getConn(0xc001018500, 0xc0021597c0, {{}, 0x0, {0xc0021323c0, 0x5}, {0xc0018d7c50, 0x12}, 0x0})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1375 +0x5c6
    net/http.(*Transport).roundTrip(0xc001018500, 0xc00162c500)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:581 +0x76f
    net/http.(*Transport).RoundTrip(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/roundtrip.go:17
    github.com/k1LoW/go-github-client/v45/factory.roundTripper.RoundTrip({0xc001018500?, {0xc0012d090d?, 0x2d5a543a0?}}, 0xc00162c500)
    	/home/runner/go/pkg/mod/github.com/k1!lo!w/go-github-client/[email protected]/factory/factory.go:[19](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:20)0 +0x147
    net/http.send(0xc00162c100, {0x1d14f60, 0xc00210b7d0}, {0x160dc[20](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:21)?, 0x487201?, 0x2d0a420?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/client.go:252 +0x5d8
    net/http.(*Client).send(0xc0020f8ae0, 0xc00162c100, {0x730000c00[21](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:22)3[23](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:24)c6?, 0x0?, 0x2d0a420?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/client.go:176 +0x9b
    net/http.(*Client).do(0xc0020f8ae0, 0xc00162c100)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/client.go:725 +0x8f5
    net/http.(*Client).Do(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/client.go:593
    github.com/google/go-github/v45/github.(*Client).BareDo(0xc00009a500, {0x1d1e0c0, 0xc00012e000}, 0xc000c79d00)
    	/home/runner/go/pkg/mod/github.com/google/go-github/[email protected]/github/github.go:643 +0x2bf
    github.com/google/go-github/v45/github.(*Client).Do(0xc00009a500?, {0x1d1e0c0?, 0xc00012e000?}, 0xc002132380?, {0x135c2c0?, 0xc00210b830})
    	/home/runner/go/pkg/mod/github.com/google/go-github/[email protected]/github/github.go:707 +0x79
    github.com/google/go-github/v45/github.(*PullRequestsService).List(0xc00009a678, {0x1d1e0c0, 0xc00012e000}, {0xc00004a1f2?, 0x0?}, {0xc00004a1fb, 0x7}, 0xc0019fcc60?)
    	/home/runner/go/pkg/mod/github.com/google/go-github/[email protected]/github/pulls.go:160 +0x158
    github.com/k1LoW/octocov/gh.(*Gh).DetectCurrentPullRequestNumber(0xc001a0caa0, {0x1d1e0c0, 0xc00012e000}, {0xc00004a1f2, 0x8}, {0xc00004a1fb, 0x7})
    	/home/runner/work/octocov/octocov/gh/gh.go:[24](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:25)7 +0x172
    github.com/k1LoW/octocov/config.(*Config).CommentConfigReady(0xc001517b00)
    	/home/runner/work/octocov/octocov/config/ready.go:77 +0xd4
    github.com/k1LoW/octocov/cmd.glob..func7(0x2b11940?, {0x2d411f8?, 0x0?, 0x0?})
    	/home/runner/work/octocov/octocov/cmd/root.go:332 +0xfd0
    github.com/spf13/cobra.(*Command).execute(0x2b11940, {0xc0001021e0, 0x0, 0x0})
    	/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:872 +0x694
    github.com/spf13/cobra.(*Command).ExecuteC(0x2b11940)
    	/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:990 +0x3b4
    github.com/spf13/cobra.(*Command).Execute(...)
    	/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:918
    github.com/k1LoW/octocov/cmd.Execute()
    	/home/runner/work/octocov/octocov/cmd/root.go:500 +0xdb
    main.main()
    	/home/runner/work/octocov/octocov/main.go:48 +0x33
    
    goroutine 4 [select]:
    go.opencensus.io/stats/view.(*worker).start(0xc0001a7c00)
    	/home/runner/go/pkg/mod/[email protected]/stats/view/worker.go:276 +0xad
    created by go.opencensus.io/stats/view.init.0
    	/home/runner/go/pkg/mod/[email protected]/stats/view/worker.go:34 +0x8d
    
    goroutine 23 [select]:
    github.com/lestrrat-go/backoff/v2.(*controller).loop(0xc0011c22a0)
    	/home/runner/go/pkg/mod/github.com/lestrrat-go/backoff/[email protected]/controller.go:52 +0xbc
    created by github.com/lestrrat-go/backoff/v2.newController
    	/home/runner/go/pkg/mod/github.com/lestrrat-go/backoff/[email protected]/controller.go:46 +0x236
    
    goroutine 9 [select]:
    github.com/lestrrat-go/backoff/v2.(*controller).loop(0xc0019fc480)
    	/home/runner/go/pkg/mod/github.com/lestrrat-go/backoff/[email protected]/controller.go:52 +0xbc
    created by github.com/lestrrat-go/backoff/v2.newController
    	/home/runner/go/pkg/mod/github.com/lestrrat-go/backoff/[email protected]/controller.go:46 +0x236
    
    goroutine 7 [IO wait]:
    internal/poll.runtime_pollWait(0x7f5ca5f1eb18, 0x72)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/netpoll.go:302 +0x89
    internal/poll.(*pollDesc).wait(0xc001750e00?, 0xc001820000?, 0x0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_poll_runtime.go:83 +0x32
    internal/poll.(*pollDesc).waitRead(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_poll_runtime.go:88
    internal/poll.(*FD).Read(0xc001750e00, {0xc001820000, 0xe58, 0xe58})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_unix.go:167 +0x[25](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:26)a
    net.(*netFD).Read(0xc001750e00, {0xc001820000?, 0xc0010366c0?, 0xc001820005?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/fd_posix.go:55 +0x29
    net.(*conn).Read(0xc000010080, {0xc001820000?, 0x58?, 0x7f5cd3d0a108?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/net.go:183 +0x45
    crypto/tls.(*atLeastReader).Read(0xc000c72930, {0xc001820000?, 0x0?, 0x15c95a0?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:785 +0x3d
    bytes.(*Buffer).ReadFrom(0xc0012f4cf8, {0x1d108e0, 0xc000c72930})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bytes/buffer.go:204 +0x98
    crypto/tls.(*Conn).readFromUntil(0xc0012f4a80, {0x1d13d80?, 0xc000010080}, 0x72?)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:807 +0xe5
    crypto/tls.(*Conn).readRecordOrCCS(0xc0012f4a80, 0x0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:614 +0x116
    crypto/tls.(*Conn).readRecord(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:582
    crypto/tls.(*Conn).Read(0xc0012f4a80, {0xc001821000, 0x1000, 0x0?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:1[28](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:29)5 +0x16f
    net/http.(*persistConn).Read(0xc00110c7e0, {0xc001821000?, 0xc0015ff380?, 0xc00007bd30?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:19[29](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:30) +0x4e
    bufio.(*Reader).fill(0xc0019fc240)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bufio/bufio.go:106 +0x103
    bufio.(*Reader).Peek(0xc0019fc240, 0x1)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bufio/bufio.go:144 +0x5d
    net/http.(*persistConn).readLoop(0xc00110c7e0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:2093 +0x1ac
    created by net/http.(*Transport).dialConn
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1750 +0x173e
    
    goroutine 8 [select]:
    net/http.(*persistConn).writeLoop(0xc00110c7e0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:2392 +0xf5
    created by net/http.(*Transport).dialConn
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1751 +0x1791
    
    goroutine 36 [IO wait]:
    internal/poll.runtime_pollWait(0x7f5ca5f1ea28, 0x72)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/netpoll.go:[30](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:31)2 +0x89
    internal/poll.(*pollDesc).wait(0xc001750f80?, 0xc001a90000?, 0x0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_poll_runtime.go:83 +0x32
    internal/poll.(*pollDesc).waitRead(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_poll_runtime.go:88
    internal/poll.(*FD).Read(0xc001750f80, {0xc001a90000, 0xe58, 0xe58})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_unix.go:167 +0x25a
    net.(*netFD).Read(0xc001750f80, {0xc001a90000?, 0xc0017455e0?, 0xc001a90005?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/fd_posix.go:55 +0x29
    net.(*conn).Read(0xc000123a48, {0xc001a90000?, 0x58?, 0x7f5cd3d0a5b8?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/net.go:183 +0x45
    crypto/tls.(*atLeastReader).Read(0xc0019c9ad0, {0xc001a90000?, 0x0?, 0x15c95a0?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:785 +0x3d
    bytes.(*Buffer).ReadFrom(0xc0010c05f8, {0x1d108e0, 0xc0019c9ad0})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bytes/buffer.go:204 +0x98
    crypto/tls.(*Conn).readFromUntil(0xc0010c0380, {0x1d13d80?, 0xc000123a48}, 0x2?)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:807 +0xe5
    crypto/tls.(*Conn).readRecordOrCCS(0xc0010c0380, 0x0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:614 +0x116
    crypto/tls.(*Conn).readRecord(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:582
    crypto/tls.(*Conn).Read(0xc0010c0380, {0xc001a91000, 0x1000, 0x0?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:1285 +0x16f
    net/http.(*persistConn).Read(0xc00110c900, {0xc001a91000?, 0x448680?, 0xc000076ec8?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1929 +0x4e
    bufio.(*Reader).fill(0xc001a8d200)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bufio/bufio.go:106 +0x103
    bufio.(*Reader).Peek(0xc001a8d200, 0x1)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bufio/bufio.go:144 +0x5d
    net/http.(*persistConn).readLoop(0xc00110c900)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:2093 +0x1ac
    created by net/http.(*Transport).dialConn
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1750 +0x173e
    
    goroutine 37 [select]:
    net/http.(*persistConn).writeLoop(0xc00110c900)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:2392 +0xf5
    created by net/http.(*Transport).dialConn
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1751 +0x1791
    
    goroutine 40 [IO wait]:
    internal/poll.runtime_pollWait(0x7f5ca5f1e938, 0x72)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/runtime/netpoll.go:302 +0x89
    internal/poll.(*pollDesc).wait(0xc000188a00?, 0xc001aca000?, 0x0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_poll_runtime.go:83 +0x32
    internal/poll.(*pollDesc).waitRead(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_poll_runtime.go:88
    internal/poll.(*FD).Read(0xc000188a00, {0xc001aca000, 0x4432, 0x4432})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/poll/fd_unix.go:167 +0x25a
    net.(*netFD).Read(0xc000188a00, {0xc001aca000?, 0xc001745860?, 0xc001acb34f?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/fd_posix.go:55 +0x29
    net.(*conn).Read(0xc000123a70, {0xc001aca000?, 0x7fffe3007fffe2?, 0x1fffdc007fffe4?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/net.go:183 +0x45
    crypto/tls.(*atLeastReader).Read(0xc000c73350, {0xc001aca000?, 0x0?, 0x34?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:785 +0x3d
    bytes.(*Buffer).ReadFrom(0xc0010c1078, {0x1d108e0, 0xc000c73350})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bytes/buffer.go:204 +0x98
    crypto/tls.(*Conn).readFromUntil(0xc0010c0e00, {0x1d13d80?, 0xc000123a70}, 0x30f0?)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:807 +0xe5
    crypto/tls.(*Conn).readRecordOrCCS(0xc0010c0e00, 0x0)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:614 +0x116
    crypto/tls.(*Conn).readRecord(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:582
    crypto/tls.(*Conn).Read(0xc0010c0e00, {0xc001ab7000, 0x1000, 0x74c6e0?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/crypto/tls/conn.go:1285 +0x16f
    bufio.(*Reader).Read(0xc001ab4120, {0xc001a9e3c0, 0x9, 0x75aaa2?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/bufio/bufio.go:236 +0x1b4
    io.ReadAtLeast({0x1d0f9a0, 0xc001ab4120}, {0xc001a9e3c0, 0x9, 0x9}, 0x9)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/io/io.go:3[31](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:32) +0x9a
    io.ReadFull(...)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/io/io.go:350
    net/http.http2readFrameHeader({0xc001a9e3c0?, 0x9?, 0xc0011fd920?}, {0x1d0f9a0?, 0xc001ab4120?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/h2_bundle.go:1566 +0x6e
    net/http.(*http2Framer).ReadFrame(0xc001a9e380)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/h2_bundle.go:1830 +0x95
    net/http.(*http2clientConnReadLoop).run(0xc0011dbf98)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/h2_bundle.go:8815 +0x130
    net/http.(*http2ClientConn).readLoop(0xc0011fe300)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/h2_bundle.go:8711 +0x6f
    created by net/http.(*http2Transport).newClientConn
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/h2_bundle.go:7439 +0xa65
    
    goroutine 16 [select]:
    net/http.setRequestCancel.func4()
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/client.go:398 +0x8b
    created by net/http.setRequestCancel
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/client.go:397 +0x439
    
    goroutine 50 [select]:
    net.(*Resolver).lookupIPAddr(0x2d09220, {0x1d1e0f8?, 0xc0019fcfc0}, {0x16497a4, 0x3}, {0xc0018d7c50, 0xe})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/lookup.go:[32](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:33)5 +0x51b
    net.(*Resolver).internetAddrList(0x1d1e0f8?, {0x1d1e0f8?, 0xc0019fcfc0?}, {0x16497a4, 0x3}, {0xc0018d7c50?, 0x12?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/ipsock.go:288 +0x67a
    net.(*Resolver).resolveAddrList(0x2d411f8?, {0x1d1e0f8, 0xc0019fcfc0}, {0x164fbb1, 0x4}, {0x16497a4?, 0x0?}, {0xc0018d7c50, 0x12}, {0x0, ...})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/dial.go:221 +0x41b
    net.(*Dialer).DialContext(0xc0019fcc00, {0x1d1e0c0, 0xc00012e000}, {0x16497a4, 0x3}, {0xc0018d7c50, 0x12})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/dial.go:406 +0x448
    net.(*Dialer).Dial(0x7f5ca4ee2418?, {0x16497a4?, 0x5cd3d0a108?}, {0xc0018d7c50?, 0x118?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/dial.go:[35](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:36)1 +0x45
    net/http.(*Transport).dial(0x0?, {0x1d1e0f8?, 0xc0019fcd20?}, {0x16497a4?, 0x2?}, {0xc0018d7c50?, 0x0?})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1172 +0x5a
    net/http.(*Transport).dialConn(0xc001018500, {0x1d1e0f8, 0xc0019fcd20}, {{}, 0x0, {0xc0021323c0, 0x5}, {0xc0018d7c50, 0x12}, 0x0})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1607 +0x83f
    net/http.(*Transport).dialConnFor(0xc0019899[40](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:41)?, 0xc000c7d810)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1449 +0xb0
    created by net/http.(*Transport).queueForDial
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/http/transport.go:1[41](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:42)8 +0x3d2
    
    goroutine 51 [select]:
    net.cgoLookupIP({0x1d1e088, 0xc002159800}, {0x16497a4, 0x3}, {0xc0018d7c50, 0xe})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/cgo_unix.go:228 +0x1aa
    net.(*Resolver).lookupIP(0x2d09220, {0x1d1e088, 0xc002159800}, {0x16497a4, 0x3}, {0xc0018d7c50, 0xe})
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/lookup_unix.go:96 +0x128
    net.glob..func1({0x1d1e088?, 0xc002159800?}, 0x0?, {0x16497a4?, 0x2d0a[42](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:43)0?}, {0xc0018d7c[50](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:51)?, 0x77[59](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:60)70?})
    	/opt/hostedtoolcache/go/1.18.5/x[64](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:65)/src/net/hook.go:23 +0x3d
    net.(*Resolver).lookupIPAddr.func1()
    	/opt/hostedtoolcache/go/1.18.5/x64/src/net/lookup.go:319 +0x9f
    internal/singleflight.(*Group).doCall(0x2d09230, 0xc002104c30, {0xc0018d7c[68](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:69), 0x12}, 0xc000c7d[81](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:82)0?)
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/singleflight/singleflight.go:95 +0x3b
    created by internal/singleflight.(*Group).DoChan
    	/opt/hostedtoolcache/go/1.18.5/x64/src/internal/singleflight/singleflight.go:[88](https://github.com/xxxxxxxxxx/runs/8129049326?check_suite_focus=true#step:11:89) +0x2ec
    

    Other configs

    test.yml

    ...
          - name: Run tests
            shell: bash
            run: |
              go test --tags github_test ./pkg/... -coverprofile=coverage.out
          - name: Show coverage
            uses: k1LoW/octocov-action@v0
    
    

    .octocov.yml

    coverage:
      if: true
    codeToTestRatio:
      code:
        - '**/*.go'
        - '!**/*_test.go'
      test:
        - '**/*_test.go'
    testExecutionTime:
      if: true
    diff:
      datastores:
        - artifact://${GITHUB_REPOSITORY}
    comment:
      if: is_pull_request
    report:
      if: is_default_branch
      datastores:
        - artifact://${GITHUB_REPOSITORY}
    
    
  • Make pull request comment better for monorepo

    Make pull request comment better for monorepo

    We use the octocov in our monorepo which has multiple language directories, like this:

    repo
    ├── .octocov.go.yaml
    ├── .octocov.java.yaml
    ├── .octocov.python.yaml
    ├── go
    ├── java
    └── python
    

    We test, generate coverage file, and run octocov individually with the separated config files and GitHub actions workflows.

    Sometimes we need to run those workflows at the same time (e.g. build whole repository), then comments on pull request look like this:

    Screen_Shot_2022-04-14_at_15_37_22

    As you can see, there are 3 different reports, but it's hard to know which report is for which. Also comments got hidden (minimized) except for the last one even they are different reports.


    So it would be great if:

    • each report can have comment header (title), like
      • Code Metrics Report (go)
      • Code Metrics Report (java)
      • Code Metrics Report (python)
    • they will not hidden by other reports.

    What do you think?

  • Release for v0.42.2

    Release for v0.42.2

    This pull request is for the next release as v0.42.2 created by tagpr. Merging it will tag v0.42.2 to the merge commit and create a GitHub release.

    You can modify this branch "tagpr-from-v0.42.1" directly before merging if you want to change the next version number or other files for the release.

    How to change the next version as you like

    There are two ways to do it.

    • Version file
      • Edit and commit the version file specified in the .tagpr configuration file to describe the next version
      • If you want to use another version file, edit the configuration file.
    • Labels convention
      • Add labels to this pull request like "tagpr:minor" or "tagpr:major"
      • If no conventional labels are added, the patch version is incremented as is.

    What's Changed

    • Use tagpr by @k1LoW in https://github.com/k1LoW/octocov/pull/173
    • Support for inserting code metrics report to body of pull request by @k1LoW in https://github.com/k1LoW/octocov/pull/172

    Full Changelog: https://github.com/k1LoW/octocov/compare/v0.42.1...v0.42.2

  • `datastores` example in README is incorrect

    `datastores` example in README is incorrect

    • local://.reports ... /path/to/reports directory

    from https://github.com/k1LoW/octocov/blob/767b059c1eca8c76853062211ac311b92e19a695/README.md?plain=1#L705

    This example says .reports may be treated as the relative path from .octocov.yml but actually it is not.

    Is it typo (local://./reports) ?

  • Allow the link to the file in the comments to be changed to an HTML file to check the line of coverage

    Allow the link to the file in the comments to be changed to an HTML file to check the line of coverage

    Proposal

    Some coverage tools output reports in html to check coverage lines.

    I want to change the file link destination for the code coverage of the files in the scope of the pull request.

    Issue

    • github actions by itself cannot host the html of the coverage report, so we need to put the html on an external server. Need to change the link to an external server
    • Some HTML in the coverage report does not allow assembling URLs that refer to the coverage in question from the path of the change file It may be necessary to generate URLs from the path of changed files only for reports that can be handled.
A tool to convert go test results to testng reports xml.

go-testng-report A tool to convert go test results to testng reports xml. Usage of testng-report: -json-report string Golang json test report (defa

Dec 8, 2021
A Golang tool that does static analysis, unit testing, code review and generate code quality report.
A Golang tool that does static analysis, unit testing, code review and generate code quality report.

goreporter A Golang tool that does static analysis, unit testing, code review and generate code quality report. This is a tool that concurrently runs

Jan 8, 2023
🐶 Automated code review tool integrated with any code analysis tools regardless of programming language
🐶 Automated code review tool integrated with any code analysis tools regardless of programming language

reviewdog - A code review dog who keeps your codebase healthy. reviewdog provides a way to post review comments to code hosting service, such as GitHu

Jan 2, 2023
🐶 Automated code review tool integrated with any code analysis tools regardless of programming language
🐶 Automated code review tool integrated with any code analysis tools regardless of programming language

reviewdog - A code review dog who keeps your codebase healthy. reviewdog provides a way to post review comments to code hosting service, such as GitHu

Jan 7, 2023
Visualise Go program GC trace data in real time

This project is no longer maintained I'm sorry but I do not have the bandwidth to maintain this tool. Please do not send issues or PRs. Thank you. gcv

Dec 14, 2022
Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go
Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go

Sloc Cloc and Code (scc) A tool similar to cloc, sloccount and tokei. For counting physical the lines of code, blank lines, comment lines, and physica

Jan 4, 2023
depth is tool to retrieve and visualize Go source code dependency trees.

depth is tool to retrieve and visualize Go source code dependency trees. Install Download the appropriate binary for your platform from the Rele

Dec 30, 2022
Tool to populate your code with traceable and secure error codes

Essential part of any project, especially customer facing is proper and secure error handling. When error happens and customer reports it, it would be nice to know the context of the error and where it exactly occured.

Sep 28, 2022
Refactoring and code transformation tool for Go.

gopatch is a tool to match and transform Go code. It is meant to aid in refactoring and restyling.

Dec 30, 2022
a tool for code clone detection

dupl dupl is a tool written in Go for finding code clones. So far it can find clones only in the Go source files. The method uses suffix tree for seri

Dec 12, 2022
a simple golang SSA viewer tool use for code analysis or make a linter
a simple golang SSA viewer tool use for code analysis or make a linter

ssaviewer A simple golang SSA viewer tool use for code analysis or make a linter ssa.html generate code modify from src/cmd/compile/internal/ssa/html.

May 17, 2022
The most opinionated Go source code linter for code audit.
The most opinionated Go source code linter for code audit.

go-critic Highly extensible Go source code linter providing checks currently missing from other linters. There is never too much static code analysis.

Jan 6, 2023
A reference for the Go community that covers the fundamentals of writing clean code and discusses concrete refactoring examples specific to Go.

A reference for the Go community that covers the fundamentals of writing clean code and discusses concrete refactoring examples specific to Go.

Jan 1, 2023
Act as part of the business code and will report aqua scan report after application installed
Act as part of the business code and will report aqua scan report after application installed

starboard-report This repo aim to enrich the functionality of starboard. Starboard integrates security tools into the Kubernetes environment, so that

Nov 25, 2021
This static analysis tool works to ensure your program's data flow does not spill beyond its banks.

Go Flow Levee This static analysis tool works to ensure your program's data flow does not spill beyond its banks. An input program's data flow is expl

Dec 1, 2022
Analyzer: zapvet is static analysis tool for zap

zapvet zapvet is static analysis tool for zap. fieldtype: fieldtype finds confliction type of field Install You can get zapvet by go install command (

Sep 18, 2022
Retnilnil is a static analysis tool to detect `return nil, nil`

retnilnil retnilnil is a static analysis tool for Golang that detects return nil, nil in functions with (*T, error) as the return type. func f() (*T,

Jun 9, 2022
A tool to cleanup stale gitlab runners

clinar - A tool to cleanup stale gitlab runners This tool basically get’s all offline runners which a user can administer. If you don’t provide the --

Dec 14, 2022
Languagetool-lint - Lint tool for languagetool

languagetool-lint Lint tool for languagetool. Requirements languagetool. Install

Oct 31, 2022