最近由于需要采用Jenkinsfile来进行golang的CI/CD流程,突然发现原来公司的Jenkins服务器上并没有安装golang的编译环境,由于之前采用docker建立的的jenkins基本文件,而这个容器是基于Alpine Linux的实现,众所周知,Alpine Linux由于体积的优势,在容器领域运用很多,但是带来的问题也非常多。
首先Alpine Linux下的libc是musl的实现,shell也是busybox的实现,包管理器是基于apk的,由于原本镜像是Alpine 3.12的,查了Alpine官方的apk库,发现只有golang较低的版本,1.13,由于需要用到golang 1.16,这里记录升级安装方法。
首先golang官方是没有alpine linux的安装包的,其他Liunx系统的二进制包由于libc的不同肯定也是不能使用的,所以从源码编译安装成了唯一的可行的方法。
过程如下:
export GOARCH='amd64' GOOS='linux';
wget -O go.tgz https://dl.google.com/go/go1.16.12.src.tar.gz
tar -C /usr/local -xzf go.tgz;
rm -f go.tgz
#由于golang已经实现bootstrap了,需要安装gcc bash musl golang 1.3的来编译
apk add --no-cache --virtual .build-deps \
bash \
gcc \
go \
musl-dev \
cd /usr/local/go/src
export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"; #编译环境便利
./make.bash; #编译
go install std;
完成后在/usr/local/go/bin就有新的golang文件,修改配置path环境变量或者把/usr/local/go/bin下的文件软链接到/usr/bin里面去就可以了
go version
可以看到最新的版本
踩坑:
go install std
会安装golang的一些标准库,由于众所周知的原因,包会不能安装,需要人工处理
golang.org 在国内由于一些 众所周知的 原因无法直接访问,而go get在获取gocode、go-def、golint等插件依赖工具的源码时,需要从 golang.org 上拉取部分代码至GOPATH,自然就导致了最后这些依赖于 golang.org 代码的依赖工具安装失败。
解决也并不复杂:先通过git clone命令手动将依赖工具的源码拉取至GOPATH的对应路径,再通过go install命令安装依赖工具。
如上 建立/usr/local/go/src/golang.org/x 目录,到https://github.com/golang/ 上找到google发布的标准库,git clone 为对应的名字放到这个目录,再次运行go install std
如:
mkdir -p /usr/local/go/src/golang.org/x
cd /usr/local/go/src/golang.org/x
git clone https://github.com/golang/tools.git tools
在采用alpine linux 安装的golang编译时,生成的文件可能在其他liunx系统下不能运行,原因也因为alpine的特殊性,解决如下:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
禁用CGO,不动态链接c库
本文为Lokie.Wang原创文章,转载无需和我联系,但请注明来自lokie博客http://lokie.wang