schubergphilis/mcvs-golang-action
GitHub: schubergphilis/mcvs-golang-action
一个集成安全扫描、代码检查、测试与发布功能的 Golang 项目 CI/CD 标准化工具集,通过 GitHub Action 和 Taskfile 实现本地与云端一致的质量门禁。
Stars: 5 | Forks: 2
# MCVS-golang-action
任务关键型漏洞扫描器(Mission Critical Vulnerability Scanner,简称 MCVS)Golang Action 仓库是一套标准化工具集合,旨在确保包含 Go 代码的项目具备一定的质量水平。
## Github Action
本仓库中的 [GitHub Action](https://github.com/features/actions) 包含以下步骤:
- 安装项目 `go.mod` 中定义的 Golang 版本。
- 验证已下载的 Golang modules。
- 检查错误的导入顺序并提示解决方法。
- 代码安全扫描,并对特定 CVE 进行最长一个月的抑制。在某些情况下,特定的 CVE 可能会在几周内被解决,这允许开发人员以安全的方式继续工作,同时知道如果问题在几周内未解决,流水线将再次失败。
- Linting。
- 单元测试。
- 集成测试。
- 代码覆盖率。
总之,使用此 action 将确保 Golang 代码在部署到生产环境之前满足特定标准,因为如果出现问题,流水线将失败。
注意:有一个 [内部 action](.github/workflows/package-version-updater.yml) 会更新无法由 Dependabot 更新的包版本。
## 版本控制
此 action 遵循语义化版本控制。在工作流中使用此 action 时:
- **最新稳定版本**:在生产工作流中使用最新的 `v3.x.x` 标签(例如 `v3.4.2`)。
- **主版本跟踪**:使用 `@v3` 自动获取最新的 v3.x.x 更新。
- **Taskfile 引用**:在包含远程 Taskfile 时,请使用符合您需求的特定版本标签(例如 `v2.1.0`)。
- **破坏性变更**:主版本号升级(v3 → v4)可能会引入破坏性变更,并需要更新工作流。
请查看 [发布页面](https://github.com/schubergphilis/mcvs-golang-action/releases) 获取最新版本和变更日志。
## Taskfile
另一个工具是 [Task](https://taskfile.dev/) 的配置。本仓库提供了一个 `./build/task.yml`,其中包含标准任务,例如安装和运行 linter。
此 `./build/task.yml` 随后可被其他项目使用。这样的好处是您不需要从一个项目到另一个项目复制和粘贴 Makefile 片段。因此,每个使用此 `./build/task.yml` 的项目都能立即从此处进行的改进(例如新任务或任务改进)中受益。
如果您是 Task 的新手,可能需要查看以下资源:
- [安装说明](https://taskfile.dev/installation/)
- [配置自动补全](https://taskfile.dev/installation/#setup-completions) 的说明
- 与例如 Visual Studio Code、Sublime 和 IntelliJ 的 [集成](https://taskfile.dev/integrations/)。
### 配置
本项目中的 `./build/task.yml` 定义了许多变量。其中一些可以在将此 Taskfile 包含到您的项目中时被覆盖。请参阅下面的示例,其中覆盖了 `CODE_COVERAGE_STRICT` 变量,以了解如何执行此操作。
以下变量可以被覆盖:
| 变量 | 描述 |
| :-------------------------- | :------------------------------------------------------------------------------------------------------- |
| `CODE_COVERAGE_STRICT` | 启用或禁用将最小覆盖率设置为观察到的最大覆盖率的强制执行。 |
| `GOLANGCI_LINT_CONFIG_PATH` | 定义 golangci-lint 配置文件的路径。 |
## 用法
### 本地
创建一个包含以下内容的 `Taskfile.yml`:
```
---
version: 3
vars:
REMOTE_URL: https://raw.githubusercontent.com
REMOTE_URL_REF: v2.1.0
REMOTE_URL_REPO: schubergphilis/mcvs-golang-action
includes:
remote: >-
{{.REMOTE_URL}}/{{.REMOTE_URL_REPO}}/{{.REMOTE_URL_REF}}/build/task.yml
```
并运行:
```
TASK_X_REMOTE_TASKFILES=1 \
task remote:test
```
请注意,只要远程 Taskfiles 仍处于实验阶段,就需要 `TASK_X_REMOTE_TASKFILES` 变量。(有关更多信息,请参阅 [issue 1317](https://github.com/go-task/task/issues/1317)。)
您可以使用 `task --list-all` 获取所有可用任务的列表。
或者,如果您在 shell 中 [配置了自动补全](https://taskfile.dev/installation/#setup-completions),您可以按 Tab 键获取可用任务的列表。
### 自动修复 Linting 问题
当 golangci-lint 报告可以自动修复的问题时,您可以使用 `fix-linting-issues` 任务:
```
TASK_X_REMOTE_TASKFILES=1 \
task remote:fix-linting-issues --yes
```
此任务使用两个工具自动修复常见的 linting 问题:
- **golines**:重新格式化 Go 代码以满足行长度要求(包装长行)。
- **wsl**:修复空格 linting 问题(根据样式规则添加/删除空行)。
运行此任务后,请检查更改并提交它们。请注意,某些 linting 问题可能仍需要手动修复。
如果您想覆盖我们 Taskfile 中的某个变量,您必须像这样调整 `includes` 部分:
```
---
includes:
remote:
taskfile: >-
{{.REMOTE_URL}}/{{.REMOTE_URL_REPO}}/{{.REMOTE_URL_REF}}/build/task.yml
vars:
CODE_COVERAGE_STRICT: "false"
```
注意:`GOLANGCI_LINT_RUN_TIMEOUT_MINUTES` 设置也是如此。
## Build Tags
Build tags(也称为构建约束)允许您根据条件在编译时包含或排除 Go 文件。此 action 支持以下常见的 build tag 模式:
- **`integration`**:用于需要外部服务或数据库的集成测试。
- **`component`**:用于测试多个单元协同工作的组件测试。
- **`e2e`**:用于测试整个应用程序流程的端到端测试。
- **`lambda.norpc`**:用于构建不支持 RPC 的 AWS Lambda 函数。
### 使用 Build Tags
当使用特定的 build tags 运行测试时:
```
# 运行集成测试
task remote:test-integration --yes
# 运行组件测试
task remote:test-component --yes
```
当使用特定的 build tags 进行代码 linting 时,您可能需要多次运行 linter 以覆盖所有代码路径:
```
- testing-type: "lint" # Lint main code
- testing-type: "lint", build-tags: "integration" # Lint integration test code
- testing-type: "lint", build-tags: "component" # Lint component test code
```
这确保具有不同 build tags 的测试文件中的代码得到正确的 linting。
### GitHub
#### 基本示例
对于需要标准测试和 linting 的简单项目,创建一个 `.github/workflows/golang.yml` 文件:
```
---
name: Golang
"on": pull_request
permissions:
contents: read
packages: read
jobs:
MCVS-golang-action:
strategy:
matrix:
args:
- testing-type: "unit"
- testing-type: "lint"
- testing-type: "coverage"
- testing-type: "security-golang-modules"
runs-on: ubuntu-24.04
env:
TASK_X_REMOTE_TASKFILES: 1
steps:
- uses: actions/checkout@v4.1.1
- uses: schubergphilis/mcvs-golang-action@v3
with:
testing-type: ${{ matrix.args.testing-type }}
token: ${{ secrets.GITHUB_TOKEN }}
```
此基本配置将在您的 Go 代码上运行单元测试、linting、代码覆盖率检查和安全扫描。
#### 高级示例
对于具有多种构建配置、集成测试或自定义要求的项目,创建一个包含以下内容的 `.github/workflows/golang.yml` 文件:
```
---
name: Golang
"on": pull_request
permissions:
contents: read
packages: read
jobs:
MCVS-golang-action:
strategy:
matrix:
args:
- release-architecture: "amd64",
release-dir: "./cmd/path-to-app",
release-type: "binary",
release-application-name: "some-app",
- release-architecture: "arm64",
release-dir: "./cmd/path-to-app",
release-type: "binary",
release-application-name: "some-lambda-func",
release-build-tags: "lambda.norpc",
- testing-type: "component"
- testing-type: "coverage"
- testing-type: "graphql-lint"
- testing-type: "integration"
- testing-type: "lint", build-tags: "component"
- testing-type: "lint", build-tags: "e2e"
- testing-type: "lint", build-tags: "integration"
- testing-type: "mcvs-texttidy"
- testing-type: "mocks-tidy"
- testing-type: "security-golang-modules"
- testing-type: "security-grype"
- testing-type: "security-trivy"
security-trivyignore: ""
- testing-type: "unit"
runs-on: ubuntu-24.04
env:
TASK_X_REMOTE_TASKFILES: 1
test-timeout: 10m0s
steps:
- uses: actions/checkout@v4.1.1
with:
fetch-depth: 0 # this is necessary for gta partial testing
- uses: schubergphilis/mcvs-golang-action@v0.9.0
with:
build-tags: ${{ matrix.args.build-tags }}
golang-unit-tests-exclusions: |-
\(cmd\/some-app\|internal\/app\/some-app\)
gta-base-branch: main
gta-partial-testing: true
release-architecture: ${{ matrix.args.release-architecture }}
release-dir: ${{ matrix.args.release-dir }}
release-type: ${{ matrix.args.release-type }}
security-trivyignore: ${{ matrix.args.security-trivyignore }}
task-install: yes
testing-type: ${{ matrix.args.testing-type }}
token: ${{ secrets.GITHUB_TOKEN }}
test-timeout: ${{ env.test-timeout }}
code-coverage-timeout: ${{ env.test-timeout }}
```
以及一个 [.golangci.yml](https://golangci-lint.run/usage/configuration/)。
| 选项 | 默认值 | 必需 | 描述 |
| :---------------------------------------------- | :------ | -------- | :--------------------------------------------------------------------------------------------------------------- |
| build-tags | x | | 运行测试和 linting 时使用的 build tags(例如 "integration", "component", "e2e") |
| code-coverage-expected | x | | 标准测试的最低预期代码覆盖率百分比 |
| code-coverage-opa-expected | x | | OPA (Open Policy Agent) 测试的最低预期代码覆盖率百分比 |
| code-coverage-timeout | | | 代码覆盖率分析的超时持续时间(例如 "10m0s") |
| github-token-for-downloading-private-go-modules | | | 具有从私有仓库下载 Go modules 权限的 GitHub token |
| golangci-timeout | x | | golangci-lint 执行的超时持续时间 |
| golang-unit-tests-exclusions | x | | 用于从单元测试中排除特定包的正则表达式模式(例如 `\(cmd\/app\|internal\/app\)`) |
| grype-version | | | 要使用的 Grype 漏洞扫描器的特定版本 |
| gta-base-branch | x | | 用于执行部分测试的对比分支,变更的 go packages 将与之比较 |
| gta-partial-testing | x | | 是否运行部分测试(true 或 false) |
| release-application-name | | | 要构建的应用程序二进制文件的名称(设置 release-type 时需要) |
| release-architecture | | | 二进制文件的目标架构(例如 "amd64", "arm64") |
| release-build-tags | | | 构建发布二进制文件时使用的 build tags(例如 "lambda.norpc") |
| release-dir | | | 包含要构建的二进制文件 main.go 文件的目录 |
| release-os | x | | 二进制文件的目标操作系统(例如 "linux", "darwin") |
| release-type | | | 要构建的发布类型(例如 "binary") |
| task-install | x | | 是否安装 Task runner("yes" 或 "no") |
| task-version | x | | 要安装的 Task runner 版本 |
| testing-type | | | 要运行的测试类型(例如 "unit", "integration", "lint", "coverage", "security-golang-modules") |
| test-timeout | | | 测试执行的超时持续时间(例如 "10m0s") |
| token | | | 用于身份验证的 GitHub token(通常为 ${{ secrets.GITHUB_TOKEN }}) |
| trivy-action-db | x | | Trivy 漏洞数据库配置 |
| trivy-action-java-db | x | | Trivy Java 漏洞数据库配置 |
| trivy-version | x | | aquasecurity/trivy-action 使用的 Trivy CLI 版本(例如 "v0.69.2") |
注意:如果在默认值列中注册了 **x**,请参阅 [action.yml](action.yml) 获取相应的值。
### 发布
在某些情况下,您可能希望自动构建并发布可执行二进制文件。此 action 将构建二进制文件,然后将其用作发布资产。
创建一个包含以下内容的 `.github/workflows/golang-releases.yml` 文件:
```
---
name: golang-releases
"on": push
permissions:
contents: write
packages: read
jobs:
mcvs-golang-action:
strategy:
matrix:
args:
- release-application-name: mcvs-image-downloader
release-architecture: amd64
release-dir: cmd/mcvs-image-downloader
release-type: binary
- release-application-name: mcvs-image-downloader
release-architecture: arm64
release-dir: cmd/mcvs-image-downloader
release-os: darwin
release-type: binary
runs-on: ubuntu-24.04
env:
TASK_X_REMOTE_TASKFILES: 1
steps:
- uses: actions/checkout@v4.2.2
- uses: schubergphilis/mcvs-golang-action@v3.4.2
with:
release-application-name: ${{ matrix.args.release-application-name }}
release-architecture: ${{ matrix.args.release-architecture }}
release-build-tags: ${{ matrix.args.release-build-tags }}
release-dir: ${{ matrix.args.release-dir }}
release-os: ${{ matrix.args.release-os }}
release-type: ${{ matrix.args.release-type }}
token: ${{ secrets.GITHUB_TOKEN }}
```
### 集成
要执行集成测试,请确保代码位于带有 `_integration_test.go` 后缀的文件中,例如 `some_integration_test.go`。
此外,在文件中包含以下标头:
```
//go:build integration
```
添加此标头后,按照此示例所示发出命令 `task remote:test-integration --yes`。此 action 将运行单元测试和集成测试。如果执行 `task remote:test --yes`,则只会运行单元测试。
### 组件
有关步骤,请参阅集成段落,并将 `integration` 替换为 `component` 以运行它们。
### 从另一个私有仓库下载发布资产
您需要一个具有 `repo` 范围的个人访问令牌(PAT)才能从私有仓库下载发布版本。您可以简单地使用 gh 命令或 curl 来下载发布资产。请阅读 [GitHub 文档](https://docs.github.com/en/rest/releases/assets) 了解更多信息。
标签:Claude, CVE检测, DevSecOps, GitHub Action, Golang, Go语言, Linting, SAST, XML 请求, 上游代理, 代码覆盖率, 代码规范, 依赖管理, 单元测试, 安全专业人员, 安全开发, 安全编程, 开源框架, 持续集成, 日志审计, 盲注攻击, 程序破解, 软件供应链安全, 远程方法调用, 错误基检测, 集成测试, 静态代码分析