golang基于Docker的本地优先持续集成系统插件dot的使用
Golang基于Docker的本地优先持续集成系统插件Dot的使用
Dot简介
Dot是一个最小化的持续集成系统,设计为本地优先。所有作业都在Docker容器内运行,Dot通过Docker客户端API与Docker守护进程通信。
特性
- 单一二进制文件,可在任何地方运行,包括您的机器或CI/CD系统
- 支持构建产物的多阶段构建
- 简单的YAML作业定义
- 支持使用自己的Docker镜像,包括私有仓库
- 使用普通的Docker
- 支持使用表达式进行条件评估
安装
使用Go安装最新版本
go install github.com/opnlabs/dot@latest
使用Docker运行
docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/project:/app ghcr.io/opnlabs/dot:latest -m
示例
使用GoReleaser构建项目的示例
stages:
- test
- security
- build
jobs:
- name: Run tests
stage: test
image: "docker.io/golang:1.21.3"
variables:
- TEST: true
script:
- go test ./...
condition: TEST
- name: Run checks
stage: security
image: "docker.io/golangci/golangci-lint:latest"
script:
- golangci-lint run ./...
- name: Build using Goreleaser
stage: build
image: "docker.io/golang:1.21.3-bookworm"
script:
- git config --global safe.directory '*'
- curl -sfL https://goreleaser.com/static/run | bash -s -- build --snapshot
artifacts:
- dist
构建完成后提取二进制文件:
tar xvf .artifacts/artifacts-*.tar
dist/dot_linux_amd64_v1/dot version
使用Dot构建Dot
这个项目可以用Dot构建。dot.yml
文件描述了构建Linux二进制文件所需的所有作业。克隆仓库并运行:
go run main.go -m
这将在.artifacts
目录中创建一个包含Linux二进制文件dot
的工件tar文件。-m
标志使dot
可以访问主机的Docker socket。只有在dot
内创建容器时才需要这样做。
更多关于golang基于Docker的本地优先持续集成系统插件dot的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang基于Docker的本地优先持续集成系统插件dot的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang基于Docker的本地优先持续集成系统插件dot使用指南
dot是一个轻量级的本地优先持续集成(CI)工具,专为Go开发者设计,它利用Docker容器来执行构建和测试任务。下面我将详细介绍如何使用dot插件来建立本地CI系统。
安装dot
首先需要安装dot工具:
go install github.com/golangci/dot@latest
基本使用
1. 初始化dot配置
在项目根目录下创建.dot.yml
文件:
version: 1
tasks:
build:
description: Build the project
commands:
- go build ./...
docker:
image: golang:1.20
volumes:
- .:/app
working_dir: /app
test:
description: Run tests
commands:
- go test -v ./...
docker:
image: golang:1.20
volumes:
- .:/app
working_dir: /app
2. 运行任务
执行构建任务:
dot run build
执行测试任务:
dot run test
高级功能示例
1. 多阶段构建
version: 1
tasks:
build-release:
description: Build release binaries
commands:
- go build -o bin/app ./cmd/app
- GOOS=linux GOARCH=amd64 go build -o bin/app-linux-amd64 ./cmd/app
- GOOS=darwin GOARCH=amd64 go build -o bin/app-darwin-amd64 ./cmd/app
docker:
image: golang:1.20
volumes:
- .:/app
working_dir: /app
2. 依赖管理
version: 1
tasks:
setup:
description: Install dependencies
commands:
- go mod download
docker:
image: golang:1.20
volumes:
- .:/app
- go-mod-cache:/go/pkg/mod
working_dir: /app
volumes:
go-mod-cache:
3. 集成测试
version: 1
tasks:
integration-test:
description: Run integration tests
services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: password
POSTGRES_USER: user
POSTGRES_DB: testdb
ports:
- "5432:5432"
commands:
- go test -tags=integration -v ./...
docker:
image: golang:1.20
volumes:
- .:/app
working_dir: /app
links:
- postgres
实际Go项目示例
下面是一个完整的Go项目dot配置示例:
version: 1
tasks:
setup:
description: Setup development environment
commands:
- go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
- go install gotest.tools/gotestsum@latest
docker:
image: golang:1.20
volumes:
- .:/app
- go-bin-cache:/go/bin
working_dir: /app
lint:
description: Run linter
commands:
- golangci-lint run ./...
docker:
image: golang:1.20
volumes:
- .:/app
- go-bin-cache:/go/bin
working_dir: /app
test:
description: Run tests with coverage
commands:
- gotestsum --format testname -- -coverprofile=coverage.out ./...
- go tool cover -html=coverage.out -o coverage.html
docker:
image: golang:1.20
volumes:
- .:/app
- go-bin-cache:/go/bin
working_dir: /app
build:
description: Build production binary
commands:
- CGO_ENABLED=0 go build -ldflags="-w -s" -o bin/app ./cmd/app
docker:
image: golang:1.20
volumes:
- .:/app
working_dir: /app
volumes:
go-bin-cache:
与Git Hooks集成
你还可以将dot与Git hooks结合使用,例如在pre-commit时自动运行lint和测试:
#!/bin/sh
# .git/hooks/pre-commit
echo "Running linter..."
dot run lint || exit 1
echo "Running tests..."
dot run test || exit 1
优势总结
- 本地优先:所有操作在本地执行,不依赖远程CI服务
- 环境一致性:通过Docker确保所有开发者和CI环境一致
- 快速反馈:无需等待远程CI队列,立即获得结果
- 可移植性:配置简单,易于在不同项目间共享
- 灵活性:可以轻松定义复杂的工作流
dot特别适合需要在提交代码前快速验证更改的Go开发者,它填补了本地开发和传统CI系统之间的空白。