Skip to content

一、Go构建工具实践

1.1 Go构建工具简介

Go是一个开源的编程语言,它内置了强大的构建工具链。Go的构建系统是完全集成的,不需要第三方构建工具就能完成项目的构建、测试和部署。

  • Go构建工具主要特点
  • 内置依赖管理:Go Modules提供了官方的依赖管理解决方案
  • 跨平台编译:支持在一个平台上编译其他平台的可执行文件
  • 标准化项目结构:遵循Go工作区和模块的约定
  • 快速编译:编译速度快,支持增量编译

1.2 Go配置

1.2.1 安装Go

TIP

Go安装包下载地址:https://golang.org/dl/

国内镜像:https://golang.google.cn/dl/

bash
wget https://golang.google.cn/dl/go1.24.4.linux-amd64.tar.gz
tar -xf go1.24.4.linux-amd64.tar.gz -C /home/application && rm -rf gogo1.24.4.linux-amd64.tar.gz
ls -l /home/application/go
总用量 72
drwxr-xr-x  2 root root  4096  5月 30 03:37 api
drwxr-xr-x  2 root root  4096  5月 30 03:37 bin
-rw-r--r--  1 root root    52  5月 30 03:37 codereview.cfg
-rw-r--r--  1 root root  1337  5月 30 03:37 CONTRIBUTING.md
drwxr-xr-x  3 root root  4096  5月 30 03:37 doc
-rw-r--r--  1 root root   505  5月 30 03:37 go.env
drwxr-xr-x  5 root root  4096  5月 30 03:37 lib
-rw-r--r--  1 root root  1453  5月 30 03:37 LICENSE
drwxr-xr-x  8 root root  4096  5月 30 03:37 misc
-rw-r--r--  1 root root  1303  5月 30 03:37 PATENTS
drwxr-xr-x  4 root root  4096  5月 30 03:37 pkg
-rw-r--r--  1 root root  1454  5月 30 03:37 README.md
-rw-r--r--  1 root root   426  5月 30 03:37 SECURITY.md
drwxr-xr-x 56 root root  4096  5月 30 03:37 src
drwxr-xr-x 28 root root 12288  5月 30 03:37 test
-rw-r--r--  1 root root    35  5月 30 03:37 VERSION
bash
cat >> /etc/profile << 'EOF'

#go
export GOROOT=/home/application/go
export GOPATH=/home/application/gopath
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
EOF

#使配置生效
source /etc/profile

#验证go
go env
go version

1.2.2 常用Go命令

bash
go mod init     # 初始化一个新的模块
go mod tidy     # 添加缺少的模块,移除未使用的模块
go build        # 编译包和依赖
go test        # 运行单元测试
go run         # 编译并运行Go程序
go get         # 添加依赖到当前模块
go install     # 编译并安装包
go clean       # 移除对象文件和缓存文件

1.3 Jenkins集成Go

1.3.1 准备一个Go项目

1.3.2 创建一个freestyle项目

  • 创建JOB

  • 源码管理

  • 增加构建步骤/Execute shell

bash
#指定go
export GOROOT=/home/application/go
export GOPATH=/home/application/gopath
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export GOPROXY=https://goproxy.cn,direct

#打印go版本信息
go version
#下载依赖
go mod tidy
#构建
go build -o uploadfile
#查看构建结果
ls -l uploadfile
  • 保存,构建

1.3.3 创建一个pipeline项目

  • 创建JOB

  • 编写pipeline脚本

groovy
pipeline {
    agent any
    stages {
        stage('拉取代码') {
            steps {
			script {
                checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/go-demo.git']])
				}
            }
        }
        stage('构建(go)') {
            steps {
                script {
                    sh '''
                    export GOROOT=/home/application/go
                    export GOPATH=/home/application/gopath
                    export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
                    export GOPROXY=https://goproxy.cn,direct
                    go mod tidy
                    go build -o uploadfile
                    '''
                }
            }
        }
    }
}
  • 保存,构建

1.3.4 指定任务在docker-slave节点上构建

Readme

在docker-slave节点上构建需要使用到Docker-plugin插件,docker-slave及使用方法不在此讨论,后续单独讨论

  • 编写Jenkins-slave Dockerfile文件

Readme

yaml
# 基于Jenkins inbound-agent的定制镜像
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17

# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for golang:1.24.4"
LABEL version="1.0"

# 切换到root用户进行安装配置
USER root

# 设置环境变量
ENV TZ=Asia/Shanghai \
    LANG=C.UTF-8 \
    LANGUAGE=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    GOLANG_VERSION=1.24.4 \
    GOPATH=/go \
    GOROOT=/usr/local/go \
    PATH=/usr/local/go/bin:/go/bin:$PATH

# 配置系统设置和安装必要工具
RUN set -eux; \
    # 更换Debian源为腾讯云镜像
    sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
    # 配置时区
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezone && \
    # 更新包列表并安装必要工具
    apt-get update && \
    apt-get install -y \
        bash-completion \
        bc \
        cifs-utils \
        curl \
        dnsutils \
        g++ \
        gcc \
        git \
        git-lfs \
        htop \
        iftop \
        iotop \
        jq \
        lrzsz \
        nmap \
        netcat-openbsd \
        nethogs \
        net-tools \
        ntpdate \
        openssh-server \
        psmisc \
        sysstat \
        tar \
        telnet \
        tzdata \
        unzip \
        vim \
        wget && \
    # 安装Go 1.24.4
    wget https://cnb.cool/srebro/docker-images/-/releases/download/V1.0.0/go${GOLANG_VERSION}.linux-amd64.tar.gz -O /tmp/go.tar.gz && \
    tar -C /usr/local -xzf /tmp/go.tar.gz && \
    rm -f /tmp/go.tar.gz && \
    # 创建GOPATH目录
    mkdir -p "$GOPATH/src" "$GOPATH/bin" && \
    chmod -R 777 "$GOPATH" && \
    # 配置Go环境
    echo 'export GOPATH=/go' >> /etc/profile.d/golang.sh && \
    echo 'export GOROOT=/usr/local/go' >> /etc/profile.d/golang.sh && \
    echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> /etc/profile.d/golang.sh && \
    chmod +x /etc/profile.d/golang.sh && \
    # 配置Go代理
    go env -w GO111MODULE=on && \
    go env -w GOPROXY=https://goproxy.cn,direct && \
    # 清理apt缓存
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 切换回jenkins用户以提高安全性
USER jenkins

# 确保jenkins用户也能使用Go
ENV GOPATH=/go \
    GOROOT=/usr/local/go \
    PATH=/usr/local/go/bin:/go/bin:$PATH
bash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:go1.24.4
bash
mkdir -p /home/application/jenkins/go-cache
  • Docker Agent templates

    • 进入Jenkins管理界面 > 系统配置 > Clouds
    • 选择已有的cloud云节点 > configure > Docker Agent templates > 进度条拖到最下面 > Add Docker Template

Readme

  • 需要配置多个Docker Agent模板,每个模板对应一个Docker镜像
  • 配置go缓存目录type=bind,source=/home/application/jenkins/go-cache,target=/root/.cache/go-build

  • 创建JOB

  • 编写pipeline脚本

groovy
pipeline {
    agent {
        label 'go-1.24.4'
    }
    stages {
        stage('打印版本') {
            steps {
                sh 'java -version'
                sh 'go version'
                sh 'go env'
            }
        }
        stage('拉取代码') {
            steps {
			script {
                checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/go-demo.git']])
				}
            }
        }
        stage('构建(go)') {
            steps {
                script {
                    sh 'go mod tidy' //安装依赖
                    sh "go build -o uploadfile" //编译
                }
            }
        }
    }
}
  • 构建并查看结果

1.3.5 使用不同的Go版本构建JOB

  • 编写Jenkins-slave Dockerfile文件
yaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17

# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for golang:1.24.4"
LABEL version="1.0"

# 切换到root用户进行安装配置
USER root

# 设置环境变量
ENV TZ=Asia/Shanghai \
    LANG=C.UTF-8 \
    LANGUAGE=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    GOLANG_VERSION=1.24.4 \
    GOPATH=/go \
    GOROOT=/usr/local/go \
    PATH=/usr/local/go/bin:/go/bin:$PATH

# 配置系统设置和安装必要工具
RUN set -eux; \
    # 更换Debian源为腾讯云镜像
    sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
    # 配置时区
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezone && \
    # 更新包列表并安装必要工具
    apt-get update && \
    apt-get install -y \
        bash-completion \
        bc \
        cifs-utils \
        curl \
        dnsutils \
        g++ \
        gcc \
        git \
        git-lfs \
        htop \
        iftop \
        iotop \
        jq \
        lrzsz \
        nmap \
        netcat-openbsd \
        nethogs \
        net-tools \
        ntpdate \
        openssh-server \
        psmisc \
        sysstat \
        tar \
        telnet \
        tzdata \
        unzip \
        vim \
        wget && \
    # 安装Go 1.24.4
    wget https://cnb.cool/srebro/docker-images/-/releases/download/V1.0.0/go${GOLANG_VERSION}.linux-amd64.tar.gz -O /tmp/go.tar.gz && \
    tar -C /usr/local -xzf /tmp/go.tar.gz && \
    rm -f /tmp/go.tar.gz && \
    # 创建GOPATH目录
    mkdir -p "$GOPATH/src" "$GOPATH/bin" && \
    chmod -R 777 "$GOPATH" && \
    # 配置Go环境
    echo 'export GOPATH=/go' >> /etc/profile.d/golang.sh && \
    echo 'export GOROOT=/usr/local/go' >> /etc/profile.d/golang.sh && \
    echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> /etc/profile.d/golang.sh && \
    chmod +x /etc/profile.d/golang.sh && \
    # 配置Go代理
    go env -w GO111MODULE=on && \
    go env -w GOPROXY=https://goproxy.cn,direct && \
    # 清理apt缓存
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 切换回jenkins用户以提高安全性
USER jenkins

# 确保jenkins用户也能使用Go
ENV GOPATH=/go \
    GOROOT=/usr/local/go \
    PATH=/usr/local/go/bin:/go/bin:$PATH
yaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17

# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for golang:1.16"
LABEL version="1.0"

# 切换到root用户进行安装配置
USER root

# 设置环境变量
ENV TZ=Asia/Shanghai \
    LANG=C.UTF-8 \
    LANGUAGE=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    GOLANG_VERSION=1.16.15 \
    GOPATH=/go \
    GOROOT=/usr/local/go \
    PATH=/usr/local/go/bin:/go/bin:$PATH

# 配置系统设置和安装必要工具
RUN set -eux; \
    # 更换Debian源为腾讯云镜像
    sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
    # 配置时区
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezone && \
    # 更新包列表并安装必要工具
    apt-get update && \
    apt-get install -y \
        bash-completion \
        bc \
        cifs-utils \
        curl \
        dnsutils \
        g++ \
        gcc \
        git \
        git-lfs \
        htop \
        iftop \
        iotop \
        jq \
        lrzsz \
        nmap \
        netcat-openbsd \
        nethogs \
        net-tools \
        ntpdate \
        openssh-server \
        psmisc \
        sysstat \
        tar \
        telnet \
        tzdata \
        unzip \
        vim \
        wget && \
    # 安装Go 1.16.15
    wget https://cnb.cool/srebro/docker-images/-/releases/download/V1.0.0/go${GOLANG_VERSION}.linux-amd64.tar.gz -O /tmp/go.tar.gz && \
    tar -C /usr/local -xzf /tmp/go.tar.gz && \
    rm -f /tmp/go.tar.gz && \
    # 创建GOPATH目录
    mkdir -p "$GOPATH/src" "$GOPATH/bin" && \
    chmod -R 777 "$GOPATH" && \
    # 配置Go环境
    echo 'export GOPATH=/go' >> /etc/profile.d/golang.sh && \
    echo 'export GOROOT=/usr/local/go' >> /etc/profile.d/golang.sh && \
    echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> /etc/profile.d/golang.sh && \
    chmod +x /etc/profile.d/golang.sh && \
    # 配置Go代理
    go env -w GO111MODULE=on && \
    go env -w GOPROXY=https://goproxy.cn,direct && \
    # 清理apt缓存
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 切换回jenkins用户以提高安全性
USER jenkins

# 确保jenkins用户也能使用Go
ENV GOPATH=/go \
    GOROOT=/usr/local/go \
    PATH=/usr/local/go/bin:/go/bin:$PATH
bash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:go1.24.4 .
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:go1.16.15 .
  • Docker Agent templates

    • 进入Jenkins管理界面 > 系统配置 > Clouds
    • 选择已有的cloud云节点 > configure > Docker Agent templates > 进度条拖到最下面 > Add Docker Template

Readme

  • 需要配置多个Docker Agent模板,每个模板对应一个Docker镜像
  • 配置go缓存目录type=bind,source=/home/application/jenkins/go-cache,target=/root/.cache/go-build

  • 构建JOB

  • 创建pipeline脚本

groovy
pipeline {
        parameters {
      choice choices: ['go-1.24.4', 'go-1.16.15'], description: 'go版本', name: 'go_version'
    }
    agent {
        label "${go_version}"
    }
	
    stages {
        stage('拉取代码'){
            steps {
                script {
                     checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/go-demo.git']])
                }
            }
        }
        stage('打印版本') {
            steps {
                sh 'java -version'
                sh 'go version'
            }
        }
        stage('构建go') {
            steps {
                script {
                    sh '''
                    go mod tidy
                    go build -o uploadfile
                    '''
                }
            }
        }
    }
}
  • 构建JOB

WARNING

参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。

最近更新

采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟