侧边栏壁纸
博主头像
Eoser's page! 博主等级

@学习@生活@自己

  • 累计撰写 114 篇文章
  • 累计创建 29 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Golang交叉编译第一弹-Jenkins的坑

eoser
2023-03-27 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

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,都是运行时报找不到。打开后,又会编译报错。请期待第二弹

0

评论区