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

1 回复

更多关于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

优势总结

  1. 本地优先:所有操作在本地执行,不依赖远程CI服务
  2. 环境一致性:通过Docker确保所有开发者和CI环境一致
  3. 快速反馈:无需等待远程CI队列,立即获得结果
  4. 可移植性:配置简单,易于在不同项目间共享
  5. 灵活性:可以轻松定义复杂的工作流

dot特别适合需要在提交代码前快速验证更改的Go开发者,它填补了本地开发和传统CI系统之间的空白。

回到顶部