作为一个程序员如果不会使用的 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
的条件,通常是某些事件例如代码推送事件和代码拉取请求,并且设置为在某个分支触发此次工作流。
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
,例如下面是一个标准的配置文件内容:
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 项目控制台管理页面截图,个人感觉是我目前使用的功能最完善并且用户体验最棒的一款工具了。