Jenkins的坑
- 起因 我使用 docker 部署了 jenkins 编译器,用来自动编译一些软件,我比较喜欢狗语言,我的设备有windows,ununtu;平台有amd64,arm64;于是我打起了 go 语言交叉编译的主意
- 经过 经过查询官方档案,大概搞懂了交叉编译的方法,写了个脚本,然后本地主机写了个 go 的 hello world 编译!Nice!一切 O 了个 K。接着我兴冲冲的粘贴到了 Jenkins 。瓦特?什么情况!执行报错,然后查看日志xx行语法错误!???我怀着委屈的心改了好多次语法,然后解决了几个问题,又有新的问题。终于,我心态崩了!玩儿去!我不该语法了!我开始找原因和修改方式。
- 定位原因 我搜索 jenkins bash 脚本报错的原因,发现有人说是 dash 和 bash 的问题。我用编译时报错的语法检测了jenkins和主机的情况,确认都是 bash 环境,那么真相只有一个!jenkins 有坑!于是,我在 Jenkins shell 编译脚本输入框的最前面加上了 “#!/bin/bash” ,强制指定为 bash 环境运行,编译过了!!!
- 总结 脚本前面强制指定脚本运行入口为 bash
我写的交叉编译脚本
交叉编译不多说,一切尽在不言中,看脚本看完就懂了
#!/bin/bash
#编译开始时间
cmp_start_time=$(TZ="Asia/Shanghai" date +%Y年%m月%d日-%H时%M分%S秒)
# 配置文件前缀名字
app_name="nav_page"
# 配置源码文件入库
build_main="main.go"
# 配置输出目录
out_path="out/"
# 要编译的芯片架构
cmp_arch="amd64
arm64"
# 要编译的系统平台
cmp_os="linux
windows
darwin"
# 设置go lib仓库镜像代理
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct
# CGO不支持交叉编译,关闭
export CGO_ENABLED=0
# 软件后缀信息
soft_type=".so"
function updateFileType(){
if [[ ${GOOS} == "windows" ]];then
soft_type=".exe"
fi
if [[ ${GOOS} == "linux" ]];then
soft_type=".so"
fi
if [[ ${GOOS} == "darwin" ]];then
soft_type=".bin"
fi
}
# git Tag信息,非git目录则为空
tag_info=""
if [[ $(git rev-parse --is-inside-work-tree) == true ]];then
tag_info=_$(git describe --abbrev=0 --tags)
fi
# 循环遍历数据编译且输出二进制文件
for iarch in ${cmp_arch}
do
export GOARCH=${iarch}
for ios in ${cmp_os}
do
export GOOS=${ios}
updateFileType
echo "build ${build_main} -o ${out_path}/${app_name}_${GOOS}_${GOARCH}${tag_info}${soft_type} ${build_main}"
go build -o ${out_path}${app_name}_${GOOS}_${GOARCH}${tag_info}${soft_type} ${build_main}
done
done
# 输出编译时间情况
echo 开始编译时间:${cmp_start_time}
echo 编译结束时间:$(TZ="Asia/Shanghai" date +%Y年%m月%d日-%H时%M分%S秒)
别慌,还有问题
这是可以编译过了,但是我的代码中引用了sqlite3的库,必须打开CGO_ENABLED,都是运行时报找不到。打开后,又会编译报错。请期待第二弹
评论区