自己编译gitlab-runner X86, arm64, mips64le等版本
总体说明
曾经下载过gitlab-runner源码,尝试在arm64、mips64le架构下进行编译,网上查了很多资料,都不可行,也没有找到现成可用的可执行文件,折腾了很久。最后发现go语言可以在某一个平台,编译出别的平台的可执行程序,于是转变思路,尝试在Ubuntu下编译各个平台的gitlab-runner,最终成功。下面进行介绍。
1. 安装操作系统
操作系统版本:Ubuntu 16.04
2. 安装go编译环境
下载链接:https://gomirrors.org/
下载版本:go1.15.2.linux-amd64.tar.gz,也可用尝试最新版本
解压:
sudo tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz
创建home目录创建工作文件夹,命令示范如下:
cd /home
sudo mkdir gopath
sudo chmod 777 -R gopath
cd gopath
mkdir src
mkdir pkg
mkdir bin
sudo chmod 777 -R *
配置环境变量:
sudo gedit ~/.bashrc
文件最后添加:
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/home/gopath
更新:
source ~/.bashr
检查一下是否正常:
go version
显示结果:
go version go1.15.2 linux/amd64
3. 编译gitlab-runner
下载代码:https://gitlab.com/gitlab-org/gitlab-runner/
下载版本:master最新版,大概是写此博客的时间。
放置目录:解压后一定要按此目录放置,需要将压缩包内的文件夹改名,下面是大致的目录结构。
/home/gopath/src/gitlab.com/gitlab-org/gitlab-runner
/home/gopath/src/gitlab.com/gitlab-org/gitlab-runner/main.go
/home/gopath/src/gitlab.com/gitlab-org/gitlab-runner//
编译X86版本:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install gitlab.com/gitlab-org/gitlab-runner/
编译arm64版本:
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go install gitlab.com/gitlab-org/gitlab-runner/
编译mips64le版本:
CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go install gitlab.com/gitlab-org/gitlab-runner/
特别说明
上述编译的所有文件都会生成到如下目录:
/home/gopath/bin
编译mips64le版本时会报错:
gitlab.com/gitlab-org/gitlab-runner/vendor/github.com/docker/docker/pkg/system
gitlab.com/gitlab-org/gitlab-runner/vendor/github.com/docker/docker/pkg/system/stat_linux.go:11:3: cannot use s.Rdev (type uint32) as type uint64 in field value
在报错文件的对应位置添加uint64()即可,不清楚这样添加是否有问题,反正可以运行。
文件位置:
/home/gopath/src/gitlab.com/gitlab-org/gitlab-runner/vendor/github.com/docker/docker/pkg/system/stat_linux.go
修改前:
// fromStatT converts a syscall.Stat_t type to a system.Stat_t type
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
return &StatT{size: s.Size,
mode: s.Mode,
uid: s.Uid,
gid: s.Gid,
rdev: s.Rdev,
mtim: s.Mtim}, nil
}
修改后:
// fromStatT converts a syscall.Stat_t type to a system.Stat_t type
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
return &StatT{size: s.Size,
mode: s.Mode,
uid: s.Uid,
gid: s.Gid,
rdev: uint64(s.Rdev),
mtim: s.Mtim}, nil
}
4. PS:
可以用如下命令查看go支持的操作系统和架构,在编译的时候使用。
命令:
go tool dist list
显示结果:
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
windows/386
windows/amd64
windows/arm