• 如何使用Github Action插件工具保证代码仓库的质量
  • 发布于 2个月前
  • 202 热度
    0 评论
作为一个程序员如果不会使用的GitHub,我个人觉得就根本不是一个合格的程序员,也是一个lowB程序员,GitHub上不仅仅是一个代码托管平台,GitHub上有很多独创的功能给代码管理提供很多的很棒功能;例如Github Action可以在action里面集成很多第三方的插件工具来对仓库源代码进行一些定制化操作,代码文档覆盖率,测试覆盖率,代码安全漏洞这些都是很不错的功能,本篇文章将介绍如何在Github使用这些功能并且集成到自己的仓库中保证自己的代码仓库的质量。

Action介绍
GitHub Actions 有一些自己的术语:
workflow:工作流程,持续集成的一次运行过程就称作为工作流程,如下第一行的name字段就为工作流的名称;
name: Go

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
然后no字段为触发workflow的条件,通常是某些事件例如代码推送事件和代码拉取请求,并且设置为在某个分支触发此次工作流。

2. jobs字段,指本次工作流需要执行的任务,这些任务可以有多个字任务组成的,每个子任务可以有自己的任务名称或者任务ID,如下:
Jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.16

    - name: Build
      run: go build -v ./...

    - name: Test
      run: go test -v ./...
上面的runs-on字段指定运行所需要的虚拟机环境;with可以指定需要语言版本信息。另外一个这里没有列举的字段needs,needs指定当前任务的依赖关系,即运行顺序,例子如下:
jobs:
  jobA:
  jobB:
    needs: jobA
  jobC:
    needs: [jobA, jobB]
和我们开发项目的库依赖关系一样,有任务的前后顺序,来执行工作流。steps字段可以指定每次Job的运行步骤和一些环境变量信息,并且可以指定运行哪些命令或者做什么动作,如下:
name: Greeting from Mona
on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
    - name: Print a greeting
      env:
        MY_VAR: Hi there! My name is
        FIRST_NAME: Mona
        MIDDLE_NAME: The
        LAST_NAME: Octocat
      run: |
        echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
env字段可以指定环境变量,run字段可以指定需要执行命令或者shell脚本。怎么样看到这里是不是觉得Github Action很强大,这还是基础的功能,我们可以在Github marketplace 里面找到更多的功能插件,来组建一个强大持续集成工作流,下面我会介绍一些我常用的工作流集成相关的软件。

Codecov
第一个要介绍的插件就是Codecov,它是一个代码文档覆盖率和代码功能覆盖率的检测插件,可以在指定的代码仓库里面,计算代码的文档和测试覆盖率。
要想使用的话,只需要在github的action里面创建一个codecov.yml的文件,统一路径是项目根目录下面的.github/workflows/xxx.yml,例如下面是一个标准的配置文件内容:
# 堆代码 duidaima.com
name: Go

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.16

    - name: Build
      run: go build -v ./...

    - name: Test
      run: go test -v ./...
    
    # 统计代码的codecov并且上传到codecov后台服务器
    - name: Codecov
      run: go test  ./... -race -coverprofile=coverage.txt -covermode=atomic -v

    - name: Upload coverage to Codecov
      run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }}   
上面是一个标准的Go项目工作流配置,包含的什么时候触发工作流条件,然后就是需要在什么环境下做一些任务操作例如跑go test,如果需要添加codecov必须在codecov.io上配置连接到GitHub仓库上,然后添加上面yml中的一段codecov相关的分析任务和上传结果任务,如下:
    # 统计代码的codecov并且上传到codecov后台服务器
    - name: Codecov
      run: go test  ./... -race -coverprofile=coverage.txt -covermode=atomic -v

    - name: Upload coverage to Codecov
      run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }}
DeepSource
另外一个常用的工具DeepSource可以支持多种语言的扫描,对其代码仓库进行扫描,然后生成报告,报告里面包含了代码存在的安全缺陷,如果代码的bug比较简单,deepsource还自动发起pr帮忙修复问题,如果不能修复还能给出修复的方案;首先要去DeepSource控制台添加需要绑定的代码仓库地址,然后需要在仓库里面建立一个deepsource .toml配置一下内容即可:
version = 1

[[analyzers]]
name = "test-coverage"
enabled = true

[[analyzers]]
name = "go"
enabled = true

  [analyzers.meta]
  import_root = "github.com/auula/owl"

[[transformers]]
name = "gofmt"
enabled = true

[[transformers]]
name = "gofumpt"
enabled = true
下图就是deepsource项目控制台管理页面截图,个人感觉是我目前使用的功能最完善并且用户体验最棒的一款工具了。

用户评论