主题
一、Go构建工具实践
1.1 Go构建工具简介
Go是一个开源的编程语言,它内置了强大的构建工具链。Go的构建系统是完全集成的,不需要第三方构建工具就能完成项目的构建、测试和部署。
- Go构建工具主要特点
- 内置依赖管理:Go Modules提供了官方的依赖管理解决方案
- 跨平台编译:支持在一个平台上编译其他平台的可执行文件
- 标准化项目结构:遵循Go工作区和模块的约定
- 快速编译:编译速度快,支持增量编译
1.2 Go配置
1.2.1 安装Go
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
- 基础镜像来源于
jenkins/inbound-agent:latest-jdk17
,此镜像自带jdk17,官方Dockerfile: https://github.com/jenkinsci/docker-agent/blob/master/debian/Dockerfile jenkins slave
节点通过JNLP
的方式连接jenkins master
- 为了提高构建速度,可将
/root/.cache/go-build
挂载到docker宿主机上
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
参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。